[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
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user