[llvm] bb70023 - [MemoryLocation][DSE] Allow other read effects in MemoryLocation::getForDest() (#144343)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 17 00:49:22 PDT 2025
Author: Nikita Popov
Date: 2025-06-17T09:49:18+02:00
New Revision: bb70023cbfecf7880e4cc89966947ef475e070e9
URL: https://github.com/llvm/llvm-project/commit/bb70023cbfecf7880e4cc89966947ef475e070e9
DIFF: https://github.com/llvm/llvm-project/commit/bb70023cbfecf7880e4cc89966947ef475e070e9.diff
LOG: [MemoryLocation][DSE] Allow other read effects in MemoryLocation::getForDest() (#144343)
MemoryLocation::getForDest() returns a (potentially) written location,
while still allowing other reads. Currently, this is limited to
argmemonly functions. However, we can ignore other (non-argmem) read
effects here for the same reason we can ignore argument reads.
Fixes https://github.com/llvm/llvm-project/issues/144300.
Proof: https://alive2.llvm.org/ce/z/LKq_dc
Added:
Modified:
llvm/lib/Analysis/MemoryLocation.cpp
llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/MemoryLocation.cpp b/llvm/lib/Analysis/MemoryLocation.cpp
index 3b42bb412b9ba..c8daab7abde18 100644
--- a/llvm/lib/Analysis/MemoryLocation.cpp
+++ b/llvm/lib/Analysis/MemoryLocation.cpp
@@ -111,7 +111,9 @@ MemoryLocation MemoryLocation::getForDest(const AnyMemIntrinsic *MI) {
std::optional<MemoryLocation>
MemoryLocation::getForDest(const CallBase *CB, const TargetLibraryInfo &TLI) {
- if (!CB->onlyAccessesArgMemory())
+ // Check that the only possible writes are to arguments.
+ MemoryEffects WriteME = CB->getMemoryEffects() & MemoryEffects::writeOnly();
+ if (!WriteME.onlyAccessesArgPointees())
return std::nullopt;
if (CB->hasOperandBundles())
diff --git a/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll b/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
index 030d315bfd925..df2feb087e397 100644
--- a/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
@@ -286,3 +286,35 @@ define void @test_dse_non_alloca() {
ret void
}
+define void @test_other_read_effects() {
+; CHECK-LABEL: @test_other_read_effects(
+; CHECK-NEXT: ret void
+;
+ %a = alloca i32, align 4
+ call void @f(ptr %a) memory(read, argmem: readwrite) nounwind willreturn
+ ret void
+}
+
+define i32 @test_other_read_effects_read_after() {
+; CHECK-LABEL: @test_other_read_effects_read_after(
+; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
+; CHECK-NEXT: call void @f(ptr [[A]]) #[[ATTR5:[0-9]+]]
+; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[A]], align 4
+; CHECK-NEXT: ret i32 [[V]]
+;
+ %a = alloca i32, align 4
+ call void @f(ptr %a) memory(read, argmem: readwrite) nounwind willreturn
+ %v = load i32, ptr %a
+ ret i32 %v
+}
+
+define void @test_other_write_effects() {
+; CHECK-LABEL: @test_other_write_effects(
+; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
+; CHECK-NEXT: call void @f(ptr [[A]]) #[[ATTR6:[0-9]+]]
+; CHECK-NEXT: ret void
+;
+ %a = alloca i32, align 4
+ call void @f(ptr %a) memory(write, argmem: readwrite) nounwind willreturn
+ ret void
+}
More information about the llvm-commits
mailing list