diff options
author | Justin Bogner <mail@justinbogner.com> | 2015-08-18 07:00:34 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2015-08-18 07:00:34 +0000 |
commit | 9f00ebaedae6c6f8eeee22c94f3825a3b1812ebd (patch) | |
tree | 41d4f7d75619f86a7eba37175442e169f5f7c94c /llvm/lib/Transforms/Scalar/GVN.cpp | |
parent | bd9fec1eaacb7f0769017aef8f6f6453dd160b7f (diff) | |
download | bcm5719-llvm-9f00ebaedae6c6f8eeee22c94f3825a3b1812ebd.tar.gz bcm5719-llvm-9f00ebaedae6c6f8eeee22c94f3825a3b1812ebd.zip |
Revert "Constant propagation after hiting llvm.assume"
This was also failing bootstrap:
http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_build
This reverts r245265.
llvm-svn: 245269
Diffstat (limited to 'llvm/lib/Transforms/Scalar/GVN.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/GVN.cpp | 71 |
1 files changed, 3 insertions, 68 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 075fea89212..f256af81fc8 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/lib/Transforms/Scalar/GVN.cpp @@ -608,10 +608,6 @@ namespace { DenseMap<uint32_t, LeaderTableEntry> LeaderTable; BumpPtrAllocator TableAllocator; - // Block-local map of equivalent values to their leader, does not - // propagate to any successors. Entries added mid-block are applied - // to the remaining instructions in the block. - SmallMapVector<llvm::Value *, llvm::Constant *, 4> ReplaceWithConstMap; SmallVector<Instruction*, 8> InstrsToErase; typedef SmallVector<NonLocalDepResult, 64> LoadDepVect; @@ -703,7 +699,6 @@ namespace { // Helper functions of redundant load elimination bool processLoad(LoadInst *L); bool processNonLocalLoad(LoadInst *L); - bool processAssumeIntrinsic(IntrinsicInst *II); void AnalyzeLoadAvailability(LoadInst *LI, LoadDepVect &Deps, AvailValInBlkVect &ValuesPerBlock, UnavailBlkVect &UnavailableBlocks); @@ -724,7 +719,6 @@ namespace { void verifyRemoved(const Instruction *I) const; bool splitCriticalEdges(); BasicBlock *splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ); - bool replaceOperandsWithConsts(Instruction *I) const; bool propagateEquality(Value *LHS, Value *RHS, const BasicBlockEdge &Root); bool processFoldableCondBr(BranchInst *BI); void addDeadBlock(BasicBlock *BB); @@ -1765,38 +1759,6 @@ bool GVN::processNonLocalLoad(LoadInst *LI) { return PerformLoadPRE(LI, ValuesPerBlock, UnavailableBlocks); } -bool GVN::processAssumeIntrinsic(IntrinsicInst *IntrinsicI) { - assert(IntrinsicI->getIntrinsicID() == Intrinsic::assume && - "This function can only be called with llvm.assume intrinsic"); - Value *V = IntrinsicI->getArgOperand(0); - Constant *True = ConstantInt::getTrue(V->getContext()); - bool Changed = false; - for (BasicBlock *Successor : successors(IntrinsicI->getParent())) { - BasicBlockEdge Edge(IntrinsicI->getParent(), Successor); - - // This property is only true in dominated successors, propagateEquality - // will check dominance for us. - Changed |= propagateEquality(V, True, Edge); - } - - if (auto *CmpI = dyn_cast<CmpInst>(V)) { - if (CmpI->getPredicate() == CmpInst::Predicate::ICMP_EQ || - CmpI->getPredicate() == CmpInst::Predicate::FCMP_OEQ || - (CmpI->getPredicate() == CmpInst::Predicate::FCMP_UEQ && - CmpI->getFastMathFlags().noNaNs())) { - Value *CmpLHS = CmpI->getOperand(0); - Value *CmpRHS = CmpI->getOperand(1); - if (isa<Constant>(CmpLHS)) - std::swap(CmpLHS, CmpRHS); - auto *RHSConst = dyn_cast<Constant>(CmpRHS); - - // If only one operand is constant. - if (RHSConst != nullptr && !isa<Constant>(CmpLHS)) - ReplaceWithConstMap[CmpLHS] = RHSConst; - } - } - return Changed; -} static void patchReplacementInstruction(Instruction *I, Value *Repl) { // Patch the replacement so that it is not more restrictive than the value @@ -2069,21 +2031,6 @@ static bool isOnlyReachableViaThisEdge(const BasicBlockEdge &E, return Pred != nullptr; } -// Tries to replace instruction with const, using information from -// ReplaceWithConstMap. -bool GVN::replaceOperandsWithConsts(Instruction *Instr) const { - bool Changed = false; - for (unsigned OpNum = 0; OpNum < Instr->getNumOperands(); ++OpNum) { - Value *Operand = Instr->getOperand(OpNum); - auto it = ReplaceWithConstMap.find(Operand); - if (it != ReplaceWithConstMap.end()) { - Instr->setOperand(OpNum, it->second); - Changed = true; - } - } - return Changed; -} - /// The given values are known to be equal in every block /// dominated by 'Root'. Exploit this, for example by replacing 'LHS' with /// 'RHS' everywhere in the scope. Returns whether a change was made. @@ -2100,13 +2047,11 @@ bool GVN::propagateEquality(Value *LHS, Value *RHS, std::pair<Value*, Value*> Item = Worklist.pop_back_val(); LHS = Item.first; RHS = Item.second; - if (LHS == RHS) - continue; + if (LHS == RHS) continue; assert(LHS->getType() == RHS->getType() && "Equality but unequal types!"); // Don't try to propagate equalities between constants. - if (isa<Constant>(LHS) && isa<Constant>(RHS)) - continue; + if (isa<Constant>(LHS) && isa<Constant>(RHS)) continue; // Prefer a constant on the right-hand side, or an Argument if no constants. if (isa<Constant>(LHS) || (isa<Argument>(LHS) && !isa<Constant>(RHS))) @@ -2257,10 +2202,6 @@ bool GVN::processInstruction(Instruction *I) { return true; } - if (IntrinsicInst *IntrinsicI = dyn_cast<IntrinsicInst>(I)) - if (IntrinsicI->getIntrinsicID() == Intrinsic::assume) - return processAssumeIntrinsic(IntrinsicI); - if (LoadInst *LI = dyn_cast<LoadInst>(I)) { if (processLoad(LI)) return true; @@ -2325,8 +2266,7 @@ bool GVN::processInstruction(Instruction *I) { // Instructions with void type don't return a value, so there's // no point in trying to find redundancies in them. - if (I->getType()->isVoidTy()) - return false; + if (I->getType()->isVoidTy()) return false; uint32_t NextNum = VN.getNextUnusedValueNumber(); unsigned Num = VN.lookup_or_add(I); @@ -2433,15 +2373,10 @@ bool GVN::processBlock(BasicBlock *BB) { if (DeadBlocks.count(BB)) return false; - // Clearing map before every BB because it can be used only for single BB. - ReplaceWithConstMap.clear(); bool ChangedFunction = false; for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) { - if (!ReplaceWithConstMap.empty()) - ChangedFunction |= replaceOperandsWithConsts(BI); - ChangedFunction |= processInstruction(BI); if (InstrsToErase.empty()) { ++BI; |