summaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2013-01-24 16:44:25 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2013-01-24 16:44:25 +0000
commitd5a80c7358d01cde9e166bebc8a3ffa0eca3aa54 (patch)
treefde4f0b687e2076d5ee05d4d07cfa623388ec7e0 /lib/Transforms/Utils
parente5742464895b7f1fcc6a5b968b72f6ec66a1fd44 (diff)
downloadllvm-d5a80c7358d01cde9e166bebc8a3ffa0eca3aa54.tar.gz
llvm-d5a80c7358d01cde9e166bebc8a3ffa0eca3aa54.tar.bz2
llvm-d5a80c7358d01cde9e166bebc8a3ffa0eca3aa54.tar.xz
Reapply chandlerc's r173342 now that the miscompile it was triggering is fixed.
Original commit message: Plug TTI into the speculation logic, giving it a real cost interface that can be specialized by targets. The goal here is not to be more aggressive, but to just be more accurate with very obvious cases. There are instructions which are known to be truly free and which were not being modeled as such in this code -- see the regression test which is distilled from an inner loop of zlib. Everywhere the TTI cost model is insufficiently conservative I've added explicit checks with FIXME comments to go add proper modelling of these cost factors. If this causes regressions, the likely solution is to make TTI even more conservative in its cost estimates, but test cases will help here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173357 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils')
-rw-r--r--lib/Transforms/Utils/SimplifyCFG.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
index 11cb25d0f9..9f3464de43 100644
--- a/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -1369,7 +1369,8 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
/// \endcode
///
/// \returns true if the conditional block is removed.
-static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
+static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
+ const TargetTransformInfo &TTI) {
// Be conservative for now. FP select instruction can often be expensive.
Value *BrCond = BI->getCondition();
if (isa<FCmpInst>(BrCond))
@@ -1398,15 +1399,22 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
// Only speculatively execution a single instruction (not counting the
// terminator) for now.
- ++SpeculationCost;
- if (SpeculationCost > 1)
+ SpeculationCost += TTI.getUserCost(I);
+ if (SpeculationCost > TargetTransformInfo::TCC_Basic)
return false;
// Don't hoist the instruction if it's unsafe or expensive.
if (!isSafeToSpeculativelyExecute(I))
return false;
- if (ComputeSpeculationCost(I) > PHINodeFoldingThreshold)
+ // FIXME: This should really be a cost metric, but our cost model doesn't
+ // accurately model the expense of select.
+ if (isa<SelectInst>(I))
return false;
+ // FIXME: The cost metric currently doesn't reason accurately about simple
+ // versus complex GEPs, take a conservative approach here.
+ if (GEPOperator *GEP = dyn_cast<GEPOperator>(I))
+ if (!GEP->hasAllConstantIndices())
+ return false;
// Do not hoist the instruction if any of its operands are defined but not
// used in this BB. The transformation will prevent the operand from
@@ -1449,9 +1457,10 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
// Account for the cost of an unfolded ConstantExpr which could end up
// getting expanded into Instructions.
// FIXME: This doesn't account for how many operations are combined in the
- // constant expression.
- ++SpeculationCost;
- if (SpeculationCost > 1)
+ // constant expression. The cost functions in TTI don't yet correctly model
+ // constant expression costs.
+ SpeculationCost += TargetTransformInfo::TCC_Basic;
+ if (SpeculationCost > TargetTransformInfo::TCC_Basic)
return false;
}
@@ -3868,7 +3877,7 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) {
TerminatorInst *Succ0TI = BI->getSuccessor(0)->getTerminator();
if (Succ0TI->getNumSuccessors() == 1 &&
Succ0TI->getSuccessor(0) == BI->getSuccessor(1))
- if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0)))
+ if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0), TTI))
return SimplifyCFG(BB, TTI, TD) | true;
}
} else if (BI->getSuccessor(1)->getSinglePredecessor() != 0) {
@@ -3877,7 +3886,7 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) {
TerminatorInst *Succ1TI = BI->getSuccessor(1)->getTerminator();
if (Succ1TI->getNumSuccessors() == 1 &&
Succ1TI->getSuccessor(0) == BI->getSuccessor(0))
- if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1)))
+ if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1), TTI))
return SimplifyCFG(BB, TTI, TD) | true;
}