225 lines · plain
1// RUN: mlir-opt %s -acc-implicit-data -split-input-file | FileCheck %s2 3// -----4 5// Test scalar in serial construct - should generate firstprivate6func.func @test_scalar_in_serial() {7 %alloc = memref.alloca() : memref<i64>8 acc.serial {9 %load = memref.load %alloc[] : memref<i64>10 acc.yield11 }12 return13}14 15// CHECK-LABEL: func.func @test_scalar_in_serial16// CHECK: acc.firstprivate varPtr({{.*}} : memref<i64>) recipe({{.*}}) -> memref<i64> {implicit = true, name = ""}17 18// -----19 20// Test scalar in parallel construct - should generate firstprivate21func.func @test_scalar_in_parallel() {22 %alloc = memref.alloca() : memref<f32>23 acc.parallel {24 %load = memref.load %alloc[] : memref<f32>25 acc.yield26 }27 return28}29 30// CHECK-LABEL: func.func @test_scalar_in_parallel31// CHECK: acc.firstprivate varPtr({{.*}} : memref<f32>) recipe({{.*}}) -> memref<f32> {implicit = true, name = ""}32 33// -----34 35// Test scalar in kernels construct - should generate copyin/copyout36func.func @test_scalar_in_kernels() {37 %alloc = memref.alloca() : memref<f64>38 acc.kernels {39 %load = memref.load %alloc[] : memref<f64>40 acc.terminator41 }42 return43}44 45// CHECK-LABEL: func.func @test_scalar_in_kernels46// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : memref<f64>) -> memref<f64> {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}47// CHECK: acc.copyout accPtr(%[[COPYIN]] : memref<f64>) to varPtr({{.*}} : memref<f64>) {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}48 49// -----50 51// Test scalar in parallel with default(none) - should NOT generate implicit data52func.func @test_scalar_parallel_defaultnone() {53 %alloc = memref.alloca() : memref<f32>54 acc.parallel {55 %load = memref.load %alloc[] : memref<f32>56 acc.yield57 } attributes {defaultAttr = #acc<defaultvalue none>}58 return59}60 61// CHECK-LABEL: func.func @test_scalar_parallel_defaultnone62// CHECK-NOT: acc.firstprivate63// CHECK-NOT: acc.copyin64 65// -----66 67// Test array in parallel - should generate copyin/copyout68func.func @test_array_in_parallel() {69 %alloc = memref.alloca() : memref<10xf32>70 acc.parallel {71 %c0 = arith.constant 0 : index72 %load = memref.load %alloc[%c0] : memref<10xf32>73 acc.yield74 }75 return76}77 78// CHECK-LABEL: func.func @test_array_in_parallel79// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}80// CHECK: acc.copyout accPtr(%[[COPYIN]] : memref<10xf32>) to varPtr({{.*}} : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}81 82// -----83 84// Test array in kernels - should generate copyin/copyout85func.func @test_array_in_kernels() {86 %alloc = memref.alloca() : memref<20xi32>87 acc.kernels {88 %c0 = arith.constant 0 : index89 %load = memref.load %alloc[%c0] : memref<20xi32>90 acc.terminator91 }92 return93}94 95// CHECK-LABEL: func.func @test_array_in_kernels96// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : memref<20xi32>) -> memref<20xi32> {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}97// CHECK: acc.copyout accPtr(%[[COPYIN]] : memref<20xi32>) to varPtr({{.*}} : memref<20xi32>) {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}98 99// -----100 101// Test array with default(present) - should generate present102func.func @test_array_parallel_defaultpresent() {103 %alloc = memref.alloca() : memref<10xf32>104 acc.parallel {105 %c0 = arith.constant 0 : index106 %load = memref.load %alloc[%c0] : memref<10xf32>107 acc.yield108 } attributes {defaultAttr = #acc<defaultvalue present>}109 return110}111 112// CHECK-LABEL: func.func @test_array_parallel_defaultpresent113// CHECK: %[[PRESENT:.*]] = acc.present varPtr({{.*}} : memref<10xf32>) -> memref<10xf32> {acc.from_default, implicit = true, name = ""}114// CHECK: acc.delete accPtr(%[[PRESENT]] : memref<10xf32>) {dataClause = #acc<data_clause acc_present>, implicit = true, name = ""}115 116// -----117 118// Test scalar with default(present) - should still generate firstprivate (scalars ignore default(present))119func.func @test_scalar_parallel_defaultpresent() {120 %alloc = memref.alloca() : memref<f32>121 acc.parallel {122 %load = memref.load %alloc[] : memref<f32>123 acc.yield124 } attributes {defaultAttr = #acc<defaultvalue present>}125 return126}127 128// CHECK-LABEL: func.func @test_scalar_parallel_defaultpresent129// CHECK: acc.firstprivate varPtr({{.*}} : memref<f32>) recipe({{.*}}) -> memref<f32> {implicit = true, name = ""}130 131// -----132 133// Test multidimensional array134func.func @test_multidim_array_in_parallel() {135 %alloc = memref.alloca() : memref<8x16xf32>136 acc.parallel {137 %c0 = arith.constant 0 : index138 %c1 = arith.constant 1 : index139 %load = memref.load %alloc[%c0, %c1] : memref<8x16xf32>140 acc.yield141 }142 return143}144 145// CHECK-LABEL: func.func @test_multidim_array_in_parallel146// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : memref<8x16xf32>) -> memref<8x16xf32> {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}147// CHECK: acc.copyout accPtr(%[[COPYIN]] : memref<8x16xf32>) to varPtr({{.*}} : memref<8x16xf32>) {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}148 149// -----150 151// Test dynamic size array152func.func @test_dynamic_array(%size: index) {153 %alloc = memref.alloca(%size) : memref<?xf64>154 acc.parallel {155 %c0 = arith.constant 0 : index156 %load = memref.load %alloc[%c0] : memref<?xf64>157 acc.yield158 }159 return160}161 162// CHECK-LABEL: func.func @test_dynamic_array163// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : memref<?xf64>) -> memref<?xf64> {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}164// CHECK: acc.copyout accPtr(%[[COPYIN]] : memref<?xf64>) to varPtr({{.*}} : memref<?xf64>) {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}165 166// -----167 168// Test variable with explicit data clause - implicit should recognize it169func.func @test_with_explicit_copyin() {170 %alloc = memref.alloca() : memref<100xf32>171 %copyin = acc.copyin varPtr(%alloc : memref<100xf32>) -> memref<100xf32> {name = "explicit"}172 acc.parallel dataOperands(%copyin : memref<100xf32>) {173 %c0 = arith.constant 0 : index174 %load = memref.load %alloc[%c0] : memref<100xf32>175 acc.yield176 }177 acc.copyout accPtr(%copyin : memref<100xf32>) to varPtr(%alloc : memref<100xf32>) {name = "explicit"}178 return179}180 181// CHECK-LABEL: func.func @test_with_explicit_copyin182// CHECK: acc.present varPtr({{.*}} : memref<100xf32>) -> memref<100xf32> {implicit = true, name = ""}183 184// -----185 186// Test multiple variables187func.func @test_multiple_variables() {188 %alloc1 = memref.alloca() : memref<f32>189 %alloc2 = memref.alloca() : memref<10xi32>190 acc.parallel {191 %load1 = memref.load %alloc1[] : memref<f32>192 %c0 = arith.constant 0 : index193 %load2 = memref.load %alloc2[%c0] : memref<10xi32>194 acc.yield195 }196 return197}198 199// CHECK-LABEL: func.func @test_multiple_variables200// CHECK: acc.firstprivate varPtr({{.*}} : memref<f32>) recipe({{.*}}) -> memref<f32> {implicit = true, name = ""}201// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr({{.*}} : memref<10xi32>) -> memref<10xi32> {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}202// CHECK: acc.copyout accPtr(%[[COPYIN]] : memref<10xi32>) to varPtr({{.*}} : memref<10xi32>) {dataClause = #acc<data_clause acc_copy>, implicit = true, name = ""}203 204// -----205 206// Test memref.view aliasing - view of explicitly copied buffer should generate present207func.func @test_memref_view(%size: index) {208 %c0 = arith.constant 0 : index209 %buffer = memref.alloca(%size) : memref<?xi8>210 %copyin = acc.copyin varPtr(%buffer : memref<?xi8>) -> memref<?xi8> {name = "buffer"}211 %view = memref.view %buffer[%c0][] : memref<?xi8> to memref<8x64xf32>212 acc.kernels dataOperands(%copyin : memref<?xi8>) {213 %c0_0 = arith.constant 0 : index214 %c0_1 = arith.constant 0 : index215 %load = memref.load %view[%c0_0, %c0_1] : memref<8x64xf32>216 acc.terminator217 }218 acc.copyout accPtr(%copyin : memref<?xi8>) to varPtr(%buffer : memref<?xi8>) {name = "buffer"}219 return220}221 222// CHECK-LABEL: func.func @test_memref_view223// CHECK: acc.present varPtr({{.*}} : memref<8x64xf32>) -> memref<8x64xf32> {implicit = true, name = ""}224 225