diff options
author | Davide Italiano <davide@freebsd.org> | 2016-12-23 13:12:50 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2016-12-23 13:12:50 +0000 |
commit | 34f94384a5169ebe773dd900029fd6b4629629a6 (patch) | |
tree | 540ba029969603625cd484fcbae8314189ec8baf | |
parent | 21da340f7a16e1d6ec3fa5c40b32ab2056f58b85 (diff) | |
download | bcm5719-llvm-34f94384a5169ebe773dd900029fd6b4629629a6.tar.gz bcm5719-llvm-34f94384a5169ebe773dd900029fd6b4629629a6.zip |
[LICM] Work around LICM needs to maintain state across loops.
The pass creates some state which expects to be cleaned up by
a later instance of the same pass. opt-bisect happens to expose
this not ideal design because calling skipLoop() will result in
this state not being cleaned up at times and an assertion firing
in `doFinalization()`. Chandler tells me the new pass manager will
give us options to avoid these design traps, but until it's not ready,
we need a workaround for the current pass infrastructure. Fix provided
by Andy Kaylor, see the review for a complete discussion.
Differential Revision: https://reviews.llvm.org/D25848
llvm-svn: 290427
-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 +} |