| ; RUN: opt -simple-loop-unswitch -loop-deletion -S < %s | FileCheck %s | |
| ; RUN: opt -simple-loop-unswitch -enable-mssa-loop-dependency=true -verify-memoryssa -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 | |
| } |