[llvm] [EarlyCSE] Do not forward memset zero to intrinsic (PR #206452)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 29 04:05:00 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Nikita Popov (nikic)

<details>
<summary>Changes</summary>

We can do this in principle, but it would require more precise handling. E.g. for masked.load we'd have to respect the passthru argument for masked out lanes. I don't think this is worthwhile, so just bail out.

---
Full diff: https://github.com/llvm/llvm-project/pull/206452.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/Scalar/EarlyCSE.cpp (+2-1) 
- (modified) llvm/test/Transforms/EarlyCSE/memset-load.ll (+12) 


``````````diff
diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
index 3dd84bddb6bf5..fc70b3e28dcdf 100644
--- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
+++ b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp
@@ -1185,7 +1185,8 @@ Value *EarlyCSE::getMatchingValue(LoadValue &InVal, ParseMemoryInst &MemInst,
   if (InVal.DefInst == nullptr)
     return nullptr;
   if (auto *MSI = dyn_cast<MemSetInst>(InVal.DefInst)) {
-    if (!MemInst.isLoad() || MemInst.isVolatile() || !MemInst.isUnordered())
+    if (!MemInst.isLoad() || MemInst.isVolatile() || !MemInst.isUnordered() ||
+        MemInst.getMatchingId() != -1)
       return nullptr;
     if (MSI->isVolatile())
       return nullptr;
diff --git a/llvm/test/Transforms/EarlyCSE/memset-load.ll b/llvm/test/Transforms/EarlyCSE/memset-load.ll
index f563d29ebdde5..da91c967ead55 100644
--- a/llvm/test/Transforms/EarlyCSE/memset-load.ll
+++ b/llvm/test/Transforms/EarlyCSE/memset-load.ll
@@ -87,6 +87,18 @@ entry:
   ret ptr addrspace(1) %v
 }
 
+define <4 x i32> @masked_load_from_zero_memset(ptr %p) {
+; CHECK-LABEL: define <4 x i32> @masked_load_from_zero_memset(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr [[P]], i8 0, i64 16, i1 false)
+; CHECK-NEXT:    [[V:%.*]] = call <4 x i32> @llvm.masked.load.v4i32.p0(ptr align 16 [[P]], <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i32> splat (i32 7))
+; CHECK-NEXT:    ret <4 x i32> [[V]]
+;
+  call void @llvm.memset.p0.i64(ptr %p, i8 0, i64 16, i1 false)
+  %v = call <4 x i32> @llvm.masked.load(ptr %p, i32 16, <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i32> <i32 7, i32 7, i32 7, i32 7>)
+  ret <4 x i32> %v
+}
+
 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
 declare void @llvm.memset.p1.i64(ptr addrspace(1) nocapture writeonly, i8, i64, i1 immarg)
 declare void @clobber(ptr)

``````````

</details>


https://github.com/llvm/llvm-project/pull/206452


More information about the llvm-commits mailing list