]> granicus.if.org Git - llvm/commitdiff
[LICM] Work around LICM needs to maintain state across loops.
authorDavide Italiano <davide@freebsd.org>
Fri, 23 Dec 2016 13:12:50 +0000 (13:12 +0000)
committerDavide Italiano <davide@freebsd.org>
Fri, 23 Dec 2016 13:12:50 +0000 (13:12 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290427 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LICM.cpp
test/Transforms/LICM/bisect-state.ll [new file with mode: 0644]

index 172459beaea3c3be100866b9615091bfc864a24a..bc2a9d1391bc5824e365633b49fd8ed00c3621ea 100644 (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,
diff --git a/test/Transforms/LICM/bisect-state.ll b/test/Transforms/LICM/bisect-state.ll
new file mode 100644 (file)
index 0000000..d8f382b
--- /dev/null
@@ -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
+}