brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.0 KiB · 6909fe6 Raw
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