xref: /llvm-project/mlir/test/Dialect/OpenACC/ops.mlir (revision e492083f55d98144ba9a049450cb429d7fd52510)
1dd4fb7c8SValentin Clement// RUN: mlir-opt -split-input-file %s | FileCheck %s
24225e7faSValentin Clement// Verify the printed output can be parsed.
326167caeSMehdi Amini// RUN: mlir-opt -split-input-file %s | mlir-opt  -split-input-file  | FileCheck %s
44225e7faSValentin Clement// Verify the generic form can be parsed.
526167caeSMehdi Amini// RUN: mlir-opt -split-input-file -mlir-print-op-generic %s | mlir-opt -split-input-file | FileCheck %s
64225e7faSValentin Clement
70254b0bcSRiver Riddlefunc.func @compute1(%A: memref<10x10xf32>, %B: memref<10x10xf32>, %C: memref<10x10xf32>) -> memref<10x10xf32> {
8a54f4eaeSMogball  %c0 = arith.constant 0 : index
9a54f4eaeSMogball  %c10 = arith.constant 10 : index
10a54f4eaeSMogball  %c1 = arith.constant 1 : index
11a54f4eaeSMogball  %async = arith.constant 1 : i64
124225e7faSValentin Clement
136d3cabd9SValentin Clement  acc.parallel async(%async: i64) {
146b42625bSValentin Clement (バレンタイン クレメン)    acc.loop gang vector control(%arg3 : index, %arg4 : index, %arg5 : index) = (%c0, %c0, %c0 : index, index, index) to (%c10, %c10, %c10 : index, index, index) step (%c1, %c1, %c1 : index, index, index) {
15e2310704SJulian Gross      %a = memref.load %A[%arg3, %arg5] : memref<10x10xf32>
16e2310704SJulian Gross      %b = memref.load %B[%arg5, %arg4] : memref<10x10xf32>
17e2310704SJulian Gross      %cij = memref.load %C[%arg3, %arg4] : memref<10x10xf32>
18a54f4eaeSMogball      %p = arith.mulf %a, %b : f32
19a54f4eaeSMogball      %co = arith.addf %cij, %p : f32
20e2310704SJulian Gross      memref.store %co, %C[%arg3, %arg4] : memref<10x10xf32>
214225e7faSValentin Clement      acc.yield
223eb4178bSValentin Clement (バレンタイン クレメン)    } attributes { collapse = [3], collapseDeviceType = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true, true, true>}
234225e7faSValentin Clement    acc.yield
244225e7faSValentin Clement  }
254225e7faSValentin Clement
264225e7faSValentin Clement  return %C : memref<10x10xf32>
274225e7faSValentin Clement}
284225e7faSValentin Clement
293eb4178bSValentin Clement (バレンタイン クレメン)// CHECK-LABEL: func @compute1
30a54f4eaeSMogball//  CHECK-NEXT:   %{{.*}} = arith.constant 0 : index
31a54f4eaeSMogball//  CHECK-NEXT:   %{{.*}} = arith.constant 10 : index
32a54f4eaeSMogball//  CHECK-NEXT:   %{{.*}} = arith.constant 1 : index
33a54f4eaeSMogball//  CHECK-NEXT:   [[ASYNC:%.*]] = arith.constant 1 : i64
346d3cabd9SValentin Clement//  CHECK-NEXT:   acc.parallel async([[ASYNC]] : i64) {
356b42625bSValentin Clement (バレンタイン クレメン)//  CHECK-NEXT:     acc.loop gang vector control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}}) {
36e2310704SJulian Gross//  CHECK-NEXT:       %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
37e2310704SJulian Gross//  CHECK-NEXT:       %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
38e2310704SJulian Gross//  CHECK-NEXT:       %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
39a54f4eaeSMogball//  CHECK-NEXT:       %{{.*}} = arith.mulf %{{.*}}, %{{.*}} : f32
40a54f4eaeSMogball//  CHECK-NEXT:       %{{.*}} = arith.addf %{{.*}}, %{{.*}} : f32
41e2310704SJulian Gross//  CHECK-NEXT:       memref.store %{{.*}}, %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
424225e7faSValentin Clement//  CHECK-NEXT:       acc.yield
433eb4178bSValentin Clement (バレンタイン クレメン)//  CHECK-NEXT:     } attributes {collapse = [3], collapseDeviceType = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true, true, true>}
444225e7faSValentin Clement//  CHECK-NEXT:     acc.yield
454225e7faSValentin Clement//  CHECK-NEXT:   }
464225e7faSValentin Clement//  CHECK-NEXT:   return %{{.*}} : memref<10x10xf32>
473eb4178bSValentin Clement (バレンタイン クレメン)
484225e7faSValentin Clement
4922dde1f9SValentin Clement// -----
5022dde1f9SValentin Clement
510254b0bcSRiver Riddlefunc.func @compute2(%A: memref<10x10xf32>, %B: memref<10x10xf32>, %C: memref<10x10xf32>) -> memref<10x10xf32> {
52a54f4eaeSMogball  %c0 = arith.constant 0 : index
53a54f4eaeSMogball  %c10 = arith.constant 10 : index
54a54f4eaeSMogball  %c1 = arith.constant 1 : index
554225e7faSValentin Clement
564225e7faSValentin Clement  acc.parallel {
576b42625bSValentin Clement (バレンタイン クレメン)    acc.loop control(%arg3 : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
584225e7faSValentin Clement      scf.for %arg4 = %c0 to %c10 step %c1 {
594225e7faSValentin Clement        scf.for %arg5 = %c0 to %c10 step %c1 {
60e2310704SJulian Gross          %a = memref.load %A[%arg3, %arg5] : memref<10x10xf32>
61e2310704SJulian Gross          %b = memref.load %B[%arg5, %arg4] : memref<10x10xf32>
62e2310704SJulian Gross          %cij = memref.load %C[%arg3, %arg4] : memref<10x10xf32>
63a54f4eaeSMogball          %p = arith.mulf %a, %b : f32
64a54f4eaeSMogball          %co = arith.addf %cij, %p : f32
65e2310704SJulian Gross          memref.store %co, %C[%arg3, %arg4] : memref<10x10xf32>
664225e7faSValentin Clement        }
674225e7faSValentin Clement      }
684225e7faSValentin Clement      acc.yield
693eb4178bSValentin Clement (バレンタイン クレメン)    } attributes {seq = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}
704225e7faSValentin Clement    acc.yield
714225e7faSValentin Clement  }
724225e7faSValentin Clement
734225e7faSValentin Clement  return %C : memref<10x10xf32>
744225e7faSValentin Clement}
754225e7faSValentin Clement
764225e7faSValentin Clement// CHECK-LABEL: func @compute2(
77a54f4eaeSMogball//  CHECK-NEXT:   %{{.*}} = arith.constant 0 : index
78a54f4eaeSMogball//  CHECK-NEXT:   %{{.*}} = arith.constant 10 : index
79a54f4eaeSMogball//  CHECK-NEXT:   %{{.*}} = arith.constant 1 : index
804225e7faSValentin Clement//  CHECK-NEXT:   acc.parallel {
816b42625bSValentin Clement (バレンタイン クレメン)//  CHECK-NEXT:     acc.loop  control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}})
824225e7faSValentin Clement//  CHECK-NEXT:       scf.for %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} {
834225e7faSValentin Clement//  CHECK-NEXT:         scf.for %{{.*}} = %{{.*}} to %{{.*}} step %{{.*}} {
84e2310704SJulian Gross//  CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
85e2310704SJulian Gross//  CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
86e2310704SJulian Gross//  CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
87a54f4eaeSMogball//  CHECK-NEXT:           %{{.*}} = arith.mulf %{{.*}}, %{{.*}} : f32
88a54f4eaeSMogball//  CHECK-NEXT:           %{{.*}} = arith.addf %{{.*}}, %{{.*}} : f32
89e2310704SJulian Gross//  CHECK-NEXT:           memref.store %{{.*}}, %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
904225e7faSValentin Clement//  CHECK-NEXT:         }
914225e7faSValentin Clement//  CHECK-NEXT:       }
924225e7faSValentin Clement//  CHECK-NEXT:       acc.yield
933eb4178bSValentin Clement (バレンタイン クレメン)//  CHECK-NEXT:     } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}
944225e7faSValentin Clement//  CHECK-NEXT:     acc.yield
954225e7faSValentin Clement//  CHECK-NEXT:   }
964225e7faSValentin Clement//  CHECK-NEXT:   return %{{.*}} : memref<10x10xf32>
974225e7faSValentin Clement//  CHECK-NEXT: }
984225e7faSValentin Clement
9922dde1f9SValentin Clement// -----
1004225e7faSValentin Clement
101c067c6e5SValentin Clementacc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
102c067c6e5SValentin Clement^bb0(%arg0: memref<10xf32>):
103c067c6e5SValentin Clement  %0 = memref.alloc() : memref<10xf32>
104c067c6e5SValentin Clement  acc.yield %0 : memref<10xf32>
105c067c6e5SValentin Clement} destroy {
106c067c6e5SValentin Clement^bb0(%arg0: memref<10xf32>):
107c067c6e5SValentin Clement  memref.dealloc %arg0 : memref<10xf32>
108c067c6e5SValentin Clement  acc.terminator
109c067c6e5SValentin Clement}
110c067c6e5SValentin Clement
1110254b0bcSRiver Riddlefunc.func @compute3(%a: memref<10x10xf32>, %b: memref<10x10xf32>, %c: memref<10xf32>, %d: memref<10xf32>) -> memref<10xf32> {
112a54f4eaeSMogball  %lb = arith.constant 0 : index
113a54f4eaeSMogball  %st = arith.constant 1 : index
114a54f4eaeSMogball  %c10 = arith.constant 10 : index
115a54f4eaeSMogball  %numGangs = arith.constant 10 : i64
116a54f4eaeSMogball  %numWorkers = arith.constant 10 : i64
1174225e7faSValentin Clement
118a0eb794dSRazvan Lupusoru  %pa = acc.present varPtr(%a : memref<10x10xf32>) varType(tensor<10x10xf32>) -> memref<10x10xf32>
119a0eb794dSRazvan Lupusoru  %pb = acc.present varPtr(%b : memref<10x10xf32>) varType(tensor<10x10xf32>) -> memref<10x10xf32>
120a0eb794dSRazvan Lupusoru  %pc = acc.present varPtr(%c : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
121a0eb794dSRazvan Lupusoru  %pd = acc.present varPtr(%d : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
12246e1b095SValentin Clement  acc.data dataOperands(%pa, %pb, %pc, %pd: memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>) {
123a0eb794dSRazvan Lupusoru    %private = acc.private varPtr(%c : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
124a25da1a9SValentin Clement    acc.parallel num_gangs({%numGangs: i64}) num_workers(%numWorkers: i64 [#acc.device_type<nvidia>]) private(@privatization_memref_10_f32 -> %private : memref<10xf32>) {
1256b42625bSValentin Clement (バレンタイン クレメン)      acc.loop gang control(%x : index) = (%lb : index) to (%c10 : index) step (%st : index) {
1266b42625bSValentin Clement (バレンタイン クレメン)        acc.loop worker control(%y : index) = (%lb : index) to (%c10 : index) step (%st : index) {
127e2310704SJulian Gross          %axy = memref.load %a[%x, %y] : memref<10x10xf32>
128e2310704SJulian Gross          %bxy = memref.load %b[%x, %y] : memref<10x10xf32>
129a54f4eaeSMogball          %tmp = arith.addf %axy, %bxy : f32
130e2310704SJulian Gross          memref.store %tmp, %c[%y] : memref<10xf32>
1314225e7faSValentin Clement          acc.yield
1323eb4178bSValentin Clement (バレンタイン クレメン)        } attributes {inclusiveUpperbound = array<i1: true>}
1334225e7faSValentin Clement
1346b42625bSValentin Clement (バレンタイン クレメン)        acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
1354225e7faSValentin Clement          // for i = 0 to 10 step 1
1364225e7faSValentin Clement          //   d[x] += c[i]
137e2310704SJulian Gross          %ci = memref.load %c[%i] : memref<10xf32>
138e2310704SJulian Gross          %dx = memref.load %d[%x] : memref<10xf32>
139a54f4eaeSMogball          %z = arith.addf %ci, %dx : f32
140e2310704SJulian Gross          memref.store %z, %d[%x] : memref<10xf32>
1414225e7faSValentin Clement          acc.yield
1423eb4178bSValentin Clement (バレンタイン クレメン)        } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<nvidia>]}
1434225e7faSValentin Clement        acc.yield
1443eb4178bSValentin Clement (バレンタイン クレメン)      } attributes {inclusiveUpperbound = array<i1: true>}
1454225e7faSValentin Clement      acc.yield
1464225e7faSValentin Clement    }
1474225e7faSValentin Clement    acc.terminator
1484225e7faSValentin Clement  }
1494225e7faSValentin Clement
1504225e7faSValentin Clement  return %d : memref<10xf32>
1514225e7faSValentin Clement}
1524225e7faSValentin Clement
1534225e7faSValentin Clement// CHECK:      func @compute3({{.*}}: memref<10x10xf32>, {{.*}}: memref<10x10xf32>, [[ARG2:%.*]]: memref<10xf32>, {{.*}}: memref<10xf32>) -> memref<10xf32> {
154a54f4eaeSMogball// CHECK-NEXT:   [[C0:%.*]] = arith.constant 0 : index
155a54f4eaeSMogball// CHECK-NEXT:   [[C1:%.*]] = arith.constant 1 : index
156a54f4eaeSMogball// CHECK-NEXT:   [[C10:%.*]] = arith.constant 10 : index
157a54f4eaeSMogball// CHECK-NEXT:   [[NUMGANG:%.*]] = arith.constant 10 : i64
158a54f4eaeSMogball// CHECK-NEXT:   [[NUMWORKERS:%.*]] = arith.constant 10 : i64
15946e1b095SValentin Clement// CHECK:        acc.data dataOperands(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>) {
160a0eb794dSRazvan Lupusoru// CHECK-NEXT:     %[[P_ARG2:.*]] = acc.private varPtr([[ARG2]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
161a25da1a9SValentin Clement// CHECK-NEXT:     acc.parallel num_gangs({[[NUMGANG]] : i64}) num_workers([[NUMWORKERS]] : i64 [#acc.device_type<nvidia>]) private(@privatization_memref_10_f32 -> %[[P_ARG2]] : memref<10xf32>) {
1626b42625bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:       acc.loop gang control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}}) {
1636b42625bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:         acc.loop worker control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}}) {
164e2310704SJulian Gross// CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
165e2310704SJulian Gross// CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}, %{{.*}}] : memref<10x10xf32>
166a54f4eaeSMogball// CHECK-NEXT:           %{{.*}} = arith.addf %{{.*}}, %{{.*}} : f32
167e2310704SJulian Gross// CHECK-NEXT:           memref.store %{{.*}}, %{{.*}}[%{{.*}}] : memref<10xf32>
1684225e7faSValentin Clement// CHECK-NEXT:           acc.yield
1693eb4178bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:         } attributes {inclusiveUpperbound = array<i1: true>}
1706b42625bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:         acc.loop control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}}) {
171e2310704SJulian Gross// CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}] : memref<10xf32>
172e2310704SJulian Gross// CHECK-NEXT:           %{{.*}} = memref.load %{{.*}}[%{{.*}}] : memref<10xf32>
173a54f4eaeSMogball// CHECK-NEXT:           %{{.*}} = arith.addf %{{.*}}, %{{.*}} : f32
174e2310704SJulian Gross// CHECK-NEXT:           memref.store %{{.*}}, %{{.*}}[%{{.*}}] : memref<10xf32>
1754225e7faSValentin Clement// CHECK-NEXT:           acc.yield
1763eb4178bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:         } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<nvidia>]}
1774225e7faSValentin Clement// CHECK-NEXT:         acc.yield
1783eb4178bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:       } attributes {inclusiveUpperbound = array<i1: true>}
1794225e7faSValentin Clement// CHECK-NEXT:       acc.yield
1804225e7faSValentin Clement// CHECK-NEXT:     }
1814225e7faSValentin Clement// CHECK-NEXT:     acc.terminator
1824225e7faSValentin Clement// CHECK-NEXT:   }
1834225e7faSValentin Clement// CHECK-NEXT:   return %{{.*}} : memref<10xf32>
1844225e7faSValentin Clement// CHECK-NEXT: }
1852bbbcae7SValentin Clement
18622dde1f9SValentin Clement// -----
18722dde1f9SValentin Clement
188996171a4SValentin Clement (バレンタイン クレメン)func.func @testloopop(%a : memref<10xf32>) -> () {
189a54f4eaeSMogball  %i64Value = arith.constant 1 : i64
190a54f4eaeSMogball  %i32Value = arith.constant 128 : i32
191a54f4eaeSMogball  %idxValue = arith.constant 8 : index
1923eb4178bSValentin Clement (バレンタイン クレメン)  %c0 = arith.constant 0 : index
1933eb4178bSValentin Clement (バレンタイン クレメン)  %c10 = arith.constant 10 : index
1943eb4178bSValentin Clement (バレンタイン クレメン)  %c1 = arith.constant 1 : index
19522dde1f9SValentin Clement
1966b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang vector worker control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
197e456689fSValentin Clement (バレンタイン クレメン)    "test.openacc_dummy_op"() : () -> ()
198e456689fSValentin Clement (バレンタイン クレメン)    acc.yield
1993eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2006b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({num=%i64Value: i64}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
201dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
20201f5fcd8SValentin Clement    acc.yield
2033eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2046b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({static=%i64Value: i64}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
205dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
20601f5fcd8SValentin Clement    acc.yield
2073eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2086b42625bSValentin Clement (バレンタイン クレメン)  acc.loop worker(%i64Value: i64) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
209dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
21001f5fcd8SValentin Clement    acc.yield
2113eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2126b42625bSValentin Clement (バレンタイン クレメン)  acc.loop worker(%i32Value: i32) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
213dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
21401f5fcd8SValentin Clement    acc.yield
2153eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2166b42625bSValentin Clement (バレンタイン クレメン)  acc.loop worker(%idxValue: index) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
217dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
21801f5fcd8SValentin Clement    acc.yield
2193eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2206b42625bSValentin Clement (バレンタイン クレメン)  acc.loop vector(%i64Value: i64) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
221dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
22201f5fcd8SValentin Clement    acc.yield
2233eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2246b42625bSValentin Clement (バレンタイン クレメン)  acc.loop vector(%i32Value: i32) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
225dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
22622dde1f9SValentin Clement    acc.yield
2273eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2286b42625bSValentin Clement (バレンタイン クレメン)  acc.loop vector(%idxValue: index) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
229dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
23022dde1f9SValentin Clement    acc.yield
2313eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2326b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({num=%i64Value: i64}) worker vector control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
233e456689fSValentin Clement (バレンタイン クレメン)    "test.openacc_dummy_op"() : () -> ()
234e456689fSValentin Clement (バレンタイン クレメン)    acc.yield
2353eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2366b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({num=%i64Value: i64, static=%i64Value: i64}) worker(%i64Value: i64) vector(%i64Value: i64) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
237dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
23822dde1f9SValentin Clement    acc.yield
2393eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2406b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({num=%i32Value: i32, static=%idxValue: index}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
241dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
24222dde1f9SValentin Clement    acc.yield
2433eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2446b42625bSValentin Clement (バレンタイン クレメン)  acc.loop tile({%i64Value : i64, %i64Value : i64}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
245dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
24622dde1f9SValentin Clement    acc.yield
2473eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2486b42625bSValentin Clement (バレンタイン クレメン)  acc.loop tile({%i32Value : i32, %i32Value : i32}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
249dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
25022dde1f9SValentin Clement    acc.yield
2513eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2526b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({static=%i64Value: i64, num=%i64Value: i64}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
253dd4fb7c8SValentin Clement    "test.openacc_dummy_op"() : () -> ()
25401f5fcd8SValentin Clement    acc.yield
2553eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2566b42625bSValentin Clement (バレンタイン クレメン)  acc.loop gang({dim=%i64Value : i64, static=%i64Value: i64}) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
2577f3d2cc2SValentin Clement    "test.openacc_dummy_op"() : () -> ()
2587f3d2cc2SValentin Clement    acc.yield
2593eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
260a0eb794dSRazvan Lupusoru  %b = acc.cache varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
2616b42625bSValentin Clement (バレンタイン クレメン)  acc.loop cache(%b : memref<10xf32>) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
262996171a4SValentin Clement (バレンタイン クレメン)    "test.openacc_dummy_op"() : () -> ()
263996171a4SValentin Clement (バレンタイン クレメン)    acc.yield
2643eb4178bSValentin Clement (バレンタイン クレメン)  } attributes {inclusiveUpperbound = array<i1: true>}
2652bbbcae7SValentin Clement  return
2662bbbcae7SValentin Clement}
2672bbbcae7SValentin Clement
268a54f4eaeSMogball// CHECK:      [[I64VALUE:%.*]] = arith.constant 1 : i64
269a54f4eaeSMogball// CHECK-NEXT: [[I32VALUE:%.*]] = arith.constant 128 : i32
270a54f4eaeSMogball// CHECK-NEXT: [[IDXVALUE:%.*]] = arith.constant 8 : index
2713eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop
272e456689fSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
273e456689fSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:   acc.yield
2743eb4178bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT: attributes {inclusiveUpperbound = array<i1: true>}
2753eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({num=[[I64VALUE]] : i64})
276dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
27701f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
2783eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({static=[[I64VALUE]] : i64})
279dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
28001f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
2813eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop worker([[I64VALUE]] : i64)
282dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
28301f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
2843eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop worker([[I32VALUE]] : i32)
285dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
28601f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
2873eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop worker([[IDXVALUE]] : index)
288dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
28901f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
2903eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop vector([[I64VALUE]] : i64)
291dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
29201f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
2933eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop vector([[I32VALUE]] : i32)
294dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
29522dde1f9SValentin Clement// CHECK-NEXT:   acc.yield
2963eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop vector([[IDXVALUE]] : index)
297dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
29822dde1f9SValentin Clement// CHECK-NEXT:   acc.yield
2996b42625bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({num=[[I64VALUE]] : i64}) worker vector
300e456689fSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
301e456689fSValentin Clement (バレンタイン クレメン)// CHECK-NEXT:   acc.yield
3023eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({num=[[I64VALUE]] : i64, static=[[I64VALUE]] : i64}) worker([[I64VALUE]] : i64) vector([[I64VALUE]] : i64)
303dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
30422dde1f9SValentin Clement// CHECK-NEXT:   acc.yield
3053eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({num=[[I32VALUE]] : i32, static=[[IDXVALUE]] : index})
306dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
30722dde1f9SValentin Clement// CHECK-NEXT:   acc.yield
3083eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop tile({[[I64VALUE]] : i64, [[I64VALUE]] : i64})
309dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
31022dde1f9SValentin Clement// CHECK-NEXT:   acc.yield
3113eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop tile({[[I32VALUE]] : i32, [[I32VALUE]] : i32})
312dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
31322dde1f9SValentin Clement// CHECK-NEXT:   acc.yield
3143eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({static=[[I64VALUE]] : i64, num=[[I64VALUE]] : i64})
315dd4fb7c8SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
31601f5fcd8SValentin Clement// CHECK-NEXT:   acc.yield
3173eb4178bSValentin Clement (バレンタイン クレメン)// CHECK:      acc.loop gang({dim=[[I64VALUE]] : i64, static=[[I64VALUE]] : i64})
3187f3d2cc2SValentin Clement// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
3197f3d2cc2SValentin Clement// CHECK-NEXT:   acc.yield
320a0eb794dSRazvan Lupusoru// CHECK:      %{{.*}} = acc.cache varPtr(%{{.*}} : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
3213eb4178bSValentin Clement (バレンタイン クレメン)// CHECK-NEXT: acc.loop cache(%{{.*}} : memref<10xf32>)
322996171a4SValentin Clement (バレンタイン クレメン)// CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
323996171a4SValentin Clement (バレンタイン クレメン)// CHECK-NEXT:   acc.yield
3242d8f0c05SValentin Clement
32522dde1f9SValentin Clement// -----
3266d3cabd9SValentin Clement
3277951ab12SValentin Clementfunc.func @acc_loop_multiple_block() {
3287951ab12SValentin Clement  %c0 = arith.constant 0 : index
3293eb4178bSValentin Clement (バレンタイン クレメン)  %c10 = arith.constant 10 : index
3303eb4178bSValentin Clement (バレンタイン クレメン)  %c1 = arith.constant 1 : index
3313eb4178bSValentin Clement (バレンタイン クレメン)  acc.parallel {
3326b42625bSValentin Clement (バレンタイン クレメン)    acc.loop control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
3333eb4178bSValentin Clement (バレンタイン クレメン)      %c1_1 = arith.constant 1 : index
3343eb4178bSValentin Clement (バレンタイン クレメン)      cf.br ^bb1(%c1_1 : index)
3353eb4178bSValentin Clement (バレンタイン クレメン)    ^bb1(%9: index):
3363eb4178bSValentin Clement (バレンタイン クレメン)      %c0_1 = arith.constant 0 : index
3373eb4178bSValentin Clement (バレンタイン クレメン)      %12 = arith.cmpi sgt, %9, %c0_1 : index
3387951ab12SValentin Clement      cf.cond_br %12, ^bb2, ^bb3
3397951ab12SValentin Clement    ^bb2:
3407951ab12SValentin Clement      %c1_0 = arith.constant 1 : index
3413eb4178bSValentin Clement (バレンタイン クレメン)      %c10_1 = arith.constant 10 : index
3423eb4178bSValentin Clement (バレンタイン クレメン)      %22 = arith.subi %c10_1, %c1_0 : index
3437951ab12SValentin Clement      cf.br ^bb1(%22 : index)
3447951ab12SValentin Clement    ^bb3:
3457951ab12SValentin Clement      acc.yield
3463eb4178bSValentin Clement (バレンタイン クレメン)    } attributes {inclusiveUpperbound = array<i1: true>}
3477951ab12SValentin Clement    acc.yield
3487951ab12SValentin Clement  }
3497951ab12SValentin Clement  return
3507951ab12SValentin Clement}
3517951ab12SValentin Clement
3527951ab12SValentin Clement// CHECK-LABEL: func.func @acc_loop_multiple_block()
3537951ab12SValentin Clement// CHECK: acc.parallel
3547951ab12SValentin Clement// CHECK: acc.loop
3557951ab12SValentin Clement// CHECK-3: ^bb{{.*}}
3567951ab12SValentin Clement// CHECK: acc.yield
3577951ab12SValentin Clement// CHECK: acc.yield
3587951ab12SValentin Clement
3597951ab12SValentin Clement// -----
3607951ab12SValentin Clement
361c067c6e5SValentin Clementacc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
362c067c6e5SValentin Clement^bb0(%arg0: memref<10xf32>):
363c067c6e5SValentin Clement  %0 = memref.alloc() : memref<10xf32>
364c067c6e5SValentin Clement  acc.yield %0 : memref<10xf32>
365c067c6e5SValentin Clement} destroy {
366c067c6e5SValentin Clement^bb0(%arg0: memref<10xf32>):
367c067c6e5SValentin Clement  memref.dealloc %arg0 : memref<10xf32>
368c067c6e5SValentin Clement  acc.terminator
369c067c6e5SValentin Clement}
370c067c6e5SValentin Clement
371c067c6e5SValentin Clementacc.private.recipe @privatization_memref_10_10_f32 : memref<10x10xf32> init {
372c067c6e5SValentin Clement^bb0(%arg0: memref<10x10xf32>):
373c067c6e5SValentin Clement  %0 = memref.alloc() : memref<10x10xf32>
374c067c6e5SValentin Clement  acc.yield %0 : memref<10x10xf32>
375c067c6e5SValentin Clement} destroy {
376c067c6e5SValentin Clement^bb0(%arg0: memref<10x10xf32>):
377c067c6e5SValentin Clement  memref.dealloc %arg0 : memref<10x10xf32>
378c067c6e5SValentin Clement  acc.terminator
379c067c6e5SValentin Clement}
380c067c6e5SValentin Clement
381e6d8598eSValentin Clementacc.firstprivate.recipe @privatization_memref_10xf32 : memref<10xf32> init {
382e6d8598eSValentin Clement^bb0(%arg0: memref<10xf32>):
383e6d8598eSValentin Clement  %0 = memref.alloc() : memref<10xf32>
384e6d8598eSValentin Clement  acc.yield %0 : memref<10xf32>
385e6d8598eSValentin Clement} copy {
386e6d8598eSValentin Clement^bb0(%arg0: memref<10xf32>, %arg1: memref<10xf32>):
387e6d8598eSValentin Clement  acc.terminator
388e6d8598eSValentin Clement} destroy {
389e6d8598eSValentin Clement^bb0(%arg0: memref<10xf32>):
390e6d8598eSValentin Clement  memref.dealloc %arg0 : memref<10xf32>
391e6d8598eSValentin Clement  acc.terminator
392e6d8598eSValentin Clement}
393e6d8598eSValentin Clement
3940254b0bcSRiver Riddlefunc.func @testparallelop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () {
395a54f4eaeSMogball  %i64value = arith.constant 1 : i64
396a54f4eaeSMogball  %i32value = arith.constant 1 : i32
397a54f4eaeSMogball  %idxValue = arith.constant 1 : index
3986d3cabd9SValentin Clement  acc.parallel async(%i64value: i64) {
3996d3cabd9SValentin Clement  }
4006d3cabd9SValentin Clement  acc.parallel async(%i32value: i32) {
4016d3cabd9SValentin Clement  }
4026d3cabd9SValentin Clement  acc.parallel async(%idxValue: index) {
4036d3cabd9SValentin Clement  }
404a25da1a9SValentin Clement  acc.parallel wait({%i64value: i64}) {
4056d3cabd9SValentin Clement  }
406a25da1a9SValentin Clement  acc.parallel wait({%i32value: i32}) {
4076d3cabd9SValentin Clement  }
408a25da1a9SValentin Clement  acc.parallel wait({%idxValue: index}) {
4096d3cabd9SValentin Clement  }
410a25da1a9SValentin Clement  acc.parallel wait({%i64value : i64, %i32value : i32, %idxValue : index}) {
4116d3cabd9SValentin Clement  }
412a25da1a9SValentin Clement  acc.parallel num_gangs({%i64value: i64}) {
4136d3cabd9SValentin Clement  }
414a25da1a9SValentin Clement  acc.parallel num_gangs({%i32value: i32}) {
4156d3cabd9SValentin Clement  }
416a25da1a9SValentin Clement  acc.parallel num_gangs({%idxValue: index}) {
4176d3cabd9SValentin Clement  }
418a25da1a9SValentin Clement  acc.parallel num_gangs({%i64value: i64, %i64value: i64, %idxValue: index}) {
419c4a63b8eSValentin Clement  }
420a25da1a9SValentin Clement  acc.parallel num_workers(%i64value: i64 [#acc.device_type<nvidia>]) {
4216d3cabd9SValentin Clement  }
422a25da1a9SValentin Clement  acc.parallel num_workers(%i32value: i32 [#acc.device_type<default>]) {
4236d3cabd9SValentin Clement  }
4246d3cabd9SValentin Clement  acc.parallel num_workers(%idxValue: index) {
4256d3cabd9SValentin Clement  }
4266d3cabd9SValentin Clement  acc.parallel vector_length(%i64value: i64) {
4276d3cabd9SValentin Clement  }
4286d3cabd9SValentin Clement  acc.parallel vector_length(%i32value: i32) {
4296d3cabd9SValentin Clement  }
4306d3cabd9SValentin Clement  acc.parallel vector_length(%idxValue: index) {
4312d8f0c05SValentin Clement  }
432e6d8598eSValentin Clement  acc.parallel private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(@privatization_memref_10xf32 -> %b: memref<10xf32>) {
433d9953d15SValentin Clement  }
434d9953d15SValentin Clement  acc.parallel {
435ab9cdf09SRiver Riddle  } attributes {defaultAttr = #acc<defaultvalue none>}
436d9953d15SValentin Clement  acc.parallel {
437ab9cdf09SRiver Riddle  } attributes {defaultAttr = #acc<defaultvalue present>}
4382e2bcee0SValentin Clement  acc.parallel {
4392e2bcee0SValentin Clement  } attributes {asyncAttr}
4402e2bcee0SValentin Clement  acc.parallel {
4412e2bcee0SValentin Clement  } attributes {waitAttr}
4422e2bcee0SValentin Clement  acc.parallel {
4432e2bcee0SValentin Clement  } attributes {selfAttr}
4442d8f0c05SValentin Clement  return
4452d8f0c05SValentin Clement}
4462d8f0c05SValentin Clement
447d9953d15SValentin Clement// CHECK:      func @testparallelop([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref<10xf32>, [[ARGC:%.*]]: memref<10x10xf32>) {
448a54f4eaeSMogball// CHECK:      [[I64VALUE:%.*]] = arith.constant 1 : i64
449a54f4eaeSMogball// CHECK:      [[I32VALUE:%.*]] = arith.constant 1 : i32
450a54f4eaeSMogball// CHECK:      [[IDXVALUE:%.*]] = arith.constant 1 : index
4516d3cabd9SValentin Clement// CHECK:      acc.parallel async([[I64VALUE]] : i64) {
4526d3cabd9SValentin Clement// CHECK-NEXT: }
4536d3cabd9SValentin Clement// CHECK:      acc.parallel async([[I32VALUE]] : i32) {
4546d3cabd9SValentin Clement// CHECK-NEXT: }
4556d3cabd9SValentin Clement// CHECK:      acc.parallel async([[IDXVALUE]] : index) {
4566d3cabd9SValentin Clement// CHECK-NEXT: }
457a25da1a9SValentin Clement// CHECK:      acc.parallel wait({[[I64VALUE]] : i64}) {
4586d3cabd9SValentin Clement// CHECK-NEXT: }
459a25da1a9SValentin Clement// CHECK:      acc.parallel wait({[[I32VALUE]] : i32}) {
4606d3cabd9SValentin Clement// CHECK-NEXT: }
461a25da1a9SValentin Clement// CHECK:      acc.parallel wait({[[IDXVALUE]] : index}) {
4626d3cabd9SValentin Clement// CHECK-NEXT: }
463a25da1a9SValentin Clement// CHECK:      acc.parallel wait({[[I64VALUE]] : i64, [[I32VALUE]] : i32, [[IDXVALUE]] : index}) {
4646d3cabd9SValentin Clement// CHECK-NEXT: }
465a25da1a9SValentin Clement// CHECK:      acc.parallel num_gangs({[[I64VALUE]] : i64}) {
4666d3cabd9SValentin Clement// CHECK-NEXT: }
467a25da1a9SValentin Clement// CHECK:      acc.parallel num_gangs({[[I32VALUE]] : i32}) {
4686d3cabd9SValentin Clement// CHECK-NEXT: }
469a25da1a9SValentin Clement// CHECK:      acc.parallel num_gangs({[[IDXVALUE]] : index}) {
4706d3cabd9SValentin Clement// CHECK-NEXT: }
471a25da1a9SValentin Clement// CHECK:      acc.parallel num_gangs({[[I64VALUE]] : i64, [[I64VALUE]] : i64, [[IDXVALUE]] : index}) {
472c4a63b8eSValentin Clement// CHECK-NEXT: }
473a25da1a9SValentin Clement// CHECK:      acc.parallel num_workers([[I64VALUE]] : i64 [#acc.device_type<nvidia>]) {
4746d3cabd9SValentin Clement// CHECK-NEXT: }
475a25da1a9SValentin Clement// CHECK:      acc.parallel num_workers([[I32VALUE]] : i32 [#acc.device_type<default>]) {
4766d3cabd9SValentin Clement// CHECK-NEXT: }
4776d3cabd9SValentin Clement// CHECK:      acc.parallel num_workers([[IDXVALUE]] : index) {
4786d3cabd9SValentin Clement// CHECK-NEXT: }
4796d3cabd9SValentin Clement// CHECK:      acc.parallel vector_length([[I64VALUE]] : i64) {
4806d3cabd9SValentin Clement// CHECK-NEXT: }
4816d3cabd9SValentin Clement// CHECK:      acc.parallel vector_length([[I32VALUE]] : i32) {
4826d3cabd9SValentin Clement// CHECK-NEXT: }
4836d3cabd9SValentin Clement// CHECK:      acc.parallel vector_length([[IDXVALUE]] : index) {
4842d8f0c05SValentin Clement// CHECK-NEXT: }
485e6d8598eSValentin Clement// CHECK:      acc.parallel firstprivate(@privatization_memref_10xf32 -> [[ARGB]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
486d9953d15SValentin Clement// CHECK-NEXT: }
487d9953d15SValentin Clement// CHECK:      acc.parallel {
488ab9cdf09SRiver Riddle// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
489d9953d15SValentin Clement// CHECK:      acc.parallel {
490ab9cdf09SRiver Riddle// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
4912e2bcee0SValentin Clement// CHECK:      acc.parallel {
4922e2bcee0SValentin Clement// CHECK-NEXT: } attributes {asyncAttr}
4932e2bcee0SValentin Clement// CHECK:      acc.parallel {
4942e2bcee0SValentin Clement// CHECK-NEXT: } attributes {waitAttr}
4952e2bcee0SValentin Clement// CHECK:      acc.parallel {
4962e2bcee0SValentin Clement// CHECK-NEXT: } attributes {selfAttr}
49788a1d402SValentin Clement
49888a1d402SValentin Clement// -----
49988a1d402SValentin Clement
500f7d92d45SValentin Clementacc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {
501f7d92d45SValentin Clement^bb0(%arg0: memref<10xf32>):
502f7d92d45SValentin Clement  %0 = memref.alloc() : memref<10xf32>
503f7d92d45SValentin Clement  acc.yield %0 : memref<10xf32>
504f7d92d45SValentin Clement} destroy {
505f7d92d45SValentin Clement^bb0(%arg0: memref<10xf32>):
506f7d92d45SValentin Clement  memref.dealloc %arg0 : memref<10xf32>
507f7d92d45SValentin Clement  acc.terminator
508f7d92d45SValentin Clement}
509f7d92d45SValentin Clement
510f7d92d45SValentin Clementacc.private.recipe @privatization_memref_10_10_f32 : memref<10x10xf32> init {
511f7d92d45SValentin Clement^bb0(%arg0: memref<10x10xf32>):
512f7d92d45SValentin Clement  %0 = memref.alloc() : memref<10x10xf32>
513f7d92d45SValentin Clement  acc.yield %0 : memref<10x10xf32>
514f7d92d45SValentin Clement} destroy {
515f7d92d45SValentin Clement^bb0(%arg0: memref<10x10xf32>):
516f7d92d45SValentin Clement  memref.dealloc %arg0 : memref<10x10xf32>
517f7d92d45SValentin Clement  acc.terminator
518f7d92d45SValentin Clement}
519f8330c14SValentin Clement
520e6d8598eSValentin Clement// Test optional destroy region
521e6d8598eSValentin Clementacc.firstprivate.recipe @firstprivatization_memref_20xf32 : memref<20xf32> init {
522e6d8598eSValentin Clement^bb0(%arg0: memref<20xf32>):
523e6d8598eSValentin Clement  %0 = memref.alloc() : memref<20xf32>
524e6d8598eSValentin Clement  acc.yield %0 : memref<20xf32>
525e6d8598eSValentin Clement} copy {
526e6d8598eSValentin Clement^bb0(%arg0: memref<20xf32>, %arg1: memref<20xf32>):
527e6d8598eSValentin Clement  acc.terminator
528e6d8598eSValentin Clement}
529e6d8598eSValentin Clement
530e6d8598eSValentin Clement// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_memref_20xf32 : memref<20xf32> init
531e6d8598eSValentin Clement
532e6d8598eSValentin Clementacc.firstprivate.recipe @firstprivatization_memref_10xf32 : memref<10xf32> init {
5336a3312f3SValentin Clement^bb0(%arg0: memref<10xf32>):
5346a3312f3SValentin Clement  %0 = memref.alloc() : memref<10xf32>
5356a3312f3SValentin Clement  acc.yield %0 : memref<10xf32>
5366a3312f3SValentin Clement} copy {
5376a3312f3SValentin Clement^bb0(%arg0: memref<10xf32>, %arg1: memref<10xf32>):
5386a3312f3SValentin Clement  acc.terminator
5396a3312f3SValentin Clement} destroy {
5406a3312f3SValentin Clement^bb0(%arg0: memref<10xf32>):
5416a3312f3SValentin Clement  memref.dealloc %arg0 : memref<10xf32>
5426a3312f3SValentin Clement  acc.terminator
5436a3312f3SValentin Clement}
5446a3312f3SValentin Clement
545f8330c14SValentin Clementfunc.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () {
546f8330c14SValentin Clement  %i64value = arith.constant 1 : i64
547f8330c14SValentin Clement  %i32value = arith.constant 1 : i32
548f8330c14SValentin Clement  %idxValue = arith.constant 1 : index
549f8330c14SValentin Clement  acc.serial async(%i64value: i64) {
550f8330c14SValentin Clement  }
551f8330c14SValentin Clement  acc.serial async(%i32value: i32) {
552f8330c14SValentin Clement  }
553f8330c14SValentin Clement  acc.serial async(%idxValue: index) {
554f8330c14SValentin Clement  }
555a25da1a9SValentin Clement  acc.serial wait({%i64value: i64}) {
556f8330c14SValentin Clement  }
557a25da1a9SValentin Clement  acc.serial wait({%i32value: i32}) {
558f8330c14SValentin Clement  }
559a25da1a9SValentin Clement  acc.serial wait({%idxValue: index}) {
560f8330c14SValentin Clement  }
561a25da1a9SValentin Clement  acc.serial wait({%i64value : i64, %i32value : i32, %idxValue : index}) {
562f8330c14SValentin Clement  }
563a0eb794dSRazvan Lupusoru  %firstprivate = acc.firstprivate varPtr(%b : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
5648fb247e2SValentin Clement  acc.serial private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(@firstprivatization_memref_10xf32 -> %firstprivate : memref<10xf32>) {
565f8330c14SValentin Clement  }
566f8330c14SValentin Clement  acc.serial {
567f8330c14SValentin Clement  } attributes {defaultAttr = #acc<defaultvalue none>}
568f8330c14SValentin Clement  acc.serial {
569f8330c14SValentin Clement  } attributes {defaultAttr = #acc<defaultvalue present>}
570f8330c14SValentin Clement  acc.serial {
571f8330c14SValentin Clement  } attributes {asyncAttr}
572f8330c14SValentin Clement  acc.serial {
573f8330c14SValentin Clement  } attributes {waitAttr}
574f8330c14SValentin Clement  acc.serial {
575f8330c14SValentin Clement  } attributes {selfAttr}
5768a21dfe1SValentin Clement  acc.serial {
5778a21dfe1SValentin Clement    acc.yield
5788a21dfe1SValentin Clement  } attributes {selfAttr}
579f8330c14SValentin Clement  return
580f8330c14SValentin Clement}
581f8330c14SValentin Clement
582f8330c14SValentin Clement// CHECK:      func @testserialop([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref<10xf32>, [[ARGC:%.*]]: memref<10x10xf32>) {
583f8330c14SValentin Clement// CHECK:      [[I64VALUE:%.*]] = arith.constant 1 : i64
584f8330c14SValentin Clement// CHECK:      [[I32VALUE:%.*]] = arith.constant 1 : i32
585f8330c14SValentin Clement// CHECK:      [[IDXVALUE:%.*]] = arith.constant 1 : index
586f8330c14SValentin Clement// CHECK:      acc.serial async([[I64VALUE]] : i64) {
587f8330c14SValentin Clement// CHECK-NEXT: }
588f8330c14SValentin Clement// CHECK:      acc.serial async([[I32VALUE]] : i32) {
589f8330c14SValentin Clement// CHECK-NEXT: }
590f8330c14SValentin Clement// CHECK:      acc.serial async([[IDXVALUE]] : index) {
591f8330c14SValentin Clement// CHECK-NEXT: }
592a25da1a9SValentin Clement// CHECK:      acc.serial wait({[[I64VALUE]] : i64}) {
593f8330c14SValentin Clement// CHECK-NEXT: }
594a25da1a9SValentin Clement// CHECK:      acc.serial wait({[[I32VALUE]] : i32}) {
595f8330c14SValentin Clement// CHECK-NEXT: }
596a25da1a9SValentin Clement// CHECK:      acc.serial wait({[[IDXVALUE]] : index}) {
597f8330c14SValentin Clement// CHECK-NEXT: }
598a25da1a9SValentin Clement// CHECK:      acc.serial wait({[[I64VALUE]] : i64, [[I32VALUE]] : i32, [[IDXVALUE]] : index}) {
599f8330c14SValentin Clement// CHECK-NEXT: }
600a0eb794dSRazvan Lupusoru// CHECK:      %[[FIRSTP:.*]] = acc.firstprivate varPtr([[ARGB]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
6018fb247e2SValentin Clement// CHECK:      acc.serial firstprivate(@firstprivatization_memref_10xf32 -> %[[FIRSTP]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
602f8330c14SValentin Clement// CHECK-NEXT: }
603f8330c14SValentin Clement// CHECK:      acc.serial {
604f8330c14SValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
605f8330c14SValentin Clement// CHECK:      acc.serial {
606f8330c14SValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
607f8330c14SValentin Clement// CHECK:      acc.serial {
608f8330c14SValentin Clement// CHECK-NEXT: } attributes {asyncAttr}
609f8330c14SValentin Clement// CHECK:      acc.serial {
610f8330c14SValentin Clement// CHECK-NEXT: } attributes {waitAttr}
611f8330c14SValentin Clement// CHECK:      acc.serial {
612f8330c14SValentin Clement// CHECK-NEXT: } attributes {selfAttr}
6138a21dfe1SValentin Clement// CHECK:      acc.serial {
6148a21dfe1SValentin Clement// CHECK:        acc.yield
6158a21dfe1SValentin Clement// CHECK-NEXT: } attributes {selfAttr}
616f8330c14SValentin Clement
617f8330c14SValentin Clement// -----
618f8330c14SValentin Clement
619d56b74eaSValentin Clement
620d56b74eaSValentin Clementfunc.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () {
621d56b74eaSValentin Clement  %i64value = arith.constant 1 : i64
622d56b74eaSValentin Clement  %i32value = arith.constant 1 : i32
623d56b74eaSValentin Clement  %idxValue = arith.constant 1 : index
624d56b74eaSValentin Clement  acc.kernels async(%i64value: i64) {
625d56b74eaSValentin Clement  }
626d56b74eaSValentin Clement  acc.kernels async(%i32value: i32) {
627d56b74eaSValentin Clement  }
628d56b74eaSValentin Clement  acc.kernels async(%idxValue: index) {
629d56b74eaSValentin Clement  }
630a25da1a9SValentin Clement  acc.kernels wait({%i64value: i64}) {
631d56b74eaSValentin Clement  }
632a25da1a9SValentin Clement  acc.kernels wait({%i32value: i32}) {
633d56b74eaSValentin Clement  }
634a25da1a9SValentin Clement  acc.kernels wait({%idxValue: index}) {
635d56b74eaSValentin Clement  }
636a25da1a9SValentin Clement  acc.kernels wait({%i64value : i64, %i32value : i32, %idxValue : index}) {
637d56b74eaSValentin Clement  }
638d56b74eaSValentin Clement  acc.kernels {
639d56b74eaSValentin Clement  } attributes {defaultAttr = #acc<defaultvalue none>}
640d56b74eaSValentin Clement  acc.kernels {
641d56b74eaSValentin Clement  } attributes {defaultAttr = #acc<defaultvalue present>}
642d56b74eaSValentin Clement  acc.kernels {
643d56b74eaSValentin Clement  } attributes {asyncAttr}
644d56b74eaSValentin Clement  acc.kernels {
645d56b74eaSValentin Clement  } attributes {waitAttr}
646d56b74eaSValentin Clement  acc.kernels {
647d56b74eaSValentin Clement  } attributes {selfAttr}
648d56b74eaSValentin Clement  acc.kernels {
649d56b74eaSValentin Clement    acc.terminator
650d56b74eaSValentin Clement  } attributes {selfAttr}
651d56b74eaSValentin Clement  return
652d56b74eaSValentin Clement}
653d56b74eaSValentin Clement
654d56b74eaSValentin Clement// CHECK:      func @testserialop([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref<10xf32>, [[ARGC:%.*]]: memref<10x10xf32>) {
655d56b74eaSValentin Clement// CHECK:      [[I64VALUE:%.*]] = arith.constant 1 : i64
656d56b74eaSValentin Clement// CHECK:      [[I32VALUE:%.*]] = arith.constant 1 : i32
657d56b74eaSValentin Clement// CHECK:      [[IDXVALUE:%.*]] = arith.constant 1 : index
658d56b74eaSValentin Clement// CHECK:      acc.kernels async([[I64VALUE]] : i64) {
659d56b74eaSValentin Clement// CHECK-NEXT: }
660d56b74eaSValentin Clement// CHECK:      acc.kernels async([[I32VALUE]] : i32) {
661d56b74eaSValentin Clement// CHECK-NEXT: }
662d56b74eaSValentin Clement// CHECK:      acc.kernels async([[IDXVALUE]] : index) {
663d56b74eaSValentin Clement// CHECK-NEXT: }
664a25da1a9SValentin Clement// CHECK:      acc.kernels wait({[[I64VALUE]] : i64}) {
665d56b74eaSValentin Clement// CHECK-NEXT: }
666a25da1a9SValentin Clement// CHECK:      acc.kernels wait({[[I32VALUE]] : i32}) {
667d56b74eaSValentin Clement// CHECK-NEXT: }
668a25da1a9SValentin Clement// CHECK:      acc.kernels wait({[[IDXVALUE]] : index}) {
669d56b74eaSValentin Clement// CHECK-NEXT: }
670a25da1a9SValentin Clement// CHECK:      acc.kernels wait({[[I64VALUE]] : i64, [[I32VALUE]] : i32, [[IDXVALUE]] : index}) {
671d56b74eaSValentin Clement// CHECK-NEXT: }
672d56b74eaSValentin Clement// CHECK:      acc.kernels {
673d56b74eaSValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
674d56b74eaSValentin Clement// CHECK:      acc.kernels {
675d56b74eaSValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
676d56b74eaSValentin Clement// CHECK:      acc.kernels {
677d56b74eaSValentin Clement// CHECK-NEXT: } attributes {asyncAttr}
678d56b74eaSValentin Clement// CHECK:      acc.kernels {
679d56b74eaSValentin Clement// CHECK-NEXT: } attributes {waitAttr}
680d56b74eaSValentin Clement// CHECK:      acc.kernels {
681d56b74eaSValentin Clement// CHECK-NEXT: } attributes {selfAttr}
682d56b74eaSValentin Clement// CHECK:      acc.kernels {
683d56b74eaSValentin Clement// CHECK:        acc.terminator
684d56b74eaSValentin Clement// CHECK-NEXT: } attributes {selfAttr}
685d56b74eaSValentin Clement
686d56b74eaSValentin Clement// -----
687d56b74eaSValentin Clement
68846e1b095SValentin Clementfunc.func @testdataop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
689a54f4eaeSMogball  %ifCond = arith.constant true
69046e1b095SValentin Clement
69146e1b095SValentin Clement  %0 = acc.present varPtr(%a : memref<f32>) -> memref<f32>
69246e1b095SValentin Clement  acc.data if(%ifCond) dataOperands(%0 : memref<f32>) {
693fa08afc3SValentin Clement  }
69446e1b095SValentin Clement
69546e1b095SValentin Clement  %1 = acc.present varPtr(%a : memref<f32>) -> memref<f32>
69646e1b095SValentin Clement  acc.data dataOperands(%1 : memref<f32>) if(%ifCond) {
6972326480fSValentin Clement  }
69846e1b095SValentin Clement
69946e1b095SValentin Clement  %2 = acc.present varPtr(%a : memref<f32>) -> memref<f32>
70046e1b095SValentin Clement  %3 = acc.present varPtr(%b : memref<f32>) -> memref<f32>
70146e1b095SValentin Clement  %4 = acc.present varPtr(%c : memref<f32>) -> memref<f32>
70246e1b095SValentin Clement  acc.data dataOperands(%2, %3, %4 : memref<f32>, memref<f32>, memref<f32>) {
70388a1d402SValentin Clement  }
70446e1b095SValentin Clement
70546e1b095SValentin Clement  %5 = acc.copyin varPtr(%a : memref<f32>) -> memref<f32>
70646e1b095SValentin Clement  %6 = acc.copyin varPtr(%b : memref<f32>) -> memref<f32>
70746e1b095SValentin Clement  %7 = acc.copyin varPtr(%c : memref<f32>) -> memref<f32>
70846e1b095SValentin Clement  acc.data dataOperands(%5, %6, %7 : memref<f32>, memref<f32>, memref<f32>) {
70988a1d402SValentin Clement  }
71046e1b095SValentin Clement
711b232054fSRazvan Lupusoru  %8 = acc.copyin varPtr(%a : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
712b232054fSRazvan Lupusoru  %9 = acc.copyin varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
713b232054fSRazvan Lupusoru  %10 = acc.copyin varPtr(%c : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
71446e1b095SValentin Clement  acc.data dataOperands(%8, %9, %10 : memref<f32>, memref<f32>, memref<f32>) {
71588a1d402SValentin Clement  }
71646e1b095SValentin Clement
717b232054fSRazvan Lupusoru  %11 = acc.create varPtr(%a : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
718b232054fSRazvan Lupusoru  %12 = acc.create varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
719b232054fSRazvan Lupusoru  %13 = acc.create varPtr(%c : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
72046e1b095SValentin Clement  acc.data dataOperands(%11, %12, %13 : memref<f32>, memref<f32>, memref<f32>) {
72188a1d402SValentin Clement  }
72246e1b095SValentin Clement  acc.copyout accPtr(%11 : memref<f32>) to varPtr(%a : memref<f32>)
72346e1b095SValentin Clement  acc.copyout accPtr(%12 : memref<f32>) to varPtr(%b : memref<f32>)
72446e1b095SValentin Clement  acc.copyout accPtr(%13 : memref<f32>) to varPtr(%c : memref<f32>)
72546e1b095SValentin Clement
726b232054fSRazvan Lupusoru  %14 = acc.create varPtr(%a : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout_zero>}
727b232054fSRazvan Lupusoru  %15 = acc.create varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout_zero>}
728b232054fSRazvan Lupusoru  %16 = acc.create varPtr(%c : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout_zero>}
72946e1b095SValentin Clement  acc.data dataOperands(%14, %15, %16 : memref<f32>, memref<f32>, memref<f32>) {
73088a1d402SValentin Clement  }
731b232054fSRazvan Lupusoru  acc.copyout accPtr(%14 : memref<f32>) to varPtr(%a : memref<f32>) {dataClause = #acc<data_clause acc_copyout_zero>}
732b232054fSRazvan Lupusoru  acc.copyout accPtr(%15 : memref<f32>) to varPtr(%b : memref<f32>) {dataClause = #acc<data_clause acc_copyout_zero>}
733b232054fSRazvan Lupusoru  acc.copyout accPtr(%16 : memref<f32>) to varPtr(%c : memref<f32>) {dataClause = #acc<data_clause acc_copyout_zero>}
73446e1b095SValentin Clement
73546e1b095SValentin Clement  %17 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
73646e1b095SValentin Clement  %18 = acc.create varPtr(%b : memref<f32>) -> memref<f32>
73746e1b095SValentin Clement  %19 = acc.create varPtr(%c : memref<f32>) -> memref<f32>
73846e1b095SValentin Clement  acc.data dataOperands(%17, %18, %19 : memref<f32>, memref<f32>, memref<f32>) {
73988a1d402SValentin Clement  }
740b232054fSRazvan Lupusoru  acc.delete accPtr(%17 : memref<f32>) {dataClause = #acc<data_clause acc_create>}
741b232054fSRazvan Lupusoru  acc.delete accPtr(%18 : memref<f32>) {dataClause = #acc<data_clause acc_create>}
742b232054fSRazvan Lupusoru  acc.delete accPtr(%19 : memref<f32>) {dataClause = #acc<data_clause acc_create>}
74346e1b095SValentin Clement
744b232054fSRazvan Lupusoru  %20 = acc.create varPtr(%a : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_create_zero>}
745b232054fSRazvan Lupusoru  %21 = acc.create varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_create_zero>}
746b232054fSRazvan Lupusoru  %22 = acc.create varPtr(%c : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_create_zero>}
74746e1b095SValentin Clement  acc.data dataOperands(%20, %21, %22 : memref<f32>, memref<f32>, memref<f32>) {
74888a1d402SValentin Clement  }
749b232054fSRazvan Lupusoru  acc.delete accPtr(%20 : memref<f32>) {dataClause = #acc<data_clause acc_create_zero>}
750b232054fSRazvan Lupusoru  acc.delete accPtr(%21 : memref<f32>) {dataClause = #acc<data_clause acc_create_zero>}
751b232054fSRazvan Lupusoru  acc.delete accPtr(%22 : memref<f32>) {dataClause = #acc<data_clause acc_create_zero>}
75246e1b095SValentin Clement
75346e1b095SValentin Clement  %23 = acc.nocreate varPtr(%a : memref<f32>) -> memref<f32>
75446e1b095SValentin Clement  %24 = acc.nocreate varPtr(%b : memref<f32>) -> memref<f32>
75546e1b095SValentin Clement  %25 = acc.nocreate varPtr(%c : memref<f32>) -> memref<f32>
75646e1b095SValentin Clement  acc.data dataOperands(%23, %24, %25 : memref<f32>, memref<f32>, memref<f32>) {
75788a1d402SValentin Clement  }
75846e1b095SValentin Clement
75946e1b095SValentin Clement  %26 = acc.deviceptr varPtr(%a : memref<f32>) -> memref<f32>
76046e1b095SValentin Clement  %27 = acc.deviceptr varPtr(%b : memref<f32>) -> memref<f32>
76146e1b095SValentin Clement  %28 = acc.deviceptr varPtr(%c : memref<f32>) -> memref<f32>
76246e1b095SValentin Clement  acc.data dataOperands(%26, %27, %28 : memref<f32>, memref<f32>, memref<f32>) {
76388a1d402SValentin Clement  }
76446e1b095SValentin Clement
76546e1b095SValentin Clement  %29 = acc.attach varPtr(%a : memref<f32>) -> memref<f32>
76646e1b095SValentin Clement  %30 = acc.attach varPtr(%b : memref<f32>) -> memref<f32>
76746e1b095SValentin Clement  %31 = acc.attach varPtr(%c : memref<f32>) -> memref<f32>
76846e1b095SValentin Clement  acc.data dataOperands(%29, %30, %31 : memref<f32>, memref<f32>, memref<f32>) {
769fa08afc3SValentin Clement  }
77046e1b095SValentin Clement
77146e1b095SValentin Clement  %32 = acc.copyin varPtr(%a : memref<f32>) -> memref<f32>
772b232054fSRazvan Lupusoru  %33 = acc.create varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
77346e1b095SValentin Clement  %34 = acc.present varPtr(%c : memref<f32>) -> memref<f32>
77446e1b095SValentin Clement  acc.data dataOperands(%32, %33, %34 : memref<f32>, memref<f32>, memref<f32>) {
77588a1d402SValentin Clement  }
77646e1b095SValentin Clement  acc.copyout accPtr(%33 : memref<f32>) to varPtr(%b : memref<f32>)
77746e1b095SValentin Clement
77846e1b095SValentin Clement  %35 = acc.present varPtr(%a : memref<f32>) -> memref<f32>
77946e1b095SValentin Clement  acc.data dataOperands(%35 : memref<f32>) {
780ab9cdf09SRiver Riddle  } attributes { defaultAttr = #acc<defaultvalue none> }
78146e1b095SValentin Clement
78246e1b095SValentin Clement
78346e1b095SValentin Clement  %36 = acc.present varPtr(%a : memref<f32>) -> memref<f32>
78446e1b095SValentin Clement  acc.data dataOperands(%36 : memref<f32>) {
785ab9cdf09SRiver Riddle  } attributes { defaultAttr = #acc<defaultvalue present> }
78646e1b095SValentin Clement
787bbb5dc49SValentin Clement  acc.data {
788ab9cdf09SRiver Riddle  } attributes { defaultAttr = #acc<defaultvalue none> }
789ecc7adc4SValentin Clement
790ecc7adc4SValentin Clement  acc.data {
791ecc7adc4SValentin Clement  } attributes { defaultAttr = #acc<defaultvalue none>, async }
792ecc7adc4SValentin Clement
793ecc7adc4SValentin Clement  %a1 = arith.constant 1 : i64
794ecc7adc4SValentin Clement  acc.data async(%a1 : i64) {
795ecc7adc4SValentin Clement  } attributes { defaultAttr = #acc<defaultvalue none>, async }
796ecc7adc4SValentin Clement
79761807f5cSValentin Clement  acc.data {
79861807f5cSValentin Clement  } attributes { defaultAttr = #acc<defaultvalue none>, wait }
79961807f5cSValentin Clement
80061807f5cSValentin Clement  %w1 = arith.constant 1 : i64
80171ec3013SValentin Clement (バレンタイン クレメン)  acc.data wait({%w1 : i64}) {
80261807f5cSValentin Clement  } attributes { defaultAttr = #acc<defaultvalue none>, wait }
80361807f5cSValentin Clement
80461807f5cSValentin Clement  %wd1 = arith.constant 1 : i64
805c09dc2d9SValentin Clement (バレンタイン クレメン)  acc.data wait({devnum: %wd1 : i64, %w1 : i64}) {
80661807f5cSValentin Clement  } attributes { defaultAttr = #acc<defaultvalue none>, wait }
80761807f5cSValentin Clement
80888a1d402SValentin Clement  return
80988a1d402SValentin Clement}
81088a1d402SValentin Clement
81146e1b095SValentin Clement// CHECK:      func @testdataop(%[[ARGA:.*]]: memref<f32>, %[[ARGB:.*]]: memref<f32>, %[[ARGC:.*]]: memref<f32>) {
81246e1b095SValentin Clement
81346e1b095SValentin Clement// CHECK:      %[[IFCOND1:.*]] = arith.constant true
81446e1b095SValentin Clement// CHECK:      %[[PRESENT_A:.*]] = acc.present varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
81546e1b095SValentin Clement// CHECK:      acc.data if(%[[IFCOND1]]) dataOperands(%[[PRESENT_A]] : memref<f32>) {
816fa08afc3SValentin Clement// CHECK-NEXT: }
81746e1b095SValentin Clement
81846e1b095SValentin Clement// CHECK:      %[[PRESENT_A:.*]] = acc.present varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
81946e1b095SValentin Clement// CHECK:      acc.data if(%[[IFCOND1]]) dataOperands(%[[PRESENT_A]] : memref<f32>) {
8202326480fSValentin Clement// CHECK-NEXT: }
82146e1b095SValentin Clement
82246e1b095SValentin Clement// CHECK:      %[[PRESENT_A:.*]] = acc.present varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
82346e1b095SValentin Clement// CHECK:      %[[PRESENT_B:.*]] = acc.present varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
82446e1b095SValentin Clement// CHECK:      %[[PRESENT_C:.*]] = acc.present varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
82546e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[PRESENT_A]], %[[PRESENT_B]], %[[PRESENT_C]] : memref<f32>, memref<f32>, memref<f32>) {
82688a1d402SValentin Clement// CHECK-NEXT: }
82746e1b095SValentin Clement
82846e1b095SValentin Clement// CHECK:      %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
82946e1b095SValentin Clement// CHECK:      %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
83046e1b095SValentin Clement// CHECK:      %[[COPYIN_C:.*]] = acc.copyin varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
83146e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : memref<f32>, memref<f32>, memref<f32>) {
83288a1d402SValentin Clement// CHECK-NEXT: }
83346e1b095SValentin Clement
834b232054fSRazvan Lupusoru// CHECK:      %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[ARGA]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
835b232054fSRazvan Lupusoru// CHECK:      %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
836b232054fSRazvan Lupusoru// CHECK:      %[[COPYIN_C:.*]] = acc.copyin varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
83746e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : memref<f32>, memref<f32>, memref<f32>) {
83888a1d402SValentin Clement// CHECK-NEXT: }
83946e1b095SValentin Clement
840b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
841b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
842b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
84346e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : memref<f32>, memref<f32>, memref<f32>) {
84488a1d402SValentin Clement// CHECK-NEXT: }
84546e1b095SValentin Clement// CHECK:      acc.copyout accPtr(%[[CREATE_A]] : memref<f32>) to varPtr(%[[ARGA]] : memref<f32>)
84646e1b095SValentin Clement// CHECK:      acc.copyout accPtr(%[[CREATE_B]] : memref<f32>) to varPtr(%[[ARGB]] : memref<f32>)
84746e1b095SValentin Clement// CHECK:      acc.copyout accPtr(%[[CREATE_C]] : memref<f32>) to varPtr(%[[ARGC]] : memref<f32>)
84846e1b095SValentin Clement
849b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout_zero>}
850b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout_zero>}
851b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout_zero>}
85246e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : memref<f32>, memref<f32>, memref<f32>) {
85388a1d402SValentin Clement// CHECK-NEXT: }
854b232054fSRazvan Lupusoru// CHECK:      acc.copyout accPtr(%[[CREATE_A]] : memref<f32>) to varPtr(%[[ARGA]] : memref<f32>) {dataClause = #acc<data_clause acc_copyout_zero>}
855b232054fSRazvan Lupusoru// CHECK:      acc.copyout accPtr(%[[CREATE_B]] : memref<f32>) to varPtr(%[[ARGB]] : memref<f32>) {dataClause = #acc<data_clause acc_copyout_zero>}
856b232054fSRazvan Lupusoru// CHECK:      acc.copyout accPtr(%[[CREATE_C]] : memref<f32>) to varPtr(%[[ARGC]] : memref<f32>) {dataClause = #acc<data_clause acc_copyout_zero>}
85746e1b095SValentin Clement
85846e1b095SValentin Clement// CHECK:      %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
85946e1b095SValentin Clement// CHECK:      %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
86046e1b095SValentin Clement// CHECK:      %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
86146e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : memref<f32>, memref<f32>, memref<f32>) {
86288a1d402SValentin Clement// CHECK-NEXT: }
86346e1b095SValentin Clement
864b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_create_zero>}
865b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_create_zero>}
866b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_create_zero>}
86746e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : memref<f32>, memref<f32>, memref<f32>) {
86888a1d402SValentin Clement// CHECK-NEXT: }
86946e1b095SValentin Clement
87046e1b095SValentin Clement// CHECK:      %[[NOCREATE_A:.*]] = acc.nocreate varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
87146e1b095SValentin Clement// CHECK:      %[[NOCREATE_B:.*]] = acc.nocreate varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
87246e1b095SValentin Clement// CHECK:      %[[NOCREATE_C:.*]] = acc.nocreate varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
87346e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[NOCREATE_A]], %[[NOCREATE_B]], %[[NOCREATE_C]] : memref<f32>, memref<f32>, memref<f32>) {
87488a1d402SValentin Clement// CHECK-NEXT: }
87546e1b095SValentin Clement
87646e1b095SValentin Clement// CHECK:      %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
87746e1b095SValentin Clement// CHECK:      %[[DEVICEPTR_B:.*]] = acc.deviceptr varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
87846e1b095SValentin Clement// CHECK:      %[[DEVICEPTR_C:.*]] = acc.deviceptr varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
87946e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_B]], %[[DEVICEPTR_C]] : memref<f32>, memref<f32>, memref<f32>) {
88088a1d402SValentin Clement// CHECK-NEXT: }
88146e1b095SValentin Clement
88246e1b095SValentin Clement// CHECK:      %[[ATTACH_A:.*]] = acc.attach varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
88346e1b095SValentin Clement// CHECK:      %[[ATTACH_B:.*]] = acc.attach varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
88446e1b095SValentin Clement// CHECK:      %[[ATTACH_C:.*]] = acc.attach varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
88546e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[ATTACH_A]], %[[ATTACH_B]], %[[ATTACH_C]] : memref<f32>, memref<f32>, memref<f32>) {
886fa08afc3SValentin Clement// CHECK-NEXT: }
88746e1b095SValentin Clement
88846e1b095SValentin Clement
88946e1b095SValentin Clement// CHECK:      %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
890b232054fSRazvan Lupusoru// CHECK:      %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
89146e1b095SValentin Clement// CHECK:      %[[PRESENT_C:.*]] = acc.present varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
89246e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[COPYIN_A]], %[[CREATE_B]], %[[PRESENT_C]] : memref<f32>, memref<f32>, memref<f32>) {
89388a1d402SValentin Clement// CHECK-NEXT: }
89446e1b095SValentin Clement// CHECK:      acc.copyout accPtr(%[[CREATE_B]] : memref<f32>) to varPtr(%[[ARGB]] : memref<f32>)
89546e1b095SValentin Clement
89646e1b095SValentin Clement// CHECK:      %[[PRESENT_A:.*]] = acc.present varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
89746e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[PRESENT_A]] : memref<f32>) {
898ab9cdf09SRiver Riddle// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
89946e1b095SValentin Clement
90046e1b095SValentin Clement// CHECK:      %[[PRESENT_A:.*]] = acc.present varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
90146e1b095SValentin Clement// CHECK:      acc.data dataOperands(%[[PRESENT_A]] : memref<f32>) {
902ab9cdf09SRiver Riddle// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
90346e1b095SValentin Clement
904bbb5dc49SValentin Clement// CHECK:      acc.data {
905ab9cdf09SRiver Riddle// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
906ecc99780SValentin Clement
907ecc7adc4SValentin Clement// CHECK:      acc.data {
908ecc7adc4SValentin Clement// CHECK-NEXT: } attributes {async, defaultAttr = #acc<defaultvalue none>}
909ecc7adc4SValentin Clement
910ecc7adc4SValentin Clement// CHECK:      acc.data async(%{{.*}} : i64) {
911ecc7adc4SValentin Clement// CHECK-NEXT: } attributes {async, defaultAttr = #acc<defaultvalue none>}
912ecc7adc4SValentin Clement
91361807f5cSValentin Clement// CHECK:      acc.data {
91461807f5cSValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>, wait}
91561807f5cSValentin Clement
91671ec3013SValentin Clement (バレンタイン クレメン)// CHECK:      acc.data wait({%{{.*}} : i64}) {
91761807f5cSValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>, wait}
91861807f5cSValentin Clement
919c09dc2d9SValentin Clement (バレンタイン クレメン)// CHECK:      acc.data wait({devnum: %{{.*}} : i64, %{{.*}} : i64}) {
92061807f5cSValentin Clement// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>, wait}
92161807f5cSValentin Clement
922ecc99780SValentin Clement// -----
923ecc99780SValentin Clement
924689afa88SValentin Clementfunc.func @testupdateop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
925a54f4eaeSMogball  %i64Value = arith.constant 1 : i64
926a54f4eaeSMogball  %i32Value = arith.constant 1 : i32
927a54f4eaeSMogball  %idxValue = arith.constant 1 : index
928a54f4eaeSMogball  %ifCond = arith.constant true
929689afa88SValentin Clement  %0 = acc.update_device varPtr(%a : memref<f32>) -> memref<f32>
930689afa88SValentin Clement  %1 = acc.update_device varPtr(%b : memref<f32>) -> memref<f32>
931689afa88SValentin Clement  %2 = acc.update_device varPtr(%c : memref<f32>) -> memref<f32>
932689afa88SValentin Clement
933689afa88SValentin Clement  acc.update async(%i64Value: i64) dataOperands(%0: memref<f32>)
934689afa88SValentin Clement  acc.update async(%i32Value: i32) dataOperands(%0: memref<f32>)
935689afa88SValentin Clement  acc.update async(%i32Value: i32) dataOperands(%0: memref<f32>)
936689afa88SValentin Clement  acc.update async(%idxValue: index) dataOperands(%0: memref<f32>)
937c09dc2d9SValentin Clement (バレンタイン クレメン)  acc.update wait({devnum: %i64Value: i64, %i32Value : i32, %idxValue : index}) dataOperands(%0: memref<f32>)
938689afa88SValentin Clement  acc.update if(%ifCond) dataOperands(%0: memref<f32>)
93978ef0328SValentin Clement (バレンタイン クレメン)  acc.update dataOperands(%0: memref<f32>)
940689afa88SValentin Clement  acc.update dataOperands(%0, %1, %2 : memref<f32>, memref<f32>, memref<f32>)
9416b42625bSValentin Clement (バレンタイン クレメン)  acc.update async dataOperands(%0, %1, %2 : memref<f32>, memref<f32>, memref<f32>)
94278ef0328SValentin Clement (バレンタイン クレメン)  acc.update wait dataOperands(%0, %1, %2 : memref<f32>, memref<f32>, memref<f32>)
943689afa88SValentin Clement  acc.update dataOperands(%0, %1, %2 : memref<f32>, memref<f32>, memref<f32>) attributes {ifPresent}
944ecc99780SValentin Clement  return
945ecc99780SValentin Clement}
946ecc99780SValentin Clement
94778ef0328SValentin Clement (バレンタイン クレメン)// CHECK: func.func @testupdateop(%{{.*}}: memref<f32>, %{{.*}}: memref<f32>, %{{.*}}: memref<f32>)
948a54f4eaeSMogball// CHECK:   [[I64VALUE:%.*]] = arith.constant 1 : i64
949a54f4eaeSMogball// CHECK:   [[I32VALUE:%.*]] = arith.constant 1 : i32
950a54f4eaeSMogball// CHECK:   [[IDXVALUE:%.*]] = arith.constant 1 : index
951a54f4eaeSMogball// CHECK:   [[IFCOND:%.*]] = arith.constant true
952689afa88SValentin Clement// CHECK:   acc.update async([[I64VALUE]] : i64) dataOperands(%{{.*}} : memref<f32>)
953689afa88SValentin Clement// CHECK:   acc.update async([[I32VALUE]] : i32) dataOperands(%{{.*}} : memref<f32>)
954689afa88SValentin Clement// CHECK:   acc.update async([[I32VALUE]] : i32) dataOperands(%{{.*}} : memref<f32>)
955689afa88SValentin Clement// CHECK:   acc.update async([[IDXVALUE]] : index) dataOperands(%{{.*}} : memref<f32>)
956c09dc2d9SValentin Clement (バレンタイン クレメン)// CHECK:   acc.update wait({devnum: [[I64VALUE]] : i64, [[I32VALUE]] : i32, [[IDXVALUE]] : index}) dataOperands(%{{.*}} : memref<f32>)
957689afa88SValentin Clement// CHECK:   acc.update if([[IFCOND]]) dataOperands(%{{.*}} : memref<f32>)
95878ef0328SValentin Clement (バレンタイン クレメン)// CHECK:   acc.update dataOperands(%{{.*}} : memref<f32>)
959689afa88SValentin Clement// CHECK:   acc.update dataOperands(%{{.*}}, %{{.*}}, %{{.*}} : memref<f32>, memref<f32>, memref<f32>)
9606b42625bSValentin Clement (バレンタイン クレメン)// CHECK:   acc.update async dataOperands(%{{.*}}, %{{.*}}, %{{.*}} : memref<f32>, memref<f32>, memref<f32>)
96178ef0328SValentin Clement (バレンタイン クレメン)// CHECK:   acc.update wait dataOperands(%{{.*}}, %{{.*}}, %{{.*}} : memref<f32>, memref<f32>, memref<f32>)
962689afa88SValentin Clement// CHECK:   acc.update dataOperands(%{{.*}}, %{{.*}}, %{{.*}} : memref<f32>, memref<f32>, memref<f32>) attributes {ifPresent}
963cc3b8e73SValentin Clement
964cc3b8e73SValentin Clement// -----
965cc3b8e73SValentin Clement
966a54f4eaeSMogball%i64Value = arith.constant 1 : i64
967a54f4eaeSMogball%i32Value = arith.constant 1 : i32
968a54f4eaeSMogball%idxValue = arith.constant 1 : index
969a54f4eaeSMogball%ifCond = arith.constant true
970cc3b8e73SValentin Clementacc.wait
971cc3b8e73SValentin Clementacc.wait(%i64Value: i64)
972cc3b8e73SValentin Clementacc.wait(%i32Value: i32)
973cc3b8e73SValentin Clementacc.wait(%idxValue: index)
974cc3b8e73SValentin Clementacc.wait(%i32Value, %idxValue : i32, index)
975cc3b8e73SValentin Clementacc.wait async(%i64Value: i64)
976cc3b8e73SValentin Clementacc.wait async(%i32Value: i32)
977cc3b8e73SValentin Clementacc.wait async(%idxValue: index)
978cc3b8e73SValentin Clementacc.wait(%i32Value: i32) async(%idxValue: index)
979cc3b8e73SValentin Clementacc.wait(%i64Value: i64) wait_devnum(%i32Value: i32)
980cc3b8e73SValentin Clementacc.wait attributes {async}
981cc3b8e73SValentin Clementacc.wait(%i64Value: i64) async(%idxValue: index) wait_devnum(%i32Value: i32)
9822326480fSValentin Clementacc.wait(%i64Value: i64) wait_devnum(%i32Value: i32) async(%idxValue: index)
983cc3b8e73SValentin Clementacc.wait if(%ifCond)
984cc3b8e73SValentin Clement
985a54f4eaeSMogball// CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64
986a54f4eaeSMogball// CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32
987a54f4eaeSMogball// CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index
988a54f4eaeSMogball// CHECK: [[IFCOND:%.*]] = arith.constant true
989cc3b8e73SValentin Clement// CHECK: acc.wait
990cc3b8e73SValentin Clement// CHECK: acc.wait([[I64VALUE]] : i64)
991cc3b8e73SValentin Clement// CHECK: acc.wait([[I32VALUE]] : i32)
992cc3b8e73SValentin Clement// CHECK: acc.wait([[IDXVALUE]] : index)
993cc3b8e73SValentin Clement// CHECK: acc.wait([[I32VALUE]], [[IDXVALUE]] : i32, index)
994cc3b8e73SValentin Clement// CHECK: acc.wait async([[I64VALUE]] : i64)
995cc3b8e73SValentin Clement// CHECK: acc.wait async([[I32VALUE]] : i32)
996cc3b8e73SValentin Clement// CHECK: acc.wait async([[IDXVALUE]] : index)
997cc3b8e73SValentin Clement// CHECK: acc.wait([[I32VALUE]] : i32) async([[IDXVALUE]] : index)
998cc3b8e73SValentin Clement// CHECK: acc.wait([[I64VALUE]] : i64) wait_devnum([[I32VALUE]] : i32)
999cc3b8e73SValentin Clement// CHECK: acc.wait attributes {async}
1000cc3b8e73SValentin Clement// CHECK: acc.wait([[I64VALUE]] : i64) async([[IDXVALUE]] : index) wait_devnum([[I32VALUE]] : i32)
10012326480fSValentin Clement// CHECK: acc.wait([[I64VALUE]] : i64) async([[IDXVALUE]] : index) wait_devnum([[I32VALUE]] : i32)
1002cc3b8e73SValentin Clement// CHECK: acc.wait if([[IFCOND]])
100351323fe2SValentin Clement
100451323fe2SValentin Clement// -----
100551323fe2SValentin Clement
1006a54f4eaeSMogball%i64Value = arith.constant 1 : i64
1007a54f4eaeSMogball%i32Value = arith.constant 1 : i32
1008a54f4eaeSMogball%i32Value2 = arith.constant 2 : i32
1009a54f4eaeSMogball%idxValue = arith.constant 1 : index
1010a54f4eaeSMogball%ifCond = arith.constant true
101151323fe2SValentin Clementacc.init
1012f706837eSValentin Clement (バレンタイン クレメン)acc.init attributes {acc.device_types = [#acc.device_type<nvidia>]}
101351323fe2SValentin Clementacc.init device_num(%i64Value : i64)
101451323fe2SValentin Clementacc.init device_num(%i32Value : i32)
101551323fe2SValentin Clementacc.init device_num(%idxValue : index)
101651323fe2SValentin Clementacc.init if(%ifCond)
10172326480fSValentin Clementacc.init if(%ifCond) device_num(%idxValue : index)
10182326480fSValentin Clementacc.init device_num(%idxValue : index) if(%ifCond)
101951323fe2SValentin Clement
1020a54f4eaeSMogball// CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64
1021a54f4eaeSMogball// CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32
1022a54f4eaeSMogball// CHECK: [[I32VALUE2:%.*]] = arith.constant 2 : i32
1023a54f4eaeSMogball// CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index
1024a54f4eaeSMogball// CHECK: [[IFCOND:%.*]] = arith.constant true
102551323fe2SValentin Clement// CHECK: acc.init
1026f706837eSValentin Clement (バレンタイン クレメン)// CHECK: acc.init attributes {acc.device_types = [#acc.device_type<nvidia>]}
102751323fe2SValentin Clement// CHECK: acc.init device_num([[I64VALUE]] : i64)
102851323fe2SValentin Clement// CHECK: acc.init device_num([[I32VALUE]] : i32)
102951323fe2SValentin Clement// CHECK: acc.init device_num([[IDXVALUE]] : index)
103051323fe2SValentin Clement// CHECK: acc.init if([[IFCOND]])
10312326480fSValentin Clement// CHECK: acc.init device_num([[IDXVALUE]] : index) if([[IFCOND]])
10322326480fSValentin Clement// CHECK: acc.init device_num([[IDXVALUE]] : index) if([[IFCOND]])
10339c77350bSValentin Clement
10349c77350bSValentin Clement// -----
10359c77350bSValentin Clement
1036a54f4eaeSMogball%i64Value = arith.constant 1 : i64
1037a54f4eaeSMogball%i32Value = arith.constant 1 : i32
1038a54f4eaeSMogball%i32Value2 = arith.constant 2 : i32
1039a54f4eaeSMogball%idxValue = arith.constant 1 : index
1040a54f4eaeSMogball%ifCond = arith.constant true
10419c77350bSValentin Clementacc.shutdown
1042f706837eSValentin Clement (バレンタイン クレメン)acc.shutdown attributes {acc.device_types = [#acc.device_type<default>]}
10439c77350bSValentin Clementacc.shutdown device_num(%i64Value : i64)
10449c77350bSValentin Clementacc.shutdown device_num(%i32Value : i32)
10459c77350bSValentin Clementacc.shutdown device_num(%idxValue : index)
10469c77350bSValentin Clementacc.shutdown if(%ifCond)
10472326480fSValentin Clementacc.shutdown if(%ifCond) device_num(%idxValue : index)
10482326480fSValentin Clementacc.shutdown device_num(%idxValue : index) if(%ifCond)
10499c77350bSValentin Clement
1050a54f4eaeSMogball// CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64
1051a54f4eaeSMogball// CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32
1052a54f4eaeSMogball// CHECK: [[I32VALUE2:%.*]] = arith.constant 2 : i32
1053a54f4eaeSMogball// CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index
1054a54f4eaeSMogball// CHECK: [[IFCOND:%.*]] = arith.constant true
10559c77350bSValentin Clement// CHECK: acc.shutdown
1056f706837eSValentin Clement (バレンタイン クレメン)// CHECK: acc.shutdown attributes {acc.device_types = [#acc.device_type<default>]}
10579c77350bSValentin Clement// CHECK: acc.shutdown device_num([[I64VALUE]] : i64)
10589c77350bSValentin Clement// CHECK: acc.shutdown device_num([[I32VALUE]] : i32)
10599c77350bSValentin Clement// CHECK: acc.shutdown device_num([[IDXVALUE]] : index)
10609c77350bSValentin Clement// CHECK: acc.shutdown if([[IFCOND]])
10612326480fSValentin Clement// CHECK: acc.shutdown device_num([[IDXVALUE]] : index) if([[IFCOND]])
10622326480fSValentin Clement// CHECK: acc.shutdown device_num([[IDXVALUE]] : index) if([[IFCOND]])
10636260cb1dSValentin Clement
10646260cb1dSValentin Clement// -----
10656260cb1dSValentin Clement
10667ed96b1cSChristian Ulmannfunc.func @testexitdataop(%a: !llvm.ptr) -> () {
1067a54f4eaeSMogball  %ifCond = arith.constant true
1068a54f4eaeSMogball  %i64Value = arith.constant 1 : i64
1069a54f4eaeSMogball  %i32Value = arith.constant 1 : i32
1070a54f4eaeSMogball  %idxValue = arith.constant 1 : index
10716260cb1dSValentin Clement
1072a0eb794dSRazvan Lupusoru  %0 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10737ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%0 : !llvm.ptr)
1074a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%0 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
107515a480c0SValentin Clement
1076a0eb794dSRazvan Lupusoru  %1 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10777ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%1 : !llvm.ptr)
10787ed96b1cSChristian Ulmann  acc.delete accPtr(%1 : !llvm.ptr)
107915a480c0SValentin Clement
1080a0eb794dSRazvan Lupusoru  %2 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10817ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%2 : !llvm.ptr) attributes {async,finalize}
10827ed96b1cSChristian Ulmann  acc.delete accPtr(%2 : !llvm.ptr)
108315a480c0SValentin Clement
1084a0eb794dSRazvan Lupusoru  %3 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10857ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%3 : !llvm.ptr)
10867ed96b1cSChristian Ulmann  acc.detach accPtr(%3 : !llvm.ptr)
108715a480c0SValentin Clement
1088a0eb794dSRazvan Lupusoru  %4 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10897ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%4 : !llvm.ptr) attributes {async}
1090a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%4 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
109115a480c0SValentin Clement
1092a0eb794dSRazvan Lupusoru  %5 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10937ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%5 : !llvm.ptr) attributes {wait}
10947ed96b1cSChristian Ulmann  acc.delete accPtr(%5 : !llvm.ptr)
109515a480c0SValentin Clement
1096a0eb794dSRazvan Lupusoru  %6 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
10977ed96b1cSChristian Ulmann  acc.exit_data async(%i64Value : i64) dataOperands(%6 : !llvm.ptr)
1098a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%6 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
109915a480c0SValentin Clement
1100a0eb794dSRazvan Lupusoru  %7 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11017ed96b1cSChristian Ulmann  acc.exit_data dataOperands(%7 : !llvm.ptr) async(%i64Value : i64)
1102a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%7 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
110315a480c0SValentin Clement
1104a0eb794dSRazvan Lupusoru  %8 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11057ed96b1cSChristian Ulmann  acc.exit_data if(%ifCond) dataOperands(%8 : !llvm.ptr)
1106a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%8 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
110715a480c0SValentin Clement
1108a0eb794dSRazvan Lupusoru  %9 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11097ed96b1cSChristian Ulmann  acc.exit_data wait_devnum(%i64Value: i64) wait(%i32Value, %idxValue : i32, index) dataOperands(%9 : !llvm.ptr)
1110a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%9 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
11116260cb1dSValentin Clement
11126260cb1dSValentin Clement  return
11136260cb1dSValentin Clement}
11146260cb1dSValentin Clement
11157ed96b1cSChristian Ulmann// CHECK: func @testexitdataop(%[[ARGA:.*]]: !llvm.ptr) {
111615a480c0SValentin Clement// CHECK: %[[IFCOND:.*]] = arith.constant true
111715a480c0SValentin Clement// CHECK: %[[I64VALUE:.*]] = arith.constant 1 : i64
111815a480c0SValentin Clement// CHECK: %[[I32VALUE:.*]] = arith.constant 1 : i32
111915a480c0SValentin Clement// CHECK: %[[IDXVALUE:.*]] = arith.constant 1 : index
112015a480c0SValentin Clement
1121a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11227ed96b1cSChristian Ulmann// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr)
1123a0eb794dSRazvan Lupusoru// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
112415a480c0SValentin Clement
1125a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11267ed96b1cSChristian Ulmann// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr)
11277ed96b1cSChristian Ulmann// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
112815a480c0SValentin Clement
1129a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11307ed96b1cSChristian Ulmann// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {async, finalize}
11317ed96b1cSChristian Ulmann// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
113215a480c0SValentin Clement
1133a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11347ed96b1cSChristian Ulmann// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr)
11357ed96b1cSChristian Ulmann// CHECK: acc.detach accPtr(%[[DEVPTR]] : !llvm.ptr)
113615a480c0SValentin Clement
1137a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11387ed96b1cSChristian Ulmann// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {async}
1139a0eb794dSRazvan Lupusoru// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
114015a480c0SValentin Clement
1141a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11427ed96b1cSChristian Ulmann// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {wait}
11437ed96b1cSChristian Ulmann// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
114415a480c0SValentin Clement
1145a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11467ed96b1cSChristian Ulmann// CHECK: acc.exit_data async(%[[I64VALUE]] : i64) dataOperands(%[[DEVPTR]] : !llvm.ptr)
1147a0eb794dSRazvan Lupusoru// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
114815a480c0SValentin Clement
1149a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11507ed96b1cSChristian Ulmann// CHECK: acc.exit_data async(%[[I64VALUE]] : i64) dataOperands(%[[DEVPTR]] : !llvm.ptr)
1151a0eb794dSRazvan Lupusoru// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
115215a480c0SValentin Clement
1153a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11547ed96b1cSChristian Ulmann// CHECK: acc.exit_data if(%[[IFCOND]]) dataOperands(%[[DEVPTR]] : !llvm.ptr)
1155a0eb794dSRazvan Lupusoru// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
115615a480c0SValentin Clement
1157a0eb794dSRazvan Lupusoru// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
11587ed96b1cSChristian Ulmann// CHECK: acc.exit_data wait_devnum(%[[I64VALUE]] : i64) wait(%[[I32VALUE]], %[[IDXVALUE]] : i32, index) dataOperands(%[[DEVPTR]] : !llvm.ptr)
1159a0eb794dSRazvan Lupusoru// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
116015a480c0SValentin Clement
11614b011901SValentin Clement// -----
11624b011901SValentin Clement
11634b011901SValentin Clement
11647ed96b1cSChristian Ulmannfunc.func @testenterdataop(%a: !llvm.ptr, %b: !llvm.ptr, %c: !llvm.ptr) -> () {
1165a54f4eaeSMogball  %ifCond = arith.constant true
1166a54f4eaeSMogball  %i64Value = arith.constant 1 : i64
1167a54f4eaeSMogball  %i32Value = arith.constant 1 : i32
1168a54f4eaeSMogball  %idxValue = arith.constant 1 : index
11694b011901SValentin Clement
1170a0eb794dSRazvan Lupusoru  %0 = acc.copyin varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11717ed96b1cSChristian Ulmann  acc.enter_data dataOperands(%0 : !llvm.ptr)
1172a0eb794dSRazvan Lupusoru  %1 = acc.create varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
1173a0eb794dSRazvan Lupusoru  %2 = acc.create varPtr(%b : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
1174a0eb794dSRazvan Lupusoru  %3 = acc.create varPtr(%c : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
11757ed96b1cSChristian Ulmann  acc.enter_data dataOperands(%1, %2, %3 : !llvm.ptr, !llvm.ptr, !llvm.ptr)
1176a0eb794dSRazvan Lupusoru  %4 = acc.attach varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11777ed96b1cSChristian Ulmann  acc.enter_data dataOperands(%4 : !llvm.ptr)
1178a0eb794dSRazvan Lupusoru  %5 = acc.copyin varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11797ed96b1cSChristian Ulmann  acc.enter_data dataOperands(%5 : !llvm.ptr) attributes {async}
1180a0eb794dSRazvan Lupusoru  %6 = acc.create varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11817ed96b1cSChristian Ulmann  acc.enter_data dataOperands(%6 : !llvm.ptr) attributes {wait}
1182a0eb794dSRazvan Lupusoru  %7 = acc.copyin varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11837ed96b1cSChristian Ulmann  acc.enter_data async(%i64Value : i64) dataOperands(%7 : !llvm.ptr)
1184a0eb794dSRazvan Lupusoru  %8 = acc.copyin varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11857ed96b1cSChristian Ulmann  acc.enter_data dataOperands(%8 : !llvm.ptr) async(%i64Value : i64)
1186a0eb794dSRazvan Lupusoru  %9 = acc.copyin varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11877ed96b1cSChristian Ulmann  acc.enter_data if(%ifCond) dataOperands(%9 : !llvm.ptr)
1188a0eb794dSRazvan Lupusoru  %10 = acc.copyin varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
11897ed96b1cSChristian Ulmann  acc.enter_data wait_devnum(%i64Value: i64) wait(%i32Value, %idxValue : i32, index) dataOperands(%10 : !llvm.ptr)
11904b011901SValentin Clement
11914b011901SValentin Clement  return
11924b011901SValentin Clement}
11934b011901SValentin Clement
11947ed96b1cSChristian Ulmann// CHECK: func @testenterdataop(%[[ARGA:.*]]: !llvm.ptr, %[[ARGB:.*]]: !llvm.ptr, %[[ARGC:.*]]: !llvm.ptr) {
119515a480c0SValentin Clement// CHECK: [[IFCOND:%.*]] = arith.constant true
1196a54f4eaeSMogball// CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64
1197a54f4eaeSMogball// CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32
1198a54f4eaeSMogball// CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index
1199a0eb794dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12007ed96b1cSChristian Ulmann// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr)
1201a0eb794dSRazvan Lupusoru// CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
1202a0eb794dSRazvan Lupusoru// CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
1203a0eb794dSRazvan Lupusoru// CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
12047ed96b1cSChristian Ulmann// CHECK: acc.enter_data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !llvm.ptr, !llvm.ptr, !llvm.ptr)
1205a0eb794dSRazvan Lupusoru// CHECK: %[[ATTACH:.*]] = acc.attach varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12067ed96b1cSChristian Ulmann// CHECK: acc.enter_data dataOperands(%[[ATTACH]] : !llvm.ptr)
1207a0eb794dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12087ed96b1cSChristian Ulmann// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr) attributes {async}
1209a0eb794dSRazvan Lupusoru// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12107ed96b1cSChristian Ulmann// CHECK: acc.enter_data dataOperands(%[[CREATE]] : !llvm.ptr) attributes {wait}
1211a0eb794dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12127ed96b1cSChristian Ulmann// CHECK: acc.enter_data async([[I64VALUE]] : i64) dataOperands(%[[COPYIN]] : !llvm.ptr)
1213a0eb794dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12147ed96b1cSChristian Ulmann// CHECK: acc.enter_data async([[I64VALUE]] : i64) dataOperands(%[[COPYIN]] : !llvm.ptr)
1215a0eb794dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12167ed96b1cSChristian Ulmann// CHECK: acc.enter_data if([[IFCOND]]) dataOperands(%[[COPYIN]] : !llvm.ptr)
1217a0eb794dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
12187ed96b1cSChristian Ulmann// CHECK: acc.enter_data wait_devnum([[I64VALUE]] : i64) wait([[I32VALUE]], [[IDXVALUE]] : i32, index) dataOperands(%[[COPYIN]] : !llvm.ptr)
1219c184dcb4SRazvan Lupusoru
1220c184dcb4SRazvan Lupusoru// -----
1221c184dcb4SRazvan Lupusoru
1222c184dcb4SRazvan Lupusorufunc.func @teststructureddataclauseops(%a: memref<10xf32>, %b: memref<memref<10xf32>>, %c: memref<10x20xf32>) -> () {
1223a0eb794dSRazvan Lupusoru  %deviceptr = acc.deviceptr varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {name = "arrayA"}
1224c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%deviceptr : memref<10xf32>) {
1225c184dcb4SRazvan Lupusoru  }
1226c184dcb4SRazvan Lupusoru
1227a0eb794dSRazvan Lupusoru  %present = acc.present varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1228c184dcb4SRazvan Lupusoru  acc.data dataOperands(%present : memref<10xf32>) {
1229c184dcb4SRazvan Lupusoru  }
1230c184dcb4SRazvan Lupusoru
1231a0eb794dSRazvan Lupusoru  %copyin = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1232c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%copyin : memref<10xf32>) {
1233c184dcb4SRazvan Lupusoru  }
1234c184dcb4SRazvan Lupusoru
1235a0eb794dSRazvan Lupusoru  %copyinreadonly = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyin_readonly>}
1236c184dcb4SRazvan Lupusoru  acc.kernels dataOperands(%copyinreadonly : memref<10xf32>) {
1237c184dcb4SRazvan Lupusoru  }
1238c184dcb4SRazvan Lupusoru
1239a0eb794dSRazvan Lupusoru  %copyinfromcopy = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
1240c184dcb4SRazvan Lupusoru  acc.serial dataOperands(%copyinfromcopy : memref<10xf32>) {
1241c184dcb4SRazvan Lupusoru  }
1242a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%copyinfromcopy : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
1243c184dcb4SRazvan Lupusoru
1244a0eb794dSRazvan Lupusoru  %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1245a0eb794dSRazvan Lupusoru  %createimplicit = acc.create varPtr(%c : memref<10x20xf32>) varType(tensor<10x20xf32>) -> memref<10x20xf32> {implicit = true}
1246c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%create, %createimplicit : memref<10xf32>, memref<10x20xf32>) {
1247c184dcb4SRazvan Lupusoru  }
1248b232054fSRazvan Lupusoru  acc.delete accPtr(%create : memref<10xf32>) {dataClause = #acc<data_clause acc_create>}
1249b232054fSRazvan Lupusoru  acc.delete accPtr(%createimplicit : memref<10x20xf32>) {dataClause = #acc<data_clause acc_create>, implicit = true}
1250c184dcb4SRazvan Lupusoru
1251a0eb794dSRazvan Lupusoru  %copyoutzero = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout_zero>}
1252c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%copyoutzero: memref<10xf32>) {
1253c184dcb4SRazvan Lupusoru  }
1254a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%copyoutzero : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copyout_zero>}
1255c184dcb4SRazvan Lupusoru
1256c184dcb4SRazvan Lupusoru  %attach = acc.attach varPtr(%b : memref<memref<10xf32>>) -> memref<memref<10xf32>>
1257c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%attach : memref<memref<10xf32>>) {
1258c184dcb4SRazvan Lupusoru  }
1259b232054fSRazvan Lupusoru  acc.detach accPtr(%attach : memref<memref<10xf32>>) {dataClause = #acc<data_clause acc_attach>}
1260c184dcb4SRazvan Lupusoru
1261a0eb794dSRazvan Lupusoru  %copyinparent = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) varPtrPtr(%b : memref<memref<10xf32>>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
1262c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%copyinparent : memref<10xf32>) {
1263c184dcb4SRazvan Lupusoru  }
1264a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%copyinparent : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
1265c184dcb4SRazvan Lupusoru
1266c184dcb4SRazvan Lupusoru  %c0 = arith.constant 0 : index
1267c184dcb4SRazvan Lupusoru  %c1 = arith.constant 1 : index
1268c184dcb4SRazvan Lupusoru  %c4 = arith.constant 4 : index
1269c184dcb4SRazvan Lupusoru  %c9 = arith.constant 9 : index
1270c184dcb4SRazvan Lupusoru  %c10 = arith.constant 10 : index
1271c184dcb4SRazvan Lupusoru  %c20 = arith.constant 20 : index
1272c184dcb4SRazvan Lupusoru
1273c184dcb4SRazvan Lupusoru  %bounds1full = acc.bounds lowerbound(%c0 : index) upperbound(%c9 : index) stride(%c1 : index)
1274a0eb794dSRazvan Lupusoru  %copyinfullslice1 = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) bounds(%bounds1full) -> memref<10xf32> {name = "arrayA[0:9]"}
1275c184dcb4SRazvan Lupusoru  // Specify full-bounds but assume that startIdx of array reference is 1.
1276c184dcb4SRazvan Lupusoru  %bounds2full = acc.bounds lowerbound(%c1 : index) upperbound(%c20 : index) extent(%c20 : index) stride(%c4 : index) startIdx(%c1 : index) {strideInBytes = true}
1277a0eb794dSRazvan Lupusoru  %copyinfullslice2 = acc.copyin varPtr(%c : memref<10x20xf32>) varType(tensor<10x20xf32>) bounds(%bounds1full, %bounds2full) -> memref<10x20xf32>
1278c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%copyinfullslice1, %copyinfullslice2 : memref<10xf32>, memref<10x20xf32>) {
1279c184dcb4SRazvan Lupusoru  }
1280c184dcb4SRazvan Lupusoru
1281c184dcb4SRazvan Lupusoru  %bounds1partial = acc.bounds lowerbound(%c4 : index) upperbound(%c9 : index) stride(%c1 : index)
1282a0eb794dSRazvan Lupusoru  %copyinpartial = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) bounds(%bounds1partial) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
1283c184dcb4SRazvan Lupusoru  acc.parallel dataOperands(%copyinpartial : memref<10xf32>) {
1284c184dcb4SRazvan Lupusoru  }
1285a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%copyinpartial : memref<10xf32>) bounds(%bounds1partial) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
1286c184dcb4SRazvan Lupusoru
1287c184dcb4SRazvan Lupusoru  return
1288c184dcb4SRazvan Lupusoru}
1289c184dcb4SRazvan Lupusoru
1290c184dcb4SRazvan Lupusoru// CHECK: func.func @teststructureddataclauseops([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref<memref<10xf32>>, [[ARGC:%.*]]: memref<10x20xf32>) {
1291a0eb794dSRazvan Lupusoru// CHECK: [[DEVICEPTR:%.*]] = acc.deviceptr varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {name = "arrayA"}
1292c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[DEVICEPTR]] : memref<10xf32>) {
1293c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1294a0eb794dSRazvan Lupusoru// CHECK: [[PRESENT:%.*]] = acc.present varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1295c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.data dataOperands([[PRESENT]] : memref<10xf32>) {
1296c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1297a0eb794dSRazvan Lupusoru// CHECK: [[COPYIN:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1298c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[COPYIN]] : memref<10xf32>) {
1299c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1300a0eb794dSRazvan Lupusoru// CHECK: [[COPYINRO:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyin_readonly>}
1301c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.kernels dataOperands([[COPYINRO]] : memref<10xf32>) {
1302c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1303a0eb794dSRazvan Lupusoru// CHECK: [[COPYINCOPY:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
1304c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.serial dataOperands([[COPYINCOPY]] : memref<10xf32>) {
1305c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1306a0eb794dSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr([[COPYINCOPY]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
1307a0eb794dSRazvan Lupusoru// CHECK: [[CREATE:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1308a0eb794dSRazvan Lupusoru// CHECK-NEXT: [[CREATEIMP:%.*]] = acc.create varPtr([[ARGC]] : memref<10x20xf32>) varType(tensor<10x20xf32>) -> memref<10x20xf32> {implicit = true}
1309c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[CREATE]], [[CREATEIMP]] : memref<10xf32>, memref<10x20xf32>) {
1310c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1311b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr([[CREATE]] : memref<10xf32>) {dataClause = #acc<data_clause acc_create>}
1312b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr([[CREATEIMP]] : memref<10x20xf32>) {dataClause = #acc<data_clause acc_create>, implicit = true}
1313a0eb794dSRazvan Lupusoru// CHECK: [[COPYOUTZ:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout_zero>}
1314c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[COPYOUTZ]] : memref<10xf32>) {
1315c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1316a0eb794dSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr([[COPYOUTZ]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copyout_zero>}
1317c184dcb4SRazvan Lupusoru// CHECK: [[ATTACH:%.*]] = acc.attach varPtr([[ARGB]] : memref<memref<10xf32>>) -> memref<memref<10xf32>>
1318c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[ATTACH]] : memref<memref<10xf32>>) {
1319c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1320b232054fSRazvan Lupusoru// CHECK-NEXT: acc.detach accPtr([[ATTACH]] : memref<memref<10xf32>>) {dataClause = #acc<data_clause acc_attach>}
1321a0eb794dSRazvan Lupusoru// CHECK: [[COPYINP:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) varPtrPtr([[ARGB]] : memref<memref<10xf32>>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
1322c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[COPYINP]] : memref<10xf32>) {
1323c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1324a0eb794dSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr([[COPYINP]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
1325c184dcb4SRazvan Lupusoru// CHECK-DAG: [[CON0:%.*]] = arith.constant 0 : index
1326c184dcb4SRazvan Lupusoru// CHECK-DAG: [[CON1:%.*]] = arith.constant 1 : index
1327c184dcb4SRazvan Lupusoru// CHECK-DAG: [[CON4:%.*]] = arith.constant 4 : index
1328c184dcb4SRazvan Lupusoru// CHECK-DAG: [[CON9:%.*]] = arith.constant 9 : index
1329c184dcb4SRazvan Lupusoru// CHECK-DAG: [[CON20:%.*]] = arith.constant 20 : index
1330c184dcb4SRazvan Lupusoru// CHECK: [[BOUNDS1F:%.*]] = acc.bounds lowerbound([[CON0]] : index) upperbound([[CON9]] : index) stride([[CON1]] : index)
1331a0eb794dSRazvan Lupusoru// CHECK-NEXT: [[COPYINF1:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) bounds([[BOUNDS1F]]) -> memref<10xf32> {name = "arrayA[0:9]"}
1332c184dcb4SRazvan Lupusoru// CHECK-NEXT: [[BOUNDS2F:%.*]] = acc.bounds lowerbound([[CON1]] : index) upperbound([[CON20]] : index) extent([[CON20]] : index) stride([[CON4]] : index) startIdx([[CON1]] : index) {strideInBytes = true}
1333a0eb794dSRazvan Lupusoru// CHECK-NEXT: [[COPYINF2:%.*]] = acc.copyin varPtr([[ARGC]] : memref<10x20xf32>) varType(tensor<10x20xf32>) bounds([[BOUNDS1F]], [[BOUNDS2F]]) -> memref<10x20xf32>
1334c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[COPYINF1]], [[COPYINF2]] : memref<10xf32>, memref<10x20xf32>) {
1335c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1336c184dcb4SRazvan Lupusoru// CHECK: [[BOUNDS1P:%.*]] = acc.bounds lowerbound([[CON4]] : index) upperbound([[CON9]] : index) stride([[CON1]] : index)
1337a0eb794dSRazvan Lupusoru// CHECK-NEXT: [[COPYINPART:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) bounds([[BOUNDS1P]]) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
1338c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.parallel dataOperands([[COPYINPART]] : memref<10xf32>) {
1339c184dcb4SRazvan Lupusoru// CHECK-NEXT: }
1340a0eb794dSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr([[COPYINPART]] : memref<10xf32>) bounds([[BOUNDS1P]]) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
1341c184dcb4SRazvan Lupusoru
1342c184dcb4SRazvan Lupusoru// -----
1343c184dcb4SRazvan Lupusoru
1344c184dcb4SRazvan Lupusorufunc.func @testunstructuredclauseops(%a: memref<10xf32>) -> () {
1345a0eb794dSRazvan Lupusoru  %copyin = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {structured = false}
1346c184dcb4SRazvan Lupusoru  acc.enter_data dataOperands(%copyin : memref<10xf32>)
1347c184dcb4SRazvan Lupusoru
1348a0eb794dSRazvan Lupusoru  %devptr = acc.getdeviceptr varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout>}
1349c184dcb4SRazvan Lupusoru  acc.exit_data dataOperands(%devptr : memref<10xf32>)
1350a0eb794dSRazvan Lupusoru  acc.copyout accPtr(%devptr : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {structured = false}
1351c184dcb4SRazvan Lupusoru
1352c184dcb4SRazvan Lupusoru  return
1353c184dcb4SRazvan Lupusoru}
1354c184dcb4SRazvan Lupusoru
1355c184dcb4SRazvan Lupusoru// CHECK: func.func @testunstructuredclauseops([[ARGA:%.*]]: memref<10xf32>) {
1356a0eb794dSRazvan Lupusoru// CHECK: [[COPYIN:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {structured = false}
1357c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.enter_data dataOperands([[COPYIN]] : memref<10xf32>)
1358a0eb794dSRazvan Lupusoru// CHECK: [[DEVPTR:%.*]] = acc.getdeviceptr varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout>}
1359c184dcb4SRazvan Lupusoru// CHECK-NEXT: acc.exit_data dataOperands([[DEVPTR]] : memref<10xf32>)
1360a0eb794dSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr([[DEVPTR]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {structured = false}
1361437bc564SValentin Clement
1362437bc564SValentin Clement// -----
1363437bc564SValentin Clement
1364647db57cSValentin Clementfunc.func @host_device_ops(%a: memref<f32>) -> () {
1365b232054fSRazvan Lupusoru  %devptr = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
1366647db57cSValentin Clement  acc.update_host accPtr(%devptr : memref<f32>) to varPtr(%a : memref<f32>) {structured = false}
1367647db57cSValentin Clement  acc.update dataOperands(%devptr : memref<f32>)
1368437bc564SValentin Clement
1369647db57cSValentin Clement  %accPtr = acc.update_device varPtr(%a : memref<f32>) -> memref<f32>
1370647db57cSValentin Clement  acc.update dataOperands(%accPtr : memref<f32>)
1371437bc564SValentin Clement  return
1372437bc564SValentin Clement}
1373647db57cSValentin Clement
1374647db57cSValentin Clement// CHECK-LABEL: func.func @host_device_ops(
1375647db57cSValentin Clement// CHECK-SAME:    %[[A:.*]]: memref<f32>)
1376647db57cSValentin Clement// CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[A]] : memref<f32>)   -> memref<f32>
1377647db57cSValentin Clement// CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : memref<f32>) to varPtr(%[[A]] : memref<f32>) {structured = false}
1378647db57cSValentin Clement// CHECK: acc.update dataOperands(%[[DEVPTR_A]] : memref<f32>)
1379647db57cSValentin Clement// CHECK: %[[DEVPTR_A:.*]] = acc.update_device varPtr(%[[A]] : memref<f32>)   -> memref<f32>
1380647db57cSValentin Clement// CHECK: acc.update dataOperands(%[[DEVPTR_A]] : memref<f32>)
13815cbe3381SValentin Clement
13825cbe3381SValentin Clement// -----
13835cbe3381SValentin Clement
13847ed96b1cSChristian Ulmannfunc.func @host_data_ops(%a: !llvm.ptr, %ifCond: i1) -> () {
1385a0eb794dSRazvan Lupusoru  %0 = acc.use_device varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
13867ed96b1cSChristian Ulmann  acc.host_data dataOperands(%0: !llvm.ptr) {
13875cbe3381SValentin Clement  }
13887ed96b1cSChristian Ulmann  acc.host_data dataOperands(%0: !llvm.ptr) {
13895cbe3381SValentin Clement  } attributes {if_present}
13907ed96b1cSChristian Ulmann  acc.host_data if(%ifCond) dataOperands(%0: !llvm.ptr) {
13915cbe3381SValentin Clement  }
13925cbe3381SValentin Clement  return
13935cbe3381SValentin Clement}
13945cbe3381SValentin Clement
13955cbe3381SValentin Clement// CHECK-LABEL: func.func @host_data_ops(
13967ed96b1cSChristian Ulmann// CHECK-SAME:    %[[A:.*]]: !llvm.ptr, %[[IFCOND:.*]]: i1)
1397a0eb794dSRazvan Lupusoru// CHECK: %[[PTR:.*]] = acc.use_device varPtr(%[[A]] : !llvm.ptr) varType(f64) -> !llvm.ptr
13987ed96b1cSChristian Ulmann// CHECK: acc.host_data dataOperands(%[[PTR]] : !llvm.ptr)
13997ed96b1cSChristian Ulmann// CHECK: acc.host_data dataOperands(%[[PTR]] : !llvm.ptr) {
14005cbe3381SValentin Clement// CHECK: } attributes {if_present}
14017ed96b1cSChristian Ulmann// CHECK: acc.host_data if(%[[IFCOND]]) dataOperands(%[[PTR]] : !llvm.ptr)
14029c3299b8SValentin Clement
14039c3299b8SValentin Clement// -----
14049c3299b8SValentin Clement
14057ed96b1cSChristian Ulmannacc.private.recipe @privatization_i32 : !llvm.ptr init {
14067ed96b1cSChristian Ulmann^bb0(%arg0: !llvm.ptr):
14079c3299b8SValentin Clement  %c1 = arith.constant 1 : i32
14089c3299b8SValentin Clement  %c0 = arith.constant 0 : i32
14097ed96b1cSChristian Ulmann  %0 = llvm.alloca %c1 x i32 : (i32) -> !llvm.ptr
14107ed96b1cSChristian Ulmann  llvm.store %c0, %0 : i32, !llvm.ptr
14117ed96b1cSChristian Ulmann  acc.yield %0 : !llvm.ptr
14129c3299b8SValentin Clement}
14139c3299b8SValentin Clement
14147ed96b1cSChristian Ulmann// CHECK: acc.private.recipe @privatization_i32 : !llvm.ptr init {
14159c3299b8SValentin Clement// CHECK: %[[C1:.*]] = arith.constant 1 : i32
14169c3299b8SValentin Clement// CHECK: %[[C0:.*]] = arith.constant 0 : i32
14177ed96b1cSChristian Ulmann// CHECK: %[[ALLOCA:.*]] = llvm.alloca %[[C1]] x i32 : (i32) -> !llvm.ptr
14187ed96b1cSChristian Ulmann// CHECK: llvm.store %[[C0]], %[[ALLOCA]] : i32, !llvm.ptr
14197ed96b1cSChristian Ulmann// CHECK: acc.yield %[[ALLOCA]] : !llvm.ptr
14209c3299b8SValentin Clement
14219c3299b8SValentin Clement// -----
14229c3299b8SValentin Clement
14239c3299b8SValentin Clementfunc.func private @destroy_struct(!llvm.struct<(i32, i32)>) -> ()
14249c3299b8SValentin Clement
14259c3299b8SValentin Clementacc.private.recipe @privatization_struct_i32_i64 : !llvm.struct<(i32, i32)> init {
14269c3299b8SValentin Clement^bb0(%arg0 : !llvm.struct<(i32, i32)>):
14279c3299b8SValentin Clement  %c1 = arith.constant 1 : i32
14289c3299b8SValentin Clement  %0 = llvm.mlir.undef : !llvm.struct<(i32, i32)>
14299c3299b8SValentin Clement  %1 = llvm.insertvalue %c1, %0[0] : !llvm.struct<(i32, i32)>
14309c3299b8SValentin Clement  %2 = llvm.insertvalue %c1, %1[1] : !llvm.struct<(i32, i32)>
14319c3299b8SValentin Clement  acc.yield %2 : !llvm.struct<(i32, i32)>
14329c3299b8SValentin Clement} destroy {
14339c3299b8SValentin Clement^bb0(%arg0: !llvm.struct<(i32, i32)>):
14349c3299b8SValentin Clement  func.call @destroy_struct(%arg0) : (!llvm.struct<(i32, i32)>) -> ()
14359c3299b8SValentin Clement  acc.terminator
14369c3299b8SValentin Clement}
14379c3299b8SValentin Clement
14389c3299b8SValentin Clement// CHECK: func.func private @destroy_struct(!llvm.struct<(i32, i32)>)
14399c3299b8SValentin Clement
14409c3299b8SValentin Clement// CHECK: acc.private.recipe @privatization_struct_i32_i64 : !llvm.struct<(i32, i32)> init {
14419c3299b8SValentin Clement// CHECK:   %[[C1:.*]] = arith.constant 1 : i32
14429c3299b8SValentin Clement// CHECK:   %[[UNDEF:.*]] = llvm.mlir.undef : !llvm.struct<(i32, i32)>
14439c3299b8SValentin Clement// CHECK:   %[[UNDEF1:.*]] = llvm.insertvalue %[[C1]], %[[UNDEF]][0] : !llvm.struct<(i32, i32)>
14449c3299b8SValentin Clement// CHECK:   %[[UNDEF2:.*]] = llvm.insertvalue %[[C1]], %[[UNDEF1]][1] : !llvm.struct<(i32, i32)>
14459c3299b8SValentin Clement// CHECK:   acc.yield %[[UNDEF2]] : !llvm.struct<(i32, i32)>
14469c3299b8SValentin Clement// CHECK: } destroy {
14479c3299b8SValentin Clement// CHECK: ^bb0(%[[ARG0:.*]]: !llvm.struct<(i32, i32)>):
14489c3299b8SValentin Clement// CHECK:   func.call @destroy_struct(%[[ARG0]]) : (!llvm.struct<(i32, i32)>) -> ()
14499c3299b8SValentin Clement// CHECK:   acc.terminator
145012f3ae6fSValentin Clement
145112f3ae6fSValentin Clement// -----
145212f3ae6fSValentin Clement
145312f3ae6fSValentin Clementacc.reduction.recipe @reduction_add_i64 : i64 reduction_operator<add> init {
14546763f591SValentin Clement^bb0(%arg0: i64):
14556763f591SValentin Clement  %0 = arith.constant 0 : i64
14566763f591SValentin Clement  acc.yield %0 : i64
145712f3ae6fSValentin Clement} combiner {
14586763f591SValentin Clement^bb0(%arg0: i64, %arg1: i64):
14596763f591SValentin Clement  %0 = arith.addi %arg0, %arg1 : i64
14606763f591SValentin Clement  acc.yield %0 : i64
146112f3ae6fSValentin Clement}
146212f3ae6fSValentin Clement
146312f3ae6fSValentin Clement// CHECK-LABEL: acc.reduction.recipe @reduction_add_i64 : i64 reduction_operator <add> init {
146412f3ae6fSValentin Clement// CHECK:       ^bb0(%{{.*}}: i64):
146512f3ae6fSValentin Clement// CHECK:         %[[C0:.*]] = arith.constant 0 : i64
146612f3ae6fSValentin Clement// CHECK:         acc.yield %[[C0]] : i64
146712f3ae6fSValentin Clement// CHECK:       } combiner {
146812f3ae6fSValentin Clement// CHECK:       ^bb0(%[[ARG0:.*]]: i64, %[[ARG1:.*]]: i64):
146912f3ae6fSValentin Clement// CHECK:         %[[RES:.*]] = arith.addi %[[ARG0]], %[[ARG1]] : i64
147012f3ae6fSValentin Clement// CHECK:         acc.yield %[[RES]] : i64
147112f3ae6fSValentin Clement// CHECK:       }
1472f4f53f8bSValentin Clement
1473f4f53f8bSValentin Clementfunc.func @acc_reduc_test(%a : i64) -> () {
14743eb4178bSValentin Clement (バレンタイン クレメン)  %c0 = arith.constant 0 : index
14753eb4178bSValentin Clement (バレンタイン クレメン)  %c10 = arith.constant 10 : index
14763eb4178bSValentin Clement (バレンタイン クレメン)  %c1 = arith.constant 1 : index
1477f4f53f8bSValentin Clement  acc.parallel reduction(@reduction_add_i64 -> %a : i64) {
14786b42625bSValentin Clement (バレンタイン クレメン)    acc.loop reduction(@reduction_add_i64 -> %a : i64) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
14796763f591SValentin Clement      acc.yield
14803eb4178bSValentin Clement (バレンタイン クレメン)    } attributes { inclusiveUpperbound = array<i1: true> }
14816763f591SValentin Clement    acc.yield
1482f4f53f8bSValentin Clement  }
1483f4f53f8bSValentin Clement  return
1484f4f53f8bSValentin Clement}
1485f4f53f8bSValentin Clement
1486f4f53f8bSValentin Clement// CHECK-LABEL: func.func @acc_reduc_test(
1487f4f53f8bSValentin Clement// CHECK-SAME:    %[[ARG0:.*]]: i64)
1488f4f53f8bSValentin Clement// CHECK:         acc.parallel reduction(@reduction_add_i64 -> %[[ARG0]] : i64)
14896763f591SValentin Clement// CHECK:           acc.loop reduction(@reduction_add_i64 -> %[[ARG0]] : i64)
149074f15d9cSValentin Clement
149174f15d9cSValentin Clement// -----
149274f15d9cSValentin Clement
149374f15d9cSValentin Clementacc.reduction.recipe @reduction_add_i64 : i64 reduction_operator<add> init {
149474f15d9cSValentin Clement^bb0(%0: i64):
149574f15d9cSValentin Clement  %1 = arith.constant 0 : i64
149674f15d9cSValentin Clement  acc.yield %1 : i64
149774f15d9cSValentin Clement} combiner {
149874f15d9cSValentin Clement^bb0(%0: i64, %1: i64):
149974f15d9cSValentin Clement  %2 = arith.addi %0, %1 : i64
150074f15d9cSValentin Clement  acc.yield %2 : i64
150174f15d9cSValentin Clement}
150274f15d9cSValentin Clement
150374f15d9cSValentin Clementfunc.func @acc_reduc_test(%a : i64) -> () {
150474f15d9cSValentin Clement  acc.serial reduction(@reduction_add_i64 -> %a : i64) {
150574f15d9cSValentin Clement  }
150674f15d9cSValentin Clement  return
150774f15d9cSValentin Clement}
150874f15d9cSValentin Clement
150974f15d9cSValentin Clement// CHECK-LABEL: func.func @acc_reduc_test(
151074f15d9cSValentin Clement// CHECK-SAME:    %[[ARG0:.*]]: i64)
151174f15d9cSValentin Clement// CHECK:         acc.serial reduction(@reduction_add_i64 -> %[[ARG0]] : i64)
15127496177dSRazvan Lupusoru
15137496177dSRazvan Lupusoru// -----
15147496177dSRazvan Lupusoru
15157496177dSRazvan Lupusorufunc.func @testdeclareop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
15167496177dSRazvan Lupusoru  %0 = acc.copyin varPtr(%a : memref<f32>) -> memref<f32>
15177496177dSRazvan Lupusoru  // copyin(zero)
1518b232054fSRazvan Lupusoru  %1 = acc.copyin varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
15197496177dSRazvan Lupusoru  // copy
1520b232054fSRazvan Lupusoru  %2 = acc.copyin varPtr(%c : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copy>}
15217496177dSRazvan Lupusoru  acc.declare_enter dataOperands(%0, %1, %2 : memref<f32>, memref<f32>, memref<f32>)
15227496177dSRazvan Lupusoru
15237496177dSRazvan Lupusoru  %3 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
15247496177dSRazvan Lupusoru  // copyout
1525b232054fSRazvan Lupusoru  %4 = acc.create varPtr(%b : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
15267496177dSRazvan Lupusoru  %5 = acc.present varPtr(%c : memref<f32>) -> memref<f32>
15277496177dSRazvan Lupusoru  acc.declare_enter dataOperands(%3, %4, %5 : memref<f32>, memref<f32>, memref<f32>)
15287496177dSRazvan Lupusoru
15297496177dSRazvan Lupusoru  %6 = acc.deviceptr varPtr(%a : memref<f32>) -> memref<f32>
15307496177dSRazvan Lupusoru  %7 = acc.declare_device_resident varPtr(%b : memref<f32>) -> memref<f32>
15317496177dSRazvan Lupusoru  %8 = acc.declare_link varPtr(%c : memref<f32>) -> memref<f32>
15327496177dSRazvan Lupusoru  acc.declare_enter dataOperands(%6, %7, %8 : memref<f32>, memref<f32>, memref<f32>)
15337496177dSRazvan Lupusoru
15347496177dSRazvan Lupusoru  acc.declare_exit dataOperands(%7, %8 : memref<f32>, memref<f32>)
1535b232054fSRazvan Lupusoru  acc.delete accPtr(%7 : memref<f32>) {dataClause = #acc<data_clause acc_declare_device_resident> }
1536b232054fSRazvan Lupusoru  acc.delete accPtr(%8 : memref<f32>) {dataClause = #acc<data_clause acc_declare_link> }
15377496177dSRazvan Lupusoru
15387496177dSRazvan Lupusoru  acc.declare_exit dataOperands(%3, %4, %5 : memref<f32>, memref<f32>, memref<f32>)
1539b232054fSRazvan Lupusoru  acc.delete accPtr(%3 : memref<f32>) {dataClause = #acc<data_clause acc_create> }
15407496177dSRazvan Lupusoru  acc.copyout accPtr(%4 : memref<f32>) to varPtr(%b : memref<f32>)
1541b232054fSRazvan Lupusoru  acc.delete accPtr(%5 : memref<f32>) {dataClause = #acc<data_clause acc_present> }
15427496177dSRazvan Lupusoru
15437496177dSRazvan Lupusoru  acc.declare_exit dataOperands(%0, %1, %2 : memref<f32>, memref<f32>, memref<f32>)
1544b232054fSRazvan Lupusoru  acc.delete accPtr(%0 : memref<f32>) {dataClause = #acc<data_clause acc_copyin> }
1545b232054fSRazvan Lupusoru  acc.delete accPtr(%1 : memref<f32>) {dataClause = #acc<data_clause acc_copyin_readonly> }
1546b232054fSRazvan Lupusoru  acc.copyout accPtr(%2 : memref<f32>) to varPtr(%c : memref<f32>) { dataClause = #acc<data_clause acc_copy> }
15477496177dSRazvan Lupusoru
15487496177dSRazvan Lupusoru  return
15497496177dSRazvan Lupusoru}
15507496177dSRazvan Lupusoru
15517496177dSRazvan Lupusoru// CHECK-LABEL: func.func @testdeclareop(
15527496177dSRazvan Lupusoru// CHECK-SAME: %[[ARGA:.*]]: memref<f32>, %[[ARGB:.*]]: memref<f32>, %[[ARGC:.*]]: memref<f32>)
15537496177dSRazvan Lupusoru// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
1554b232054fSRazvan Lupusoru// CHECK-NEXT: %[[COPYINRO:.*]] = acc.copyin varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyin_readonly>}
1555b232054fSRazvan Lupusoru// CHECK-NEXT: %[[COPY:.*]] = acc.copyin varPtr(%[[ARGC]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copy>}
15567496177dSRazvan Lupusoru// CHECK-NEXT: acc.declare_enter dataOperands(%[[COPYIN]], %[[COPYINRO]], %[[COPY]] : memref<f32>, memref<f32>, memref<f32>)
15577496177dSRazvan Lupusoru// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
1558b232054fSRazvan Lupusoru// CHECK-NEXT: %[[COPYOUT:.*]] = acc.create varPtr(%[[ARGB]] : memref<f32>) -> memref<f32> {dataClause = #acc<data_clause acc_copyout>}
15597496177dSRazvan Lupusoru// CHECK-NEXT: %[[PRESENT:.*]] = acc.present varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
15607496177dSRazvan Lupusoru// CHECK-NEXT: acc.declare_enter dataOperands(%[[CREATE]], %[[COPYOUT]], %[[PRESENT]] : memref<f32>, memref<f32>, memref<f32>)
15617496177dSRazvan Lupusoru// CHECK: %[[DEVICEPTR:.*]] = acc.deviceptr varPtr(%[[ARGA]] : memref<f32>) -> memref<f32>
15627496177dSRazvan Lupusoru// CHECK-NEXT: %[[DEVICERES:.*]] = acc.declare_device_resident varPtr(%[[ARGB]] : memref<f32>) -> memref<f32>
15637496177dSRazvan Lupusoru// CHECK-NEXT: %[[LINK:.*]] = acc.declare_link varPtr(%[[ARGC]] : memref<f32>) -> memref<f32>
15647496177dSRazvan Lupusoru// CHECK-NEXT: acc.declare_enter dataOperands(%[[DEVICEPTR]], %[[DEVICERES]], %[[LINK]] : memref<f32>, memref<f32>, memref<f32>)
15657496177dSRazvan Lupusoru// CHECK: acc.declare_exit dataOperands(%[[DEVICERES]], %[[LINK]] : memref<f32>, memref<f32>)
1566b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr(%[[DEVICERES]] : memref<f32>) {dataClause = #acc<data_clause acc_declare_device_resident>}
1567b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr(%[[LINK]] : memref<f32>) {dataClause = #acc<data_clause acc_declare_link>}
15687496177dSRazvan Lupusoru// CHECK: acc.declare_exit dataOperands(%[[CREATE]], %[[COPYOUT]], %[[PRESENT]] : memref<f32>, memref<f32>, memref<f32>)
1569b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr(%[[CREATE]] : memref<f32>) {dataClause = #acc<data_clause acc_create>}
15707496177dSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr(%[[COPYOUT]] : memref<f32>) to varPtr(%[[ARGB]] : memref<f32>)
1571b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr(%[[PRESENT]] : memref<f32>) {dataClause = #acc<data_clause acc_present>}
15727496177dSRazvan Lupusoru// CHECK: acc.declare_exit dataOperands(%[[COPYIN]], %[[COPYINRO]], %[[COPY]] : memref<f32>, memref<f32>, memref<f32>)
1573b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr(%[[COPYIN]] : memref<f32>) {dataClause = #acc<data_clause acc_copyin>}
1574b232054fSRazvan Lupusoru// CHECK-NEXT: acc.delete accPtr(%[[COPYINRO]] : memref<f32>) {dataClause = #acc<data_clause acc_copyin_readonly>}
1575b232054fSRazvan Lupusoru// CHECK-NEXT: acc.copyout accPtr(%[[COPY]] : memref<f32>) to varPtr(%[[ARGC]] : memref<f32>) {dataClause = #acc<data_clause acc_copy>}
15767496177dSRazvan Lupusoru
15777496177dSRazvan Lupusoru// -----
15787496177dSRazvan Lupusoru
15796674e578SValentin Clementllvm.mlir.global external @globalvar() { acc.declare = #acc.declare<dataClause = acc_create> } : i32 {
15807496177dSRazvan Lupusoru  %0 = llvm.mlir.constant(0 : i32) : i32
15817496177dSRazvan Lupusoru  llvm.return %0 : i32
15827496177dSRazvan Lupusoru}
15837496177dSRazvan Lupusoru
15847496177dSRazvan Lupusoruacc.global_ctor @acc_constructor {
15857ed96b1cSChristian Ulmann  %0 = llvm.mlir.addressof @globalvar { acc.declare = #acc.declare<dataClause = acc_create> } : !llvm.ptr
1586a0eb794dSRazvan Lupusoru  %1 = acc.create varPtr(%0 : !llvm.ptr) varType(i32) -> !llvm.ptr
15877ed96b1cSChristian Ulmann  acc.declare_enter dataOperands(%1 : !llvm.ptr)
15887496177dSRazvan Lupusoru  acc.terminator
15897496177dSRazvan Lupusoru}
15907496177dSRazvan Lupusoru
15917496177dSRazvan Lupusoruacc.global_dtor @acc_destructor {
15927ed96b1cSChristian Ulmann  %0 = llvm.mlir.addressof @globalvar { acc.declare = #acc.declare<dataClause = acc_create> } : !llvm.ptr
1593a0eb794dSRazvan Lupusoru  %1 = acc.getdeviceptr varPtr(%0 : !llvm.ptr) varType(i32) -> !llvm.ptr {dataClause = #acc<data_clause acc_create>}
15947ed96b1cSChristian Ulmann  acc.declare_exit dataOperands(%1 : !llvm.ptr)
15957ed96b1cSChristian Ulmann  acc.delete accPtr(%1 : !llvm.ptr)
15967496177dSRazvan Lupusoru  acc.terminator
15977496177dSRazvan Lupusoru}
15987496177dSRazvan Lupusoru
15997496177dSRazvan Lupusoru// CHECK-LABEL: acc.global_ctor @acc_constructor
16007ed96b1cSChristian Ulmann// CHECK: %[[ADDR:.*]] = llvm.mlir.addressof @globalvar {acc.declare = #acc.declare<dataClause = acc_create>} : !llvm.ptr
1601a0eb794dSRazvan Lupusoru// CHECK-NEXT: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !llvm.ptr) varType(i32) -> !llvm.ptr
16027ed96b1cSChristian Ulmann// CHECK-NEXT: acc.declare_enter dataOperands(%[[CREATE]] : !llvm.ptr)
16037496177dSRazvan Lupusoru// CHECK: acc.global_dtor @acc_destructor
16047ed96b1cSChristian Ulmann// CHECK: %[[ADDR:.*]] = llvm.mlir.addressof @globalvar {acc.declare = #acc.declare<dataClause = acc_create>} : !llvm.ptr
1605a0eb794dSRazvan Lupusoru// CHECK-NEXT: %[[DELETE:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !llvm.ptr) varType(i32) -> !llvm.ptr {dataClause = #acc<data_clause acc_create>}
16067ed96b1cSChristian Ulmann// CHECK-NEXT: acc.declare_exit dataOperands(%[[DELETE]] : !llvm.ptr)
16077ed96b1cSChristian Ulmann// CHECK-NEXT: acc.delete accPtr(%[[DELETE]] : !llvm.ptr)
160852a0b6a6SRazvan Lupusoru
160952a0b6a6SRazvan Lupusoru// -----
161052a0b6a6SRazvan Lupusoru
161152a0b6a6SRazvan Lupusorufunc.func @acc_func(%a : i64) -> () attributes {acc.routine_info = #acc.routine_info<[@acc_func_rout1,@acc_func_rout2,@acc_func_rout3,
161252a0b6a6SRazvan Lupusoru    @acc_func_rout4,@acc_func_rout5,@acc_func_rout6,@acc_func_rout7,@acc_func_rout8,@acc_func_rout9]>} {
161352a0b6a6SRazvan Lupusoru  return
161452a0b6a6SRazvan Lupusoru}
161552a0b6a6SRazvan Lupusoru
161652a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout1 func(@acc_func)
161752a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout2 func(@acc_func) bind("acc_func_gpu")
161852a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout3 func(@acc_func) bind("acc_func_gpu_gang") gang
161952a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout4 func(@acc_func) bind("acc_func_gpu_vector") vector
162052a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout5 func(@acc_func) bind("acc_func_gpu_worker") worker
162152a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout6 func(@acc_func) bind("acc_func_gpu_seq") seq
162252a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout7 func(@acc_func) bind("acc_func_gpu_imp_gang") implicit gang
162352a0b6a6SRazvan Lupusoruacc.routine @acc_func_rout8 func(@acc_func) bind("acc_func_gpu_vector_nohost") vector nohost
1624b06bc7c6SValentin Clement (バレンタイン クレメン)acc.routine @acc_func_rout9 func(@acc_func) bind("acc_func_gpu_gang_dim1") gang(dim: 1 : i64)
162552a0b6a6SRazvan Lupusoru
162652a0b6a6SRazvan Lupusoru// CHECK-LABEL: func.func @acc_func(
162752a0b6a6SRazvan Lupusoru// CHECK: attributes {acc.routine_info = #acc.routine_info<[@acc_func_rout1, @acc_func_rout2, @acc_func_rout3,
162852a0b6a6SRazvan Lupusoru// CHECK: @acc_func_rout4, @acc_func_rout5, @acc_func_rout6, @acc_func_rout7, @acc_func_rout8, @acc_func_rout9]>}
162952a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout1 func(@acc_func)
163052a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout2 func(@acc_func) bind("acc_func_gpu")
163152a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout3 func(@acc_func) bind("acc_func_gpu_gang") gang
163252a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout4 func(@acc_func) bind("acc_func_gpu_vector") vector
163352a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout5 func(@acc_func) bind("acc_func_gpu_worker") worker
163452a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout6 func(@acc_func) bind("acc_func_gpu_seq") seq
163552a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout7 func(@acc_func) bind("acc_func_gpu_imp_gang") gang implicit
163652a0b6a6SRazvan Lupusoru// CHECK: acc.routine @acc_func_rout8 func(@acc_func) bind("acc_func_gpu_vector_nohost") vector nohost
1637b06bc7c6SValentin Clement (バレンタイン クレメン)// CHECK: acc.routine @acc_func_rout9 func(@acc_func) bind("acc_func_gpu_gang_dim1") gang(dim: 1 : i64)
1638550b6f11SValentin Clement
1639550b6f11SValentin Clement// -----
1640550b6f11SValentin Clement
1641550b6f11SValentin Clementfunc.func @acc_func() -> () {
1642550b6f11SValentin Clement  "test.openacc_dummy_op"() {acc.declare_action = #acc.declare_action<postAlloc = @_QMacc_declareFacc_declare_allocateEa_acc_declare_update_desc_post_alloc>} : () -> ()
1643550b6f11SValentin Clement  return
1644550b6f11SValentin Clement}
1645550b6f11SValentin Clement
1646550b6f11SValentin Clement// CHECK-LABEL: func.func @acc_func
1647550b6f11SValentin Clement// CHECK: "test.openacc_dummy_op"() {acc.declare_action = #acc.declare_action<postAlloc = @_QMacc_declareFacc_declare_allocateEa_acc_declare_update_desc_post_alloc>}
1648804b9979SValentin Clement
1649804b9979SValentin Clement// -----
1650804b9979SValentin Clement
1651804b9979SValentin Clementfunc.func @compute3(%a: memref<10x10xf32>, %b: memref<10x10xf32>, %c: memref<10xf32>, %d: memref<10xf32>) {
1652804b9979SValentin Clement  %lb = arith.constant 0 : index
1653804b9979SValentin Clement  %st = arith.constant 1 : index
1654804b9979SValentin Clement  %c10 = arith.constant 10 : index
1655804b9979SValentin Clement  %numGangs = arith.constant 10 : i64
1656804b9979SValentin Clement  %numWorkers = arith.constant 10 : i64
1657804b9979SValentin Clement
16584bdc9057SRazvan Lupusoru  %c20 = arith.constant 20 : i32
16597ed96b1cSChristian Ulmann  %alloc = llvm.alloca %c20 x i32 { acc.declare = #acc.declare<dataClause = acc_create, implicit = true> } : (i32) -> !llvm.ptr
1660a0eb794dSRazvan Lupusoru  %createlocal = acc.create varPtr(%alloc : !llvm.ptr) varType(!llvm.array<20 x i32>) -> !llvm.ptr {implicit = true}
16614bdc9057SRazvan Lupusoru
1662a0eb794dSRazvan Lupusoru  %pa = acc.present varPtr(%a : memref<10x10xf32>) varType(tensor<10x10xf32>) -> memref<10x10xf32>
1663a0eb794dSRazvan Lupusoru  %pb = acc.present varPtr(%b : memref<10x10xf32>) varType(tensor<10x10xf32>) -> memref<10x10xf32>
1664a0eb794dSRazvan Lupusoru  %pc = acc.present varPtr(%c : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
1665a0eb794dSRazvan Lupusoru  %pd = acc.present varPtr(%d : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>
16667ed96b1cSChristian Ulmann  acc.declare dataOperands(%pa, %pb, %pc, %pd, %createlocal: memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>, !llvm.ptr) {
1667804b9979SValentin Clement  }
16684bdc9057SRazvan Lupusoru
1669804b9979SValentin Clement  return
1670804b9979SValentin Clement}
1671804b9979SValentin Clement
1672804b9979SValentin Clement// CHECK-LABEL: func.func @compute3
1673804b9979SValentin Clement// CHECK: acc.declare dataOperands(
16744bac6ed4SValentin Clement
16754bac6ed4SValentin Clement// -----
16764bac6ed4SValentin Clement
16774bac6ed4SValentin Clement%i64Value = arith.constant 1 : i64
16784bac6ed4SValentin Clement%i32Value = arith.constant 1 : i32
16794bac6ed4SValentin Clement%i32Value2 = arith.constant 2 : i32
16804bac6ed4SValentin Clement%idxValue = arith.constant 1 : index
16814bac6ed4SValentin Clement%ifCond = arith.constant true
1682f706837eSValentin Clement (バレンタイン クレメン)acc.set attributes {device_type = #acc.device_type<nvidia>}
16834bac6ed4SValentin Clementacc.set device_num(%i64Value : i64)
16844bac6ed4SValentin Clementacc.set device_num(%i32Value : i32)
16854bac6ed4SValentin Clementacc.set device_num(%idxValue : index)
16864bac6ed4SValentin Clementacc.set device_num(%idxValue : index) if(%ifCond)
16874bac6ed4SValentin Clementacc.set default_async(%i32Value : i32)
16884bac6ed4SValentin Clement
16894bac6ed4SValentin Clement// CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64
16904bac6ed4SValentin Clement// CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32
16914bac6ed4SValentin Clement// CHECK: [[I32VALUE2:%.*]] = arith.constant 2 : i32
16924bac6ed4SValentin Clement// CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index
16934bac6ed4SValentin Clement// CHECK: [[IFCOND:%.*]] = arith.constant true
1694f706837eSValentin Clement (バレンタイン クレメン)// CHECK: acc.set attributes {device_type = #acc.device_type<nvidia>}
16954bac6ed4SValentin Clement// CHECK: acc.set device_num([[I64VALUE]] : i64)
16964bac6ed4SValentin Clement// CHECK: acc.set device_num([[I32VALUE]] : i32)
16974bac6ed4SValentin Clement// CHECK: acc.set device_num([[IDXVALUE]] : index)
16984bac6ed4SValentin Clement// CHECK: acc.set device_num([[IDXVALUE]] : index) if([[IFCOND]])
16994bac6ed4SValentin Clement// CHECK: acc.set default_async([[I32VALUE]] : i32)
170061278ec3SRazvan Lupusoru
170161278ec3SRazvan Lupusoru// -----
170261278ec3SRazvan Lupusoru
170361278ec3SRazvan Lupusoru// CHECK-LABEL: func.func @acc_atomic_read
170461278ec3SRazvan Lupusoru// CHECK-SAME: (%[[v:.*]]: memref<i32>, %[[x:.*]]: memref<i32>)
170561278ec3SRazvan Lupusorufunc.func @acc_atomic_read(%v: memref<i32>, %x: memref<i32>) {
1706a63f9157Skhaki3  // CHECK: acc.atomic.read %[[v]] = %[[x]] : memref<i32>, memref<i32>, i32
1707a63f9157Skhaki3  acc.atomic.read %v = %x : memref<i32>, memref<i32>, i32
170861278ec3SRazvan Lupusoru  return
170961278ec3SRazvan Lupusoru}
171061278ec3SRazvan Lupusoru
171161278ec3SRazvan Lupusoru// -----
171261278ec3SRazvan Lupusoru
171361278ec3SRazvan Lupusoru// CHECK-LABEL: func.func @acc_atomic_write
171461278ec3SRazvan Lupusoru// CHECK-SAME: (%[[ADDR:.*]]: memref<i32>, %[[VAL:.*]]: i32)
171561278ec3SRazvan Lupusorufunc.func @acc_atomic_write(%addr : memref<i32>, %val : i32) {
171661278ec3SRazvan Lupusoru  // CHECK: acc.atomic.write %[[ADDR]] = %[[VAL]] : memref<i32>, i32
171761278ec3SRazvan Lupusoru  acc.atomic.write %addr = %val : memref<i32>, i32
171861278ec3SRazvan Lupusoru  return
171961278ec3SRazvan Lupusoru}
172061278ec3SRazvan Lupusoru
172161278ec3SRazvan Lupusoru// -----
172261278ec3SRazvan Lupusoru
172361278ec3SRazvan Lupusoru// CHECK-LABEL: func.func @acc_atomic_update
172461278ec3SRazvan Lupusoru// CHECK-SAME: (%[[X:.*]]: memref<i32>, %[[EXPR:.*]]: i32, %[[XBOOL:.*]]: memref<i1>, %[[EXPRBOOL:.*]]: i1)
172561278ec3SRazvan Lupusorufunc.func @acc_atomic_update(%x : memref<i32>, %expr : i32, %xBool : memref<i1>, %exprBool : i1) {
172661278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[X]] : memref<i32>
172761278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
172861278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.add %[[XVAL]], %[[EXPR]] : i32
172961278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[NEWVAL]] : i32
173061278ec3SRazvan Lupusoru  acc.atomic.update %x : memref<i32> {
173161278ec3SRazvan Lupusoru  ^bb0(%xval: i32):
173261278ec3SRazvan Lupusoru    %newval = llvm.add %xval, %expr : i32
173361278ec3SRazvan Lupusoru    acc.yield %newval : i32
173461278ec3SRazvan Lupusoru  }
173561278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[XBOOL]] : memref<i1>
173661278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i1):
173761278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.and %[[XVAL]], %[[EXPRBOOL]] : i1
173861278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[NEWVAL]] : i1
173961278ec3SRazvan Lupusoru  acc.atomic.update %xBool : memref<i1> {
174061278ec3SRazvan Lupusoru  ^bb0(%xval: i1):
174161278ec3SRazvan Lupusoru    %newval = llvm.and %xval, %exprBool : i1
174261278ec3SRazvan Lupusoru    acc.yield %newval : i1
174361278ec3SRazvan Lupusoru  }
174461278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[X]] : memref<i32>
174561278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
174661278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.shl %[[XVAL]], %[[EXPR]] : i32
174761278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[NEWVAL]] : i32
174861278ec3SRazvan Lupusoru  // CHECK-NEXT: }
174961278ec3SRazvan Lupusoru  acc.atomic.update %x : memref<i32> {
175061278ec3SRazvan Lupusoru  ^bb0(%xval: i32):
175161278ec3SRazvan Lupusoru    %newval = llvm.shl %xval, %expr : i32
175261278ec3SRazvan Lupusoru    acc.yield %newval : i32
175361278ec3SRazvan Lupusoru  }
175461278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[X]] : memref<i32>
175561278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
175661278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.intr.smax(%[[XVAL]], %[[EXPR]]) : (i32, i32) -> i32
175761278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[NEWVAL]] : i32
175861278ec3SRazvan Lupusoru  // CHECK-NEXT: }
175961278ec3SRazvan Lupusoru  acc.atomic.update %x : memref<i32> {
176061278ec3SRazvan Lupusoru  ^bb0(%xval: i32):
176161278ec3SRazvan Lupusoru    %newval = llvm.intr.smax(%xval, %expr) : (i32, i32) -> i32
176261278ec3SRazvan Lupusoru    acc.yield %newval : i32
176361278ec3SRazvan Lupusoru  }
176461278ec3SRazvan Lupusoru
176561278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[XBOOL]] : memref<i1>
176661278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i1):
176761278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[NEWVAL:.*]] = llvm.icmp "eq" %[[XVAL]], %[[EXPRBOOL]] : i1
176861278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[NEWVAL]] : i1
176961278ec3SRazvan Lupusoru  // }
177061278ec3SRazvan Lupusoru  acc.atomic.update %xBool : memref<i1> {
177161278ec3SRazvan Lupusoru  ^bb0(%xval: i1):
177261278ec3SRazvan Lupusoru    %newval = llvm.icmp "eq" %xval, %exprBool : i1
177361278ec3SRazvan Lupusoru    acc.yield %newval : i1
177461278ec3SRazvan Lupusoru  }
177561278ec3SRazvan Lupusoru
177661278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[X]] : memref<i32> {
177761278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
177861278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[XVAL]] : i32
177961278ec3SRazvan Lupusoru  // CHECK-NEXT: }
178061278ec3SRazvan Lupusoru  acc.atomic.update %x : memref<i32> {
178161278ec3SRazvan Lupusoru  ^bb0(%xval:i32):
178261278ec3SRazvan Lupusoru    acc.yield %xval : i32
178361278ec3SRazvan Lupusoru  }
178461278ec3SRazvan Lupusoru
178561278ec3SRazvan Lupusoru  // CHECK: acc.atomic.update %[[X]] : memref<i32> {
178661278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[XVAL:.*]]: i32):
178761278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %{{.+}} : i32
178861278ec3SRazvan Lupusoru  // CHECK-NEXT: }
178961278ec3SRazvan Lupusoru  %const = arith.constant 42 : i32
179061278ec3SRazvan Lupusoru  acc.atomic.update %x : memref<i32> {
179161278ec3SRazvan Lupusoru  ^bb0(%xval:i32):
179261278ec3SRazvan Lupusoru    acc.yield %const : i32
179361278ec3SRazvan Lupusoru  }
179461278ec3SRazvan Lupusoru
179561278ec3SRazvan Lupusoru  return
179661278ec3SRazvan Lupusoru}
179761278ec3SRazvan Lupusoru
179861278ec3SRazvan Lupusoru// -----
179961278ec3SRazvan Lupusoru
180061278ec3SRazvan Lupusoru// CHECK-LABEL: func.func @acc_atomic_capture
180161278ec3SRazvan Lupusoru// CHECK-SAME: (%[[v:.*]]: memref<i32>, %[[x:.*]]: memref<i32>, %[[expr:.*]]: i32)
180261278ec3SRazvan Lupusorufunc.func @acc_atomic_capture(%v: memref<i32>, %x: memref<i32>, %expr: i32) {
180361278ec3SRazvan Lupusoru  // CHECK: acc.atomic.capture {
180461278ec3SRazvan Lupusoru  // CHECK-NEXT: acc.atomic.update %[[x]] : memref<i32>
180561278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[xval:.*]]: i32):
180661278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[newval:.*]] = llvm.add %[[xval]], %[[expr]] : i32
180761278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[newval]] : i32
180861278ec3SRazvan Lupusoru  // CHECK-NEXT: }
1809a63f9157Skhaki3  // CHECK-NEXT: acc.atomic.read %[[v]] = %[[x]] : memref<i32>, memref<i32>, i32
181061278ec3SRazvan Lupusoru  // CHECK-NEXT: }
181161278ec3SRazvan Lupusoru  acc.atomic.capture {
181261278ec3SRazvan Lupusoru    acc.atomic.update %x : memref<i32> {
181361278ec3SRazvan Lupusoru    ^bb0(%xval: i32):
181461278ec3SRazvan Lupusoru      %newval = llvm.add %xval, %expr : i32
181561278ec3SRazvan Lupusoru      acc.yield %newval : i32
181661278ec3SRazvan Lupusoru    }
1817a63f9157Skhaki3    acc.atomic.read %v = %x : memref<i32>, memref<i32>, i32
181861278ec3SRazvan Lupusoru  }
181961278ec3SRazvan Lupusoru  // CHECK: acc.atomic.capture {
1820a63f9157Skhaki3  // CHECK-NEXT: acc.atomic.read %[[v]] = %[[x]] : memref<i32>, memref<i32>, i32
182161278ec3SRazvan Lupusoru  // CHECK-NEXT: acc.atomic.update %[[x]] : memref<i32>
182261278ec3SRazvan Lupusoru  // CHECK-NEXT: (%[[xval:.*]]: i32):
182361278ec3SRazvan Lupusoru  // CHECK-NEXT:   %[[newval:.*]] = llvm.add %[[xval]], %[[expr]] : i32
182461278ec3SRazvan Lupusoru  // CHECK-NEXT:   acc.yield %[[newval]] : i32
182561278ec3SRazvan Lupusoru  // CHECK-NEXT: }
182661278ec3SRazvan Lupusoru  // CHECK-NEXT: }
182761278ec3SRazvan Lupusoru  acc.atomic.capture {
1828a63f9157Skhaki3    acc.atomic.read %v = %x : memref<i32>, memref<i32>, i32
182961278ec3SRazvan Lupusoru    acc.atomic.update %x : memref<i32> {
183061278ec3SRazvan Lupusoru    ^bb0(%xval: i32):
183161278ec3SRazvan Lupusoru      %newval = llvm.add %xval, %expr : i32
183261278ec3SRazvan Lupusoru      acc.yield %newval : i32
183361278ec3SRazvan Lupusoru    }
183461278ec3SRazvan Lupusoru  }
183561278ec3SRazvan Lupusoru  // CHECK: acc.atomic.capture {
1836a63f9157Skhaki3  // CHECK-NEXT: acc.atomic.read %[[v]] = %[[x]] : memref<i32>, memref<i32>, i32
183761278ec3SRazvan Lupusoru  // CHECK-NEXT: acc.atomic.write %[[x]] = %[[expr]] : memref<i32>, i32
183861278ec3SRazvan Lupusoru  // CHECK-NEXT: }
183961278ec3SRazvan Lupusoru  acc.atomic.capture {
1840a63f9157Skhaki3    acc.atomic.read %v = %x : memref<i32>, memref<i32>, i32
184161278ec3SRazvan Lupusoru    acc.atomic.write %x = %expr : memref<i32>, i32
184261278ec3SRazvan Lupusoru  }
184361278ec3SRazvan Lupusoru
184461278ec3SRazvan Lupusoru  return
184561278ec3SRazvan Lupusoru}
1846b5df6a90SValentin Clement (バレンタイン クレメン)
1847b5df6a90SValentin Clement (バレンタイン クレメン)// -----
1848b5df6a90SValentin Clement (バレンタイン クレメン)
1849a435e1f6SRazvan Lupusoru// CHECK-LABEL: func.func @acc_num_gangs
1850a435e1f6SRazvan Lupusorufunc.func @acc_num_gangs() {
1851b5df6a90SValentin Clement (バレンタイン クレメン)  %c2 = arith.constant 2 : i32
1852b5df6a90SValentin Clement (バレンタイン クレメン)  %c1 = arith.constant 1 : i32
1853b5df6a90SValentin Clement (バレンタイン クレメン)  acc.parallel num_gangs({%c2 : i32} [#acc.device_type<default>], {%c1 : i32, %c1 : i32, %c1 : i32} [#acc.device_type<nvidia>]) {
1854b5df6a90SValentin Clement (バレンタイン クレメン)  }
1855b5df6a90SValentin Clement (バレンタイン クレメン)
1856a435e1f6SRazvan Lupusoru  return
1857a435e1f6SRazvan Lupusoru}
1858a435e1f6SRazvan Lupusoru
1859b5df6a90SValentin Clement (バレンタイン クレメン)// CHECK: acc.parallel num_gangs({%c2{{.*}} : i32} [#acc.device_type<default>], {%c1{{.*}} : i32, %c1{{.*}} : i32, %c1{{.*}} : i32} [#acc.device_type<nvidia>])
1860a435e1f6SRazvan Lupusoru
1861a435e1f6SRazvan Lupusoru// -----
1862a435e1f6SRazvan Lupusoru
1863a435e1f6SRazvan Lupusoru// CHECK-LABEL: func.func @acc_combined
1864a435e1f6SRazvan Lupusorufunc.func @acc_combined() {
1865a435e1f6SRazvan Lupusoru  acc.parallel combined(loop) {
1866a435e1f6SRazvan Lupusoru    acc.loop combined(parallel) {
1867a435e1f6SRazvan Lupusoru      acc.yield
1868a435e1f6SRazvan Lupusoru    }
1869a435e1f6SRazvan Lupusoru    acc.terminator
1870a435e1f6SRazvan Lupusoru  }
1871a435e1f6SRazvan Lupusoru
1872a435e1f6SRazvan Lupusoru  acc.kernels combined(loop) {
1873a435e1f6SRazvan Lupusoru    acc.loop combined(kernels) {
1874a435e1f6SRazvan Lupusoru      acc.yield
1875a435e1f6SRazvan Lupusoru    }
1876a435e1f6SRazvan Lupusoru    acc.terminator
1877a435e1f6SRazvan Lupusoru  }
1878a435e1f6SRazvan Lupusoru
1879a435e1f6SRazvan Lupusoru  acc.serial combined(loop) {
1880a435e1f6SRazvan Lupusoru    acc.loop combined(serial) {
1881a435e1f6SRazvan Lupusoru      acc.yield
1882a435e1f6SRazvan Lupusoru    }
1883a435e1f6SRazvan Lupusoru    acc.terminator
1884a435e1f6SRazvan Lupusoru  }
1885a435e1f6SRazvan Lupusoru
1886a435e1f6SRazvan Lupusoru  return
1887a435e1f6SRazvan Lupusoru}
1888a435e1f6SRazvan Lupusoru
1889a435e1f6SRazvan Lupusoru// CHECK: acc.parallel combined(loop)
1890a435e1f6SRazvan Lupusoru// CHECK: acc.loop combined(parallel)
1891a435e1f6SRazvan Lupusoru// CHECK: acc.kernels combined(loop)
1892a435e1f6SRazvan Lupusoru// CHECK: acc.loop combined(kernels)
1893a435e1f6SRazvan Lupusoru// CHECK: acc.serial combined(loop)
1894a435e1f6SRazvan Lupusoru// CHECK: acc.loop combined(serial)
1895*e492083fSScott Manley
1896*e492083fSScott Manleyacc.firstprivate.recipe @firstprivatization_memref_i32 : memref<i32> init {
1897*e492083fSScott Manley^bb0(%arg0: memref<i32>):
1898*e492083fSScott Manley  %alloca = memref.alloca() : memref<i32>
1899*e492083fSScott Manley  acc.yield %alloca : memref<i32>
1900*e492083fSScott Manley} copy {
1901*e492083fSScott Manley^bb0(%arg0: memref<i32>, %arg1: memref<i32>):
1902*e492083fSScott Manley  %0 = memref.load %arg1[] : memref<i32>
1903*e492083fSScott Manley  memref.store %0, %arg0[] : memref<i32>
1904*e492083fSScott Manley  acc.terminator
1905*e492083fSScott Manley}
1906*e492083fSScott Manley
1907*e492083fSScott Manley// CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_memref_i32
1908*e492083fSScott Manley// CHECK:       memref.alloca
1909*e492083fSScott Manley
1910*e492083fSScott Manleyacc.reduction.recipe @reduction_add_memref_i32 : memref<i32> reduction_operator <add> init {
1911*e492083fSScott Manley^bb0(%arg0: memref<i32>):
1912*e492083fSScott Manley  %c0_i32 = arith.constant 0 : i32
1913*e492083fSScott Manley  %alloca = memref.alloca() : memref<i32>
1914*e492083fSScott Manley  memref.store %c0_i32, %alloca[] : memref<i32>
1915*e492083fSScott Manley  acc.yield %alloca : memref<i32>
1916*e492083fSScott Manley} combiner {
1917*e492083fSScott Manley^bb0(%arg0: memref<i32>, %arg1: memref<i32>):
1918*e492083fSScott Manley  %0 = memref.load %arg0[] : memref<i32>
1919*e492083fSScott Manley  %1 = memref.load %arg1[] : memref<i32>
1920*e492083fSScott Manley  %2 = arith.addi %0, %1 : i32
1921*e492083fSScott Manley  memref.store %2, %arg0[] : memref<i32>
1922*e492083fSScott Manley  acc.yield %arg0 : memref<i32>
1923*e492083fSScott Manley}
1924*e492083fSScott Manley
1925*e492083fSScott Manley// CHECK-LABEL: acc.reduction.recipe @reduction_add_memref_i32
1926*e492083fSScott Manley// CHECK:       memref.alloca
1927*e492083fSScott Manley
1928*e492083fSScott Manleyacc.private.recipe @privatization_memref_i32 : memref<i32> init {
1929*e492083fSScott Manley^bb0(%arg0: memref<i32>):
1930*e492083fSScott Manley  %alloca = memref.alloca() : memref<i32>
1931*e492083fSScott Manley  acc.yield %alloca : memref<i32>
1932*e492083fSScott Manley}
1933*e492083fSScott Manley
1934*e492083fSScott Manley// CHECK-LABEL: acc.private.recipe @privatization_memref_i32
1935*e492083fSScott Manley// CHECK:       memref.alloca
1936