[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