void mlir::populateOpenACCToLLVMConversionPatterns(
LLVMTypeConverter &converter, OwningRewritePatternList &patterns) {
+ patterns.add<LegalizeDataOpForLLVMTranslation<acc::DataOp>>(converter);
patterns.add<LegalizeDataOpForLLVMTranslation<acc::EnterDataOp>>(converter);
patterns.add<LegalizeDataOpForLLVMTranslation<acc::ExitDataOp>>(converter);
patterns.add<LegalizeDataOpForLLVMTranslation<acc::UpdateOp>>(converter);
return true;
};
+ target.addDynamicallyLegalOp<acc::DataOp>(
+ [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<acc::EnterDataOp>(
[allDataOperandsAreConverted](acc::EnterDataOp op) {
return allDataOperandsAreConverted(op.copyinOperands()) &&
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
//===----------------------------------------------------------------------===//
}
// CHECK: acc.update if(%{{.*}}) host(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>) device(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, 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<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>) copyout(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>)
+
+// -----
+
+func @testdataregion(%a: !llvm.ptr<f32>, %b: memref<10xf32>, %c: !llvm.ptr<f32>) -> () {
+ acc.data copyin(%b : memref<10xf32>) deviceptr(%c: !llvm.ptr<f32>) attach(%a : !llvm.ptr<f32>) {
+ }
+ return
+}
+
+// CHECK: acc.data copyin(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>) deviceptr(%{{.*}} : !llvm.ptr<f32>) attach(%{{.*}} : !llvm.ptr<f32>)
+
+// -----
+
+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<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>) copyout_zero(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>)
+
+// -----
+
+func @testdataregion(%a: !llvm.ptr<f32>, %b: memref<10xf32>, %c: !llvm.ptr<f32>) -> () {
+ acc.data create(%b : memref<10xf32>) create_zero(%c: !llvm.ptr<f32>) no_create(%a : !llvm.ptr<f32>) {
+ }
+ return
+}
+
+// CHECK: acc.data create(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>) create_zero(%{{.*}} : !llvm.ptr<f32>) no_create(%{{.*}} : !llvm.ptr<f32>)
+
+// -----
+
+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<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>, !llvm.struct<"openacc_data.1", (struct<(ptr<f32>, ptr<f32>, i64, array<1 x i64>, array<1 x i64>)>, ptr<f32>, i64)>)