; RUN: opt -S -loop-rotate < %s -verify-loop-info | FileCheck %s ; ; Verify that LoopRotate preserves LoopSimplify form even in very peculiar loop ; structures. We manually validate the CFG with FileCheck because currently we ; can't cause a failure when LoopSimplify fails to be preserved. define void @PR18643() { ; CHECK-LABEL: @PR18643( entry: br label %outer.header ; CHECK: br label %outer.header outer.header: ; CHECK: outer.header: br i1 undef, label %inner.header, label %outer.body ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_PREROTATE_PREHEADER:[^,]*]], label %outer.body ; CHECK: [[INNER_PREROTATE_PREHEADER]]: ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_PREROTATE_PREHEADER_SPLIT_RETURN:[^,]*]], label %[[INNER_ROTATED_PREHEADER:[^,]*]] ; CHECK: [[INNER_ROTATED_PREHEADER]]: ; CHECK-NEXT: br label %inner.body inner.header: ; Now the latch! ; CHECK: inner.header: br i1 undef, label %return, label %inner.body ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_SPLIT_RETURN:[^,]*]], label %inner.body inner.body: ; Now the header! ; CHECK: inner.body: br i1 undef, label %outer.latch, label %inner.latch ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_SPLIT_OUTER_LATCH:[^,]*]], label %inner.header inner.latch: ; Dead! br label %inner.header outer.body: ; CHECK: outer.body: br label %outer.latch ; CHECK-NEXT: br label %outer.latch ; L2 -> L1 exit edge needs a simplified exit block. ; CHECK: [[INNER_SPLIT_OUTER_LATCH]]: ; CHECK-NEXT: br label %outer.latch outer.latch: ; CHECK: outer.latch: br label %outer.header ; CHECK-NEXT: br label %outer.header ; L1 -> L0 exit edge need sa simplified exit block. ; CHECK: [[INNER_PREROTATE_PREHEADER_SPLIT_RETURN]]: ; CHECK-NEXT: br label %return ; L2 -> L0 exit edge needs a simplified exit block. ; CHECK: [[INNER_SPLIT_RETURN]]: ; CHECK-NEXT: br label %return return: ; CHECK: return: unreachable }