diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2018-05-31 08:08:34 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2018-05-31 08:08:34 +0000 |
commit | 0bad5be430b2620b46909e23f447f6aabc340145 (patch) | |
tree | 7c9b09850444068032cff58f628a71ea3ccce2c6 | |
parent | 71d4afb90a3973c1ca0771188cac5a972b52e996 (diff) | |
download | bcm5719-llvm-0bad5be430b2620b46909e23f447f6aabc340145.tar.gz bcm5719-llvm-0bad5be430b2620b46909e23f447f6aabc340145.zip |
[NFC] Factor out a method for further extension
llvm-svn: 333633
-rw-r--r-- | llvm/lib/Transforms/Scalar/EarlyCSE.cpp | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp index a65d1556704..5e031a330bf 100644 --- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp +++ b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp @@ -579,6 +579,9 @@ private: bool processNode(DomTreeNode *Node); + bool handleBranchCondition(Instruction *CondInst, const BranchInst *BI, + const BasicBlock *BB, const BasicBlock *Pred); + Value *getOrCreateResult(Value *Inst, Type *ExpectedType) const { if (auto *LI = dyn_cast<LoadInst>(Inst)) return LI; @@ -707,6 +710,33 @@ bool EarlyCSE::isOperatingOnInvariantMemAt(Instruction *I, unsigned GenAt) { return AvailableInvariants.lookup(MemLoc) <= GenAt; } +bool EarlyCSE::handleBranchCondition(Instruction *CondInst, + const BranchInst *BI, const BasicBlock *BB, + const BasicBlock *Pred) { + assert(BI->isConditional() && "Should be a conditional branch!"); + assert(BI->getCondition() == CondInst && "Wrong condition?"); + assert(BI->getSuccessor(0) == BB || BI->getSuccessor(1) == BB); + auto *TorF = (BI->getSuccessor(0) == BB) + ? ConstantInt::getTrue(BB->getContext()) + : ConstantInt::getFalse(BB->getContext()); + AvailableValues.insert(CondInst, TorF); + LLVM_DEBUG(dbgs() << "EarlyCSE CVP: Add conditional value for '" + << CondInst->getName() << "' as " << *TorF << " in " + << BB->getName() << "\n"); + if (!DebugCounter::shouldExecute(CSECounter)) { + LLVM_DEBUG(dbgs() << "Skipping due to debug counter\n"); + } else { + // Replace all dominated uses with the known value. + if (unsigned Count = replaceDominatedUsesWith(CondInst, TorF, DT, + BasicBlockEdge(Pred, BB))) { + + NumCSECVP += Count; + return true; + } + } + return false; +} + bool EarlyCSE::processNode(DomTreeNode *Node) { bool Changed = false; BasicBlock *BB = Node->getBlock(); @@ -730,26 +760,8 @@ bool EarlyCSE::processNode(DomTreeNode *Node) { auto *BI = dyn_cast<BranchInst>(Pred->getTerminator()); if (BI && BI->isConditional()) { auto *CondInst = dyn_cast<Instruction>(BI->getCondition()); - if (CondInst && SimpleValue::canHandle(CondInst)) { - assert(BI->getSuccessor(0) == BB || BI->getSuccessor(1) == BB); - auto *TorF = (BI->getSuccessor(0) == BB) - ? ConstantInt::getTrue(BB->getContext()) - : ConstantInt::getFalse(BB->getContext()); - AvailableValues.insert(CondInst, TorF); - LLVM_DEBUG(dbgs() << "EarlyCSE CVP: Add conditional value for '" - << CondInst->getName() << "' as " << *TorF << " in " - << BB->getName() << "\n"); - if (!DebugCounter::shouldExecute(CSECounter)) { - LLVM_DEBUG(dbgs() << "Skipping due to debug counter\n"); - } else { - // Replace all dominated uses with the known value. - if (unsigned Count = replaceDominatedUsesWith( - CondInst, TorF, DT, BasicBlockEdge(Pred, BB))) { - Changed = true; - NumCSECVP += Count; - } - } - } + if (CondInst && SimpleValue::canHandle(CondInst)) + Changed |= handleBranchCondition(CondInst, BI, BB, Pred); } } |