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