[llvm] d1314d0 - [MemoryLocation] Teach MemoryLocation about llvm.experimental.memset.pattern (#120421)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 15 05:50:27 PST 2025


Author: Alex Bradbury
Date: 2025-01-15T13:50:23Z
New Revision: d1314d0152f242c618caafce264fccbc47273d84

URL: https://github.com/llvm/llvm-project/commit/d1314d0152f242c618caafce264fccbc47273d84
DIFF: https://github.com/llvm/llvm-project/commit/d1314d0152f242c618caafce264fccbc47273d84.diff

LOG: [MemoryLocation] Teach MemoryLocation about llvm.experimental.memset.pattern (#120421)

Relates to (but isn't dependent on) #120420.

This allows alias analysis o the intrinsic of the same quality as for
the libcall, which we want in order to move LoopIdiomRecognize over to
selecting the intrinsic.

Added: 
    

Modified: 
    llvm/lib/Analysis/MemoryLocation.cpp
    llvm/test/Analysis/BasicAA/memset-pattern.ll
    llvm/test/Transforms/DeadStoreElimination/memory-intrinsics-sizes.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/MemoryLocation.cpp b/llvm/lib/Analysis/MemoryLocation.cpp
index b664b54c044f54..6e3232772706af 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<ConstantInt>(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 33d3d125b5794e..aaa605db0eb26a 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 10afbdc432ad5d..947d8a788c2440 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


        


More information about the llvm-commits mailing list