xref: /llvm-project/mlir/test/Analysis/DataFlow/test-last-modified.mlir (revision a9d0f5e2f09aef88426a1bf14aeffaaa753f0f13)
1d80c271cSMogball// RUN: mlir-opt -test-last-modified %s 2>&1 | FileCheck %s
2d80c271cSMogball
3d80c271cSMogball// CHECK-LABEL: test_tag: test_simple_mod
4d80c271cSMogball// CHECK: operand #0
5d80c271cSMogball// CHECK-NEXT: - a
6d80c271cSMogball// CHECK: operand #1
7d80c271cSMogball// CHECK-NEXT: - b
8d80c271cSMogballfunc.func @test_simple_mod(%arg0: memref<i32>, %arg1: memref<i32>) -> (memref<i32>, memref<i32>) {
9d80c271cSMogball  %c0 = arith.constant 0 : i32
10d80c271cSMogball  %c1 = arith.constant 1 : i32
11d80c271cSMogball  memref.store %c0, %arg0[] {tag_name = "a"} : memref<i32>
12d80c271cSMogball  memref.store %c1, %arg1[] {tag_name = "b"} : memref<i32>
13d80c271cSMogball  return {tag = "test_simple_mod"} %arg0, %arg1 : memref<i32>, memref<i32>
14d80c271cSMogball}
15d80c271cSMogball
16d80c271cSMogball// CHECK-LABEL: test_tag: test_simple_mod_overwrite_a
17d80c271cSMogball// CHECK: operand #1
18d80c271cSMogball// CHECK-NEXT: - a
19d80c271cSMogball// CHECK-LABEL: test_tag: test_simple_mod_overwrite_b
20d80c271cSMogball// CHECK: operand #0
21d80c271cSMogball// CHECK-NEXT: - b
22d80c271cSMogballfunc.func @test_simple_mod_overwrite(%arg0: memref<i32>) -> memref<i32> {
23d80c271cSMogball  %c0 = arith.constant 0 : i32
24d80c271cSMogball  memref.store %c0, %arg0[] {tag = "test_simple_mod_overwrite_a", tag_name = "a"} : memref<i32>
25d80c271cSMogball  %c1 = arith.constant 1 : i32
26d80c271cSMogball  memref.store %c1, %arg0[] {tag_name = "b"} : memref<i32>
27d80c271cSMogball  return {tag = "test_simple_mod_overwrite_b"} %arg0 : memref<i32>
28d80c271cSMogball}
29d80c271cSMogball
30d80c271cSMogball// CHECK-LABEL: test_tag: test_mod_control_flow
31d80c271cSMogball// CHECK: operand #0
32d80c271cSMogball// CHECK-NEXT: - b
33d80c271cSMogball// CHECK-NEXT: - a
34d80c271cSMogballfunc.func @test_mod_control_flow(%cond: i1, %ptr: memref<i32>) -> memref<i32> {
35d80c271cSMogball  cf.cond_br %cond, ^a, ^b
36d80c271cSMogball
37d80c271cSMogball^a:
38d80c271cSMogball  %c0 = arith.constant 0 : i32
39d80c271cSMogball  memref.store %c0, %ptr[] {tag_name = "a"} : memref<i32>
40d80c271cSMogball  cf.br ^c
41d80c271cSMogball
42d80c271cSMogball^b:
43d80c271cSMogball  %c1 = arith.constant 1 : i32
44d80c271cSMogball  memref.store %c1, %ptr[] {tag_name = "b"} : memref<i32>
45d80c271cSMogball  cf.br ^c
46d80c271cSMogball
47d80c271cSMogball^c:
48d80c271cSMogball  return {tag = "test_mod_control_flow"} %ptr : memref<i32>
49d80c271cSMogball}
50d80c271cSMogball
51d80c271cSMogball// CHECK-LABEL: test_tag: test_mod_dead_branch
52d80c271cSMogball// CHECK: operand #0
53d80c271cSMogball// CHECK-NEXT: - a
54d80c271cSMogballfunc.func @test_mod_dead_branch(%arg: i32, %ptr: memref<i32>) -> memref<i32> {
55d80c271cSMogball  %0 = arith.subi %arg, %arg : i32
56d80c271cSMogball  %1 = arith.constant -1 : i32
57d80c271cSMogball  %2 = arith.cmpi sgt, %0, %1 : i32
58d80c271cSMogball  cf.cond_br %2, ^a, ^b
59d80c271cSMogball
60d80c271cSMogball^a:
61d80c271cSMogball  %c0 = arith.constant 0 : i32
62d80c271cSMogball  memref.store %c0, %ptr[] {tag_name = "a"} : memref<i32>
63d80c271cSMogball  cf.br ^c
64d80c271cSMogball
65d80c271cSMogball^b:
66d80c271cSMogball  %c1 = arith.constant 1 : i32
67d80c271cSMogball  memref.store %c1, %ptr[] {tag_name = "b"} : memref<i32>
68d80c271cSMogball  cf.br ^c
69d80c271cSMogball
70d80c271cSMogball^c:
71d80c271cSMogball  return {tag = "test_mod_dead_branch"} %ptr : memref<i32>
72d80c271cSMogball}
73d80c271cSMogball
74d80c271cSMogball// CHECK-LABEL: test_tag: test_mod_region_control_flow
75d80c271cSMogball// CHECK: operand #0
76d80c271cSMogball// CHECK-NEXT: then
77d80c271cSMogball// CHECK-NEXT: else
78d80c271cSMogballfunc.func @test_mod_region_control_flow(%cond: i1, %ptr: memref<i32>) -> memref<i32> {
79d80c271cSMogball  scf.if %cond {
80d80c271cSMogball    %c0 = arith.constant 0 : i32
81d80c271cSMogball    memref.store %c0, %ptr[] {tag_name = "then"}: memref<i32>
82d80c271cSMogball  } else {
83d80c271cSMogball    %c1 = arith.constant 1 : i32
84d80c271cSMogball    memref.store %c1, %ptr[] {tag_name = "else"} : memref<i32>
85d80c271cSMogball  }
86d80c271cSMogball  return {tag = "test_mod_region_control_flow"} %ptr : memref<i32>
87d80c271cSMogball}
88d80c271cSMogball
89d80c271cSMogball// CHECK-LABEL: test_tag: test_mod_dead_region
90d80c271cSMogball// CHECK: operand #0
91d80c271cSMogball// CHECK-NEXT: else
92d80c271cSMogballfunc.func @test_mod_dead_region(%ptr: memref<i32>) -> memref<i32> {
93d80c271cSMogball  %false = arith.constant false
94d80c271cSMogball  scf.if %false {
95d80c271cSMogball    %c0 = arith.constant 0 : i32
96d80c271cSMogball    memref.store %c0, %ptr[] {tag_name = "then"}: memref<i32>
97d80c271cSMogball  } else {
98d80c271cSMogball    %c1 = arith.constant 1 : i32
99d80c271cSMogball    memref.store %c1, %ptr[] {tag_name = "else"} : memref<i32>
100d80c271cSMogball  }
101d80c271cSMogball  return {tag = "test_mod_dead_region"} %ptr : memref<i32>
102d80c271cSMogball}
103d80c271cSMogball
104d80c271cSMogball// CHECK-LABEL: test_tag: unknown_memory_effects_a
105d80c271cSMogball// CHECK: operand #1
106d80c271cSMogball// CHECK-NEXT: - a
107d80c271cSMogball// CHECK-LABEL: test_tag: unknown_memory_effects_b
108d80c271cSMogball// CHECK: operand #0
109d80c271cSMogball// CHECK-NEXT: - <unknown>
110d80c271cSMogballfunc.func @unknown_memory_effects(%ptr: memref<i32>) -> memref<i32> {
111d80c271cSMogball  %c0 = arith.constant 0 : i32
112d80c271cSMogball  memref.store %c0, %ptr[] {tag = "unknown_memory_effects_a", tag_name = "a"} : memref<i32>
113d80c271cSMogball  "test.unknown_effects"() : () -> ()
114d80c271cSMogball  return {tag = "unknown_memory_effects_b"} %ptr : memref<i32>
115d80c271cSMogball}
1165d8813deSAlex Zinenko
1175d8813deSAlex Zinenko// CHECK-LABEL: test_tag: store_with_a_region_before::before:
1185d8813deSAlex Zinenko// CHECK:  operand #0
1195d8813deSAlex Zinenko// CHECK:   - pre
1205d8813deSAlex Zinenko// CHECK: test_tag: inside_region:
1215d8813deSAlex Zinenko// CHECK:  operand #0
1225d8813deSAlex Zinenko// CHECK:   - region
1235d8813deSAlex Zinenko// CHECK: test_tag: after:
1245d8813deSAlex Zinenko// CHECK:  operand #0
1255d8813deSAlex Zinenko// CHECK:   - region
1265d8813deSAlex Zinenko// CHECK: test_tag: return:
1275d8813deSAlex Zinenko// CHECK:  operand #0
1285d8813deSAlex Zinenko// CHECK:   - post
1295d8813deSAlex Zinenkofunc.func @store_with_a_region_before(%arg0: memref<f32>) -> memref<f32> {
1305d8813deSAlex Zinenko  %0 = arith.constant 0.0 : f32
1315d8813deSAlex Zinenko  %1 = arith.constant 1.0 : f32
1325d8813deSAlex Zinenko  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
1335d8813deSAlex Zinenko  memref.load %arg0[] {tag = "store_with_a_region_before::before"} : memref<f32>
1345d8813deSAlex Zinenko  test.store_with_a_region %arg0 attributes { tag_name = "region", store_before_region = true } {
1355d8813deSAlex Zinenko    memref.load %arg0[] {tag = "inside_region"} : memref<f32>
1365d8813deSAlex Zinenko    test.store_with_a_region_terminator
1375d8813deSAlex Zinenko  } : memref<f32>
1385d8813deSAlex Zinenko  memref.load %arg0[] {tag = "after"} : memref<f32>
1395d8813deSAlex Zinenko  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
1405d8813deSAlex Zinenko  return {tag = "return"} %arg0 : memref<f32>
1415d8813deSAlex Zinenko}
1425d8813deSAlex Zinenko
1435d8813deSAlex Zinenko// CHECK-LABEL: test_tag: store_with_a_region_after::before:
1445d8813deSAlex Zinenko// CHECK:  operand #0
1455d8813deSAlex Zinenko// CHECK:   - pre
1465d8813deSAlex Zinenko// CHECK: test_tag: inside_region:
1475d8813deSAlex Zinenko// CHECK:  operand #0
1485d8813deSAlex Zinenko// CHECK:   - pre
1495d8813deSAlex Zinenko// CHECK: test_tag: after:
1505d8813deSAlex Zinenko// CHECK:  operand #0
1515d8813deSAlex Zinenko// CHECK:   - region
1525d8813deSAlex Zinenko// CHECK: test_tag: return:
1535d8813deSAlex Zinenko// CHECK:  operand #0
1545d8813deSAlex Zinenko// CHECK:   - post
1555d8813deSAlex Zinenkofunc.func @store_with_a_region_after(%arg0: memref<f32>) -> memref<f32> {
1565d8813deSAlex Zinenko  %0 = arith.constant 0.0 : f32
1575d8813deSAlex Zinenko  %1 = arith.constant 1.0 : f32
1585d8813deSAlex Zinenko  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
1595d8813deSAlex Zinenko  memref.load %arg0[] {tag = "store_with_a_region_after::before"} : memref<f32>
1605d8813deSAlex Zinenko  test.store_with_a_region %arg0 attributes { tag_name = "region", store_before_region = false } {
1615d8813deSAlex Zinenko    memref.load %arg0[] {tag = "inside_region"} : memref<f32>
1625d8813deSAlex Zinenko    test.store_with_a_region_terminator
1635d8813deSAlex Zinenko  } : memref<f32>
1645d8813deSAlex Zinenko  memref.load %arg0[] {tag = "after"} : memref<f32>
1655d8813deSAlex Zinenko  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
1665d8813deSAlex Zinenko  return {tag = "return"} %arg0 : memref<f32>
1675d8813deSAlex Zinenko}
1685d8813deSAlex Zinenko
1695d8813deSAlex Zinenko// CHECK-LABEL: test_tag: store_with_a_region_before_containing_a_store::before:
1705d8813deSAlex Zinenko// CHECK:  operand #0
1715d8813deSAlex Zinenko// CHECK:   - pre
1725d8813deSAlex Zinenko// CHECK: test_tag: enter_region:
1735d8813deSAlex Zinenko// CHECK:  operand #0
1745d8813deSAlex Zinenko// CHECK:   - region
1755d8813deSAlex Zinenko// CHECK: test_tag: exit_region:
1765d8813deSAlex Zinenko// CHECK:  operand #0
1775d8813deSAlex Zinenko// CHECK:   - inner
1785d8813deSAlex Zinenko// CHECK: test_tag: after:
1795d8813deSAlex Zinenko// CHECK:  operand #0
1805d8813deSAlex Zinenko// CHECK:   - inner
1815d8813deSAlex Zinenko// CHECK: test_tag: return:
1825d8813deSAlex Zinenko// CHECK:  operand #0
1835d8813deSAlex Zinenko// CHECK:   - post
1845d8813deSAlex Zinenkofunc.func @store_with_a_region_before_containing_a_store(%arg0: memref<f32>) -> memref<f32> {
1855d8813deSAlex Zinenko  %0 = arith.constant 0.0 : f32
1865d8813deSAlex Zinenko  %1 = arith.constant 1.0 : f32
1875d8813deSAlex Zinenko  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
1885d8813deSAlex Zinenko  memref.load %arg0[] {tag = "store_with_a_region_before_containing_a_store::before"} : memref<f32>
1895d8813deSAlex Zinenko  test.store_with_a_region %arg0 attributes { tag_name = "region", store_before_region = true } {
1905d8813deSAlex Zinenko    memref.load %arg0[] {tag = "enter_region"} : memref<f32>
1915d8813deSAlex Zinenko    %2 = arith.constant 2.0 : f32
1925d8813deSAlex Zinenko    memref.store %2, %arg0[] {tag_name = "inner"} : memref<f32>
1935d8813deSAlex Zinenko    memref.load %arg0[] {tag = "exit_region"} : memref<f32>
1945d8813deSAlex Zinenko    test.store_with_a_region_terminator
1955d8813deSAlex Zinenko  } : memref<f32>
1965d8813deSAlex Zinenko  memref.load %arg0[] {tag = "after"} : memref<f32>
1975d8813deSAlex Zinenko  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
1985d8813deSAlex Zinenko  return {tag = "return"} %arg0 : memref<f32>
1995d8813deSAlex Zinenko}
2005d8813deSAlex Zinenko
2015d8813deSAlex Zinenko// CHECK-LABEL: test_tag: store_with_a_region_after_containing_a_store::before:
2025d8813deSAlex Zinenko// CHECK:  operand #0
2035d8813deSAlex Zinenko// CHECK:   - pre
2045d8813deSAlex Zinenko// CHECK: test_tag: enter_region:
2055d8813deSAlex Zinenko// CHECK:  operand #0
2065d8813deSAlex Zinenko// CHECK:   - pre
2075d8813deSAlex Zinenko// CHECK: test_tag: exit_region:
2085d8813deSAlex Zinenko// CHECK:  operand #0
2095d8813deSAlex Zinenko// CHECK:   - inner
2105d8813deSAlex Zinenko// CHECK: test_tag: after:
2115d8813deSAlex Zinenko// CHECK:  operand #0
2125d8813deSAlex Zinenko// CHECK:   - region
2135d8813deSAlex Zinenko// CHECK: test_tag: return:
2145d8813deSAlex Zinenko// CHECK:  operand #0
2155d8813deSAlex Zinenko// CHECK:   - post
2165d8813deSAlex Zinenkofunc.func @store_with_a_region_after_containing_a_store(%arg0: memref<f32>) -> memref<f32> {
2175d8813deSAlex Zinenko  %0 = arith.constant 0.0 : f32
2185d8813deSAlex Zinenko  %1 = arith.constant 1.0 : f32
2195d8813deSAlex Zinenko  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
2205d8813deSAlex Zinenko  memref.load %arg0[] {tag = "store_with_a_region_after_containing_a_store::before"} : memref<f32>
2215d8813deSAlex Zinenko  test.store_with_a_region %arg0 attributes { tag_name = "region", store_before_region = false } {
2225d8813deSAlex Zinenko    memref.load %arg0[] {tag = "enter_region"} : memref<f32>
2235d8813deSAlex Zinenko    %2 = arith.constant 2.0 : f32
2245d8813deSAlex Zinenko    memref.store %2, %arg0[] {tag_name = "inner"} : memref<f32>
2255d8813deSAlex Zinenko    memref.load %arg0[] {tag = "exit_region"} : memref<f32>
2265d8813deSAlex Zinenko    test.store_with_a_region_terminator
2275d8813deSAlex Zinenko  } : memref<f32>
2285d8813deSAlex Zinenko  memref.load %arg0[] {tag = "after"} : memref<f32>
2295d8813deSAlex Zinenko  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
2305d8813deSAlex Zinenko  return {tag = "return"} %arg0 : memref<f32>
2315d8813deSAlex Zinenko}
232*a9d0f5e2Svic
233*a9d0f5e2Svic// CHECK-LABEL: test_tag: store_with_a_loop_region_before::before:
234*a9d0f5e2Svic// CHECK:  operand #0
235*a9d0f5e2Svic// CHECK:   - pre
236*a9d0f5e2Svic// CHECK: test_tag: inside_region:
237*a9d0f5e2Svic// CHECK:  operand #0
238*a9d0f5e2Svic// CHECK:   - region
239*a9d0f5e2Svic// CHECK: test_tag: after:
240*a9d0f5e2Svic// CHECK:  operand #0
241*a9d0f5e2Svic// CHECK:   - region
242*a9d0f5e2Svic// CHECK: test_tag: return:
243*a9d0f5e2Svic// CHECK:  operand #0
244*a9d0f5e2Svic// CHECK:   - post
245*a9d0f5e2Svicfunc.func @store_with_a_loop_region_before(%arg0: memref<f32>) -> memref<f32> {
246*a9d0f5e2Svic  %0 = arith.constant 0.0 : f32
247*a9d0f5e2Svic  %1 = arith.constant 1.0 : f32
248*a9d0f5e2Svic  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
249*a9d0f5e2Svic  memref.load %arg0[] {tag = "store_with_a_loop_region_before::before"} : memref<f32>
250*a9d0f5e2Svic  test.store_with_a_loop_region %arg0 attributes { tag_name = "region", store_before_region = true } {
251*a9d0f5e2Svic    memref.load %arg0[] {tag = "inside_region"} : memref<f32>
252*a9d0f5e2Svic    test.store_with_a_region_terminator
253*a9d0f5e2Svic  } : memref<f32>
254*a9d0f5e2Svic  memref.load %arg0[] {tag = "after"} : memref<f32>
255*a9d0f5e2Svic  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
256*a9d0f5e2Svic  return {tag = "return"} %arg0 : memref<f32>
257*a9d0f5e2Svic}
258*a9d0f5e2Svic
259*a9d0f5e2Svic// CHECK-LABEL: test_tag: store_with_a_loop_region_after::before:
260*a9d0f5e2Svic// CHECK:  operand #0
261*a9d0f5e2Svic// CHECK:   - pre
262*a9d0f5e2Svic// CHECK: test_tag: inside_region:
263*a9d0f5e2Svic// CHECK:  operand #0
264*a9d0f5e2Svic// CHECK:   - pre
265*a9d0f5e2Svic// CHECK: test_tag: after:
266*a9d0f5e2Svic// CHECK:  operand #0
267*a9d0f5e2Svic// CHECK:   - region
268*a9d0f5e2Svic// CHECK: test_tag: return:
269*a9d0f5e2Svic// CHECK:  operand #0
270*a9d0f5e2Svic// CHECK:   - post
271*a9d0f5e2Svicfunc.func @store_with_a_loop_region_after(%arg0: memref<f32>) -> memref<f32> {
272*a9d0f5e2Svic  %0 = arith.constant 0.0 : f32
273*a9d0f5e2Svic  %1 = arith.constant 1.0 : f32
274*a9d0f5e2Svic  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
275*a9d0f5e2Svic  memref.load %arg0[] {tag = "store_with_a_loop_region_after::before"} : memref<f32>
276*a9d0f5e2Svic  test.store_with_a_loop_region %arg0 attributes { tag_name = "region", store_before_region = false } {
277*a9d0f5e2Svic    memref.load %arg0[] {tag = "inside_region"} : memref<f32>
278*a9d0f5e2Svic    test.store_with_a_region_terminator
279*a9d0f5e2Svic  } : memref<f32>
280*a9d0f5e2Svic  memref.load %arg0[] {tag = "after"} : memref<f32>
281*a9d0f5e2Svic  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
282*a9d0f5e2Svic  return {tag = "return"} %arg0 : memref<f32>
283*a9d0f5e2Svic}
284*a9d0f5e2Svic
285*a9d0f5e2Svic// CHECK-LABEL:     test_tag: store_with_a_loop_region_before_containing_a_store::before:
286*a9d0f5e2Svic// CHECK:      operand #0
287*a9d0f5e2Svic// CHECK:       - pre
288*a9d0f5e2Svic// CHECK:     test_tag: enter_region:
289*a9d0f5e2Svic// CHECK:      operand #0
290*a9d0f5e2Svic// CHECK-DAG:   - region
291*a9d0f5e2Svic// CHECK-DAG:   - inner
292*a9d0f5e2Svic// CHECK:     test_tag: exit_region:
293*a9d0f5e2Svic// CHECK:      operand #0
294*a9d0f5e2Svic// CHECK:       - inner
295*a9d0f5e2Svic// CHECK:     test_tag: after:
296*a9d0f5e2Svic// CHECK:      operand #0
297*a9d0f5e2Svic// CHECK-DAG:   - region
298*a9d0f5e2Svic// CHECK-DAG:   - inner
299*a9d0f5e2Svic// CHECK:     test_tag: return:
300*a9d0f5e2Svic// CHECK:      operand #0
301*a9d0f5e2Svic// CHECK:       - post
302*a9d0f5e2Svicfunc.func @store_with_a_loop_region_before_containing_a_store(%arg0: memref<f32>) -> memref<f32> {
303*a9d0f5e2Svic  %0 = arith.constant 0.0 : f32
304*a9d0f5e2Svic  %1 = arith.constant 1.0 : f32
305*a9d0f5e2Svic  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
306*a9d0f5e2Svic  memref.load %arg0[] {tag = "store_with_a_loop_region_before_containing_a_store::before"} : memref<f32>
307*a9d0f5e2Svic  test.store_with_a_loop_region %arg0 attributes { tag_name = "region", store_before_region = true } {
308*a9d0f5e2Svic    memref.load %arg0[] {tag = "enter_region"} : memref<f32>
309*a9d0f5e2Svic    %2 = arith.constant 2.0 : f32
310*a9d0f5e2Svic    memref.store %2, %arg0[] {tag_name = "inner"} : memref<f32>
311*a9d0f5e2Svic    memref.load %arg0[] {tag = "exit_region"} : memref<f32>
312*a9d0f5e2Svic    test.store_with_a_region_terminator
313*a9d0f5e2Svic  } : memref<f32>
314*a9d0f5e2Svic  memref.load %arg0[] {tag = "after"} : memref<f32>
315*a9d0f5e2Svic  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
316*a9d0f5e2Svic  return {tag = "return"} %arg0 : memref<f32>
317*a9d0f5e2Svic}
318*a9d0f5e2Svic
319*a9d0f5e2Svic// CHECK-LABEL:     test_tag: store_with_a_loop_region_after_containing_a_store::before:
320*a9d0f5e2Svic// CHECK:      operand #0
321*a9d0f5e2Svic// CHECK:       - pre
322*a9d0f5e2Svic// CHECK:     test_tag: enter_region:
323*a9d0f5e2Svic// CHECK:      operand #0
324*a9d0f5e2Svic// CHECK-DAG:   - pre
325*a9d0f5e2Svic// CHECK-DAG:   - inner
326*a9d0f5e2Svic// CHECK:     test_tag: exit_region:
327*a9d0f5e2Svic// CHECK:      operand #0
328*a9d0f5e2Svic// CHECK:       - inner
329*a9d0f5e2Svic// CHECK:     test_tag: after:
330*a9d0f5e2Svic// CHECK:      operand #0
331*a9d0f5e2Svic// CHECK:       - region
332*a9d0f5e2Svic// CHECK:     test_tag: return:
333*a9d0f5e2Svic// CHECK:      operand #0
334*a9d0f5e2Svic// CHECK:       - post
335*a9d0f5e2Svicfunc.func @store_with_a_loop_region_after_containing_a_store(%arg0: memref<f32>) -> memref<f32> {
336*a9d0f5e2Svic  %0 = arith.constant 0.0 : f32
337*a9d0f5e2Svic  %1 = arith.constant 1.0 : f32
338*a9d0f5e2Svic  memref.store %0, %arg0[] {tag_name = "pre"} : memref<f32>
339*a9d0f5e2Svic  memref.load %arg0[] {tag = "store_with_a_loop_region_after_containing_a_store::before"} : memref<f32>
340*a9d0f5e2Svic  test.store_with_a_loop_region %arg0 attributes { tag_name = "region", store_before_region = false } {
341*a9d0f5e2Svic    memref.load %arg0[] {tag = "enter_region"} : memref<f32>
342*a9d0f5e2Svic    %2 = arith.constant 2.0 : f32
343*a9d0f5e2Svic    memref.store %2, %arg0[] {tag_name = "inner"} : memref<f32>
344*a9d0f5e2Svic    memref.load %arg0[] {tag = "exit_region"} : memref<f32>
345*a9d0f5e2Svic    test.store_with_a_region_terminator
346*a9d0f5e2Svic  } : memref<f32>
347*a9d0f5e2Svic  memref.load %arg0[] {tag = "after"} : memref<f32>
348*a9d0f5e2Svic  memref.store %1, %arg0[] {tag_name = "post"} : memref<f32>
349*a9d0f5e2Svic  return {tag = "return"} %arg0 : memref<f32>
350*a9d0f5e2Svic}
351