Revert "[DSE] Eliminate noop store even through has clobbering between LoadI and...
authorNikita Popov <npopov@redhat.com>
Fri, 2 Sep 2022 07:28:48 +0000 (09:28 +0200)
committerNikita Popov <npopov@redhat.com>
Fri, 2 Sep 2022 07:28:48 +0000 (09:28 +0200)
This reverts commit cd8f3e75813995c1d2da35370ffcf5af3aff9c2f.

As pointed out by Eli on the review, this is missing an alignment
check. The value might be written at an offset.

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll

index d24c5a2..45c404a 100644 (file)
@@ -1864,16 +1864,8 @@ 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) {
-            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;
-            }
+          if (LoadAccess != Current)
             return false;
-          }
         }
         return true;
       }
index 06a5f86..e5630cc 100644 (file)
@@ -612,10 +612,12 @@ 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
 }