1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

[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
This commit is contained in:
Davide Italiano 2016-12-23 13:12:50 +00:00
parent 1184fd8c48
commit 8b7b8bb5e6
2 changed files with 21 additions and 1 deletions

View File

@ -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,

View File

@ -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
}