diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/LICM.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/LICM/bisect-state.ll | 15 |
2 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index 172459beaea..bc2a9d1391b 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -124,8 +124,13 @@ struct LegacyLICMPass : public LoopPass { } bool runOnLoop(Loop *L, LPPassManager &LPM) override { - if (skipLoop(L)) + if (skipLoop(L)) { + // If we have run LICM on a previous loop but now we are skipping + // (because we've hit the opt-bisect limit), we need to clear the + // loop alias information. + LICM.getLoopToAliasSetMap().clear(); return false; + } auto *SE = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>(); return LICM.runOnLoop(L, diff --git a/llvm/test/Transforms/LICM/bisect-state.ll b/llvm/test/Transforms/LICM/bisect-state.ll new file mode 100644 index 00000000000..d8f382b22b7 --- /dev/null +++ b/llvm/test/Transforms/LICM/bisect-state.ll @@ -0,0 +1,15 @@ +; Make sure we don't crash in LICM. +; RUN: opt %s -licm -opt-bisect-limit=1 + +define void @patatino() { +for.cond1: + br label %for.body +for.body: + br label %for.cond5 +for.cond5: + br i1 true, label %if.end, label %for.end +if.end: + br label %for.cond5 +for.end: + br label %for.body +} |