diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td --- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td @@ -186,6 +186,14 @@ let regions = (region AnyRegion:$region); + let extraClassDeclaration = [{ + /// The number of data operands. + unsigned getNumDataOperands(); + + /// The i-th data operand passed. + Value getDataOperand(unsigned i); + }]; + let assemblyFormat = [{ ( `if` `(` $ifCond^ `)` )? ( `copy` `(` $copyOperands^ `:` type($copyOperands) `)` )? diff --git a/mlir/lib/Conversion/OpenACCToLLVM/OpenACCToLLVM.cpp b/mlir/lib/Conversion/OpenACCToLLVM/OpenACCToLLVM.cpp --- a/mlir/lib/Conversion/OpenACCToLLVM/OpenACCToLLVM.cpp +++ b/mlir/lib/Conversion/OpenACCToLLVM/OpenACCToLLVM.cpp @@ -137,6 +137,7 @@ void mlir::populateOpenACCToLLVMConversionPatterns( LLVMTypeConverter &converter, OwningRewritePatternList &patterns) { + patterns.add>(converter); patterns.add>(converter); patterns.add>(converter); patterns.add>(converter); @@ -170,6 +171,21 @@ return true; }; + target.addDynamicallyLegalOp( + [allDataOperandsAreConverted](acc::DataOp op) { + return allDataOperandsAreConverted(op.copyOperands()) && + allDataOperandsAreConverted(op.copyinOperands()) && + allDataOperandsAreConverted(op.copyinReadonlyOperands()) && + allDataOperandsAreConverted(op.copyoutOperands()) && + allDataOperandsAreConverted(op.copyoutZeroOperands()) && + allDataOperandsAreConverted(op.createOperands()) && + allDataOperandsAreConverted(op.createZeroOperands()) && + allDataOperandsAreConverted(op.noCreateOperands()) && + allDataOperandsAreConverted(op.presentOperands()) && + allDataOperandsAreConverted(op.deviceptrOperands()) && + allDataOperandsAreConverted(op.attachOperands()); + }); + target.addDynamicallyLegalOp( [allDataOperandsAreConverted](acc::EnterDataOp op) { return allDataOperandsAreConverted(op.copyinOperands()) && diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -652,6 +652,20 @@ return success(); } +unsigned DataOp::getNumDataOperands() { + return copyOperands().size() + copyinOperands().size() + + copyinReadonlyOperands().size() + copyoutOperands().size() + + copyoutZeroOperands().size() + createOperands().size() + + createZeroOperands().size() + noCreateOperands().size() + + presentOperands().size() + deviceptrOperands().size() + + attachOperands().size(); +} + +Value DataOp::getDataOperand(unsigned i) { + unsigned numOptional = ifCond() ? 1 : 0; + return getOperand(numOptional + i); +} + //===----------------------------------------------------------------------===// // ExitDataOp //===----------------------------------------------------------------------===// diff --git a/mlir/test/Conversion/OpenACCToLLVM/convert-standalone-data-to-llvmir.mlir b/mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir rename from mlir/test/Conversion/OpenACCToLLVM/convert-standalone-data-to-llvmir.mlir rename to mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir --- a/mlir/test/Conversion/OpenACCToLLVM/convert-standalone-data-to-llvmir.mlir +++ b/mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir @@ -108,3 +108,54 @@ } // CHECK: acc.update if(%{{.*}}) host(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) device(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) + +// ----- + +func @testdataregion(%a: memref<10xf32>, %b: memref<10xf32>) -> () { + acc.data copy(%b : memref<10xf32>) copyout(%a : memref<10xf32>) { + } + return +} + +// CHECK: acc.data copy(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) copyout(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) + +// ----- + +func @testdataregion(%a: !llvm.ptr, %b: memref<10xf32>, %c: !llvm.ptr) -> () { + acc.data copyin(%b : memref<10xf32>) deviceptr(%c: !llvm.ptr) attach(%a : !llvm.ptr) { + } + return +} + +// CHECK: acc.data copyin(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) deviceptr(%{{.*}} : !llvm.ptr) attach(%{{.*}} : !llvm.ptr) + +// ----- + +func @testdataregion(%a: memref<10xf32>, %b: memref<10xf32>) -> () { + %ifCond = constant true + acc.data if(%ifCond) copyin_readonly(%b : memref<10xf32>) copyout_zero(%a : memref<10xf32>) { + } + return +} + +// CHECK: acc.data if(%{{.*}}) copyin_readonly(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) copyout_zero(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) + +// ----- + +func @testdataregion(%a: !llvm.ptr, %b: memref<10xf32>, %c: !llvm.ptr) -> () { + acc.data create(%b : memref<10xf32>) create_zero(%c: !llvm.ptr) no_create(%a : !llvm.ptr) { + } + return +} + +// CHECK: acc.data create(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) create_zero(%{{.*}} : !llvm.ptr) no_create(%{{.*}} : !llvm.ptr) + +// ----- + +func @testdataregion(%a: memref<10xf32>, %b: memref<10xf32>) -> () { + acc.data present(%a, %b : memref<10xf32>, memref<10xf32>) { + } + return +} + +// CHECK: acc.data present(%{{.*}}, %{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>, !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>)