brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · c7ef47c Raw
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