xref: /llvm-project/mlir/test/Analysis/test-liveness.mlir (revision a5985ca51dd7e0759d65fac9cb2b6a4448ebc404)
1// RUN: mlir-opt %s -pass-pipeline="builtin.module(func.func(test-print-liveness))" -split-input-file 2>&1 | FileCheck %s
2
3// CHECK-LABEL: Testing : func_empty
4func.func @func_empty() {
5  // CHECK: Block: 0
6  // CHECK-NEXT: LiveIn:{{ *$}}
7  // CHECK-NEXT: LiveOut:{{ *$}}
8  // CHECK-NEXT: BeginLivenessIntervals
9  // CHECK-NEXT: EndLivenessIntervals
10  // CHECK-NEXT: BeginCurrentlyLive
11  // CHECK-NEXT: EndCurrentlyLive
12  return
13}
14
15// -----
16
17// CHECK-LABEL: Testing : func_simpleBranch
18func.func @func_simpleBranch(%arg0: i32, %arg1 : i32) -> i32 {
19  // CHECK: Block: 0
20  // CHECK-NEXT: LiveIn:{{ *$}}
21  // CHECK-NEXT: LiveOut: arg0@0 arg1@0
22  // CHECK-NEXT: BeginLivenessIntervals
23  // CHECK-NEXT: EndLivenessIntervals
24  // CHECK-NEXT: BeginCurrentlyLive
25  // CHECK: cf.br
26  // CHECK-SAME:   arg0@0 arg1@0
27  // CHECK-NEXT: EndCurrentlyLive
28  cf.br ^exit
29^exit:
30  // CHECK: Block: 1
31  // CHECK-NEXT: LiveIn: arg0@0 arg1@0
32  // CHECK-NEXT: LiveOut:{{ *$}}
33  // CHECK-NEXT: BeginLivenessIntervals
34  // CHECK: val_2
35  // CHECK-NEXT:     %0 = arith.addi
36  // CHECK-NEXT:     return
37  // CHECK-NEXT: EndLivenessIntervals
38  // CHECK-NEXT: BeginCurrentlyLive
39  // CHECK: arith.addi
40  // CHECK-SAME:    arg0@0 arg1@0 val_2
41  // CHECK: return
42  // CHECK-SAME:    val_2
43  // CHECK-NEXT:EndCurrentlyLive
44  %result = arith.addi %arg0, %arg1 : i32
45  return %result : i32
46}
47
48// -----
49
50// CHECK-LABEL: Testing : func_condBranch
51func.func @func_condBranch(%cond : i1, %arg1: i32, %arg2 : i32) -> i32 {
52  // CHECK: Block: 0
53  // CHECK-NEXT: LiveIn:{{ *$}}
54  // CHECK-NEXT: LiveOut: arg1@0 arg2@0
55  // CHECK-NEXT: BeginLivenessIntervals
56  // CHECK-NEXT: EndLivenessIntervals
57  // CHECK-NEXT: BeginCurrentlyLive
58  // CHECK: cf.cond_br
59  // CHECK-SAME:   arg0@0 arg1@0 arg2@0
60  // CHECK-NEXT: EndCurrentlyLive
61  cf.cond_br %cond, ^bb1, ^bb2
62^bb1:
63  // CHECK: Block: 1
64  // CHECK-NEXT: LiveIn: arg1@0 arg2@0
65  // CHECK-NEXT: LiveOut: arg1@0 arg2@0
66  // CHECK: BeginCurrentlyLive
67  // CHECK: cf.br
68  // COM: arg0@0 had its last user in the previous block.
69  // CHECK-SAME:   arg1@0 arg2@0
70  // CHECK-NEXT: EndCurrentlyLive
71  cf.br ^exit
72^bb2:
73  // CHECK: Block: 2
74  // CHECK-NEXT: LiveIn: arg1@0 arg2@0
75  // CHECK-NEXT: LiveOut: arg1@0 arg2@0
76  // CHECK: BeginCurrentlyLive
77  // CHECK: cf.br
78  // CHECK-SAME:   arg1@0 arg2@0
79  // CHECK-NEXT: EndCurrentlyLive
80  cf.br ^exit
81^exit:
82  // CHECK: Block: 3
83  // CHECK-NEXT: LiveIn: arg1@0 arg2@0
84  // CHECK-NEXT: LiveOut:{{ *$}}
85  // CHECK-NEXT: BeginLivenessIntervals
86  // CHECK: val_3
87  // CHECK-NEXT:     %0 = arith.addi
88  // CHECK-NEXT:     return
89  // CHECK-NEXT: EndLivenessIntervals
90  // CHECK-NEXT: BeginCurrentlyLive
91  // CHECK: arith.addi
92  // CHECK-SAME:   arg1@0 arg2@0 val_3
93  // CHECK: return
94  // CHECK-SAME:  val_3
95  // CHECK-NEXT: EndCurrentlyLive
96  %result = arith.addi %arg1, %arg2 : i32
97  return %result : i32
98}
99
100// -----
101
102// CHECK-LABEL: Testing : func_loop
103func.func @func_loop(%arg0 : i32, %arg1 : i32) -> i32 {
104  // CHECK: Block: 0
105  // CHECK-NEXT: LiveIn:{{ *$}}
106  // CHECK-NEXT: LiveOut: arg1@0
107  // CHECK: BeginCurrentlyLive
108  // CHECK: arith.constant
109  // CHECK-SAME:  arg0@0 arg1@0 val_2
110  // CHECK: cf.br
111  // CHECK-SAME:  arg0@0 arg1@0 val_2
112  // CHECK-NEXT: EndCurrentlyLive
113  %const0 = arith.constant 0 : i32
114  cf.br ^loopHeader(%const0, %arg0 : i32, i32)
115^loopHeader(%counter : i32, %i : i32):
116  // CHECK: Block: 1
117  // CHECK-NEXT: LiveIn: arg1@0
118  // CHECK-NEXT: LiveOut: arg1@0 arg0@1
119  // CHECK-NEXT: BeginLivenessIntervals
120  // CHECK-NEXT: val_5
121  // CHECK-NEXT:     %2 = arith.cmpi
122  // CHECK-NEXT:     cf.cond_br
123  // CHECK-NEXT: EndLivenessIntervals
124  // CHECK-NEXT: BeginCurrentlyLive
125  // CHECK: arith.cmpi
126  // CHECK-SAME:  arg1@0 arg0@1 arg1@1 val_5
127  // CHECK: cf.cond_br
128  // CHECK-SAME:  arg1@0 arg0@1 arg1@1 val_5
129  // CHECK-NEXT: EndCurrentlyLive
130  %lessThan = arith.cmpi slt, %counter, %arg1 : i32
131  cf.cond_br %lessThan, ^loopBody(%i : i32), ^exit(%i : i32)
132^loopBody(%val : i32):
133  // CHECK: Block: 2
134  // CHECK-NEXT: LiveIn: arg1@0 arg0@1
135  // CHECK-NEXT: LiveOut: arg1@0
136  // CHECK-NEXT: BeginLivenessIntervals
137  // CHECK-NEXT: val_7
138  // CHECK-NEXT:     %c
139  // CHECK-NEXT:     %4 = arith.addi
140  // CHECK-NEXT:     %5 = arith.addi
141  // CHECK-NEXT: val_8
142  // CHECK-NEXT:     %4 = arith.addi
143  // CHECK-NEXT:     %5 = arith.addi
144  // CHECK-NEXT:     cf.br
145  // CHECK: EndLivenessIntervals
146  // CHECK-NEXT: BeginCurrentlyLive
147  // CHECK: arith.constant
148  // CHECK-SAME:  arg1@0 arg0@1 arg0@2 val_7
149  // CHECK: arith.addi
150  // CHECK-SAME:  arg1@0 arg0@1 arg0@2 val_7 val_8
151  // CHECK: arith.addi
152  // CHECK-SAME:  arg1@0 arg0@1 val_7 val_8 val_9
153  // CHECK: cf.br
154  // CHECK-SAME:  arg1@0 val_8 val_9
155  // CHECK-NEXT: EndCurrentlyLive
156  %const1 = arith.constant 1 : i32
157  %inc = arith.addi %val, %const1 : i32
158  %inc2 = arith.addi %counter, %const1 : i32
159  cf.br ^loopHeader(%inc, %inc2 : i32, i32)
160^exit(%sum : i32):
161  // CHECK: Block: 3
162  // CHECK-NEXT: LiveIn: arg1@0
163  // CHECK-NEXT: LiveOut:{{ *$}}
164  // CHECK: BeginCurrentlyLive
165  // CHECK: arith.addi
166  // CHECK-SAME:  arg1@0 arg0@3 val_11
167  // CHECK: return
168  // CHECK-SAME:  val_11
169  // CHECK-NEXT: EndCurrentlyLive
170  %result = arith.addi %sum, %arg1 : i32
171  return %result : i32
172}
173
174// -----
175
176// CHECK-LABEL: Testing : func_ranges
177func.func @func_ranges(%cond : i1, %arg1 : i32, %arg2 : i32, %arg3 : i32) -> i32 {
178  // CHECK: Block: 0
179  // CHECK-NEXT: LiveIn:{{ *$}}
180  // CHECK-NEXT: LiveOut: arg2@0 val_9 val_10
181  // CHECK-NEXT: BeginLivenessIntervals
182  // CHECK-NEXT: val_4
183  // CHECK-NEXT:    %0 = arith.addi
184  // CHECK-NEXT:    %c
185  // CHECK-NEXT:    %1 = arith.addi
186  // CHECK-NEXT:    %2 = arith.addi
187  // CHECK-NEXT:    %3 = arith.muli
188  // CHECK-NEXT: val_5
189  // CHECK-NEXT:    %c
190  // CHECK-NEXT:    %1 = arith.addi
191  // CHECK-NEXT:    %2 = arith.addi
192  // CHECK-NEXT:    %3 = arith.muli
193  // CHECK-NEXT:    %4 = arith.muli
194  // CHECK-NEXT:    %5 = arith.addi
195  // CHECK-NEXT: val_6
196  // CHECK-NEXT:    %1 = arith.addi
197  // CHECK-NEXT:    %2 = arith.addi
198  // CHECK-NEXT:    %3 = arith.muli
199  // CHECK-NEXT: val_7
200  // CHECK-NEXT:   %2 = arith.addi
201  // CHECK-NEXT:   %3 = arith.muli
202  // CHECK-NEXT:   %4 = arith.muli
203  // CHECK:      val_8
204  // CHECK-NEXT:    %3 = arith.muli
205  // CHECK-NEXT:    %4 = arith.muli
206  // CHECK-NEXT: val_9
207  // CHECK-NEXT:    %4 = arith.muli
208  // CHECK-NEXT:    %5 = arith.addi
209  // CHECK-NEXT:    cf.cond_br
210  // CHECK-NEXT:    %c
211  // CHECK-NEXT:    %6 = arith.muli
212  // CHECK-NEXT:    %7 = arith.muli
213  // CHECK-NEXT:    %8 = arith.addi
214  // CHECK-NEXT: val_10
215  // CHECK-NEXT:    %5 = arith.addi
216  // CHECK-NEXT:    cf.cond_br
217  // CHECK-NEXT:    %7
218  // CHECK: EndLivenessIntervals
219  // CHECK-NEXT: BeginCurrentlyLive
220  // CHECK: arith.addi
221  // CHECK-SAME:  arg0@0 arg1@0 arg2@0 arg3@0 val_4
222  // CHECK: arith.constant
223  // CHECK-SAME:  arg0@0 arg2@0 arg3@0 val_4 val_5
224  // CHECK: arith.addi
225  // CHECK-SAME:  arg0@0 arg2@0 arg3@0 val_4 val_5 val_6
226  // CHECK: arith.addi
227  // CHECK-SAME:  arg0@0 arg2@0 arg3@0 val_4 val_5 val_6 val_7
228  // CHECK: arith.muli
229  // CHECK-SAME:  arg0@0 arg2@0 val_4 val_5 val_6 val_7 val_8
230  // CHECK: arith.muli
231  // CHECK-SAME:  arg0@0 arg2@0 val_5 val_7 val_8 val_9
232  // CHECK: arith.addi
233  // CHECK-SAME:  arg0@0 arg2@0 val_5 val_9 val_10
234  // CHECK: cf.cond_br
235  // CHECK-SAME:  arg0@0 arg2@0 val_9 val_10
236  // CHECK-NEXT: EndCurrentlyLive
237  %0 = arith.addi %arg1, %arg2 : i32
238  %const1 = arith.constant 1 : i32
239  %1 = arith.addi %const1, %arg2 : i32
240  %2 = arith.addi %const1, %arg3 : i32
241  %3 = arith.muli %0, %1 : i32
242  %4 = arith.muli %3, %2 : i32
243  %5 = arith.addi %4, %const1 : i32
244  cf.cond_br %cond, ^bb1, ^bb2
245
246^bb1:
247  // CHECK: Block: 1
248  // CHECK-NEXT: LiveIn: arg2@0 val_9
249  // CHECK-NEXT: LiveOut: arg2@0
250  // CHECK: BeginCurrentlyLive
251  // CHECK: arith.constant
252  // CHECK-SAME:  arg2@0 val_9
253  // CHECK: arith.muli
254  // CHECK-SAME:  arg2@0 val_9
255  // CHECK: cf.br
256  // CHECK-SAME:  arg2@0
257  // CHECK-NEXT: EndCurrentlyLive
258  %const4 = arith.constant 4 : i32
259  %6 = arith.muli %4, %const4 : i32
260  cf.br ^exit(%6 : i32)
261
262^bb2:
263  // CHECK: Block: 2
264  // CHECK-NEXT: LiveIn: arg2@0 val_9 val_10
265  // CHECK-NEXT: LiveOut: arg2@0
266  // CHECK: BeginCurrentlyLive
267  // CHECK: arith.muli
268  // CHECK-SAME:  arg2@0 val_9 val_10
269  // CHECK: arith.addi
270  // CHECK-SAME:  arg2@0
271  // CHECK: cf.br
272  // CHECK-SAME:  arg2@0
273  // CHECK: EndCurrentlyLive
274  %7 = arith.muli %4, %5 : i32
275  %8 = arith.addi %4, %arg2 : i32
276  cf.br ^exit(%8 : i32)
277
278^exit(%sum : i32):
279  // CHECK: Block: 3
280  // CHECK-NEXT: LiveIn: arg2@0
281  // CHECK-NEXT: LiveOut:{{ *$}}
282  // CHECK: BeginCurrentlyLive
283  // CHECK: arith.addi
284  // CHECK-SAME:  arg2@0
285  // CHECK: return
286  // CHECK-NOT: arg2@0
287  // CHECK: EndCurrentlyLive
288  %result = arith.addi %sum, %arg2 : i32
289  return %result : i32
290}
291
292// -----
293
294// CHECK-LABEL: Testing : nested_region
295
296func.func @nested_region(
297  %arg0 : index, %arg1 : index, %arg2 : index,
298  %arg3 : i32, %arg4 : i32, %arg5 : i32,
299  %buffer : memref<i32>) -> i32 {
300  // CHECK: Block: 0
301  // CHECK-NEXT: LiveIn:{{ *$}}
302  // CHECK-NEXT: LiveOut:{{ *$}}
303  // CHECK-NEXT: BeginLivenessIntervals
304  // CHECK-NEXT: val_7
305  // CHECK-NEXT:    %0 = arith.addi
306  // CHECK-NEXT:    %1 = arith.addi
307  // CHECK-NEXT:    scf.for
308  // CHECK:         // %2 = arith.addi
309  // CHECK-NEXT:    %3 = arith.addi
310  // CHECK-NEXT: val_8
311  // CHECK-NEXT:    %1 = arith.addi
312  // CHECK-NEXT:    scf.for
313  // CHECK:         // func.return %1
314  // CHECK: EndLivenessIntervals
315  // CHECK-NEXT: BeginCurrentlyLive
316  // CHECK: arith.addi
317  // CHECK-SAME:  arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7
318  // CHECK: arith.addi
319  // CHECK-SAME:  arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8
320  // CHECK: scf.for
321  // CHECK-NEXT: arith.addi
322  // CHECK-NEXT: arith.addi
323  // CHECK-NEXT: memref.store
324  // CHECK-NEXT:  arg5@0 arg6@0 val_7 val_8
325  // CHECK: return
326  // CHECK-SAME:  val_8
327  // CHECK-NEXT: EndCurrentlyLive
328  %0 = arith.addi %arg3, %arg4 : i32
329  %1 = arith.addi %arg4, %arg5 : i32
330  scf.for %arg6 = %arg0 to %arg1 step %arg2 {
331    // CHECK: Block: 1
332    // CHECK-NEXT: LiveIn: arg5@0 arg6@0 val_7
333    // CHECK-NEXT: LiveOut:{{ *$}}
334    // CHECK: BeginCurrentlyLive
335    // CHECK-NEXT: arith.addi
336    // CHECK-SAME:   arg5@0 arg6@0 val_7 arg0@1 val_10
337    // CHECK-NEXT: arith.addi
338    // CHECK-SAME:   arg6@0 val_7 val_10 val_11
339    // CHECK-NEXT: memref.store
340    // CHECK-SAME:   arg6@0 val_11
341    // CHECK-NEXT: EndCurrentlyLive
342    %2 = arith.addi %0, %arg5 : i32
343    %3 = arith.addi %2, %0 : i32
344    memref.store %3, %buffer[] : memref<i32>
345  }
346  return %1 : i32
347}
348
349// -----
350
351// CHECK-LABEL: Testing : nested_region2
352
353func.func @nested_region2(
354  // CHECK: Block: 0
355  // CHECK-NEXT: LiveIn:{{ *$}}
356  // CHECK-NEXT: LiveOut:{{ *$}}
357  // CHECK-NEXT: BeginLivenessIntervals
358  // CHECK-NEXT: val_7
359  // CHECK-NEXT:    %0 = arith.addi
360  // CHECK-NEXT:    %1 = arith.addi
361  // CHECK-NEXT:    scf.for
362  // CHECK:         // %2 = arith.addi
363  // CHECK-NEXT:    scf.for
364  // CHECK:         // %3 = arith.addi
365  // CHECK-NEXT: val_8
366  // CHECK-NEXT:    %1 = arith.addi
367  // CHECK-NEXT:    scf.for
368  // CHECK:         // func.return %1
369  // CHECK: EndLivenessIntervals
370  // CHECK-NEXT: BeginCurrentlyLive
371  // CHECK-NEXT: arith.addi
372  // CHECK-SAME:   arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7
373  // CHECK-NEXT: arith.addi
374  // CHECK-SAME:   arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8
375  // CHECK-NEXT: scf.for {{.*}}
376  // CHECK-NEXT:   arith.addi
377  // CHECK-NEXT:   scf.for {{.*}} {
378  // CHECK-NEXT:     arith.addi
379  // CHECK-NEXT:     memref.store
380  // CHECK-NEXT:   }
381  // CHECK-NEXT: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 val_8
382  // CHECK-NEXT: return
383  // CHECK-SAME:  val_8
384  %arg0 : index, %arg1 : index, %arg2 : index,
385  %arg3 : i32, %arg4 : i32, %arg5 : i32,
386  %buffer : memref<i32>) -> i32 {
387  %0 = arith.addi %arg3, %arg4 : i32
388  %1 = arith.addi %arg4, %arg5 : i32
389  scf.for %arg6 = %arg0 to %arg1 step %arg2 {
390    // CHECK: Block: 1
391    // CHECK-NEXT: LiveIn: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7
392    // CHECK-NEXT: LiveOut:{{ *$}}
393    // CHECK-NEXT: BeginLivenessIntervals
394    // CHECK-NEXT: val_10
395    // CHECK-NEXT:    %2 = arith.addi
396    // CHECK-NEXT:    scf.for
397    // CHECK:         // %3 = arith.addi
398    // CHECK: EndLivenessIntervals
399    // CHECK-NEXT: BeginCurrentlyLive
400    // CHECK-NEXT: arith.addi
401    // CHECK-SAME:   arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 arg0@1 val_10
402    // CHECK-NEXT: scf.for {{.*}}
403    // CHECK-NEXT:   arith.addi
404    // CHECK-NEXT:   memref.store
405    // CHECK-NEXT: arg0@0 arg1@0 arg2@0 arg6@0 val_7
406    %2 = arith.addi %0, %arg5 : i32
407    scf.for %arg7 = %arg0 to %arg1 step %arg2 {
408      // CHECK: Block: 2
409      // CHECK: BeginCurrentlyLive
410      // CHECK-NEXT: arith.addi
411      // CHECK-SAME:   arg6@0 val_7 val_10 arg0@2 val_12
412      // CHECK-NEXT: memref.store
413      // CHECK-SAME:   arg6@0 val_12
414      // CHECK: EndCurrentlyLive
415      %3 = arith.addi %2, %0 : i32
416      memref.store %3, %buffer[] : memref<i32>
417    }
418  }
419  return %1 : i32
420}
421
422// -----
423
424// CHECK-LABEL: Testing : nested_region3
425
426func.func @nested_region3(
427  // CHECK: Block: 0
428  // CHECK-NEXT: LiveIn:{{ *$}}
429  // CHECK-NEXT: LiveOut: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8
430  // CHECK-NEXT: BeginLivenessIntervals
431  // CHECK-NEXT: val_7
432  // CHECK-NEXT:    %0 = arith.addi
433  // CHECK-NEXT:    %1 = arith.addi
434  // CHECK-NEXT:    scf.for
435  // CHECK:         // cf.br ^bb1
436  // CHECK-NEXT:    %2 = arith.addi
437  // CHECK-NEXT:    scf.for
438  // CHECK:         // %2 = arith.addi
439  // CHECK: EndLivenessIntervals
440  // CHECK-NEXT: BeginCurrentlyLive
441  // CHECK-NEXT: arith.addi
442  // CHECK-SAME:   arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7
443  // CHECK-NEXT: arith.addi
444  // CHECK-SAME:   arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8
445  // CHECK-NEXT: scf.for
446  // COM: Skipping the body of the scf.for...
447  // CHECK: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 val_8
448  // CHECK-NEXT: cf.br
449  // CHECK-SAME:   arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8
450  // CHECK-NEXT: EndCurrentlyLive
451  %arg0 : index, %arg1 : index, %arg2 : index,
452  %arg3 : i32, %arg4 : i32, %arg5 : i32,
453  %buffer : memref<i32>) -> i32 {
454  %0 = arith.addi %arg3, %arg4 : i32
455  %1 = arith.addi %arg4, %arg5 : i32
456  scf.for %arg6 = %arg0 to %arg1 step %arg2 {
457    // CHECK: Block: 1
458    // CHECK-NEXT: LiveIn: arg5@0 arg6@0 val_7
459    // CHECK-NEXT: LiveOut:{{ *$}}
460    // CHECK: BeginCurrentlyLive
461    // CHECK-NEXT: arith.addi
462    // CHECK-SAME:   arg5@0 arg6@0 val_7 arg0@1 val_10
463    // CHECK-NEXT: memref.store
464    // CHECK-SAME:   arg6@0 val_10
465    // CHECK-NEXT: EndCurrentlyLive
466    %2 = arith.addi %0, %arg5 : i32
467    memref.store %2, %buffer[] : memref<i32>
468  }
469  cf.br ^exit
470
471^exit:
472  // CHECK: Block: 2
473  // CHECK-NEXT: LiveIn: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8
474  // CHECK-NEXT: LiveOut:{{ *$}}
475  // CHECK: BeginCurrentlyLive
476  // CHECK: scf.for
477  // CHECK: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8
478  // CHECK-NEXT: return
479  // CHECK-SAME:   val_8
480  // CHECK-NEXT: EndCurrentlyLive
481  scf.for %arg7 = %arg0 to %arg1 step %arg2 {
482    // CHECK: Block: 3
483    // CHECK-NEXT: LiveIn: arg6@0 val_7 val_8
484    // CHECK-NEXT: LiveOut:{{ *$}}
485    // CHECK: BeginCurrentlyLive
486    // CHECK-NEXT: arith.addi
487    // CHECK-SAME:   arg6@0 val_7 val_8 arg0@3 val_12
488    // CHECK-NEXT: memref.store
489    // CHECK-SAME:   arg6@0 val_12
490    // CHECK-NEXT: EndCurrentlyLive
491    %2 = arith.addi %0, %1 : i32
492    memref.store %2, %buffer[] : memref<i32>
493  }
494  return %1 : i32
495}
496
497// -----
498
499// CHECK-LABEL: Testing : nested_region4
500
501func.func @nested_region4(%arg0: index, %arg1: index, %arg2: index) {
502  // CHECK: Block: 0
503  // CHECK-NEXT: LiveIn:{{ *$}}
504  // CHECK-NEXT: LiveOut:{{ *$}}
505
506  // CHECK: {{^// +}}[[VAL3:[a-z0-9_]+]]{{ *:}}
507  // CHECK: {{^// +}}[[VAL4:[a-z0-9_]+]]{{ *:}}
508  %c0_i32 = arith.constant 0 : i32
509  %c1_i32 = arith.constant 1 : i32
510
511  %0 = scf.for %arg3 = %arg0 to %arg1 step %arg2 iter_args(%arg4 = %c0_i32) -> (i32) {
512    // CHECK: Block: 1
513    // CHECK-NEXT: LiveIn: [[VAL4]]{{ *$}}
514    // CHECK-NEXT: LiveOut:{{ *$}}
515    %1 = arith.addi %arg4, %c1_i32 : i32
516    scf.yield %1 : i32
517  }
518  return
519}
520