mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
Fix SCEV forgetMemoizedResults should search and destroy backedge exprs.
Fixes PR15570: SEGV: SCEV back-edge info invalid after dead code removal. Indvars creates a SCEV expression for the loop's back edge taken count, then determines that the comparison is always true and removes it. When loop-unroll asks for the expression, it contains a NULL SCEVUnknkown (as a CallbackVH). forgetMemoizedResults should invalidate the loop back edges expression. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177986 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -4230,6 +4230,25 @@ ScalarEvolution::BackedgeTakenInfo::getMax(ScalarEvolution *SE) const {
|
||||
return Max ? Max : SE->getCouldNotCompute();
|
||||
}
|
||||
|
||||
bool ScalarEvolution::BackedgeTakenInfo::hasOperand(const SCEV *S,
|
||||
ScalarEvolution *SE) const {
|
||||
if (Max && Max != SE->getCouldNotCompute() && SE->hasOperand(Max, S))
|
||||
return true;
|
||||
|
||||
if (!ExitNotTaken.ExitingBlock)
|
||||
return false;
|
||||
|
||||
for (const ExitNotTakenInfo *ENT = &ExitNotTaken;
|
||||
ENT != 0; ENT = ENT->getNextExit()) {
|
||||
|
||||
if (ENT->ExactNotTaken != SE->getCouldNotCompute()
|
||||
&& SE->hasOperand(ENT->ExactNotTaken, S)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Allocate memory for BackedgeTakenInfo and copy the not-taken count of each
|
||||
/// computable exit into a persistent ExitNotTakenInfo array.
|
||||
ScalarEvolution::BackedgeTakenInfo::BackedgeTakenInfo(
|
||||
@ -6940,6 +6959,17 @@ void ScalarEvolution::forgetMemoizedResults(const SCEV *S) {
|
||||
BlockDispositions.erase(S);
|
||||
UnsignedRanges.erase(S);
|
||||
SignedRanges.erase(S);
|
||||
|
||||
for (DenseMap<const Loop*, BackedgeTakenInfo>::iterator I =
|
||||
BackedgeTakenCounts.begin(), E = BackedgeTakenCounts.end(); I != E; ) {
|
||||
BackedgeTakenInfo &BEInfo = I->second;
|
||||
if (BEInfo.hasOperand(S, this)) {
|
||||
BEInfo.clear();
|
||||
BackedgeTakenCounts.erase(I++);
|
||||
}
|
||||
else
|
||||
++I;
|
||||
}
|
||||
}
|
||||
|
||||
typedef DenseMap<const Loop *, std::string> VerifyMap;
|
||||
|
Reference in New Issue
Block a user