forked from OSchip/llvm-project
[PM] Sink an LCSSA preservation assert from the LoopSimplify pass into
the library routine shared with the new PM and other code. This assert checks that when LCSSA preservation is requested we start in LCSSA form. Without this early assert, given *very* complex test cases we can hit an assert or crash much later on when trying to preserve LCSSA. The new PM's loop simplify doesn't need to (and indeed can't) preserve LCSSA as the new PM doesn't deal in transforms in the dependency graph. But we asked the library to and shockingly, this didn't work very well! Stop doing that. Now the assert will tell us immediately with existing test cases. Before this, it took a pretty convoluted input to trigger this. However, sinking the assert also found a bug in LoopUnroll where we asked simplifyLoop to preserve LCSSA *right before we reform it*. That's kinda silly and unsurprising that it wasn't available. =D Stop doing that too. We also would assert that the unrolled loop was in LCSSA even if preserving LCSSA was never requested! I don't have a test case or anything here. I spotted it by inspection and it seems quite obvious. No logic change anyways, that's just avoiding a spurrious assert. llvm-svn: 292710
This commit is contained in:
parent
17350de1ca
commit
7fd29cef42
|
@ -735,6 +735,17 @@ bool llvm::simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI,
|
|||
bool PreserveLCSSA) {
|
||||
bool Changed = false;
|
||||
|
||||
#ifndef NDEBUG
|
||||
// If we're asked to preserve LCSSA, the loop nest needs to start in LCSSA
|
||||
// form.
|
||||
if (PreserveLCSSA) {
|
||||
assert(DT && "DT not available.");
|
||||
assert(LI && "LI not available.");
|
||||
assert(L->isRecursivelyLCSSAForm(*DT, *LI) &&
|
||||
"Requested to preserve LCSSA, but it's already broken.");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Worklist maintains our depth-first queue of loops in this nest to process.
|
||||
SmallVector<Loop *, 4> Worklist;
|
||||
Worklist.push_back(L);
|
||||
|
@ -814,15 +825,6 @@ bool LoopSimplify::runOnFunction(Function &F) {
|
|||
&getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
|
||||
|
||||
bool PreserveLCSSA = mustPreserveAnalysisID(LCSSAID);
|
||||
#ifndef NDEBUG
|
||||
if (PreserveLCSSA) {
|
||||
assert(DT && "DT not available.");
|
||||
assert(LI && "LI not available.");
|
||||
bool InLCSSA = all_of(
|
||||
*LI, [&](Loop *L) { return L->isRecursivelyLCSSAForm(*DT, *LI); });
|
||||
assert(InLCSSA && "Requested to preserve LCSSA, but it's already broken.");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Simplify each loop nest in the function.
|
||||
for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
|
||||
|
@ -846,10 +848,10 @@ PreservedAnalyses LoopSimplifyPass::run(Function &F,
|
|||
ScalarEvolution *SE = AM.getCachedResult<ScalarEvolutionAnalysis>(F);
|
||||
AssumptionCache *AC = &AM.getResult<AssumptionAnalysis>(F);
|
||||
|
||||
// FIXME: This pass should verify that the loops on which it's operating
|
||||
// are in canonical SSA form, and that the pass itself preserves this form.
|
||||
// Note that we don't preserve LCSSA in the new PM, if you need it run LCSSA
|
||||
// after simplifying the loops.
|
||||
for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
|
||||
Changed |= simplifyLoop(*I, DT, LI, SE, AC, true /* PreserveLCSSA */);
|
||||
Changed |= simplifyLoop(*I, DT, LI, SE, AC, /*PreserveLCSSA*/ false);
|
||||
|
||||
// FIXME: We need to invalidate this to avoid PR28400. Is there a better
|
||||
// solution?
|
||||
|
|
|
@ -750,7 +750,10 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force,
|
|||
// loops too).
|
||||
// TODO: That potentially might be compile-time expensive. We should try
|
||||
// to fix the loop-simplified form incrementally.
|
||||
simplifyLoop(OuterL, DT, LI, SE, AC, PreserveLCSSA);
|
||||
// Note that we only preserve LCSSA at this stage if we need to and if we
|
||||
// won't end up fixing it. If we end up fixing it anyways, we don't need
|
||||
// to preserve it here and in fact we can't because it isn't correct.
|
||||
simplifyLoop(OuterL, DT, LI, SE, AC, PreserveLCSSA && !NeedToFixLCSSA);
|
||||
|
||||
// LCSSA must be performed on the outermost affected loop. The unrolled
|
||||
// loop's last loop latch is guaranteed to be in the outermost loop after
|
||||
|
@ -762,7 +765,7 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force,
|
|||
|
||||
if (NeedToFixLCSSA)
|
||||
formLCSSARecursively(*OuterL, *DT, LI, SE);
|
||||
else
|
||||
else if (PreserveLCSSA)
|
||||
assert(OuterL->isLCSSAForm(*DT) &&
|
||||
"Loops should be in LCSSA form after loop-unroll.");
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue