mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
Revert r173342 temporarily. It appears to cause a very late miscompile
of stage2 in a bootstrap. Still investigating.... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173343 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1369,8 +1369,7 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
|
||||
/// \endcode
|
||||
///
|
||||
/// \returns true if the conditional block is removed.
|
||||
static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
||||
const TargetTransformInfo &TTI) {
|
||||
static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
|
||||
// Be conservative for now. FP select instruction can often be expensive.
|
||||
Value *BrCond = BI->getCondition();
|
||||
if (isa<FCmpInst>(BrCond))
|
||||
@@ -1399,22 +1398,15 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
||||
|
||||
// Only speculatively execution a single instruction (not counting the
|
||||
// terminator) for now.
|
||||
SpeculationCost += TTI.getUserCost(I);
|
||||
if (SpeculationCost > TargetTransformInfo::TCC_Basic)
|
||||
++SpeculationCost;
|
||||
if (SpeculationCost > 1)
|
||||
return false;
|
||||
|
||||
// Don't hoist the instruction if it's unsafe or expensive.
|
||||
if (!isSafeToSpeculativelyExecute(I))
|
||||
return false;
|
||||
// FIXME: This should really be a cost metric, but our cost model doesn't
|
||||
// accurately model the expense of select.
|
||||
if (isa<SelectInst>(I))
|
||||
if (ComputeSpeculationCost(I) > PHINodeFoldingThreshold)
|
||||
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
|
||||
@@ -1457,10 +1449,9 @@ 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. The cost functions in TTI don't yet correctly model
|
||||
// constant expression costs.
|
||||
SpeculationCost += TargetTransformInfo::TCC_Basic;
|
||||
if (SpeculationCost > TargetTransformInfo::TCC_Basic)
|
||||
// constant expression.
|
||||
++SpeculationCost;
|
||||
if (SpeculationCost > 1)
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3877,7 +3868,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), TTI))
|
||||
if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0)))
|
||||
return SimplifyCFG(BB, TTI, TD) | true;
|
||||
}
|
||||
} else if (BI->getSuccessor(1)->getSinglePredecessor() != 0) {
|
||||
@@ -3886,7 +3877,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), TTI))
|
||||
if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1)))
|
||||
return SimplifyCFG(BB, TTI, TD) | true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user