[DSE,MemorySSA] Check for underlying objects first.
authorFlorian Hahn <flo@fhahn.com>
Fri, 14 Aug 2020 14:25:01 +0000 (15:25 +0100)
committerFlorian Hahn <flo@fhahn.com>
Mon, 17 Aug 2020 17:52:18 +0000 (18:52 +0100)
isWriteAtEndOfFunction needs to check all memory uses of Def, which is
much more expensive than getting the underlying objects in practice.
Switch the call order, as recommended by the TODO, which was added as
per an earlier review.

This shaves off a bit of compile-time.

llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp

index faa936e..a757db1 100644 (file)
@@ -2045,29 +2045,28 @@ struct DSEState {
           !isRemovable(Def->getMemoryInst()))
         continue;
 
-      // TODO: Consider doing the underlying object check first, if it is
-      // beneficial compile-time wise.
-      if (isWriteAtEndOfFunction(Def)) {
-        Instruction *DefI = Def->getMemoryInst();
-        // See through pointer-to-pointer bitcasts
-        SmallVector<const Value *, 4> Pointers;
-        getUnderlyingObjects(getLocForWriteEx(DefI)->Ptr, Pointers);
+      Instruction *DefI = Def->getMemoryInst();
+      SmallVector<const Value *, 4> Pointers;
+      auto DefLoc = getLocForWriteEx(DefI);
+      if (!DefLoc)
+        continue;
+      getUnderlyingObjects(DefLoc->Ptr, Pointers);
 
-        LLVM_DEBUG(dbgs() << "   ... MemoryDef is not accessed until the end "
-                             "of the function\n");
-        bool CanKill = true;
-        for (const Value *Pointer : Pointers) {
-          if (!InvisibleToCallerAfterRet.count(Pointer)) {
-            CanKill = false;
-            break;
-          }
+      bool CanKill = true;
+      for (const Value *Pointer : Pointers) {
+        if (!InvisibleToCallerAfterRet.count(Pointer)) {
+          CanKill = false;
+          break;
         }
+      }
 
-        if (CanKill) {
-          deleteDeadInstruction(DefI);
-          ++NumFastStores;
-          MadeChange = true;
-        }
+      if (CanKill && isWriteAtEndOfFunction(Def)) {
+        // See through pointer-to-pointer bitcasts
+        LLVM_DEBUG(dbgs() << "   ... MemoryDef is not accessed until the end "
+                             "of the function\n");
+        deleteDeadInstruction(DefI);
+        ++NumFastStores;
+        MadeChange = true;
       }
     }
     return MadeChange;