275 lines · plain
1// RUN: mlir-opt -split-input-file --openacc-legalize-data-values %s | FileCheck %s --check-prefixes=CHECK,DEVICE2// RUN: mlir-opt -split-input-file --openacc-legalize-data-values=host-to-device=false %s | FileCheck %s --check-prefixes=CHECK,HOST3 4func.func @test(%a: memref<10xf32>, %i : index) {5 %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>6 acc.parallel dataOperands(%create : memref<10xf32>) {7 %ci = memref.load %a[%i] : memref<10xf32>8 acc.yield9 }10 return11}12 13// CHECK-LABEL: func.func @test14// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)15// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>16// CHECK: acc.parallel dataOperands(%[[CREATE]] : memref<10xf32>) {17// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>18// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>19// CHECK: acc.yield20// CHECK: }21 22// -----23 24func.func @test(%a: memref<10xf32>, %i : index) {25 %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>26 acc.serial dataOperands(%create : memref<10xf32>) {27 %ci = memref.load %a[%i] : memref<10xf32>28 acc.yield29 }30 return31}32 33// CHECK-LABEL: func.func @test34// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)35// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>36// CHECK: acc.serial dataOperands(%[[CREATE]] : memref<10xf32>) {37// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>38// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>39// CHECK: acc.yield40// CHECK: }41 42// -----43 44func.func @test(%a: memref<10xf32>, %i : index) {45 %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>46 acc.kernels dataOperands(%create : memref<10xf32>) {47 %ci = memref.load %a[%i] : memref<10xf32>48 acc.terminator49 }50 return51}52 53// CHECK-LABEL: func.func @test54// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)55// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>56// CHECK: acc.kernels dataOperands(%[[CREATE]] : memref<10xf32>) {57// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>58// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>59// CHECK: acc.terminator60// CHECK: }61 62// -----63 64func.func @test(%a: memref<10xf32>, %i : index) {65 %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>66 acc.data dataOperands(%create : memref<10xf32>) {67 %c0 = arith.constant 0.000000e+00 : f3268 memref.store %c0, %a[%i] : memref<10xf32>69 acc.serial {70 %cs = memref.load %a[%i] : memref<10xf32>71 acc.yield72 }73 acc.terminator74 }75 return76}77 78// CHECK-LABEL: func.func @test79// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)80// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>81// CHECK: acc.data dataOperands(%[[CREATE]] : memref<10xf32>) {82// CHECK: memref.store %{{.*}}, %[[A]][%[[I]]] : memref<10xf32>83// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>84// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>85// CHECK: acc.terminator86// CHECK: }87 88// -----89 90func.func @test(%a: memref<10xf32>) {91 %lb = arith.constant 0 : index92 %st = arith.constant 1 : index93 %c10 = arith.constant 10 : index94 %create = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>95 acc.parallel dataOperands(%create : memref<10xf32>) {96 acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {97 %ci = memref.load %a[%i] : memref<10xf32>98 acc.yield99 } attributes {independent = [#acc.device_type<none>]}100 acc.yield101 }102 return103}104 105// CHECK-LABEL: func.func @test106// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)107// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>108// CHECK: acc.parallel dataOperands(%[[CREATE]] : memref<10xf32>) {109// CHECK: acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {110// DEVICE: %{{.*}} = memref.load %[[CREATE:.*]][%[[I]]] : memref<10xf32>111// CHECK: acc.yield112// CHECK: } attributes {independent = [#acc.device_type<none>]}113// CHECK: acc.yield114// CHECK: }115 116// -----117 118acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {119^bb0(%arg0: memref<10xf32>):120 %0 = memref.alloc() : memref<10xf32>121 acc.yield %0 : memref<10xf32>122} destroy {123^bb0(%arg0: memref<10xf32>):124 memref.dealloc %arg0 : memref<10xf32> 125 acc.terminator126}127 128func.func @test(%a: memref<10xf32>) {129 %lb = arith.constant 0 : index130 %st = arith.constant 1 : index131 %c10 = arith.constant 10 : index132 %p1 = acc.private varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>133 acc.parallel private(%p1 : memref<10xf32>) {134 acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {135 %ci = memref.load %a[%i] : memref<10xf32>136 acc.yield137 } attributes {independent = [#acc.device_type<none>]}138 acc.yield139 }140 return141}142 143// CHECK-LABEL: func.func @test144// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)145// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>146// CHECK: acc.parallel private(%[[PRIVATE]] : memref<10xf32>) {147// CHECK: acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {148// DEVICE: %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>149// CHECK: acc.yield150// CHECK: } attributes {independent = [#acc.device_type<none>]}151// CHECK: acc.yield152// CHECK: }153 154// -----155 156acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {157^bb0(%arg0: memref<10xf32>):158 %0 = memref.alloc() : memref<10xf32>159 acc.yield %0 : memref<10xf32>160} destroy {161^bb0(%arg0: memref<10xf32>):162 memref.dealloc %arg0 : memref<10xf32> 163 acc.terminator164}165 166func.func @test(%a: memref<10xf32>) {167 %lb = arith.constant 0 : index168 %st = arith.constant 1 : index169 %c10 = arith.constant 10 : index170 %p1 = acc.private varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>171 acc.parallel {172 acc.loop private(%p1 : memref<10xf32>) control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {173 %ci = memref.load %a[%i] : memref<10xf32>174 acc.yield175 } attributes {independent = [#acc.device_type<none>]}176 acc.yield177 }178 return179}180 181// CHECK-LABEL: func.func @test182// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)183// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>184// CHECK: acc.parallel {185// CHECK: acc.loop private(%[[PRIVATE]] : memref<10xf32>) control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {186// DEVICE: %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>187// CHECK: acc.yield188// CHECK: } attributes {independent = [#acc.device_type<none>]}189// CHECK: acc.yield190// CHECK: }191 192// -----193 194acc.private.recipe @privatization_memref_10_f32 : memref<10xf32> init {195^bb0(%arg0: memref<10xf32>):196 %0 = memref.alloc() : memref<10xf32>197 acc.yield %0 : memref<10xf32>198} destroy {199^bb0(%arg0: memref<10xf32>):200 memref.dealloc %arg0 : memref<10xf32> 201 acc.terminator202}203 204func.func @test(%a: memref<10xf32>) {205 %lb = arith.constant 0 : index206 %st = arith.constant 1 : index207 %c10 = arith.constant 10 : index208 %p1 = acc.private varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>209 acc.serial private(%p1 : memref<10xf32>) {210 acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {211 %ci = memref.load %a[%i] : memref<10xf32>212 acc.yield213 } attributes {seq = [#acc.device_type<none>]}214 acc.yield215 }216 return217}218 219// CHECK-LABEL: func.func @test220// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)221// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) recipe(@privatization_memref_10_f32) -> memref<10xf32>222// CHECK: acc.serial private(%[[PRIVATE]] : memref<10xf32>) {223// CHECK: acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {224// DEVICE: %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>225// CHECK: acc.yield226// CHECK: } attributes {seq = [#acc.device_type<none>]}227// CHECK: acc.yield228// CHECK: }229 230// -----231 232func.func @test(%a: memref<10xf32>) {233 %devptr = acc.use_device varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>234 acc.host_data dataOperands(%devptr : memref<10xf32>) {235 func.call @foo(%a) : (memref<10xf32>) -> ()236 acc.terminator237 }238 return239}240func.func private @foo(memref<10xf32>)241 242// CHECK-LABEL: func.func @test243// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)244// CHECK: %[[USE_DEVICE:.*]] = acc.use_device varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32>245// CHECK: acc.host_data dataOperands(%[[USE_DEVICE]] : memref<10xf32>) {246// DEVICE: func.call @foo(%[[USE_DEVICE]]) : (memref<10xf32>) -> ()247// CHECK: acc.terminator248// CHECK: }249 250// -----251 252func.func @test(%a: memref<10xf32>) {253 %declare = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {name = "arr"}254 %token = acc.declare_enter dataOperands(%declare : memref<10xf32>)255 acc.kernels dataOperands(%declare : memref<10xf32>) {256 %c0 = arith.constant 0 : index257 %c1 = arith.constant 1.000000e+00 : f32258 memref.store %c1, %a[%c0] : memref<10xf32>259 acc.terminator260 }261 acc.declare_exit token(%token) dataOperands(%declare : memref<10xf32>)262 return263}264 265// CHECK-LABEL: func.func @test266// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)267// CHECK: %[[DECLARE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {name = "arr"}268// CHECK: %[[TOKEN:.*]] = acc.declare_enter dataOperands(%[[DECLARE]] : memref<10xf32>)269// CHECK: acc.kernels dataOperands(%[[DECLARE]] : memref<10xf32>) {270// DEVICE: memref.store %{{.*}}, %[[DECLARE]][%{{.*}}] : memref<10xf32>271// HOST: memref.store %{{.*}}, %[[A]][%{{.*}}] : memref<10xf32>272// CHECK: acc.terminator273// CHECK: }274// CHECK: acc.declare_exit token(%[[TOKEN]]) dataOperands(%[[DECLARE]] : memref<10xf32>)275// CHECK: return