1// RUN: mlir-opt %s -test-print-dominance -split-input-file 2>&1 | FileCheck %s
2
3// CHECK-LABEL: Testing : func_condBranch
4func @func_condBranch(%cond : i1) {
5  cond_br %cond, ^bb1, ^bb2
6^bb1:
7  br ^exit
8^bb2:
9  br ^exit
10^exit:
11  return
12}
13// CHECK-LABEL: --- DominanceInfo ---
14// CHECK-NEXT: Nearest(0, 0) = 0
15// CHECK-NEXT: Nearest(0, 1) = 0
16// CHECK-NEXT: Nearest(0, 2) = 0
17// CHECK-NEXT: Nearest(0, 3) = 0
18// CHECK: Nearest(1, 0) = 0
19// CHECK-NEXT: Nearest(1, 1) = 1
20// CHECK-NEXT: Nearest(1, 2) = 0
21// CHECK-NEXT: Nearest(1, 3) = 0
22// CHECK: Nearest(2, 0) = 0
23// CHECK-NEXT: Nearest(2, 1) = 0
24// CHECK-NEXT: Nearest(2, 2) = 2
25// CHECK-NEXT: Nearest(2, 3) = 0
26// CHECK: Nearest(3, 0) = 0
27// CHECK-NEXT: Nearest(3, 1) = 0
28// CHECK-NEXT: Nearest(3, 2) = 0
29// CHECK-NEXT: Nearest(3, 3) = 3
30// CHECK-LABEL: --- PostDominanceInfo ---
31// CHECK-NEXT: Nearest(0, 0) = 0
32// CHECK-NEXT: Nearest(0, 1) = 3
33// CHECK-NEXT: Nearest(0, 2) = 3
34// CHECK-NEXT: Nearest(0, 3) = 3
35// CHECK: Nearest(1, 0) = 3
36// CHECK-NEXT: Nearest(1, 1) = 1
37// CHECK-NEXT: Nearest(1, 2) = 3
38// CHECK-NEXT: Nearest(1, 3) = 3
39// CHECK: Nearest(2, 0) = 3
40// CHECK-NEXT: Nearest(2, 1) = 3
41// CHECK-NEXT: Nearest(2, 2) = 2
42// CHECK-NEXT: Nearest(2, 3) = 3
43// CHECK: Nearest(3, 0) = 3
44// CHECK-NEXT: Nearest(3, 1) = 3
45// CHECK-NEXT: Nearest(3, 2) = 3
46// CHECK-NEXT: Nearest(3, 3) = 3
47
48// -----
49
50// CHECK-LABEL: Testing : func_loop
51func @func_loop(%arg0 : i32, %arg1 : i32) {
52  br ^loopHeader(%arg0 : i32)
53^loopHeader(%counter : i32):
54  %lessThan = cmpi slt, %counter, %arg1 : i32
55  cond_br %lessThan, ^loopBody, ^exit
56^loopBody:
57  %const0 = constant 1 : i32
58  %inc = addi %counter, %const0 : i32
59  br ^loopHeader(%inc : i32)
60^exit:
61  return
62}
63// CHECK-LABEL: --- DominanceInfo ---
64// CHECK: Nearest(1, 0) = 0
65// CHECK-NEXT: Nearest(1, 1) = 1
66// CHECK-NEXT: Nearest(1, 2) = 1
67// CHECK-NEXT: Nearest(1, 3) = 1
68// CHECK: Nearest(2, 0) = 0
69// CHECK-NEXT: Nearest(2, 1) = 1
70// CHECK-NEXT: Nearest(2, 2) = 2
71// CHECK-NEXT: Nearest(2, 3) = 1
72// CHECK: Nearest(3, 0) = 0
73// CHECK-NEXT: Nearest(3, 1) = 1
74// CHECK-NEXT: Nearest(3, 2) = 1
75// CHECK-NEXT: Nearest(3, 3) = 3
76// CHECK-LABEL: --- PostDominanceInfo ---
77// CHECK: Nearest(1, 0) = 1
78// CHECK-NEXT: Nearest(1, 1) = 1
79// CHECK-NEXT: Nearest(1, 2) = 1
80// CHECK-NEXT: Nearest(1, 3) = 3
81// CHECK: Nearest(2, 0) = 1
82// CHECK-NEXT: Nearest(2, 1) = 1
83// CHECK-NEXT: Nearest(2, 2) = 2
84// CHECK-NEXT: Nearest(2, 3) = 3
85// CHECK: Nearest(3, 0) = 3
86// CHECK-NEXT: Nearest(3, 1) = 3
87// CHECK-NEXT: Nearest(3, 2) = 3
88// CHECK-NEXT: Nearest(3, 3) = 3
89
90// -----
91
92// CHECK-LABEL: Testing : nested_region
93func @nested_region(%arg0 : index, %arg1 : index, %arg2 : index) {
94  scf.for %arg3 = %arg0 to %arg1 step %arg2 { }
95  return
96}
97
98// CHECK-LABEL: --- DominanceInfo ---
99// CHECK-NEXT: Nearest(0, 0) = 0
100// CHECK-NEXT: Nearest(0, 1) = 1
101// CHECK: Nearest(1, 0) = 1
102// CHECK-NEXT: Nearest(1, 1) = 1
103// CHECK-LABEL: --- PostDominanceInfo ---
104// CHECK-NEXT: Nearest(0, 0) = 0
105// CHECK-NEXT: Nearest(0, 1) = 1
106// CHECK: Nearest(1, 0) = 1
107// CHECK-NEXT: Nearest(1, 1) = 1
108
109// -----
110
111// CHECK-LABEL: Testing : nested_region2
112func @nested_region2(%arg0 : index, %arg1 : index, %arg2 : index) {
113  scf.for %arg3 = %arg0 to %arg1 step %arg2 {
114    scf.for %arg4 = %arg0 to %arg1 step %arg2 {
115      scf.for %arg5 = %arg0 to %arg1 step %arg2 { }
116    }
117  }
118  return
119}
120// CHECK-LABEL: --- DominanceInfo ---
121// CHECK: Nearest(1, 0) = 1
122// CHECK-NEXT: Nearest(1, 1) = 1
123// CHECK-NEXT: Nearest(1, 2) = 2
124// CHECK-NEXT: Nearest(1, 3) = 3
125// CHECK: Nearest(2, 0) = 2
126// CHECK-NEXT: Nearest(2, 1) = 2
127// CHECK-NEXT: Nearest(2, 2) = 2
128// CHECK-NEXT: Nearest(2, 3) = 3
129// CHECK: Nearest(3, 0) = 3
130// CHECK-NEXT: Nearest(3, 1) = 3
131// CHECK-NEXT: Nearest(3, 2) = 3
132// CHECK-NEXT: Nearest(3, 3) = 3
133// CHECK-LABEL: --- PostDominanceInfo ---
134// CHECK-NEXT: Nearest(0, 0) = 0
135// CHECK-NEXT: Nearest(0, 1) = 1
136// CHECK-NEXT: Nearest(0, 2) = 2
137// CHECK-NEXT: Nearest(0, 3) = 3
138// CHECK: Nearest(1, 0) = 1
139// CHECK-NEXT: Nearest(1, 1) = 1
140// CHECK-NEXT: Nearest(1, 2) = 2
141// CHECK-NEXT: Nearest(1, 3) = 3
142// CHECK: Nearest(2, 0) = 2
143// CHECK-NEXT: Nearest(2, 1) = 2
144// CHECK-NEXT: Nearest(2, 2) = 2
145// CHECK-NEXT: Nearest(2, 3) = 3
146
147// -----
148
149// CHECK-LABEL: Testing : func_loop_nested_region
150func @func_loop_nested_region(
151  %arg0 : i32,
152  %arg1 : i32,
153  %arg2 : index,
154  %arg3 : index,
155  %arg4 : index) {
156  br ^loopHeader(%arg0 : i32)
157^loopHeader(%counter : i32):
158  %lessThan = cmpi slt, %counter, %arg1 : i32
159  cond_br %lessThan, ^loopBody, ^exit
160^loopBody:
161  %const0 = constant 1 : i32
162  %inc = addi %counter, %const0 : i32
163  scf.for %arg5 = %arg2 to %arg3 step %arg4 {
164    scf.for %arg6 = %arg2 to %arg3 step %arg4 { }
165  }
166  br ^loopHeader(%inc : i32)
167^exit:
168  return
169}
170// CHECK-LABEL: --- DominanceInfo ---
171// CHECK: Nearest(2, 0) = 0
172// CHECK-NEXT: Nearest(2, 1) = 1
173// CHECK-NEXT: Nearest(2, 2) = 2
174// CHECK-NEXT: Nearest(2, 3) = 2
175// CHECK-NEXT: Nearest(2, 4) = 2
176// CHECK-NEXT: Nearest(2, 5) = 1
177// CHECK: Nearest(3, 0) = 0
178// CHECK-NEXT: Nearest(3, 1) = 1
179// CHECK-NEXT: Nearest(3, 2) = 2
180// CHECK-NEXT: Nearest(3, 3) = 3
181// CHECK-NEXT: Nearest(3, 4) = 4
182// CHECK-NEXT: Nearest(3, 5) = 1
183// CHECK: Nearest(4, 0) = 0
184// CHECK-NEXT: Nearest(4, 1) = 1
185// CHECK-NEXT: Nearest(4, 2) = 2
186// CHECK-NEXT: Nearest(4, 3) = 4
187// CHECK-NEXT: Nearest(4, 4) = 4
188// CHECK-NEXT: Nearest(4, 5) = 1
189// CHECK-LABEL: --- PostDominanceInfo ---
190// CHECK: Nearest(2, 0) = 1
191// CHECK-NEXT: Nearest(2, 1) = 1
192// CHECK-NEXT: Nearest(2, 2) = 2
193// CHECK-NEXT: Nearest(2, 3) = 2
194// CHECK-NEXT: Nearest(2, 4) = 2
195// CHECK-NEXT: Nearest(2, 5) = 5
196// CHECK: Nearest(3, 0) = 1
197// CHECK-NEXT: Nearest(3, 1) = 1
198// CHECK-NEXT: Nearest(3, 2) = 2
199// CHECK-NEXT: Nearest(3, 3) = 3
200// CHECK-NEXT: Nearest(3, 4) = 4
201// CHECK-NEXT: Nearest(3, 5) = 5
202// CHECK: Nearest(4, 0) = 1
203// CHECK-NEXT: Nearest(4, 1) = 1
204// CHECK-NEXT: Nearest(4, 2) = 2
205// CHECK-NEXT: Nearest(4, 3) = 4
206// CHECK-NEXT: Nearest(4, 4) = 4
207// CHECK-NEXT: Nearest(4, 5) = 5
208// CHECK-LABEL: --- Block Dominance relationship ---
209// CHECK-NEXT: dominates(0, 0) = true
210// CHECK-NEXT: dominates(0, 1) = true
211// CHECK-NEXT: dominates(0, 2) = true
212// CHECK-NEXT: dominates(0, 3) = true
213// CHECK-NEXT: dominates(0, 4) = true
214// CHECK-NEXT: dominates(0, 5) = true
215// CHECK-NEXT: dominates(0, 6) = false
216// CHECK-NEXT: dominates(1, 0) = false
217// CHECK-NEXT: dominates(1, 1) = true
218// CHECK-NEXT: dominates(1, 2) = true
219// CHECK-NEXT: dominates(1, 3) = true
220// CHECK-NEXT: dominates(1, 4) = true
221// CHECK-NEXT: dominates(1, 5) = true
222// CHECK-NEXT: dominates(1, 6) = false
223// CHECK-NEXT: dominates(2, 0) = false
224// CHECK-NEXT: dominates(2, 1) = false
225// CHECK-NEXT: dominates(2, 2) = true
226// CHECK-NEXT: dominates(2, 3) = true
227// CHECK-NEXT: dominates(2, 4) = true
228// CHECK-NEXT: dominates(2, 5) = false
229// CHECK-NEXT: dominates(2, 6) = false
230// CHECK-NEXT: dominates(3, 0) = false
231// CHECK-NEXT: dominates(3, 1) = false
232// CHECK-NEXT: dominates(3, 2) = false
233// CHECK-NEXT: dominates(3, 3) = true
234// CHECK-NEXT: dominates(3, 4) = false
235// CHECK-NEXT: dominates(3, 5) = false
236// CHECK-NEXT: dominates(3, 6) = false
237// CHECK-NEXT: dominates(4, 0) = false
238// CHECK-NEXT: dominates(4, 1) = false
239// CHECK-NEXT: dominates(4, 2) = false
240// CHECK-NEXT: dominates(4, 3) = true
241// CHECK-NEXT: dominates(4, 4) = true
242// CHECK-NEXT: dominates(4, 5) = false
243// CHECK-NEXT: dominates(4, 6) = false
244// CHECK-NEXT: dominates(5, 0) = false
245// CHECK-NEXT: dominates(5, 1) = false
246// CHECK-NEXT: dominates(5, 2) = false
247// CHECK-NEXT: dominates(5, 3) = false
248// CHECK-NEXT: dominates(5, 4) = false
249// CHECK-NEXT: dominates(5, 5) = true
250// CHECK-NEXT: dominates(5, 6) = false
251// CHECK-NEXT: dominates(6, 0) = true
252// CHECK-NEXT: dominates(6, 1) = true
253// CHECK-NEXT: dominates(6, 2) = true
254// CHECK-NEXT: dominates(6, 3) = true
255// CHECK-NEXT: dominates(6, 4) = true
256// CHECK-NEXT: dominates(6, 5) = true
257// CHECK-NEXT: dominates(6, 6) = true
258// CHECK-LABEL: --- Block PostDominance relationship ---
259// CHECK-NEXT: postdominates(0, 0) = true
260// CHECK-NEXT: postdominates(0, 1) = false
261// CHECK-NEXT: postdominates(0, 2) = false
262// CHECK-NEXT: postdominates(0, 3) = false
263// CHECK-NEXT: postdominates(0, 4) = false
264// CHECK-NEXT: postdominates(0, 5) = false
265// CHECK-NEXT: postdominates(0, 6) = false
266// CHECK-NEXT: postdominates(1, 0) = true
267// CHECK-NEXT: postdominates(1, 1) = true
268// CHECK-NEXT: postdominates(1, 2) = true
269// CHECK-NEXT: postdominates(1, 3) = true
270// CHECK-NEXT: postdominates(1, 4) = true
271// CHECK-NEXT: postdominates(1, 5) = false
272// CHECK-NEXT: postdominates(1, 6) = false
273// CHECK-NEXT: postdominates(2, 0) = false
274// CHECK-NEXT: postdominates(2, 1) = false
275// CHECK-NEXT: postdominates(2, 2) = true
276// CHECK-NEXT: postdominates(2, 3) = true
277// CHECK-NEXT: postdominates(2, 4) = true
278// CHECK-NEXT: postdominates(2, 5) = false
279// CHECK-NEXT: postdominates(2, 6) = false
280// CHECK-NEXT: postdominates(3, 0) = false
281// CHECK-NEXT: postdominates(3, 1) = false
282// CHECK-NEXT: postdominates(3, 2) = false
283// CHECK-NEXT: postdominates(3, 3) = true
284// CHECK-NEXT: postdominates(3, 4) = false
285// CHECK-NEXT: postdominates(3, 5) = false
286// CHECK-NEXT: postdominates(3, 6) = false
287// CHECK-NEXT: postdominates(4, 0) = false
288// CHECK-NEXT: postdominates(4, 1) = false
289// CHECK-NEXT: postdominates(4, 2) = false
290// CHECK-NEXT: postdominates(4, 3) = true
291// CHECK-NEXT: postdominates(4, 4) = true
292// CHECK-NEXT: postdominates(4, 5) = false
293// CHECK-NEXT: postdominates(4, 6) = false
294// CHECK-NEXT: postdominates(5, 0) = true
295// CHECK-NEXT: postdominates(5, 1) = true
296// CHECK-NEXT: postdominates(5, 2) = true
297// CHECK-NEXT: postdominates(5, 3) = true
298// CHECK-NEXT: postdominates(5, 4) = true
299// CHECK-NEXT: postdominates(5, 5) = true
300// CHECK-NEXT: postdominates(5, 6) = false
301// CHECK-NEXT: postdominates(6, 0) = true
302// CHECK-NEXT: postdominates(6, 1) = true
303// CHECK-NEXT: postdominates(6, 2) = true
304// CHECK-NEXT: postdominates(6, 3) = true
305// CHECK-NEXT: postdominates(6, 4) = true
306// CHECK-NEXT: postdominates(6, 5) = true
307// CHECK-NEXT: postdominates(6, 6) = true
308