1; RUN: opt < %s -disable-output -passes='verify<cycles>,print<cycles>' 2>&1 | FileCheck %s -check-prefix=CHECK 2 3define void @empty() { 4; CHECK-LABEL: CycleInfo for function: empty 5; CHECK-NOT: depth 6 7 ret void 8} 9 10define void @simple(i1 %arg) { 11; CHECK-LABEL: CycleInfo for function: simple 12; CHECK: depth=1: entries(loop) 13entry: 14 br label %loop 15 16loop: 17 br i1 %arg, label %loop, label %exit 18 19exit: 20 ret void 21} 22 23define void @two_latches(i1 %arg) { 24; CHECK-LABEL: CycleInfo for function: two_latches 25; CHECK: depth=1: entries(loop) loop_next 26entry: 27 br label %loop 28 29loop: 30 br i1 %arg, label %loop, label %loop_next 31 32loop_next: 33 br i1 %arg, label %exit, label %loop 34 35exit: 36 ret void 37} 38 39define void @nested_simple(i1 %arg) { 40; CHECK-LABEL: CycleInfo for function: nested_simple 41; CHECK: depth=1: entries(outer_header) outer_latch inner 42; CHECK: depth=2: entries(inner) 43entry: 44 br label %outer_header 45 46outer_header: 47 br label %inner 48 49inner: 50 br i1 %arg, label %inner, label %outer_latch 51 52outer_latch: 53 br i1 %arg, label %outer_header, label %exit 54 55exit: 56 ret void 57} 58 59define void @nested_outer_latch_in_inner_loop(i1 %arg) { 60; CHECK-LABEL: CycleInfo for function: nested_outer_latch_in_inner_loop 61; CHECK: depth=1: entries(outer_header) inner_header inner_latch 62; CHECK: depth=2: entries(inner_header) inner_latch 63entry: 64 br label %outer_header 65 66outer_header: 67 br label %inner_header 68 69inner_header: 70 br i1 %arg, label %inner_latch, label %outer_header 71 72inner_latch: 73 br i1 %arg, label %exit, label %inner_header 74 75exit: 76 ret void 77} 78 79define void @sibling_loops(i1 %arg) { 80; CHECK-LABEL: CycleInfo for function: sibling_loops 81; CHECK-DAG: depth=1: entries(left) 82; CHECK-DAG: depth=1: entries(right) 83entry: 84 br i1 %arg, label %left, label %right 85 86left: 87 br i1 %arg, label %left, label %exit 88 89right: 90 br i1 %arg, label %right, label %exit 91 92exit: 93 ret void 94} 95 96define void @serial_loops(i1 %arg) { 97; CHECK-LABEL: CycleInfo for function: serial_loops 98; CHECK-DAG: depth=1: entries(second) 99; CHECK-DAG: depth=1: entries(first) 100entry: 101 br label %first 102 103first: 104 br i1 %arg, label %first, label %second 105 106second: 107 br i1 %arg, label %second, label %exit 108 109exit: 110 ret void 111} 112 113define void @nested_sibling_loops(i1 %arg) { 114; CHECK-LABEL: CycleInfo for function: nested_sibling_loops 115; CHECK: depth=1: entries(outer_header) left right 116; CHECK-DAG: depth=2: entries(right) 117; CHECK-DAG: depth=2: entries(left) 118entry: 119 br label %outer_header 120 121outer_header: 122 br i1 %arg, label %left, label %right 123 124left: 125 switch i32 undef, label %exit [ i32 0, label %left 126 i32 1, label %outer_header ] 127 128right: 129 switch i32 undef, label %outer_header [ i32 0, label %exit 130 i32 1, label %right ] 131 132exit: 133 ret void 134} 135 136define void @deeper_nest(i1 %arg) { 137; CHECK-LABEL: CycleInfo for function: deeper_nest 138; CHECK: depth=1: entries(outer_header) outer_latch middle_header inner_header inner_latch 139; CHECK: depth=2: entries(middle_header) inner_header inner_latch 140; CHECK: depth=3: entries(inner_header) inner_latch 141entry: 142 br label %outer_header 143 144outer_header: 145 br label %middle_header 146 147middle_header: 148 br label %inner_header 149 150inner_header: 151 br i1 %arg, label %middle_header, label %inner_latch 152 153inner_latch: 154 br i1 %arg, label %inner_header, label %outer_latch 155 156outer_latch: 157 br i1 %arg, label %outer_header, label %exit 158 159exit: 160 ret void 161} 162 163define void @irreducible_basic(i1 %arg) { 164; CHECK-LABEL: CycleInfo for function: irreducible_basic 165; CHECK: depth=1: entries(right left) 166entry: 167 br i1 %arg, label %left, label %right 168 169left: 170 br i1 %arg, label %right, label %exit 171 172right: 173 br i1 %arg, label %left, label %exit 174 175exit: 176 ret void 177} 178 179define void @irreducible_mess(i1 %arg) { 180; CHECK-LABEL: CycleInfo for function: irreducible_mess 181; CHECK: depth=1: entries(B A) D C 182; CHECK: depth=2: entries(D C A) 183; CHECK: depth=3: entries(C A) 184entry: 185 br i1 %arg, label %A, label %B 186 187A: 188 br i1 %arg, label %C, label %D 189 190B: 191 br i1 %arg, label %C, label %D 192 193C: 194 switch i32 undef, label %A [ i32 0, label %D 195 i32 1, label %exit ] 196 197D: 198 switch i32 undef, label %B [ i32 0, label %C 199 i32 1, label %exit ] 200 201exit: 202 ret void 203} 204 205define void @irreducible_into_simple_cycle(i1 %arg) { 206; CHECK-LABEL: CycleInfo for function: irreducible_into_simple_cycle 207; CHECK: depth=1: entries(F C A) E D B 208entry: 209 switch i32 undef, label %A [ i32 0, label %C 210 i32 1, label %F ] 211 212A: 213 br label %B 214 215B: 216 br label %C 217 218C: 219 br label %D 220 221D: 222 br i1 %arg, label %E, label %exit 223 224E: 225 br label %F 226 227F: 228 br i1 %arg, label %A, label %exit 229 230exit: 231 ret void 232} 233 234define void @irreducible_mountain_bug(i1 %arg) { 235; CHECK-LABEL: CycleInfo for function: irreducible_mountain_bug 236; CHECK: depth=1: entries(while.cond) 237; CHECK: depth=2: entries(cond.end61 cond.true49) while.body63 while.cond47 238; CHECK: depth=3: entries(while.body63 cond.true49) while.cond47 239entry: 240 br i1 %arg, label %if.end, label %if.then 241 242if.end: 243 br i1 %arg, label %if.then7, label %if.else 244 245if.then7: 246 br label %if.end16 247 248if.else: 249 br label %if.end16 250 251if.end16: 252 br i1 %arg, label %while.cond.preheader, label %if.then39 253 254while.cond.preheader: 255 br label %while.cond 256 257while.cond: 258 br i1 %arg, label %cond.true49, label %lor.rhs 259 260cond.true49: 261 br i1 %arg, label %if.then69, label %while.body63 262 263while.body63: 264 br i1 %arg, label %exit, label %while.cond47 265 266while.cond47: 267 br i1 %arg, label %cond.true49, label %cond.end61 268 269cond.end61: 270 br i1 %arg, label %while.body63, label %while.cond 271 272if.then69: 273 br i1 %arg, label %exit, label %while.cond 274 275lor.rhs: 276 br i1 %arg, label %cond.end61, label %while.end76 277 278while.end76: 279 br label %exit 280 281if.then39: 282 br i1 %arg, label %exit, label %if.end.i145 283 284if.end.i145: 285 br i1 %arg, label %exit, label %if.end8.i149 286 287if.end8.i149: 288 br label %exit 289 290if.then: 291 br i1 %arg, label %exit, label %if.end.i 292 293if.end.i: 294 br i1 %arg, label %exit, label %if.end8.i 295 296if.end8.i: 297 br label %exit 298 299exit: 300 ret void 301} 302