summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Scalar/ConstantHoisting.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/ConstantHoisting.cpp39
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
OpenPOWER on IntegriCloud