xref: /llvm-project/mlir/test/Analysis/test-cfg-loop-info.mlir (revision 1ef51e0452a473f404edc635412685fce6f61004)
1*1ef51e04SChristian Ulmann// RUN: mlir-opt -pass-pipeline="builtin.module(any(test-cfg-loop-info))" --split-input-file %s 2>&1 | FileCheck %s
2*1ef51e04SChristian Ulmann
3*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "no_loop_single_block"
4*1ef51e04SChristian Ulmann// CHECK: no loops
5*1ef51e04SChristian Ulmannfunc.func @no_loop_single_block() {
6*1ef51e04SChristian Ulmann  return
7*1ef51e04SChristian Ulmann}
8*1ef51e04SChristian Ulmann
9*1ef51e04SChristian Ulmann// -----
10*1ef51e04SChristian Ulmann
11*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "no_loop"
12*1ef51e04SChristian Ulmann// CHECK: no loops
13*1ef51e04SChristian Ulmannfunc.func @no_loop() {
14*1ef51e04SChristian Ulmann  cf.br ^bb1
15*1ef51e04SChristian Ulmann^bb1:
16*1ef51e04SChristian Ulmann  return
17*1ef51e04SChristian Ulmann}
18*1ef51e04SChristian Ulmann
19*1ef51e04SChristian Ulmann// -----
20*1ef51e04SChristian Ulmann
21*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "simple_loop"
22*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]]
23*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 containing:
24*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><exiting>
25*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch>
26*1ef51e04SChristian Ulmannfunc.func @simple_loop(%c: i1) {
27*1ef51e04SChristian Ulmann  cf.br ^bb1
28*1ef51e04SChristian Ulmann^bb1:
29*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb2, ^bb3
30*1ef51e04SChristian Ulmann^bb2:
31*1ef51e04SChristian Ulmann  cf.br ^bb1
32*1ef51e04SChristian Ulmann^bb3:
33*1ef51e04SChristian Ulmann  return
34*1ef51e04SChristian Ulmann}
35*1ef51e04SChristian Ulmann
36*1ef51e04SChristian Ulmann// -----
37*1ef51e04SChristian Ulmann
38*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "single_block_loop"
39*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]]
40*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 containing:
41*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><latch><exiting>
42*1ef51e04SChristian Ulmannfunc.func @single_block_loop(%c: i1) {
43*1ef51e04SChristian Ulmann  cf.br ^bb1
44*1ef51e04SChristian Ulmann^bb1:
45*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb1, ^bb2
46*1ef51e04SChristian Ulmann^bb2:
47*1ef51e04SChristian Ulmann  return
48*1ef51e04SChristian Ulmann}
49*1ef51e04SChristian Ulmann
50*1ef51e04SChristian Ulmann// -----
51*1ef51e04SChristian Ulmann
52*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "nested_loop"
53*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]], ^[[BB4:.*]]
54*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1
55*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><exiting>
56*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch>
57*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]
58*1ef51e04SChristian Ulmann// CHECK: Loop at depth 2
59*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<header><exiting>
60*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]<latch>
61*1ef51e04SChristian Ulmannfunc.func @nested_loop(%c: i1) {
62*1ef51e04SChristian Ulmann  cf.br ^bb1
63*1ef51e04SChristian Ulmann^bb1:
64*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb2, ^bb4
65*1ef51e04SChristian Ulmann^bb2:
66*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb1, ^bb3
67*1ef51e04SChristian Ulmann^bb3:
68*1ef51e04SChristian Ulmann  cf.br ^bb2
69*1ef51e04SChristian Ulmann^bb4:
70*1ef51e04SChristian Ulmann  return
71*1ef51e04SChristian Ulmann}
72*1ef51e04SChristian Ulmann
73*1ef51e04SChristian Ulmann// -----
74*1ef51e04SChristian Ulmann
75*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "multi_latch"
76*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]], ^[[BB4:.*]]
77*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1
78*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><exiting>
79*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch>
80*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]<latch>
81*1ef51e04SChristian Ulmannfunc.func @multi_latch(%c: i1) {
82*1ef51e04SChristian Ulmann  cf.br ^bb1
83*1ef51e04SChristian Ulmann^bb1:
84*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb4, ^bb2
85*1ef51e04SChristian Ulmann^bb2:
86*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb1, ^bb3
87*1ef51e04SChristian Ulmann^bb3:
88*1ef51e04SChristian Ulmann  cf.br ^bb1
89*1ef51e04SChristian Ulmann^bb4:
90*1ef51e04SChristian Ulmann  return
91*1ef51e04SChristian Ulmann}
92*1ef51e04SChristian Ulmann
93*1ef51e04SChristian Ulmann// -----
94*1ef51e04SChristian Ulmann
95*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "multiple_loops"
96*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]], ^[[BB4:.*]], ^[[BB5:.*]]
97*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1
98*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]<header><exiting>
99*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB4]]<latch>
100*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1
101*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header>
102*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch><exiting>
103*1ef51e04SChristian Ulmannfunc.func @multiple_loops(%c: i1) {
104*1ef51e04SChristian Ulmann  cf.br ^bb1
105*1ef51e04SChristian Ulmann^bb1:
106*1ef51e04SChristian Ulmann  cf.br ^bb2
107*1ef51e04SChristian Ulmann^bb2:
108*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb3, ^bb1
109*1ef51e04SChristian Ulmann^bb3:
110*1ef51e04SChristian Ulmann  cf.cond_br %c, ^bb5, ^bb4
111*1ef51e04SChristian Ulmann^bb4:
112*1ef51e04SChristian Ulmann  cf.br ^bb3
113*1ef51e04SChristian Ulmann^bb5:
114*1ef51e04SChristian Ulmann  return
115*1ef51e04SChristian Ulmann}
116