diff options
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVNHoist.cpp | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVNHoist.cpp b/llvm/lib/Transforms/Scalar/GVNHoist.cpp index e12644a0185..5a50f54cf5f 100644 --- a/llvm/lib/Transforms/Scalar/GVNHoist.cpp +++ b/llvm/lib/Transforms/Scalar/GVNHoist.cpp @@ -53,10 +53,10 @@ namespace { // Provides a sorting function based on the execution order of two instructions. struct SortByDFSIn { private: - DenseMap<const Value *, unsigned> &DFSNumber; + DenseMap<const BasicBlock *, unsigned> &DFSNumber; public: - SortByDFSIn(DenseMap<const Value *, unsigned> &D) : DFSNumber(D) {} + SortByDFSIn(DenseMap<const BasicBlock *, unsigned> &D) : DFSNumber(D) {} // Returns true when A executes before B. bool operator()(const Instruction *A, const Instruction *B) const { @@ -74,10 +74,9 @@ public: if (NA < NB) return true; if (NA == NB) { - unsigned ADFS = DFSNumber.lookup(A); - unsigned BDFS = DFSNumber.lookup(B); - assert (ADFS && ADFS); - return ADFS < BDFS; + // Sort them in the order they occur in the same basic block. + BasicBlock::const_iterator AI(A), BI(B); + return std::distance(AI, BI) < 0; } return false; } @@ -197,13 +196,9 @@ public: VN.setMemDep(MD); bool Res = false; - // Perform DFS Numbering of blocks and instructions. unsigned I = 0; - for (const BasicBlock *BB : depth_first(&F.getEntryBlock())) { + for (const BasicBlock *BB : depth_first(&F.getEntryBlock())) DFSNumber.insert({BB, ++I}); - for (auto &Inst: *BB) - DFSNumber.insert({&Inst, ++I}); - } // FIXME: use lazy evaluation of VN to avoid the fix-point computation. while (1) { @@ -233,7 +228,7 @@ private: AliasAnalysis *AA; MemoryDependenceResults *MD; const bool OptForMinSize; - DenseMap<const Value *, unsigned> DFSNumber; + DenseMap<const BasicBlock *, unsigned> DFSNumber; BBSideEffectsSet BBSideEffects; MemorySSA *MSSA; int HoistedCtr; @@ -295,14 +290,16 @@ private: } /* Return true when I1 appears before I2 in the instructions of BB. */ - bool firstInBB(const Instruction *I1, const Instruction *I2) { - assert (I1->getParent() == I2->getParent()); - unsigned I1DFS = DFSNumber.lookup(I1); - unsigned I2DFS = DFSNumber.lookup(I2); - assert (I1DFS && I2DFS); - return I1DFS < I2DFS; - } + bool firstInBB(BasicBlock *BB, const Instruction *I1, const Instruction *I2) { + for (Instruction &I : *BB) { + if (&I == I1) + return true; + if (&I == I2) + return false; + } + llvm_unreachable("I1 and I2 not found in BB"); + } // Return true when there are users of Def in BB. bool hasMemoryUseOnPath(MemoryAccess *Def, const BasicBlock *BB, const Instruction *OldPt) { @@ -326,7 +323,7 @@ private: return true; // It is only harmful to hoist when the use is before OldPt. - if (firstInBB(MU->getMemoryInst(), OldPt)) + if (firstInBB(UBB, MU->getMemoryInst(), OldPt)) return true; } @@ -440,7 +437,7 @@ private: if (NewBB == DBB && !MSSA->isLiveOnEntryDef(D)) if (auto *UD = dyn_cast<MemoryUseOrDef>(D)) - if (firstInBB(NewPt, UD->getMemoryInst())) + if (firstInBB(DBB, NewPt, UD->getMemoryInst())) // Cannot move the load or store to NewPt above its definition in D. return false; @@ -517,7 +514,7 @@ private: if (BB == HoistBB) { NewHoistBB = HoistBB; - NewHoistPt = firstInBB(Insn, HoistPt) ? Insn : HoistPt; + NewHoistPt = firstInBB(BB, Insn, HoistPt) ? Insn : HoistPt; } else { NewHoistBB = DT->findNearestCommonDominator(HoistBB, BB); if (NewHoistBB == BB) |