xref: /llvm-project/mlir/test/Dialect/OpenACC/canonicalize.mlir (revision 6b42625b1f983f6aafb9f4fe2953970c73963603)
1// RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s
2
3func.func @testenterdataop(%a: memref<f32>) -> () {
4  %ifCond = arith.constant true
5  %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
6  acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
7  return
8}
9
10// CHECK: acc.enter_data dataOperands(%{{.*}} : memref<f32>)
11
12// -----
13
14func.func @testenterdataop(%a: memref<f32>) -> () {
15  %ifCond = arith.constant false
16  %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
17  acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
18  return
19}
20
21// CHECK: func @testenterdataop
22// CHECK-NOT: acc.enter_data
23
24// -----
25
26func.func @testexitdataop(%a: memref<f32>) -> () {
27  %ifCond = arith.constant true
28  %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
29  acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
30  acc.delete accPtr(%0 : memref<f32>)
31  return
32}
33
34// CHECK: acc.exit_data dataOperands(%{{.*}} : memref<f32>)
35
36// -----
37
38func.func @testexitdataop(%a: memref<f32>) -> () {
39  %ifCond = arith.constant false
40  %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
41  acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
42  acc.delete accPtr(%0 : memref<f32>)
43  return
44}
45
46// CHECK: func @testexitdataop
47// CHECK-NOT: acc.exit_data
48
49// -----
50
51func.func @testupdateop(%a: memref<f32>) -> () {
52  %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
53  acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
54  %ifCond = arith.constant true
55  acc.update if(%ifCond) dataOperands(%0: memref<f32>)
56  return
57}
58
59// CHECK: acc.update dataOperands(%{{.*}} : memref<f32>)
60
61// -----
62
63func.func @testupdateop(%a: memref<f32>) -> () {
64  %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
65  acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
66  %ifCond = arith.constant false
67  acc.update if(%ifCond) dataOperands(%0: memref<f32>)
68  return
69}
70
71// CHECK: func @testupdateop
72// CHECK-NOT: acc.update{{.$}}
73
74// -----
75
76func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
77  %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
78  acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
79  return
80}
81
82// CHECK:  func @testenterdataop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1)
83// CHECK:    acc.enter_data if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>)
84
85// -----
86
87func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
88  %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
89  acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
90  acc.delete accPtr(%0 : memref<f32>)
91  return
92}
93
94// CHECK: func @testexitdataop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1)
95// CHECK:   acc.exit_data if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>)
96
97// -----
98
99func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
100  %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
101  acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
102  acc.update if(%ifCond) dataOperands(%0: memref<f32>)
103  return
104}
105
106// CHECK:  func @testupdateop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1)
107// CHECK:    acc.update if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>)
108
109// -----
110
111func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
112  %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32>
113  %1 = arith.constant 1 : i32
114  %2 = arith.constant 10 : i32
115  %false = arith.constant false
116  acc.host_data dataOperands(%0 : memref<f32>) if(%false) {
117    acc.loop control(%iv : i32) = (%1 : i32) to (%2 : i32) step (%1 : i32) {
118      acc.yield
119    } attributes { inclusiveUpperbound = array<i1: true> }
120    acc.loop control(%iv : i32) = (%1 : i32) to (%2 : i32) step (%1 : i32) {
121      acc.yield
122    } attributes { inclusiveUpperbound = array<i1: true> }
123    acc.terminator
124  }
125  return
126}
127
128// CHECK-LABEL: func.func @testhostdataop
129// CHECK-NOT: acc.host_data
130// CHECK: acc.loop
131// CHECK: acc.yield
132// CHECK: acc.loop
133// CHECK: acc.yield
134
135// -----
136
137func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
138  %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32>
139  %true = arith.constant true
140  acc.host_data dataOperands(%0 : memref<f32>) if(%true) {
141  }
142  return
143}
144
145// CHECK-LABEL: func.func @testhostdataop
146// CHECK: acc.host_data dataOperands(%{{.*}} : memref<f32>) {
147
148// -----
149
150func.func @update_no_op(%x : memref<i32>) {
151  acc.atomic.update %x : memref<i32> {
152  ^bb0(%xval : i32):
153    acc.yield %xval : i32
154  }
155  return
156}
157
158// CHECK-LABEL: func.func @update_no_op
159// CHECK-NOT: acc.atomic.update
160
161// -----
162
163func.func @update_write_op(%x : memref<i32>, %value: i32) {
164  acc.atomic.update %x : memref<i32> {
165  ^bb0(%xval : i32):
166    acc.yield %value : i32
167  }
168  return
169}
170
171// CHECK-LABEL: func.func @update_write_op
172// CHECK-SAME:            (%[[X:.+]]: memref<i32>, %[[VALUE:.+]]: i32)
173// CHECK: acc.atomic.write %[[X]] = %[[VALUE]] : memref<i32>, i32
174// CHECK-NOT: acc.atomic.update
175
176// -----
177
178func.func @update_normal(%x : memref<i32>, %value: i32) {
179  acc.atomic.update %x : memref<i32> {
180  ^bb0(%xval : i32):
181    %newval = arith.addi %xval, %value : i32
182    acc.yield %newval : i32
183  }
184  return
185}
186
187// CHECK-LABEL: func.func @update_normal
188// CHECK: acc.atomic.update
189// CHECK: arith.addi
190// CHECK: acc.yield
191
192// -----
193
194func.func @update_unnecessary_computations(%x: memref<i32>) {
195  %c0 = arith.constant 0 : i32
196  acc.atomic.update %x : memref<i32> {
197  ^bb0(%xval: i32):
198    %newval = arith.addi %xval, %c0 : i32
199    acc.yield %newval: i32
200  }
201  return
202}
203
204// CHECK-LABEL: func.func @update_unnecessary_computations
205// CHECK-NOT: acc.atomic.update
206
207// -----
208
209func.func @update_unnecessary_computations(%x: memref<i32>) {
210  %c0 = arith.constant 0 : i32
211  acc.atomic.update %x : memref<i32> {
212  ^bb0(%xval: i32):
213    %newval = arith.muli %xval, %c0 : i32
214    acc.yield %newval: i32
215  }
216  return
217}
218
219// CHECK-LABEL: func.func @update_unnecessary_computations
220// CHECK-NOT: acc.atomic.update
221// CHECK: acc.atomic.write
222