xref: /llvm-project/llvm/test/Transforms/Inline/pr50589.ll (revision 151602c7a9935558ca671b35359989b261045db0)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=inline < %s | FileCheck %s
3
4; Test interaction of simplification during cloning with insertion of scoped
5; noalias metadata.
6
7define <2 x i8> @callee1(ptr %ptr1, ptr noalias %ptr2, <2 x i1> %mask, <2 x i8> %passthru) {
8; CHECK-LABEL: @callee1(
9; CHECK-NEXT:    [[RET:%.*]] = call <2 x i8> @llvm.masked.load.v2i8.p0(ptr [[PTR1:%.*]], i32 1, <2 x i1> [[MASK:%.*]], <2 x i8> [[PASSTHRU:%.*]])
10; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[PTR2:%.*]], align 2
11; CHECK-NEXT:    ret <2 x i8> [[RET]]
12;
13  %ret = call <2 x i8> @llvm.masked.load.v2i8(ptr %ptr1, i32 1, <2 x i1> %mask, <2 x i8> %passthru)
14  store <2 x i8> zeroinitializer, ptr %ptr2
15  ret <2 x i8> %ret
16}
17
18; The load should not have !noalias.
19define void @caller1(ptr %ptr1, ptr %ptr2) {
20; CHECK-LABEL: @caller1(
21; CHECK-NEXT:    [[PASSTHRU:%.*]] = load <2 x i8>, ptr [[PTR2:%.*]], align 2{{$}}
22; CHECK-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])
23; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[PTR2]], align 2, !alias.scope !0
24; CHECK-NEXT:    ret void
25;
26  %passthru = load <2 x i8>, ptr %ptr2
27  call <2 x i8> @callee1(ptr %ptr1, ptr %ptr2, <2 x i1> zeroinitializer, <2 x i8> %passthru)
28  ret void
29}
30
31define <2 x i8> @callee2(ptr %ptr1, ptr noalias %ptr2, <2 x i1> %mask) {
32; CHECK-LABEL: @callee2(
33; CHECK-NEXT:    [[PASSTHRU:%.*]] = load <2 x i8>, ptr [[PTR2:%.*]], align 2
34; CHECK-NEXT:    [[RET:%.*]] = call <2 x i8> @llvm.masked.load.v2i8.p0(ptr [[PTR1:%.*]], i32 1, <2 x i1> [[MASK:%.*]], <2 x i8> [[PASSTHRU]])
35; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[PTR2]], align 2
36; CHECK-NEXT:    ret <2 x i8> [[RET]]
37;
38  %passthru = load <2 x i8>, ptr %ptr2
39  %ret = call <2 x i8> @llvm.masked.load.v2i8(ptr %ptr1, i32 1, <2 x i1> %mask, <2 x i8> %passthru)
40  store <2 x i8> zeroinitializer, ptr %ptr2
41  ret <2 x i8> %ret
42}
43
44; The load should not have !noalias.
45define void @caller2(ptr %ptr1, ptr %ptr2) {
46; CHECK-LABEL: @caller2(
47; CHECK-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
48; CHECK-NEXT:    [[PASSTHRU_I:%.*]] = load <2 x i8>, ptr [[PTR2:%.*]], align 2, !alias.scope !3{{$}}
49; CHECK-NEXT:    store <2 x i8> zeroinitializer, ptr [[PTR2]], align 2, !alias.scope !3
50; CHECK-NEXT:    ret void
51;
52  call <2 x i8> @callee2(ptr %ptr1, ptr %ptr2, <2 x i1> zeroinitializer)
53  ret void
54}
55
56declare <2 x i8> @llvm.masked.load.v2i8(ptr, i32, <2 x i1>, <2 x i8>)
57