66 lines · plain
1; RUN: opt -S -passes=loop-rotate < %s -verify-loop-info | FileCheck %s2;3; Verify that LoopRotate preserves LoopSimplify form even in very peculiar loop4; structures. We manually validate the CFG with FileCheck because currently we5; can't cause a failure when LoopSimplify fails to be preserved.6 7define void @PR18643(i1 %arg) {8; CHECK-LABEL: @PR18643(9entry:10 br label %outer.header11; CHECK: br label %outer.header12 13outer.header:14; CHECK: outer.header:15 br i1 %arg, label %inner.header, label %outer.body16; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_PREROTATE_PREHEADER:[^,]*]], label %outer.body17 18; CHECK: [[INNER_PREROTATE_PREHEADER]]:19; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_PREROTATE_PREHEADER_SPLIT_RETURN:[^,]*]], label %[[INNER_ROTATED_PREHEADER:[^,]*]]20 21; CHECK: [[INNER_ROTATED_PREHEADER]]:22; CHECK-NEXT: br label %inner.body23 24inner.header:25; Now the latch!26; CHECK: inner.header:27 br i1 %arg, label %return, label %inner.body28; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_SPLIT_RETURN:[^,]*]], label %inner.body29 30inner.body:31; Now the header!32; CHECK: inner.body:33 br i1 %arg, label %outer.latch, label %inner.latch34; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_SPLIT_OUTER_LATCH:[^,]*]], label %inner.header35 36inner.latch:37; Dead!38 br label %inner.header39 40outer.body:41; CHECK: outer.body:42 br label %outer.latch43; CHECK-NEXT: br label %outer.latch44 45; L2 -> L1 exit edge needs a simplified exit block.46; CHECK: [[INNER_SPLIT_OUTER_LATCH]]:47; CHECK-NEXT: br label %outer.latch48 49outer.latch:50; CHECK: outer.latch:51 br label %outer.header52; CHECK-NEXT: br label %outer.header53 54; L1 -> L0 exit edge need sa simplified exit block.55; CHECK: [[INNER_PREROTATE_PREHEADER_SPLIT_RETURN]]:56; CHECK-NEXT: br label %return57 58; L2 -> L0 exit edge needs a simplified exit block.59; CHECK: [[INNER_SPLIT_RETURN]]:60; CHECK-NEXT: br label %return61 62return:63; CHECK: return:64 unreachable65}66