mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-02 08:46:23 +00:00
When LSR is replacing an instruction, call
ScalarEvolution::deleteValueFromRecords on it before doing the replaceAllUsesWith, because ScalarEvolution looks at the instruction's users to find SCEV references to the instruction's SCEV object in its internal maps. Move all of LSR's loop-related state clearing after processing the loop and before cleaning up dead PHI nodes. This eliminates all of LSR's SCEV references just before the calls to ScalarEvolution::deleteValueFromRecords so that when ScalarEvolution drops its own SCEV references, the reference counts will reach zero and the SCEVs will be deleted immediately. These changes fix some compiler aborts involving ScalarEvolution holding onto and reusing SCEV objects for instructions that have been deleted. No regression test unfortunately; because the symptoms were due to dangling pointers, reduced testcases ended up being fairly arbitrary. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51359 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
55384a853c
commit
010ee2d955
@ -237,8 +237,8 @@ DeleteTriviallyDeadInstructions(SmallPtrSet<Instruction*,16> &Insts) {
|
||||
if (Value *PNV = PN->hasConstantValue()) {
|
||||
if (Instruction *U = dyn_cast<Instruction>(PNV))
|
||||
Insts.insert(U);
|
||||
PN->replaceAllUsesWith(PNV);
|
||||
SE->deleteValueFromRecords(PN);
|
||||
PN->replaceAllUsesWith(PNV);
|
||||
PN->eraseFromParent();
|
||||
Changed = true;
|
||||
continue;
|
||||
@ -1663,8 +1663,8 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
||||
|
||||
// Remove the old compare instruction. The old indvar is probably dead too.
|
||||
DeadInsts.insert(cast<Instruction>(CondUse->OperandValToReplace));
|
||||
OldCond->replaceAllUsesWith(Cond);
|
||||
SE->deleteValueFromRecords(OldCond);
|
||||
OldCond->replaceAllUsesWith(Cond);
|
||||
OldCond->eraseFromParent();
|
||||
|
||||
IVUsesByStride[*CondStride].Users.pop_back();
|
||||
@ -1782,7 +1782,7 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
#endif
|
||||
|
||||
// IVsByStride keeps IVs for one particular loop.
|
||||
IVsByStride.clear();
|
||||
assert(IVsByStride.empty() && "Stale entries in IVsByStride?");
|
||||
|
||||
// Sort the StrideOrder so we process larger strides first.
|
||||
std::stable_sort(StrideOrder.begin(), StrideOrder.end(), StrideCompare());
|
||||
@ -1799,6 +1799,12 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
StrengthReduceStridedIVUsers(SI->first, SI->second, L, HasOneStride);
|
||||
}
|
||||
|
||||
// We're done analyzing this loop; release all the state we built up for it.
|
||||
CastedPointers.clear();
|
||||
IVUsesByStride.clear();
|
||||
IVsByStride.clear();
|
||||
StrideOrder.clear();
|
||||
|
||||
// Clean up after ourselves
|
||||
if (!DeadInsts.empty()) {
|
||||
DeleteTriviallyDeadInstructions(DeadInsts);
|
||||
@ -1826,8 +1832,8 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
if (BO->hasOneUse() && PN == *(BO->use_begin())) {
|
||||
DeadInsts.insert(BO);
|
||||
// Break the cycle, then delete the PHI.
|
||||
PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
|
||||
SE->deleteValueFromRecords(PN);
|
||||
PN->replaceAllUsesWith(UndefValue::get(PN->getType()));
|
||||
PN->eraseFromParent();
|
||||
}
|
||||
}
|
||||
@ -1836,8 +1842,5 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
DeleteTriviallyDeadInstructions(DeadInsts);
|
||||
}
|
||||
|
||||
CastedPointers.clear();
|
||||
IVUsesByStride.clear();
|
||||
StrideOrder.clear();
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user