summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/SimpleLoopUnswitch/pr37888.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/SimpleLoopUnswitch/pr37888.ll')
-rw-r--r--llvm/test/Transforms/SimpleLoopUnswitch/pr37888.ll38
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SimpleLoopUnswitch/pr37888.ll b/llvm/test/Transforms/SimpleLoopUnswitch/pr37888.ll
new file mode 100644
index 00000000000..307706fc34a
--- /dev/null
+++ b/llvm/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
+}
OpenPOWER on IntegriCloud