xref: /llvm-project/mlir/test/Dialect/OpenACC/legalize-data.mlir (revision a0eb794da8b8c1e423e4b3100a137faf3844406f)
1// RUN: mlir-opt -split-input-file --openacc-legalize-data-values %s | FileCheck %s --check-prefixes=CHECK,DEVICE
2// RUN: mlir-opt -split-input-file --openacc-legalize-data-values=host-to-device=false %s | FileCheck %s --check-prefixes=CHECK,HOST
3
4func.func @test(%a: memref<10xf32>, %i : index) {
5  %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
6  acc.parallel dataOperands(%create : memref<10xf32>) {
7    %ci = memref.load %a[%i] : memref<10xf32>
8    acc.yield
9  }
10  return
11}
12
13// CHECK-LABEL: func.func @test
14// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
15// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
16// CHECK: acc.parallel dataOperands(%[[CREATE]] : memref<10xf32>) {
17// DEVICE:   %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
18// HOST:    %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
19// CHECK:   acc.yield
20// CHECK: }
21
22// -----
23
24func.func @test(%a: memref<10xf32>, %i : index) {
25  %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
26  acc.serial dataOperands(%create : memref<10xf32>) {
27    %ci = memref.load %a[%i] : memref<10xf32>
28    acc.yield
29  }
30  return
31}
32
33// CHECK-LABEL: func.func @test
34// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
35// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
36// CHECK: acc.serial dataOperands(%[[CREATE]] : memref<10xf32>) {
37// DEVICE:   %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
38// HOST:    %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
39// CHECK:   acc.yield
40// CHECK: }
41
42// -----
43
44func.func @test(%a: memref<10xf32>, %i : index) {
45  %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
46  acc.kernels dataOperands(%create : memref<10xf32>) {
47    %ci = memref.load %a[%i] : memref<10xf32>
48    acc.terminator
49  }
50  return
51}
52
53// CHECK-LABEL: func.func @test
54// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
55// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
56// CHECK: acc.kernels dataOperands(%[[CREATE]] : memref<10xf32>) {
57// DEVICE:   %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
58// HOST:    %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
59// CHECK:   acc.terminator
60// CHECK: }
61
62// -----
63
64func.func @test(%a: memref<10xf32>, %i : index) {
65  %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
66  acc.data dataOperands(%create : memref<10xf32>) {
67    %c0 = arith.constant 0.000000e+00 : f32
68    memref.store %c0, %a[%i] : memref<10xf32>
69    acc.serial {
70      %cs = memref.load %a[%i] : memref<10xf32>
71      acc.yield
72    }
73    acc.terminator
74  }
75  return
76}
77
78// CHECK-LABEL: func.func @test
79// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
80// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
81// CHECK: acc.data dataOperands(%[[CREATE]] : memref<10xf32>) {
82// CHECK: memref.store %{{.*}}, %[[A]][%[[I]]] : memref<10xf32>
83// DEVICE:   %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
84// HOST:    %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
85// CHECK:   acc.terminator
86// CHECK: }
87
88// -----
89
90func.func @test(%a: memref<10xf32>) {
91  %lb = arith.constant 0 : index
92  %st = arith.constant 1 : index
93  %c10 = arith.constant 10 : index
94  %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
95  acc.parallel dataOperands(%create : memref<10xf32>) {
96    acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
97      %ci = memref.load %a[%i] : memref<10xf32>
98      acc.yield
99    }
100    acc.yield
101  }
102  return
103}
104
105// CHECK: func.func @test
106// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
107// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
108// CHECK: acc.parallel dataOperands(%[[CREATE]] : memref<10xf32>) {
109// CHECK:   acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index)  step (%{{.*}} : index) {
110// DEVICE:    %{{.*}} = memref.load %[[CREATE:.*]][%[[I]]] : memref<10xf32>
111// CHECK:     acc.yield
112// CHECK:   }
113// CHECK:   acc.yield
114// CHECK: }
115
116// -----
117
118acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
119^bb0(%arg0: memref<10xf32>):
120  %0 = memref.alloc() : memref<10xf32>
121  acc.yield %0 : memref<10xf32>
122} destroy {
123^bb0(%arg0: memref<10xf32>):
124  memref.dealloc %arg0 : memref<10xf32>
125  acc.terminator
126}
127
128func.func @test(%a: memref<10xf32>) {
129  %lb = arith.constant 0 : index
130  %st = arith.constant 1 : index
131  %c10 = arith.constant 10 : index
132  %p1 = acc.private varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
133  acc.parallel private(@privatization_memref_10_f32 -> %p1 : memref<10xf32>) {
134    acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
135      %ci = memref.load %a[%i] : memref<10xf32>
136      acc.yield
137    }
138    acc.yield
139  }
140  return
141}
142
143// CHECK: func.func @test
144// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
145// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
146// CHECK: acc.parallel private(@privatization_memref_10_f32 -> %[[PRIVATE]] : memref<10xf32>) {
147// CHECK:   acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index)  step (%{{.*}} : index) {
148// DEVICE:    %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>
149// CHECK:     acc.yield
150// CHECK:   }
151// CHECK:   acc.yield
152// CHECK: }
153
154// -----
155
156acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
157^bb0(%arg0: memref<10xf32>):
158  %0 = memref.alloc() : memref<10xf32>
159  acc.yield %0 : memref<10xf32>
160} destroy {
161^bb0(%arg0: memref<10xf32>):
162  memref.dealloc %arg0 : memref<10xf32>
163  acc.terminator
164}
165
166func.func @test(%a: memref<10xf32>) {
167  %lb = arith.constant 0 : index
168  %st = arith.constant 1 : index
169  %c10 = arith.constant 10 : index
170  %p1 = acc.private varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
171  acc.parallel {
172    acc.loop private(@privatization_memref_10_f32 -> %p1 : memref<10xf32>) control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
173      %ci = memref.load %a[%i] : memref<10xf32>
174      acc.yield
175    }
176    acc.yield
177  }
178  return
179}
180
181// CHECK: func.func @test
182// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
183// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
184// CHECK: acc.parallel  {
185// CHECK:   acc.loop private(@privatization_memref_10_f32 -> %[[PRIVATE]] : memref<10xf32>) control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index)  step (%{{.*}} : index) {
186// DEVICE:    %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>
187// CHECK:     acc.yield
188// CHECK:   }
189// CHECK:   acc.yield
190// CHECK: }
191
192// -----
193
194acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
195^bb0(%arg0: memref<10xf32>):
196  %0 = memref.alloc() : memref<10xf32>
197  acc.yield %0 : memref<10xf32>
198} destroy {
199^bb0(%arg0: memref<10xf32>):
200  memref.dealloc %arg0 : memref<10xf32>
201  acc.terminator
202}
203
204func.func @test(%a: memref<10xf32>) {
205  %lb = arith.constant 0 : index
206  %st = arith.constant 1 : index
207  %c10 = arith.constant 10 : index
208  %p1 = acc.private varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
209  acc.serial private(@privatization_memref_10_f32 -> %p1 : memref<10xf32>) {
210    acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
211      %ci = memref.load %a[%i] : memref<10xf32>
212      acc.yield
213    }
214    acc.yield
215  }
216  return
217}
218
219// CHECK: func.func @test
220// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
221// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
222// CHECK: acc.serial private(@privatization_memref_10_f32 -> %[[PRIVATE]] : memref<10xf32>) {
223// CHECK:   acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index)  step (%{{.*}} : index) {
224// DEVICE:    %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>
225// CHECK:     acc.yield
226// CHECK:   }
227// CHECK:   acc.yield
228// CHECK: }
229