-
Notifications
You must be signed in to change notification settings - Fork 14k
[MemoryLocation][DSE] Allow other read effects in MemoryLocation::getForDest() #144343
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ForDest() 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 llvm#144300.
@llvm/pr-subscribers-llvm-transforms Author: Nikita Popov (nikic) ChangesMemoryLocation::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 #144300. Full diff: https://github.com/llvm/llvm-project/pull/144343.diff 2 Files Affected:
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..8a69f1f55d491 100644
--- a/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
@@ -286,3 +286,24 @@ 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
+}
|
@llvm/pr-subscribers-llvm-analysis Author: Nikita Popov (nikic) ChangesMemoryLocation::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 #144300. Full diff: https://github.com/llvm/llvm-project/pull/144343.diff 2 Files Affected:
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..8a69f1f55d491 100644
--- a/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/trivial-dse-calls.ll
@@ -286,3 +286,24 @@ 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
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks
…ForDest() (llvm#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 llvm#144300. Proof: https://alive2.llvm.org/ce/z/LKq_dc
…ForDest() (llvm#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 llvm#144300. Proof: https://alive2.llvm.org/ce/z/LKq_dc
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 #144300.
Proof: https://alive2.llvm.org/ce/z/LKq_dc