[llvm] [MemoryLocation] Model value parameter of memset.pattern intrinsic (PR #138559)

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Mon May 5 10:42:51 PDT 2025


https://github.com/preames created https://github.com/llvm/llvm-project/pull/138559

This parameter may be a pointer if the pointer is being written to the destination, but is neither read or written.

>From 5af6568c1be126eb1fbb581705478abed71f21af Mon Sep 17 00:00:00 2001
From: Philip Reames <preames at rivosinc.com>
Date: Mon, 5 May 2025 10:41:10 -0700
Subject: [PATCH] [MemoryLocation] Model value parameter of memset.pattern
 intrinsic

This parameter may be a pointer if the pointer is being written to
the destination, but is neither read or written.
---
 llvm/lib/Analysis/MemoryLocation.cpp       | 4 ++++
 llvm/test/Transforms/GVN/memset-pattern.ll | 7 ++-----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Analysis/MemoryLocation.cpp b/llvm/lib/Analysis/MemoryLocation.cpp
index 6e3232772706a..7c474fe1a28b6 100644
--- a/llvm/lib/Analysis/MemoryLocation.cpp
+++ b/llvm/lib/Analysis/MemoryLocation.cpp
@@ -186,6 +186,10 @@ MemoryLocation MemoryLocation::getForArgument(const CallBase *Call,
     case Intrinsic::experimental_memset_pattern:
       assert((ArgIdx == 0 || ArgIdx == 1) &&
              "Invalid argument index for memory intrinsic");
+      if (ArgIdx == 1) {
+        assert(Arg->getType()->isPointerTy());
+        return MemoryLocation(Arg, LocationSize::precise(0), AATags);
+      }
       if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
         return MemoryLocation(
             Arg,
diff --git a/llvm/test/Transforms/GVN/memset-pattern.ll b/llvm/test/Transforms/GVN/memset-pattern.ll
index 20ac87e916757..6fe50867df8dc 100644
--- a/llvm/test/Transforms/GVN/memset-pattern.ll
+++ b/llvm/test/Transforms/GVN/memset-pattern.ll
@@ -49,11 +49,8 @@ define i32 @load_forward_over_memset_pattern(ptr %P, ptr noalias %Q) {
 
 define i32 @load_forward_over_memset_pattern2(ptr %P, ptr noalias %Q) nounwind ssp {
 ; CHECK-LABEL: @load_forward_over_memset_pattern2(
-; CHECK-NEXT:    [[V1:%.*]] = load i32, ptr [[Q:%.*]], align 4
-; CHECK-NEXT:    tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[P:%.*]], ptr [[Q]], i64 8, i1 false)
-; CHECK-NEXT:    [[V2:%.*]] = load i32, ptr [[Q]], align 4
-; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[V1]], [[V2]]
-; CHECK-NEXT:    ret i32 [[SUB]]
+; CHECK-NEXT:    tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 8, i1 false)
+; CHECK-NEXT:    ret i32 0
 ;
   %v1 = load i32, ptr %Q
   tail call void @llvm.experimental.memset.pattern(ptr %P, ptr %Q, i64 8, i1 false)



More information about the llvm-commits mailing list