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