[llvm] r277650 - GVN-hoist: compute DFS numbers once
Sebastian Pop via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 3 13:54:36 PDT 2016
Author: spop
Date: Wed Aug 3 15:54:36 2016
New Revision: 277650
URL: http://llvm.org/viewvc/llvm-project?rev=277650&view=rev
Log:
GVN-hoist: compute DFS numbers once
With this patch we compute the DFS numbers of instructions only once and update
them during the code generation when an instruction gets hoisted.
Differential Revision: https://reviews.llvm.org/D23021
Modified:
llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp?rev=277650&r1=277649&r2=277650&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp Wed Aug 3 15:54:36 2016
@@ -72,8 +72,16 @@ public:
//
// 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 @@ public:
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 @@ public:
VN.clear();
Res = true;
-
- // DFS numbers change when instructions are hoisted: clear and recompute.
- DFSNumber.clear();
}
return Res;
@@ -741,7 +748,10 @@ private:
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;
More information about the llvm-commits
mailing list