diff --git a/llvm/lib/Analysis/MemoryLocation.cpp b/llvm/lib/Analysis/MemoryLocation.cpp index b664b54c044f5..6e3232772706a 100644 --- a/llvm/lib/Analysis/MemoryLocation.cpp +++ b/llvm/lib/Analysis/MemoryLocation.cpp @@ -183,6 +183,18 @@ MemoryLocation MemoryLocation::getForArgument(const CallBase *Call, AATags); return MemoryLocation::getAfter(Arg, AATags); + case Intrinsic::experimental_memset_pattern: + assert((ArgIdx == 0 || ArgIdx == 1) && + "Invalid argument index for memory intrinsic"); + if (ConstantInt *LenCI = dyn_cast(II->getArgOperand(2))) + return MemoryLocation( + Arg, + LocationSize::precise( + LenCI->getZExtValue() * + DL.getTypeAllocSize(II->getArgOperand(1)->getType())), + AATags); + return MemoryLocation::getAfter(Arg, AATags); + case Intrinsic::lifetime_start: case Intrinsic::lifetime_end: case Intrinsic::invariant_start: diff --git a/llvm/test/Analysis/BasicAA/memset-pattern.ll b/llvm/test/Analysis/BasicAA/memset-pattern.ll index 33d3d125b5794..aaa605db0eb26 100644 --- a/llvm/test/Analysis/BasicAA/memset-pattern.ll +++ b/llvm/test/Analysis/BasicAA/memset-pattern.ll @@ -4,7 +4,7 @@ define void @test_memset_pattern4_const_size(ptr noalias %a, i32 %pattern) { ; CHECK-LABEL: Function: test_memset_pattern4_const_size ; CHECK: Just Mod: Ptr: i8* %a <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false) ; CHECK-NEXT: Just Mod: Ptr: i8* %a.gep.1 <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false) -; CHECK-NEXT: Just Mod: Ptr: i8* %a.gep.129 <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false) +; CHECK-NEXT: NoModRef: Ptr: i8* %a.gep.129 <-> call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr %a, i32 %pattern, i64 17, i1 false) entry: load i8, ptr %a diff --git a/llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll b/llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll index 10afbdc432ad5..947d8a788c244 100644 --- a/llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll +++ b/llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll @@ -133,8 +133,7 @@ define void @memset_pattern_and_store_2(ptr %ptr, i64 %len) { define void @memset_pattern_and_store_3(ptr %ptr) { ; CHECK-LABEL: @memset_pattern_and_store_3( -; CHECK-NEXT: store i64 0, ptr [[PTR:%.*]], align 4 -; CHECK-NEXT: call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR]], i8 0, i64 13, i1 false) +; CHECK-NEXT: call void @llvm.experimental.memset.pattern.p0.i8.i64(ptr align 1 [[PTR:%.*]], i8 0, i64 13, i1 false) ; CHECK-NEXT: ret void ; store i64 0, ptr %ptr