diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/GVNSink.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVNSink.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVNSink.cpp b/llvm/lib/Transforms/Scalar/GVNSink.cpp index e612a82fc89a..720b8e71fd56 100644 --- a/llvm/lib/Transforms/Scalar/GVNSink.cpp +++ b/llvm/lib/Transforms/Scalar/GVNSink.cpp @@ -35,7 +35,6 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/DenseMapInfo.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/Hashing.h" #include "llvm/ADT/None.h" @@ -45,7 +44,6 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" -#include "llvm/ADT/StringExtras.h" #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/CFG.h" @@ -383,6 +381,8 @@ public: } }; +using BasicBlocksSet = SmallPtrSet<const BasicBlock *, 32>; + class ValueTable { DenseMap<Value *, uint32_t> ValueNumbering; DenseMap<GVNExpression::Expression *, uint32_t> ExpressionNumbering; @@ -390,6 +390,7 @@ class ValueTable { BumpPtrAllocator Allocator; ArrayRecycler<Value *> Recycler; uint32_t nextValueNumber = 1; + BasicBlocksSet ReachableBBs; /// Create an expression for I based on its opcode and its uses. If I /// touches or reads memory, the expression is also based upon its memory @@ -421,6 +422,11 @@ class ValueTable { public: ValueTable() = default; + /// Set basic blocks reachable from entry block. + void setReachableBBs(const BasicBlocksSet &ReachableBBs) { + this->ReachableBBs = ReachableBBs; + } + /// Returns the value number for the specified value, assigning /// it a new number if it did not have one before. uint32_t lookupOrAdd(Value *V) { @@ -434,6 +440,9 @@ public: } Instruction *I = cast<Instruction>(V); + if (!ReachableBBs.contains(I->getParent())) + return ~0U; + InstructionUseExpr *exp = nullptr; switch (I->getOpcode()) { case Instruction::Load: @@ -570,6 +579,7 @@ public: unsigned NumSunk = 0; ReversePostOrderTraversal<Function*> RPOT(&F); + VN.setReachableBBs(BasicBlocksSet(RPOT.begin(), RPOT.end())); for (auto *N : RPOT) NumSunk += sinkBB(N); @@ -648,12 +658,7 @@ Optional<SinkingInstructionCandidate> GVNSink::analyzeInstructionForSinking( VNums[N]++; } unsigned VNumToSink = - std::max_element(VNums.begin(), VNums.end(), - [](const std::pair<uint32_t, unsigned> &I, - const std::pair<uint32_t, unsigned> &J) { - return I.second < J.second; - }) - ->first; + std::max_element(VNums.begin(), VNums.end(), llvm::less_second())->first; if (VNums[VNumToSink] == 1) // Can't sink anything! @@ -776,12 +781,9 @@ unsigned GVNSink::sinkBB(BasicBlock *BBEnd) { unsigned NumOrigPreds = Preds.size(); // We can only sink instructions through unconditional branches. - for (auto I = Preds.begin(); I != Preds.end();) { - if ((*I)->getTerminator()->getNumSuccessors() != 1) - I = Preds.erase(I); - else - ++I; - } + llvm::erase_if(Preds, [](BasicBlock *BB) { + return BB->getTerminator()->getNumSuccessors() != 1; + }); LockstepReverseIterator LRI(Preds); SmallVector<SinkingInstructionCandidate, 4> Candidates; |