Revert "[SCEV] Clarify behavior around max backedge taken count"

This reverts commit r303497 since it breaks the msan bootstrap bot:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/1379/

llvm-svn: 303498
This commit is contained in:
Sanjoy Das 2017-05-21 05:02:12 +00:00
parent 5207168383
commit 8963650cfa
4 changed files with 27 additions and 58 deletions

View File

@ -656,12 +656,10 @@ private:
/// Test whether this BackedgeTakenInfo contains complete information. /// Test whether this BackedgeTakenInfo contains complete information.
bool hasFullInfo() const { return isComplete(); } bool hasFullInfo() const { return isComplete(); }
/// Return an expression indicating the exact *backedge-taken* /// Return an expression indicating the exact backedge-taken count of the
/// count of the loop if it is known or SCEVCouldNotCompute /// loop if it is known or SCEVCouldNotCompute otherwise. This is the
/// otherwise. If execution makes it to the backedge on every /// number of times the loop header can be guaranteed to execute, minus
/// iteration (i.e. there are no abnormal exists like exception /// one.
/// throws and thread exits) then this is the number of times the
/// loop header will execute minus one.
/// ///
/// If the SCEV predicate associated with the answer can be different /// If the SCEV predicate associated with the answer can be different
/// from AlwaysTrue, we must add a (non null) Predicates argument. /// from AlwaysTrue, we must add a (non null) Predicates argument.
@ -1400,11 +1398,11 @@ public:
const SCEV *getExitCount(const Loop *L, BasicBlock *ExitingBlock); const SCEV *getExitCount(const Loop *L, BasicBlock *ExitingBlock);
/// If the specified loop has a predictable backedge-taken count, return it, /// If the specified loop has a predictable backedge-taken count, return it,
/// otherwise return a SCEVCouldNotCompute object. The backedge-taken count is /// otherwise return a SCEVCouldNotCompute object. The backedge-taken count
/// the number of times the loop header will be branched to from within the /// is the number of times the loop header will be branched to from within
/// loop, assuming there are no abnormal exists like exception throws. This is /// the loop. This is one less than the trip count of the loop, since it
/// one less than the trip count of the loop, since it doesn't count the first /// doesn't count the first iteration, when the header is branched to from
/// iteration, when the header is branched to from outside the loop. /// outside the loop.
/// ///
/// Note that it is not valid to call this method on a loop without a /// Note that it is not valid to call this method on a loop without a
/// loop-invariant backedge-taken count (see /// loop-invariant backedge-taken count (see
@ -1419,10 +1417,8 @@ public:
const SCEV *getPredicatedBackedgeTakenCount(const Loop *L, const SCEV *getPredicatedBackedgeTakenCount(const Loop *L,
SCEVUnionPredicate &Predicates); SCEVUnionPredicate &Predicates);
/// When successful, this returns a SCEVConstant that is greater than or equal /// Similar to getBackedgeTakenCount, except return the least SCEV value
/// to (i.e. a "conservative over-approximation") of the value returend by /// that is known never to be less than the actual backedge taken count.
/// getBackedgeTakenCount. If such a value cannot be computed, it returns the
/// SCEVCouldNotCompute object.
const SCEV *getMaxBackedgeTakenCount(const Loop *L); const SCEV *getMaxBackedgeTakenCount(const Loop *L);
/// Return true if the backedge taken count is either the value returned by /// Return true if the backedge taken count is either the value returned by

View File

@ -5947,8 +5947,6 @@ ScalarEvolution::BackedgeTakenInfo::getMax(ScalarEvolution *SE) const {
if (any_of(ExitNotTaken, PredicateNotAlwaysTrue) || !getMax()) if (any_of(ExitNotTaken, PredicateNotAlwaysTrue) || !getMax())
return SE->getCouldNotCompute(); return SE->getCouldNotCompute();
assert((isa<SCEVCouldNotCompute>(getMax()) || isa<SCEVConstant>(getMax())) &&
"No point in having a non-constant max backedge taken count!");
return getMax(); return getMax();
} }
@ -5974,11 +5972,7 @@ bool ScalarEvolution::BackedgeTakenInfo::hasOperand(const SCEV *S,
} }
ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E) ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E)
: ExactNotTaken(E), MaxNotTaken(E), MaxOrZero(false) { : ExactNotTaken(E), MaxNotTaken(E), MaxOrZero(false) {}
assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
isa<SCEVConstant>(MaxNotTaken)) &&
"No point in having a non-constant max backedge taken count!");
}
ScalarEvolution::ExitLimit::ExitLimit( ScalarEvolution::ExitLimit::ExitLimit(
const SCEV *E, const SCEV *M, bool MaxOrZero, const SCEV *E, const SCEV *M, bool MaxOrZero,
@ -5987,9 +5981,6 @@ ScalarEvolution::ExitLimit::ExitLimit(
assert((isa<SCEVCouldNotCompute>(ExactNotTaken) || assert((isa<SCEVCouldNotCompute>(ExactNotTaken) ||
!isa<SCEVCouldNotCompute>(MaxNotTaken)) && !isa<SCEVCouldNotCompute>(MaxNotTaken)) &&
"Exact is not allowed to be less precise than Max"); "Exact is not allowed to be less precise than Max");
assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
isa<SCEVConstant>(MaxNotTaken)) &&
"No point in having a non-constant max backedge taken count!");
for (auto *PredSet : PredSetList) for (auto *PredSet : PredSetList)
for (auto *P : *PredSet) for (auto *P : *PredSet)
addPredicate(P); addPredicate(P);
@ -5998,19 +5989,11 @@ ScalarEvolution::ExitLimit::ExitLimit(
ScalarEvolution::ExitLimit::ExitLimit( ScalarEvolution::ExitLimit::ExitLimit(
const SCEV *E, const SCEV *M, bool MaxOrZero, const SCEV *E, const SCEV *M, bool MaxOrZero,
const SmallPtrSetImpl<const SCEVPredicate *> &PredSet) const SmallPtrSetImpl<const SCEVPredicate *> &PredSet)
: ExitLimit(E, M, MaxOrZero, {&PredSet}) { : ExitLimit(E, M, MaxOrZero, {&PredSet}) {}
assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
isa<SCEVConstant>(MaxNotTaken)) &&
"No point in having a non-constant max backedge taken count!");
}
ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E, const SCEV *M, ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E, const SCEV *M,
bool MaxOrZero) bool MaxOrZero)
: ExitLimit(E, M, MaxOrZero, None) { : ExitLimit(E, M, MaxOrZero, None) {}
assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
isa<SCEVConstant>(MaxNotTaken)) &&
"No point in having a non-constant max backedge taken count!");
}
/// Allocate memory for BackedgeTakenInfo and copy the not-taken count of each /// Allocate memory for BackedgeTakenInfo and copy the not-taken count of each
/// computable exit into a persistent ExitNotTakenInfo array. /// computable exit into a persistent ExitNotTakenInfo array.
@ -6035,8 +6018,6 @@ ScalarEvolution::BackedgeTakenInfo::BackedgeTakenInfo(
return ExitNotTakenInfo(ExitBB, EL.ExactNotTaken, std::move(Predicate)); return ExitNotTakenInfo(ExitBB, EL.ExactNotTaken, std::move(Predicate));
}); });
assert((isa<SCEVCouldNotCompute>(MaxCount) || isa<SCEVConstant>(MaxCount)) &&
"No point in having a non-constant max backedge taken count!");
} }
/// Invalidate this result and free the ExitNotTakenInfo array. /// Invalidate this result and free the ExitNotTakenInfo array.
@ -6298,7 +6279,7 @@ ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromCondImpl(
// to not. // to not.
if (isa<SCEVCouldNotCompute>(MaxBECount) && if (isa<SCEVCouldNotCompute>(MaxBECount) &&
!isa<SCEVCouldNotCompute>(BECount)) !isa<SCEVCouldNotCompute>(BECount))
MaxBECount = getConstant(getUnsignedRange(BECount).getUnsignedMax()); MaxBECount = BECount;
return ExitLimit(BECount, MaxBECount, false, return ExitLimit(BECount, MaxBECount, false,
{&EL0.Predicates, &EL1.Predicates}); {&EL0.Predicates, &EL1.Predicates});
@ -7602,20 +7583,13 @@ ScalarEvolution::howFarToZero(const SCEV *V, const Loop *L, bool ControlsExit,
loopHasNoAbnormalExits(AddRec->getLoop())) { loopHasNoAbnormalExits(AddRec->getLoop())) {
const SCEV *Exact = const SCEV *Exact =
getUDivExpr(Distance, CountDown ? getNegativeSCEV(Step) : Step); getUDivExpr(Distance, CountDown ? getNegativeSCEV(Step) : Step);
const SCEV *Max = return ExitLimit(Exact, Exact, false, Predicates);
Exact == getCouldNotCompute()
? Exact
: getConstant(getUnsignedRange(Exact).getUnsignedMax());
return ExitLimit(Exact, Max, false, Predicates);
} }
// Solve the general equation. // Solve the general equation.
const SCEV *E = SolveLinEquationWithOverflow(StepC->getAPInt(), const SCEV *E = SolveLinEquationWithOverflow(
getNegativeSCEV(Start), *this); StepC->getAPInt(), getNegativeSCEV(Start), *this);
const SCEV *M = E == getCouldNotCompute() return ExitLimit(E, E, false, Predicates);
? E
: getConstant(getUnsignedRange(E).getUnsignedMax());
return ExitLimit(E, M, false, Predicates);
} }
ScalarEvolution::ExitLimit ScalarEvolution::ExitLimit
@ -9244,9 +9218,8 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
getConstant(StrideForMaxBECount), false); getConstant(StrideForMaxBECount), false);
} }
if (isa<SCEVCouldNotCompute>(MaxBECount) && if (isa<SCEVCouldNotCompute>(MaxBECount))
!isa<SCEVCouldNotCompute>(BECount)) MaxBECount = BECount;
MaxBECount = getConstant(getUnsignedRange(BECount).getUnsignedMax());
return ExitLimit(BECount, MaxBECount, MaxOrZero, Predicates); return ExitLimit(BECount, MaxBECount, MaxOrZero, Predicates);
} }

View File

@ -102,7 +102,7 @@ for.body.i.i: ; preds = %entry, %for.body.i.
%cmp.i.i = icmp eq i32* %ptrincdec.i.i, %end %cmp.i.i = icmp eq i32* %ptrincdec.i.i, %end
br i1 %cmp.i.i, label %_ZSt4fillIPiiEvT_S1_RKT0_.exit, label %for.body.i.i br i1 %cmp.i.i, label %_ZSt4fillIPiiEvT_S1_RKT0_.exit, label %for.body.i.i
; CHECK: Loop %for.body.i.i: backedge-taken count is ((-4 + (-1 * %begin) + %end) /u 4) ; CHECK: Loop %for.body.i.i: backedge-taken count is ((-4 + (-1 * %begin) + %end) /u 4)
; CHECK: Loop %for.body.i.i: max backedge-taken count is 4611686018427387903 ; CHECK: Loop %for.body.i.i: max backedge-taken count is ((-4 + (-1 * %begin) + %end) /u 4)
_ZSt4fillIPiiEvT_S1_RKT0_.exit: ; preds = %for.body.i.i, %entry _ZSt4fillIPiiEvT_S1_RKT0_.exit: ; preds = %for.body.i.i, %entry
ret void ret void
} }

View File

@ -14,7 +14,7 @@ exit:
; CHECK-LABEL: @test1 ; CHECK-LABEL: @test1
; CHECK: Loop %loop: backedge-taken count is ((-32 + (96 * %n)) /u 32) ; CHECK: Loop %loop: backedge-taken count is ((-32 + (96 * %n)) /u 32)
; CHECK: Loop %loop: max backedge-taken count is 134217727 ; CHECK: Loop %loop: max backedge-taken count is ((-32 + (96 * %n)) /u 32)
} }
; PR19183 ; PR19183
@ -32,7 +32,7 @@ exit:
; CHECK-LABEL: @test2 ; CHECK-LABEL: @test2
; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32) ; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
; CHECK: Loop %loop: max backedge-taken count is 134217727 ; CHECK: Loop %loop: max backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
} }
define void @test3(i32 %n) { define void @test3(i32 %n) {
@ -49,7 +49,7 @@ exit:
; CHECK-LABEL: @test3 ; CHECK-LABEL: @test3
; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * %n)) /u 32) ; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * %n)) /u 32)
; CHECK: Loop %loop: max backedge-taken count is 134217727 ; CHECK: Loop %loop: max backedge-taken count is ((-32 + (32 * %n)) /u 32)
} }
define void @test4(i32 %n) { define void @test4(i32 %n) {
@ -66,7 +66,7 @@ exit:
; CHECK-LABEL: @test4 ; CHECK-LABEL: @test4
; CHECK: Loop %loop: backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4) ; CHECK: Loop %loop: backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4)
; CHECK: Loop %loop: max backedge-taken count is 1073741823 ; CHECK: Loop %loop: max backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4)
} }
define void @test5(i32 %n) { define void @test5(i32 %n) {
@ -83,5 +83,5 @@ exit:
; CHECK-LABEL: @test5 ; CHECK-LABEL: @test5
; CHECK: Loop %loop: backedge-taken count is ((-4 + (4 * %n)) /u 4) ; CHECK: Loop %loop: backedge-taken count is ((-4 + (4 * %n)) /u 4)
; CHECK: Loop %loop: max backedge-taken count is 1073741823 ; CHECK: Loop %loop: max backedge-taken count is ((-4 + (4 * %n)) /u 4)
} }