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