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