forked from OSchip/llvm-project
[DSE] Eliminate noop store even through has clobbering between LoadI and StoreI
For noop store of the form of LoadI and StoreI, An invariant should be kept is that the memory state of the related MemoryLoc before LoadI is the same as before StoreI. For this example: ``` define void @pr49927(i32* %q, i32* %p) { %v = load i32, i32* %p, align 4 store i32 %v, i32* %q, align 4 store i32 %v, i32* %p, align 4 ret void } ``` Here the definition of the store's destination is different with the definition of the load's destination, which it seems that the invariant mentioned above is broken. But the definition of the store's destination would write a value that is LoadI, actually, the invariant is still kept. So we can safely ignore it. Differential Revision: https://reviews.llvm.org/D132657
This commit is contained in:
parent
acce424111
commit
cd8f3e7581
|
@ -1864,8 +1864,16 @@ struct DSEState {
|
|||
// We are searching for the definition of the store's destination.
|
||||
// So, if that is the same definition as the load, then this is a
|
||||
// noop. Otherwise, fail.
|
||||
if (LoadAccess != Current)
|
||||
if (LoadAccess != Current) {
|
||||
auto *CurrentStoreI =
|
||||
dyn_cast<StoreInst>(cast<MemoryDef>(Current)->getMemoryInst());
|
||||
if (CurrentStoreI && CurrentStoreI->getOperand(0) == LoadI) {
|
||||
// This is a potentially clobbering store, but it writes the same value,
|
||||
// so we can safely ignore it.
|
||||
continue;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -612,12 +612,10 @@ define void @pr49927(i32* %q, i32* %p) {
|
|||
; CHECK-LABEL: @pr49927(
|
||||
; CHECK-NEXT: [[V:%.*]] = load i32, i32* [[P:%.*]], align 4
|
||||
; CHECK-NEXT: store i32 [[V]], i32* [[Q:%.*]], align 4
|
||||
; CHECK-NEXT: store i32 [[V]], i32* [[P]], align 4
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%v = load i32, i32* %p, align 4
|
||||
store i32 %v, i32* %q, align 4
|
||||
; FIXME: this store can be eliminated
|
||||
store i32 %v, i32* %p, align 4
|
||||
ret void
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue