302 lines · plain
1; RUN: opt < %s -disable-output -passes='verify<cycles>,print<cycles>' 2>&1 | FileCheck %s -check-prefix=CHECK2 3define void @empty() {4; CHECK-LABEL: CycleInfo for function: empty5; CHECK-NOT: depth6 7 ret void8}9 10define void @simple(i1 %arg) {11; CHECK-LABEL: CycleInfo for function: simple12; CHECK: depth=1: entries(loop)13entry:14 br label %loop15 16loop:17 br i1 %arg, label %loop, label %exit18 19exit:20 ret void21}22 23define void @two_latches(i1 %arg) {24; CHECK-LABEL: CycleInfo for function: two_latches25; CHECK: depth=1: entries(loop) loop_next26entry:27 br label %loop28 29loop:30 br i1 %arg, label %loop, label %loop_next31 32loop_next:33 br i1 %arg, label %exit, label %loop34 35exit:36 ret void37}38 39define void @nested_simple(i1 %arg) {40; CHECK-LABEL: CycleInfo for function: nested_simple41; CHECK: depth=1: entries(outer_header) outer_latch inner42; CHECK: depth=2: entries(inner)43entry:44 br label %outer_header45 46outer_header:47 br label %inner48 49inner:50 br i1 %arg, label %inner, label %outer_latch51 52outer_latch:53 br i1 %arg, label %outer_header, label %exit54 55exit:56 ret void57}58 59define void @nested_outer_latch_in_inner_loop(i1 %arg) {60; CHECK-LABEL: CycleInfo for function: nested_outer_latch_in_inner_loop61; CHECK: depth=1: entries(outer_header) inner_header inner_latch62; CHECK: depth=2: entries(inner_header) inner_latch63entry:64 br label %outer_header65 66outer_header:67 br label %inner_header68 69inner_header:70 br i1 %arg, label %inner_latch, label %outer_header71 72inner_latch:73 br i1 %arg, label %exit, label %inner_header74 75exit:76 ret void77}78 79define void @sibling_loops(i1 %arg) {80; CHECK-LABEL: CycleInfo for function: sibling_loops81; CHECK-DAG: depth=1: entries(left)82; CHECK-DAG: depth=1: entries(right)83entry:84 br i1 %arg, label %left, label %right85 86left:87 br i1 %arg, label %left, label %exit88 89right:90 br i1 %arg, label %right, label %exit91 92exit:93 ret void94}95 96define void @serial_loops(i1 %arg) {97; CHECK-LABEL: CycleInfo for function: serial_loops98; CHECK-DAG: depth=1: entries(second)99; CHECK-DAG: depth=1: entries(first)100entry:101 br label %first102 103first:104 br i1 %arg, label %first, label %second105 106second:107 br i1 %arg, label %second, label %exit108 109exit:110 ret void111}112 113define void @nested_sibling_loops(i1 %arg) {114; CHECK-LABEL: CycleInfo for function: nested_sibling_loops115; CHECK: depth=1: entries(outer_header) left right116; CHECK-DAG: depth=2: entries(right)117; CHECK-DAG: depth=2: entries(left)118entry:119 br label %outer_header120 121outer_header:122 br i1 %arg, label %left, label %right123 124left:125 switch i32 undef, label %exit [ i32 0, label %left126 i32 1, label %outer_header ]127 128right:129 switch i32 undef, label %outer_header [ i32 0, label %exit130 i32 1, label %right ]131 132exit:133 ret void134}135 136define void @deeper_nest(i1 %arg) {137; CHECK-LABEL: CycleInfo for function: deeper_nest138; CHECK: depth=1: entries(outer_header) outer_latch middle_header inner_header inner_latch139; CHECK: depth=2: entries(middle_header) inner_header inner_latch140; CHECK: depth=3: entries(inner_header) inner_latch141entry:142 br label %outer_header143 144outer_header:145 br label %middle_header146 147middle_header:148 br label %inner_header149 150inner_header:151 br i1 %arg, label %middle_header, label %inner_latch152 153inner_latch:154 br i1 %arg, label %inner_header, label %outer_latch155 156outer_latch:157 br i1 %arg, label %outer_header, label %exit158 159exit:160 ret void161}162 163define void @irreducible_basic(i1 %arg) {164; CHECK-LABEL: CycleInfo for function: irreducible_basic165; CHECK: depth=1: entries(right left)166entry:167 br i1 %arg, label %left, label %right168 169left:170 br i1 %arg, label %right, label %exit171 172right:173 br i1 %arg, label %left, label %exit174 175exit:176 ret void177}178 179define void @irreducible_mess(i1 %arg) {180; CHECK-LABEL: CycleInfo for function: irreducible_mess181; CHECK: depth=1: entries(B A) D C182; CHECK: depth=2: entries(D C A)183; CHECK: depth=3: entries(C A)184entry:185 br i1 %arg, label %A, label %B186 187A:188 br i1 %arg, label %C, label %D189 190B:191 br i1 %arg, label %C, label %D192 193C:194 switch i32 undef, label %A [ i32 0, label %D195 i32 1, label %exit ]196 197D:198 switch i32 undef, label %B [ i32 0, label %C199 i32 1, label %exit ]200 201exit:202 ret void203}204 205define void @irreducible_into_simple_cycle(i1 %arg) {206; CHECK-LABEL: CycleInfo for function: irreducible_into_simple_cycle207; CHECK: depth=1: entries(F C A) E D B208entry:209 switch i32 undef, label %A [ i32 0, label %C210 i32 1, label %F ]211 212A:213 br label %B214 215B:216 br label %C217 218C:219 br label %D220 221D:222 br i1 %arg, label %E, label %exit223 224E:225 br label %F226 227F:228 br i1 %arg, label %A, label %exit229 230exit:231 ret void232}233 234define void @irreducible_mountain_bug(i1 %arg) {235; CHECK-LABEL: CycleInfo for function: irreducible_mountain_bug236; CHECK: depth=1: entries(while.cond)237; CHECK: depth=2: entries(cond.end61 cond.true49) while.body63 while.cond47238; CHECK: depth=3: entries(while.body63 cond.true49) while.cond47239entry:240 br i1 %arg, label %if.end, label %if.then241 242if.end:243 br i1 %arg, label %if.then7, label %if.else244 245if.then7:246 br label %if.end16247 248if.else:249 br label %if.end16250 251if.end16:252 br i1 %arg, label %while.cond.preheader, label %if.then39253 254while.cond.preheader:255 br label %while.cond256 257while.cond:258 br i1 %arg, label %cond.true49, label %lor.rhs259 260cond.true49:261 br i1 %arg, label %if.then69, label %while.body63262 263while.body63:264 br i1 %arg, label %exit, label %while.cond47265 266while.cond47:267 br i1 %arg, label %cond.true49, label %cond.end61268 269cond.end61:270 br i1 %arg, label %while.body63, label %while.cond271 272if.then69:273 br i1 %arg, label %exit, label %while.cond274 275lor.rhs:276 br i1 %arg, label %cond.end61, label %while.end76277 278while.end76:279 br label %exit280 281if.then39:282 br i1 %arg, label %exit, label %if.end.i145283 284if.end.i145:285 br i1 %arg, label %exit, label %if.end8.i149286 287if.end8.i149:288 br label %exit289 290if.then:291 br i1 %arg, label %exit, label %if.end.i292 293if.end.i:294 br i1 %arg, label %exit, label %if.end8.i295 296if.end8.i:297 br label %exit298 299exit:300 ret void301}302