diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/ConstantHoisting.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/ConstantHoisting.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp index 28a31a97025..0fca617be7e 100644 --- a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp +++ b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp @@ -148,6 +148,8 @@ void ConstantHoisting::CollectConstant(User * U, unsigned Opcode, ConstantCandidate &CC = ConstantMap[C]; CC.CumulativeCost += Cost; CC.Uses.push_back(U); + DEBUG(dbgs() << "Collect constant " << *C << " with cost " << Cost + << " from " << *U << '\n'); } } @@ -279,6 +281,20 @@ static void CollectBasicBlocks(SmallPtrSet<BasicBlock *, 4> &BBs, Function &F, BBs.insert(I->getParent()); } +/// \brief Find the instruction we should insert the constant materialization +/// before. +static Instruction *getMatInsertPt(Instruction *I, const DominatorTree *DT) { + if (!isa<PHINode>(I) && !isa<LandingPadInst>(I)) // Simple case. + return I; + + // We can't insert directly before a phi node or landing pad. Insert before + // the terminator of the dominating block. + assert(&I->getParent()->getParent()->getEntryBlock() != I->getParent() && + "PHI or landing pad in entry block!"); + BasicBlock *IDom = DT->getNode(I->getParent())->getIDom()->getBlock(); + return IDom->getTerminator(); +} + /// \brief Find an insertion point that dominates all uses. Instruction *ConstantHoisting:: FindConstantInsertionPoint(Function &F, const ConstantInfo &CI) const { @@ -291,10 +307,10 @@ FindConstantInsertionPoint(Function &F, const ConstantInfo &CI) const { RCI != RCE; ++RCI) for (SmallVectorImpl<User *>::const_iterator U = RCI->Uses.begin(), E = RCI->Uses.end(); U != E; ++U) - CollectBasicBlocks(BBs, F, *U); + CollectBasicBlocks(BBs, F, *U); if (BBs.count(Entry)) - return Entry->getFirstInsertionPt(); + return getMatInsertPt(&Entry->front(), DT); while (BBs.size() >= 2) { BasicBlock *BB, *BB1, *BB2; @@ -302,27 +318,14 @@ FindConstantInsertionPoint(Function &F, const ConstantInfo &CI) const { BB2 = *llvm::next(BBs.begin()); BB = DT->findNearestCommonDominator(BB1, BB2); if (BB == Entry) - return Entry->getFirstInsertionPt(); + return getMatInsertPt(&Entry->front(), DT); BBs.erase(BB1); BBs.erase(BB2); BBs.insert(BB); } assert((BBs.size() == 1) && "Expected only one element."); - return (*BBs.begin())->getFirstInsertionPt(); -} - -/// \brief Find the instruction we should insert the constant materialization -/// before. -static Instruction *getMatInsertPt(Instruction *I, const DominatorTree *DT) { - if (!isa<PHINode>(I) && !isa<LandingPadInst>(I)) // Simple case. - return I; - - // We can't insert directly before a phi node or landing pad. Insert before - // the terminator of the dominating block. - assert(&I->getParent()->getParent()->getEntryBlock() != I->getParent() && - "PHI or landing pad in entry block!"); - BasicBlock *IDom = DT->getNode(I->getParent())->getIDom()->getBlock(); - return IDom->getTerminator(); + Instruction &FirstInst = (*BBs.begin())->front(); + return getMatInsertPt(&FirstInst, DT); } /// \brief Emit materialization code for all rebased constants and update their |