[PATCH] D48470: [LegacyPM] Fix PR37888 by teaching the legacy loop pass manager how to clear out deleted loops from the current queue beyond just the current loop.
Chandler Carruth via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 21 19:48:30 PDT 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL335317: [LegacyPM] Fix PR37888 by teaching the legacy loop pass manager how to (authored by chandlerc, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D48470?vs=152421&id=152424#toc
Repository:
rL LLVM
https://reviews.llvm.org/D48470
Files:
llvm/trunk/lib/Analysis/LoopPass.cpp
llvm/trunk/test/Transforms/SimpleLoopUnswitch/pr37888.ll
Index: llvm/trunk/test/Transforms/SimpleLoopUnswitch/pr37888.ll
===================================================================
--- llvm/trunk/test/Transforms/SimpleLoopUnswitch/pr37888.ll
+++ llvm/trunk/test/Transforms/SimpleLoopUnswitch/pr37888.ll
@@ -0,0 +1,38 @@
+; RUN: opt -simple-loop-unswitch -loop-deletion -S < %s | FileCheck %s
+;
+; Check that when we do unswitching where we re-enqueue the loop to be processed
+; again, but manage to delete the loop before ever getting to iterate on it, it
+; doesn't crash the legacy pass manager.
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @pr37888() {
+; CHECK-LABEL: define void @pr37888()
+entry:
+ %tobool = icmp ne i16 undef, 0
+ br label %for.body
+; CHECK: %[[TOBOOL:.*]] = icmp ne
+; CHECK-NEXT: br i1 %[[TOBOOL]], label %if.then, label %[[ENTRY_SPLIT:.*]]
+;
+; CHECK: [[ENTRY_SPLIT]]:
+; CHECK-NEXT: br label %for.end
+
+for.body:
+ br i1 %tobool, label %if.then, label %if.end
+
+if.then:
+ unreachable
+; CHECK: if.then:
+; CHECK-NEXT: unreachable
+
+if.end:
+ br label %for.inc
+
+for.inc:
+ br i1 undef, label %for.body, label %for.end
+
+for.end:
+ ret void
+; CHECK: for.end:
+; CHECK-NEXT: ret void
+}
Index: llvm/trunk/lib/Analysis/LoopPass.cpp
===================================================================
--- llvm/trunk/lib/Analysis/LoopPass.cpp
+++ llvm/trunk/lib/Analysis/LoopPass.cpp
@@ -142,8 +142,17 @@
void LPPassManager::markLoopAsDeleted(Loop &L) {
assert((&L == CurrentLoop || CurrentLoop->contains(&L)) &&
"Must not delete loop outside the current loop tree!");
- if (&L == CurrentLoop)
+ // If this loop appears elsewhere within the queue, we also need to remove it
+ // there. However, we have to be careful to not remove the back of the queue
+ // as that is assumed to match the current loop.
+ assert(LQ.back() == CurrentLoop && "Loop queue back isn't the current loop!");
+ LQ.erase(std::remove(LQ.begin(), LQ.end(), &L), LQ.end());
+
+ if (&L == CurrentLoop) {
CurrentLoopDeleted = true;
+ // Add this loop back onto the back of the queue to preserve our invariants.
+ LQ.push_back(&L);
+ }
}
/// run - Execute all of the passes scheduled for execution. Keep track of
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48470.152424.patch
Type: text/x-patch
Size: 2266 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180622/6126e7ef/attachment.bin>
More information about the llvm-commits
mailing list