mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
Remove the temporary flag -disable-unroll-scev and dead code.
SCEV should now be used for trip count analysis, not LoopInfo. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145262 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -165,99 +165,6 @@ PHINode *Loop::getCanonicalInductionVariable() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// getTripCount - Return a loop-invariant LLVM value indicating the number of
|
||||
/// times the loop will be executed. Note that this means that the backedge
|
||||
/// of the loop executes N-1 times. If the trip-count cannot be determined,
|
||||
/// this returns null.
|
||||
///
|
||||
/// The IndVarSimplify pass transforms loops to have a form that this
|
||||
/// function easily understands.
|
||||
///
|
||||
Value *Loop::getTripCount() const {
|
||||
// Canonical loops will end with a 'cmp ne I, V', where I is the incremented
|
||||
// canonical induction variable and V is the trip count of the loop.
|
||||
PHINode *IV = getCanonicalInductionVariable();
|
||||
if (IV == 0 || IV->getNumIncomingValues() != 2) return 0;
|
||||
|
||||
bool P0InLoop = contains(IV->getIncomingBlock(0));
|
||||
Value *Inc = IV->getIncomingValue(!P0InLoop);
|
||||
BasicBlock *BackedgeBlock = IV->getIncomingBlock(!P0InLoop);
|
||||
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(BackedgeBlock->getTerminator()))
|
||||
if (BI->isConditional()) {
|
||||
if (ICmpInst *ICI = dyn_cast<ICmpInst>(BI->getCondition())) {
|
||||
if (ICI->getOperand(0) == Inc) {
|
||||
if (BI->getSuccessor(0) == getHeader()) {
|
||||
if (ICI->getPredicate() == ICmpInst::ICMP_NE)
|
||||
return ICI->getOperand(1);
|
||||
} else if (ICI->getPredicate() == ICmpInst::ICMP_EQ) {
|
||||
return ICI->getOperand(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// getSmallConstantTripCount - Returns the trip count of this loop as a
|
||||
/// normal unsigned value, if possible. Returns 0 if the trip count is unknown
|
||||
/// or not constant. Will also return 0 if the trip count is very large
|
||||
/// (>= 2^32)
|
||||
unsigned Loop::getSmallConstantTripCount() const {
|
||||
Value* TripCount = this->getTripCount();
|
||||
if (TripCount) {
|
||||
if (ConstantInt *TripCountC = dyn_cast<ConstantInt>(TripCount)) {
|
||||
// Guard against huge trip counts.
|
||||
if (TripCountC->getValue().getActiveBits() <= 32) {
|
||||
return (unsigned)TripCountC->getZExtValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// getSmallConstantTripMultiple - Returns the largest constant divisor of the
|
||||
/// trip count of this loop as a normal unsigned value, if possible. This
|
||||
/// means that the actual trip count is always a multiple of the returned
|
||||
/// value (don't forget the trip count could very well be zero as well!).
|
||||
///
|
||||
/// Returns 1 if the trip count is unknown or not guaranteed to be the
|
||||
/// multiple of a constant (which is also the case if the trip count is simply
|
||||
/// constant, use getSmallConstantTripCount for that case), Will also return 1
|
||||
/// if the trip count is very large (>= 2^32).
|
||||
unsigned Loop::getSmallConstantTripMultiple() const {
|
||||
Value* TripCount = this->getTripCount();
|
||||
// This will hold the ConstantInt result, if any
|
||||
ConstantInt *Result = NULL;
|
||||
if (TripCount) {
|
||||
// See if the trip count is constant itself
|
||||
Result = dyn_cast<ConstantInt>(TripCount);
|
||||
// if not, see if it is a multiplication
|
||||
if (!Result)
|
||||
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(TripCount)) {
|
||||
switch (BO->getOpcode()) {
|
||||
case BinaryOperator::Mul:
|
||||
Result = dyn_cast<ConstantInt>(BO->getOperand(1));
|
||||
break;
|
||||
case BinaryOperator::Shl:
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1)))
|
||||
if (CI->getValue().getActiveBits() <= 5)
|
||||
return 1u << CI->getZExtValue();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Guard against huge trip counts.
|
||||
if (Result && Result->getValue().getActiveBits() <= 32) {
|
||||
return (unsigned)Result->getZExtValue();
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// isLCSSAForm - Return true if the Loop is in LCSSA form
|
||||
bool Loop::isLCSSAForm(DominatorTree &DT) const {
|
||||
// Sort the blocks vector so that we can use binary search to do quick
|
||||
|
Reference in New Issue
Block a user