302 lines
6.1 KiB
LLVM
302 lines
6.1 KiB
LLVM
; RUN: opt < %s -disable-output -passes='print<cycles>' 2>&1 | FileCheck %s -check-prefix=CHECK
|
|
|
|
define void @empty() {
|
|
; CHECK-LABEL: CycleInfo for function: empty
|
|
; CHECK-NOT: depth
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @simple() {
|
|
; CHECK-LABEL: CycleInfo for function: simple
|
|
; CHECK: depth=1: entries(loop)
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
br i1 undef, label %loop, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @two_latches() {
|
|
; CHECK-LABEL: CycleInfo for function: two_latches
|
|
; CHECK: depth=1: entries(loop) loop_next
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
br i1 undef, label %loop, label %loop_next
|
|
|
|
loop_next:
|
|
br i1 undef, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @nested_simple() {
|
|
; CHECK-LABEL: CycleInfo for function: nested_simple
|
|
; CHECK: depth=1: entries(outer_header) outer_latch inner
|
|
; CHECK: depth=2: entries(inner)
|
|
entry:
|
|
br label %outer_header
|
|
|
|
outer_header:
|
|
br label %inner
|
|
|
|
inner:
|
|
br i1 undef, label %inner, label %outer_latch
|
|
|
|
outer_latch:
|
|
br i1 undef, label %outer_header, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @nested_outer_latch_in_inner_loop() {
|
|
; CHECK-LABEL: CycleInfo for function: nested_outer_latch_in_inner_loop
|
|
; CHECK: depth=1: entries(outer_header) inner_header inner_latch
|
|
; CHECK: depth=2: entries(inner_header) inner_latch
|
|
entry:
|
|
br label %outer_header
|
|
|
|
outer_header:
|
|
br label %inner_header
|
|
|
|
inner_header:
|
|
br i1 undef, label %inner_latch, label %outer_header
|
|
|
|
inner_latch:
|
|
br i1 undef, label %exit, label %inner_header
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @sibling_loops() {
|
|
; CHECK-LABEL: CycleInfo for function: sibling_loops
|
|
; CHECK-DAG: depth=1: entries(left)
|
|
; CHECK-DAG: depth=1: entries(right)
|
|
entry:
|
|
br i1 undef, label %left, label %right
|
|
|
|
left:
|
|
br i1 undef, label %left, label %exit
|
|
|
|
right:
|
|
br i1 undef, label %right, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @serial_loops() {
|
|
; CHECK-LABEL: CycleInfo for function: serial_loops
|
|
; CHECK-DAG: depth=1: entries(second)
|
|
; CHECK-DAG: depth=1: entries(first)
|
|
entry:
|
|
br label %first
|
|
|
|
first:
|
|
br i1 undef, label %first, label %second
|
|
|
|
second:
|
|
br i1 undef, label %second, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @nested_sibling_loops() {
|
|
; CHECK-LABEL: CycleInfo for function: nested_sibling_loops
|
|
; CHECK: depth=1: entries(outer_header) left right
|
|
; CHECK-DAG: depth=2: entries(right)
|
|
; CHECK-DAG: depth=2: entries(left)
|
|
entry:
|
|
br label %outer_header
|
|
|
|
outer_header:
|
|
br i1 undef, label %left, label %right
|
|
|
|
left:
|
|
switch i32 undef, label %exit [ i32 0, label %left
|
|
i32 1, label %outer_header ]
|
|
|
|
right:
|
|
switch i32 undef, label %outer_header [ i32 0, label %exit
|
|
i32 1, label %right ]
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @deeper_nest() {
|
|
; CHECK-LABEL: CycleInfo for function: deeper_nest
|
|
; CHECK: depth=1: entries(outer_header) outer_latch middle_header inner_header inner_latch
|
|
; CHECK: depth=2: entries(middle_header) inner_header inner_latch
|
|
; CHECK: depth=3: entries(inner_header) inner_latch
|
|
entry:
|
|
br label %outer_header
|
|
|
|
outer_header:
|
|
br label %middle_header
|
|
|
|
middle_header:
|
|
br label %inner_header
|
|
|
|
inner_header:
|
|
br i1 undef, label %middle_header, label %inner_latch
|
|
|
|
inner_latch:
|
|
br i1 undef, label %inner_header, label %outer_latch
|
|
|
|
outer_latch:
|
|
br i1 undef, label %outer_header, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @irreducible_basic() {
|
|
; CHECK-LABEL: CycleInfo for function: irreducible_basic
|
|
; CHECK: depth=1: entries(right left)
|
|
entry:
|
|
br i1 undef, label %left, label %right
|
|
|
|
left:
|
|
br i1 undef, label %right, label %exit
|
|
|
|
right:
|
|
br i1 undef, label %left, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @irreducible_mess() {
|
|
; CHECK-LABEL: CycleInfo for function: irreducible_mess
|
|
; CHECK: depth=1: entries(B A) D C
|
|
; CHECK: depth=2: entries(D C A)
|
|
; CHECK: depth=3: entries(C A)
|
|
entry:
|
|
br i1 undef, label %A, label %B
|
|
|
|
A:
|
|
br i1 undef, label %C, label %D
|
|
|
|
B:
|
|
br i1 undef, label %C, label %D
|
|
|
|
C:
|
|
switch i32 undef, label %A [ i32 0, label %D
|
|
i32 1, label %exit ]
|
|
|
|
D:
|
|
switch i32 undef, label %B [ i32 0, label %C
|
|
i32 1, label %exit ]
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @irreducible_into_simple_cycle() {
|
|
; CHECK-LABEL: CycleInfo for function: irreducible_into_simple_cycle
|
|
; CHECK: depth=1: entries(F C A) E D B
|
|
entry:
|
|
switch i32 undef, label %A [ i32 0, label %C
|
|
i32 1, label %F ]
|
|
|
|
A:
|
|
br label %B
|
|
|
|
B:
|
|
br label %C
|
|
|
|
C:
|
|
br label %D
|
|
|
|
D:
|
|
br i1 undef, label %E, label %exit
|
|
|
|
E:
|
|
br label %F
|
|
|
|
F:
|
|
br i1 undef, label %A, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @irreducible_mountain_bug() {
|
|
; CHECK-LABEL: CycleInfo for function: irreducible_mountain_bug
|
|
; CHECK: depth=1: entries(while.cond)
|
|
; CHECK: depth=2: entries(cond.end61 cond.true49) while.body63 while.cond47
|
|
; CHECK: depth=3: entries(while.body63 cond.true49) while.cond47
|
|
entry:
|
|
br i1 undef, label %if.end, label %if.then
|
|
|
|
if.end:
|
|
br i1 undef, label %if.then7, label %if.else
|
|
|
|
if.then7:
|
|
br label %if.end16
|
|
|
|
if.else:
|
|
br label %if.end16
|
|
|
|
if.end16:
|
|
br i1 undef, label %while.cond.preheader, label %if.then39
|
|
|
|
while.cond.preheader:
|
|
br label %while.cond
|
|
|
|
while.cond:
|
|
br i1 undef, label %cond.true49, label %lor.rhs
|
|
|
|
cond.true49:
|
|
br i1 undef, label %if.then69, label %while.body63
|
|
|
|
while.body63:
|
|
br i1 undef, label %exit, label %while.cond47
|
|
|
|
while.cond47:
|
|
br i1 undef, label %cond.true49, label %cond.end61
|
|
|
|
cond.end61:
|
|
br i1 undef, label %while.body63, label %while.cond
|
|
|
|
if.then69:
|
|
br i1 undef, label %exit, label %while.cond
|
|
|
|
lor.rhs:
|
|
br i1 undef, label %cond.end61, label %while.end76
|
|
|
|
while.end76:
|
|
br label %exit
|
|
|
|
if.then39:
|
|
br i1 undef, label %exit, label %if.end.i145
|
|
|
|
if.end.i145:
|
|
br i1 undef, label %exit, label %if.end8.i149
|
|
|
|
if.end8.i149:
|
|
br label %exit
|
|
|
|
if.then:
|
|
br i1 undef, label %exit, label %if.end.i
|
|
|
|
if.end.i:
|
|
br i1 undef, label %exit, label %if.end8.i
|
|
|
|
if.end8.i:
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|