[PATCH] D23021: GVN-hoist: compute DFS numbers once

Sebastian Pop via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 1 10:17:10 PDT 2016


sebpop created this revision.
sebpop added a reviewer: dberlin.
sebpop added a subscriber: llvm-commits.

With this patch we compute the DFS numbers of instructions only once and update them during the code generation when an instruction gets hoisted.
Passes check and test-suite on x86_64-linux.

https://reviews.llvm.org/D23021

Files:
  llvm/lib/Transforms/Scalar/GVNHoist.cpp

Index: llvm/lib/Transforms/Scalar/GVNHoist.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/GVNHoist.cpp
+++ llvm/lib/Transforms/Scalar/GVNHoist.cpp
@@ -72,8 +72,16 @@
     //
     // assert(A != B);
 
-    unsigned ADFS = DFSNumber.lookup(A);
-    unsigned BDFS = DFSNumber.lookup(B);
+    const BasicBlock *BA = A->getParent();
+    const BasicBlock *BB = B->getParent();
+    unsigned ADFS, BDFS;
+    if (BA == BB) {
+      ADFS = DFSNumber.lookup(A);
+      BDFS = DFSNumber.lookup(B);
+    } else {
+      ADFS = DFSNumber.lookup(BA);
+      BDFS = DFSNumber.lookup(BB);
+    }
     assert (ADFS && BDFS);
     return ADFS < BDFS;
   }
@@ -195,15 +203,17 @@
     bool Res = false;
     MemorySSA M(F, AA, DT);
     MSSA = &M;
+    // Perform DFS Numbering of instructions.
+    unsigned BBI = 0;
+    for (const BasicBlock *BB : depth_first(&F.getEntryBlock())) {
+      DFSNumber[BB] = ++BBI;
+      unsigned I = 0;
+      for (auto &Inst: *BB)
+        DFSNumber[&Inst] = ++I;
+    }
 
     // FIXME: use lazy evaluation of VN to avoid the fix-point computation.
     while (1) {
-      // Perform DFS Numbering of instructions.
-      unsigned I = 0;
-      for (const BasicBlock *BB : depth_first(&F.getEntryBlock()))
-        for (auto &Inst: *BB)
-          DFSNumber.insert({&Inst, ++I});
-
       auto HoistStat = hoistExpressions(F);
       if (HoistStat.first + HoistStat.second == 0)
         return Res;
@@ -215,9 +225,6 @@
         VN.clear();
 
       Res = true;
-
-      // DFS numbers change when instructions are hoisted: clear and recompute.
-      DFSNumber.clear();
     }
 
     return Res;
@@ -741,7 +748,10 @@
           continue;
 
         // Move the instruction at the end of HoistPt.
-        Repl->moveBefore(HoistPt->getTerminator());
+        Instruction *Last = HoistPt->getTerminator();
+        Repl->moveBefore(Last);
+
+        DFSNumber[Repl] = DFSNumber[Last]++;
       }
 
       MemoryAccess *NewMemAcc = nullptr;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23021.66339.patch
Type: text/x-patch
Size: 2015 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160801/cf90d86c/attachment.bin>


More information about the llvm-commits mailing list