[llvm] [DSE] Use alias analysis to identify no-op stores (PR #122610)

Alex MacLean via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 11 11:30:44 PST 2025


https://github.com/AlexMaclean created https://github.com/llvm/llvm-project/pull/122610

None

>From 1f479901a1218f99c18f551c3e1c3f744a6a434f Mon Sep 17 00:00:00 2001
From: Alex Maclean <amaclean at nvidia.com>
Date: Fri, 10 Jan 2025 20:23:48 +0000
Subject: [PATCH] [DSE] Use alias analysis to identify no-op stores

---
 llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp   |  4 +++-
 .../Transforms/DeadStoreElimination/noop-stores.ll    | 11 +++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index cae5b9c41a37f1..908b9110bd595d 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -2116,7 +2116,9 @@ struct DSEState {
       return true;
 
     if (auto *LoadI = dyn_cast<LoadInst>(Store->getOperand(0))) {
-      if (LoadI->getPointerOperand() == Store->getOperand(1)) {
+      if (LoadI->getPointerOperand() == Store->getOperand(1) ||
+          AA.isMustAlias(MemoryLocation::get(LoadI),
+                         MemoryLocation::get(Store))) {
         // Get the defining access for the load.
         auto *LoadAccess = MSSA.getMemoryAccess(LoadI)->getDefiningAccess();
         // Fast path: the defining accesses are the same.
diff --git a/llvm/test/Transforms/DeadStoreElimination/noop-stores.ll b/llvm/test/Transforms/DeadStoreElimination/noop-stores.ll
index 9fc20d76da5eb4..5bedc1ebe8281e 100644
--- a/llvm/test/Transforms/DeadStoreElimination/noop-stores.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/noop-stores.ll
@@ -1152,3 +1152,14 @@ if.else:
 end:
   ret void
 }
+
+define i32 @test_use_alias_analysis(ptr %Q) {
+; CHECK-LABEL: @test_use_alias_analysis(
+; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[Q:%.*]], align 4
+; CHECK-NEXT:    ret i32 [[A]]
+;
+  %a = load i32, ptr %Q
+  %Q2 = addrspacecast ptr %Q to ptr addrspace(5)
+  store i32 %a, ptr addrspace(5) %Q2
+  ret i32 %a
+}



More information about the llvm-commits mailing list