diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -1287,7 +1287,6 @@ addOperand(operands, operandSegments, async); addOperand(operands, operandSegments, waitDevnum); addOperands(operands, operandSegments, waitOperands); - operandSegments.append({0, 0, 0, 0}); addOperands(operands, operandSegments, dataClauseOperands); mlir::acc::EnterDataOp enterDataOp = createSimpleOp( diff --git a/flang/lib/Optimizer/Transforms/OpenACC/OpenACCDataOperandConversion.cpp b/flang/lib/Optimizer/Transforms/OpenACC/OpenACCDataOperandConversion.cpp --- a/flang/lib/Optimizer/Transforms/OpenACC/OpenACCDataOperandConversion.cpp +++ b/flang/lib/Optimizer/Transforms/OpenACC/OpenACCDataOperandConversion.cpp @@ -116,7 +116,6 @@ fir::LLVMTypeConverter converter( op.getOperation()->getParentOfType(), true); patterns.add>(converter); - patterns.add>(converter); patterns.add>(converter); patterns.add>(converter); @@ -148,14 +147,6 @@ allDataOperandsAreConverted(op.getAttachOperands()); }); - target.addDynamicallyLegalOp( - [allDataOperandsAreConverted](acc::EnterDataOp op) { - return allDataOperandsAreConverted(op.getCopyinOperands()) && - allDataOperandsAreConverted(op.getCreateOperands()) && - allDataOperandsAreConverted(op.getCreateZeroOperands()) && - allDataOperandsAreConverted(op.getAttachOperands()); - }); - target.addDynamicallyLegalOp( [allDataOperandsAreConverted](acc::ExitDataOp op) { return allDataOperandsAreConverted(op.getCopyoutOperands()) && diff --git a/flang/test/Transforms/OpenACC/convert-data-operands-to-llvmir.fir b/flang/test/Transforms/OpenACC/convert-data-operands-to-llvmir.fir --- a/flang/test/Transforms/OpenACC/convert-data-operands-to-llvmir.fir +++ b/flang/test/Transforms/OpenACC/convert-data-operands-to-llvmir.fir @@ -32,21 +32,17 @@ func.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} { %0 = fir.address_of(@_QFEa) : !fir.ref> - acc.enter_data copyin(%0 : !fir.ref>) acc.exit_data copyout(%0 : !fir.ref>) return } // CHECK-LABEL: func.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} { // CHECK: %[[ADDR:.*]] = fir.address_of(@_QFEa) : !fir.ref> -// CHECK: %[[CAST0:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref> to !llvm.ptr> -// CHECK: acc.enter_data copyin(%[[CAST0]] : !llvm.ptr>) // CHECK: %[[CAST1:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref> to !llvm.ptr> // CHECK: acc.exit_data copyout(%[[CAST1]] : !llvm.ptr>) // LLVMIR-LABEL: llvm.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} { // LLVMIR: %[[ADDR:.*]] = llvm.mlir.addressof @_QFEa : !llvm.ptr> -// LLVMIR: acc.enter_data copyin(%[[ADDR]] : !llvm.ptr>) // LLVMIR: acc.exit_data copyout(%[[ADDR]] : !llvm.ptr>) // ----- 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 @@ -765,10 +765,6 @@ Optional:$waitDevnum, Variadic:$waitOperands, UnitAttr:$wait, - Variadic:$copyinOperands, - Variadic:$createOperands, - Variadic:$createZeroOperands, - Variadic:$attachOperands, Variadic:$dataClauseOperands); let extraClassDeclaration = [{ @@ -785,11 +781,6 @@ | `async` `(` $asyncOperand `:` type($asyncOperand) `)` | `wait_devnum` `(` $waitDevnum `:` type($waitDevnum) `)` | `wait` `(` $waitOperands `:` type($waitOperands) `)` - | `copyin` `(` $copyinOperands `:` type($copyinOperands) `)` - | `create` `(` $createOperands `:` type($createOperands) `)` - | `create_zero` `(` $createZeroOperands `:` - type($createZeroOperands) `)` - | `attach` `(` $attachOperands `:` type($attachOperands) `)` | `dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)` ) attr-dict-with-keyword 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 @@ -156,7 +156,6 @@ void mlir::populateOpenACCToLLVMConversionPatterns( LLVMTypeConverter &converter, RewritePatternSet &patterns) { patterns.add>(converter); - patterns.add>(converter); patterns.add>(converter); patterns.add>(converter); } @@ -209,14 +208,6 @@ allDataOperandsAreConverted(op.getAttachOperands()); }); - target.addDynamicallyLegalOp( - [allDataOperandsAreConverted](acc::EnterDataOp op) { - return allDataOperandsAreConverted(op.getCopyinOperands()) && - allDataOperandsAreConverted(op.getCreateOperands()) && - allDataOperandsAreConverted(op.getCreateZeroOperands()) && - allDataOperandsAreConverted(op.getAttachOperands()); - }); - target.addDynamicallyLegalOp( [allDataOperandsAreConverted](acc::ExitDataOp op) { return allDataOperandsAreConverted(op.getCopyoutOperands()) && 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 @@ -588,12 +588,9 @@ // 2.6.6. Data Enter Directive restriction // At least one copyin, create, or attach clause must appear on an enter data // directive. - if (getCopyinOperands().empty() && getCreateOperands().empty() && - getCreateZeroOperands().empty() && getAttachOperands().empty() && - getDataClauseOperands().empty()) - return emitError( - "at least one operand in copyin, create, " - "create_zero or attach must appear on the enter data operation"); + if (getDataClauseOperands().empty()) + return emitError("at least one operand must be present in dataOperands on " + "the enter data operation"); // The async attribute represent the async clause without value. Therefore the // attribute and operand cannot appear at the same time. @@ -617,9 +614,7 @@ } unsigned EnterDataOp::getNumDataOperands() { - return getCopyinOperands().size() + getCreateOperands().size() + - getCreateZeroOperands().size() + getAttachOperands().size() + - getDataClauseOperands().size(); + return getDataClauseOperands().size(); } Value EnterDataOp::getDataOperand(unsigned i) { diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp --- a/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp @@ -162,16 +162,30 @@ unsigned index = 0; // Create operands are handled as `alloc` call. - if (failed(processOperands(builder, moduleTranslation, op, - op.getCreateOperands(), op.getNumDataOperands(), - kCreateFlag, flags, names, index, mapperAllocas))) + // Copyin operands are handled as `to` call. + llvm::SmallVector create, copyin; + for (mlir::Value dataOp : op.getDataClauseOperands()) { + if (auto createOp = + mlir::dyn_cast_or_null(dataOp.getDefiningOp())) { + create.push_back(createOp.getVarPtr()); + } else if (auto copyinOp = mlir::dyn_cast_or_null( + dataOp.getDefiningOp())) { + copyin.push_back(copyinOp.getVarPtr()); + } + } + + auto nbTotalOperands = create.size() + copyin.size(); + + // Create operands are handled as `alloc` call. + if (failed(processOperands(builder, moduleTranslation, op, create, + nbTotalOperands, kCreateFlag, flags, names, index, + mapperAllocas))) return failure(); // Copyin operands are handled as `to` call. - if (failed(processOperands(builder, moduleTranslation, op, - op.getCopyinOperands(), op.getNumDataOperands(), - kDeviceCopyinFlag, flags, names, index, - mapperAllocas))) + if (failed(processOperands(builder, moduleTranslation, op, copyin, + nbTotalOperands, kDeviceCopyinFlag, flags, names, + index, mapperAllocas))) return failure(); return success(); @@ -495,7 +509,7 @@ "unexpected OpenACC terminator with operands"); return success(); }) - .Case([&](acc::UpdateDeviceOp) { + .Case([](auto op) { // NOP return success(); }) diff --git a/mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir b/mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir --- a/mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir +++ b/mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir @@ -1,42 +1,5 @@ // RUN: mlir-opt -convert-openacc-to-llvm='use-opaque-pointers=1' -split-input-file %s | FileCheck %s -func.func @testenterdataop(%a: memref<10xf32>, %b: memref<10xf32>) -> () { - acc.enter_data copyin(%b : memref<10xf32>) create(%a : memref<10xf32>) - return -} - -// CHECK: acc.enter_data copyin(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) create(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) - -// ----- - -func.func @testenterdataop(%a: !llvm.ptr, %b: memref<10xf32>) -> () { - acc.enter_data copyin(%b : memref<10xf32>) create(%a : !llvm.ptr) - return -} - -// CHECK: acc.enter_data copyin(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) create(%{{.*}} : !llvm.ptr) - -// ----- - -func.func @testenterdataop(%a: memref<10xi64>, %b: memref<10xf32>) -> () { - acc.enter_data copyin(%b : memref<10xf32>) create_zero(%a : memref<10xi64>) attributes {async} - return -} - -// CHECK: acc.enter_data copyin(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) create_zero(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) attributes {async} - -// ----- - -func.func @testenterdataop(%a: memref<10xf32>, %b: memref<10xf32>) -> () { - %ifCond = arith.constant true - acc.enter_data if(%ifCond) copyin(%b : memref<10xf32>) create(%a : memref<10xf32>) - return -} - -// CHECK: acc.enter_data if(%{{.*}}) copyin(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) create(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) - -// ----- - func.func @testexitdataop(%a: memref<10xf32>, %b: memref<10xf32>) -> () { acc.exit_data copyout(%b : memref<10xf32>) delete(%a : memref<10xf32>) return diff --git a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir --- a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir +++ b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir @@ -1,13 +1,14 @@ // RUN: mlir-opt %s -convert-openacc-to-scf -split-input-file | FileCheck %s -func.func @testenterdataop(%a: memref<10xf32>, %ifCond: i1) -> () { - acc.enter_data if(%ifCond) create(%a: memref<10xf32>) +func.func @testenterdataop(%a: memref, %ifCond: i1) -> () { + %0 = acc.create varPtr(%a : memref) -> memref + acc.enter_data if(%ifCond) dataOperands(%0 : memref) return } -// CHECK: func @testenterdataop(%{{.*}}: memref<10xf32>, [[IFCOND:%.*]]: i1) +// CHECK: func @testenterdataop(%{{.*}}: memref, [[IFCOND:%.*]]: i1) // CHECK: scf.if [[IFCOND]] { -// CHECK-NEXT: acc.enter_data create(%{{.*}} : memref<10xf32>) +// CHECK-NEXT: acc.enter_data dataOperands(%{{.*}} : memref) // CHECK-NEXT: } // ----- @@ -62,26 +63,28 @@ // ----- -func.func @enter_data_true(%d1 : memref<10xf32>) { +func.func @enter_data_true(%d1 : memref) { %true = arith.constant true - acc.enter_data if(%true) create(%d1 : memref<10xf32>) attributes {async} + %0 = acc.create varPtr(%d1 : memref) -> memref + acc.enter_data if(%true) dataOperands(%0 : memref) attributes {async} return } // CHECK-LABEL: func.func @enter_data_true // CHECK-NOT: if -// CHECK: acc.enter_data create +// CHECK: acc.enter_data dataOperands // ----- -func.func @enter_data_false(%d1 : memref<10xf32>) { +func.func @enter_data_false(%d1 : memref) { %false = arith.constant false - acc.enter_data if(%false) create(%d1 : memref<10xf32>) attributes {async} + %0 = acc.create varPtr(%d1 : memref) -> memref + acc.enter_data if(%false) dataOperands(%0 : memref) attributes {async} return } // CHECK-LABEL: func.func @enter_data_false -// CHECK-NOT:acc.enter_data +// CHECK-NOT: acc.enter_data // ----- diff --git a/mlir/test/Dialect/OpenACC/canonicalize.mlir b/mlir/test/Dialect/OpenACC/canonicalize.mlir --- a/mlir/test/Dialect/OpenACC/canonicalize.mlir +++ b/mlir/test/Dialect/OpenACC/canonicalize.mlir @@ -1,18 +1,20 @@ // RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s -func.func @testenterdataop(%a: memref<10xf32>) -> () { +func.func @testenterdataop(%a: memref) -> () { %ifCond = arith.constant true - acc.enter_data if(%ifCond) create(%a: memref<10xf32>) + %0 = acc.create varPtr(%a : memref) -> memref + acc.enter_data if(%ifCond) dataOperands(%0 : memref) return } -// CHECK: acc.enter_data create(%{{.*}} : memref<10xf32>) +// CHECK: acc.enter_data dataOperands(%{{.*}} : memref) // ----- -func.func @testenterdataop(%a: memref<10xf32>) -> () { +func.func @testenterdataop(%a: memref) -> () { %ifCond = arith.constant false - acc.enter_data if(%ifCond) create(%a: memref<10xf32>) + %0 = acc.create varPtr(%a : memref) -> memref + acc.enter_data if(%ifCond) dataOperands(%0 : memref) return } @@ -67,13 +69,14 @@ // ----- -func.func @testenterdataop(%a: memref<10xf32>, %ifCond: i1) -> () { - acc.enter_data if(%ifCond) create(%a: memref<10xf32>) +func.func @testenterdataop(%a: memref, %ifCond: i1) -> () { + %0 = acc.create varPtr(%a : memref) -> memref + acc.enter_data if(%ifCond) dataOperands(%0 : memref) return } -// CHECK: func @testenterdataop(%{{.*}}: memref<10xf32>, [[IFCOND:%.*]]: i1) -// CHECK: acc.enter_data if(%{{.*}}) create(%{{.*}} : memref<10xf32>) +// CHECK: func @testenterdataop(%{{.*}}: memref, [[IFCOND:%.*]]: i1) +// CHECK: acc.enter_data if(%{{.*}}) dataOperands(%{{.*}} : memref) // ----- diff --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir --- a/mlir/test/Dialect/OpenACC/invalid.mlir +++ b/mlir/test/Dialect/OpenACC/invalid.mlir @@ -186,29 +186,32 @@ // ----- -// expected-error@+1 {{at least one operand in copyin, create, create_zero or attach must appear on the enter data operation}} +// expected-error@+1 {{at least one operand must be present in dataOperands on the enter data operation}} acc.enter_data attributes {async} // ----- %cst = arith.constant 1 : index -%value = memref.alloc() : memref<10xf32> +%value = memref.alloc() : memref +%0 = acc.create varPtr(%value : memref) -> memref // expected-error@+1 {{async attribute cannot appear with asyncOperand}} -acc.enter_data async(%cst: index) create(%value : memref<10xf32>) attributes {async} +acc.enter_data async(%cst: index) dataOperands(%0 : memref) attributes {async} // ----- %cst = arith.constant 1 : index -%value = memref.alloc() : memref<10xf32> +%value = memref.alloc() : memref +%0 = acc.create varPtr(%value : memref) -> memref // expected-error@+1 {{wait attribute cannot appear with waitOperands}} -acc.enter_data wait(%cst: index) create(%value : memref<10xf32>) attributes {wait} +acc.enter_data wait(%cst: index) dataOperands(%0 : memref) attributes {wait} // ----- %cst = arith.constant 1 : index -%value = memref.alloc() : memref<10xf32> +%value = memref.alloc() : memref +%0 = acc.create varPtr(%value : memref) -> memref // expected-error@+1 {{wait_devnum cannot appear without waitOperands}} -acc.enter_data wait_devnum(%cst: index) create(%value : memref<10xf32>) +acc.enter_data wait_devnum(%cst: index) dataOperands(%0 : memref) // ----- diff --git a/mlir/test/Dialect/OpenACC/ops.mlir b/mlir/test/Dialect/OpenACC/ops.mlir --- a/mlir/test/Dialect/OpenACC/ops.mlir +++ b/mlir/test/Dialect/OpenACC/ops.mlir @@ -945,39 +945,61 @@ // ----- -func.func @testenterdataop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10xf32>) -> () { +func.func @testenterdataop(%a: !llvm.ptr, %b: !llvm.ptr, %c: !llvm.ptr) -> () { %ifCond = arith.constant true %i64Value = arith.constant 1 : i64 %i32Value = arith.constant 1 : i32 %idxValue = arith.constant 1 : index - acc.enter_data copyin(%a : memref<10xf32>) - acc.enter_data create(%a : memref<10xf32>) create_zero(%b, %c : memref<10xf32>, memref<10x10xf32>) - acc.enter_data attach(%a : memref<10xf32>) - acc.enter_data copyin(%a : memref<10xf32>) attributes {async} - acc.enter_data create(%a : memref<10xf32>) attributes {wait} - acc.enter_data async(%i64Value : i64) copyin(%a : memref<10xf32>) - acc.enter_data copyin(%a : memref<10xf32>) async(%i64Value : i64) - acc.enter_data if(%ifCond) copyin(%a : memref<10xf32>) - acc.enter_data wait_devnum(%i64Value: i64) wait(%i32Value, %idxValue : i32, index) copyin(%a : memref<10xf32>) + %0 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data dataOperands(%0 : !llvm.ptr) + %1 = acc.create varPtr(%a : !llvm.ptr) -> !llvm.ptr + %2 = acc.create varPtr(%b : !llvm.ptr) -> !llvm.ptr {dataClause = 8 : i64} + %3 = acc.create varPtr(%c : !llvm.ptr) -> !llvm.ptr {dataClause = 8 : i64} + acc.enter_data dataOperands(%1, %2, %3 : !llvm.ptr, !llvm.ptr, !llvm.ptr) + %4 = acc.attach varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data dataOperands(%4 : !llvm.ptr) + %5 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data dataOperands(%5 : !llvm.ptr) attributes {async} + %6 = acc.create varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data dataOperands(%6 : !llvm.ptr) attributes {wait} + %7 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data async(%i64Value : i64) dataOperands(%7 : !llvm.ptr) + %8 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data dataOperands(%8 : !llvm.ptr) async(%i64Value : i64) + %9 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data if(%ifCond) dataOperands(%9 : !llvm.ptr) + %10 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr + acc.enter_data wait_devnum(%i64Value: i64) wait(%i32Value, %idxValue : i32, index) dataOperands(%10 : !llvm.ptr) return } -// CHECK: func @testenterdataop([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref<10xf32>, [[ARGC:%.*]]: memref<10x10xf32>) { +// CHECK: func @testenterdataop(%[[ARGA:.*]]: !llvm.ptr, %[[ARGB:.*]]: !llvm.ptr, %[[ARGC:.*]]: !llvm.ptr) { // CHECK: [[IFCOND1:%.*]] = arith.constant true // CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64 // CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32 // CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index -// CHECK: acc.enter_data copyin([[ARGA]] : memref<10xf32>) -// CHECK: acc.enter_data create([[ARGA]] : memref<10xf32>) create_zero([[ARGB]], [[ARGC]] : memref<10xf32>, memref<10x10xf32>) -// CHECK: acc.enter_data attach([[ARGA]] : memref<10xf32>) -// CHECK: acc.enter_data copyin([[ARGA]] : memref<10xf32>) attributes {async} -// CHECK: acc.enter_data create([[ARGA]] : memref<10xf32>) attributes {wait} -// CHECK: acc.enter_data async([[I64VALUE]] : i64) copyin([[ARGA]] : memref<10xf32>) -// CHECK: acc.enter_data async([[I64VALUE]] : i64) copyin([[ARGA]] : memref<10xf32>) -// CHECK: acc.enter_data if([[IFCOND]]) copyin([[ARGA]] : memref<10xf32>) -// CHECK: acc.enter_data wait_devnum([[I64VALUE]] : i64) wait([[I32VALUE]], [[IDXVALUE]] : i32, index) copyin([[ARGA]] : memref<10xf32>) +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr) +// CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : !llvm.ptr) -> !llvm.ptr {dataClause = 8 : i64} +// CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : !llvm.ptr) -> !llvm.ptr {dataClause = 8 : i64} +// CHECK: acc.enter_data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !llvm.ptr, !llvm.ptr, !llvm.ptr) +// CHECK: %[[ATTACH:.*]] = acc.attach varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data dataOperands(%[[ATTACH]] : !llvm.ptr) +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr) attributes {async} +// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data dataOperands(%[[CREATE]] : !llvm.ptr) attributes {wait} +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data async([[I64VALUE]] : i64) dataOperands(%[[COPYIN]] : !llvm.ptr) +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data async([[I64VALUE]] : i64) dataOperands(%[[COPYIN]] : !llvm.ptr) +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data if([[IFCOND]]) dataOperands(%[[COPYIN]] : !llvm.ptr) +// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: acc.enter_data wait_devnum([[I64VALUE]] : i64) wait([[I32VALUE]], [[IDXVALUE]] : i32, index) dataOperands(%[[COPYIN]] : !llvm.ptr) // ----- diff --git a/mlir/test/Target/LLVMIR/openacc-llvm.mlir b/mlir/test/Target/LLVMIR/openacc-llvm.mlir --- a/mlir/test/Target/LLVMIR/openacc-llvm.mlir +++ b/mlir/test/Target/LLVMIR/openacc-llvm.mlir @@ -1,62 +1,46 @@ // RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s -llvm.func @testenterdataop(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: i64, %arg3: i64, %arg4: i64, %arg5: !llvm.ptr) { - %0 = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %1 = llvm.insertvalue %arg0, %0[0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %2 = llvm.insertvalue %arg1, %1[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %3 = llvm.insertvalue %arg2, %2[2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %4 = llvm.insertvalue %arg3, %3[3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %5 = llvm.insertvalue %arg4, %4[4, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %6 = llvm.mlir.constant(10 : index) : i64 - %7 = llvm.mlir.constant(1 : index) : i64 - %8 = llvm.mlir.null : !llvm.ptr - %9 = llvm.getelementptr %8[%6] : (!llvm.ptr, i64) -> !llvm.ptr - %10 = llvm.ptrtoint %9 : !llvm.ptr to i64 - %11 = llvm.extractvalue %5[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> - %12 = llvm.mlir.undef : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)> - %13 = llvm.insertvalue %5, %12[0] : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)> - %14 = llvm.insertvalue %11, %13[1] : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)> - %15 = llvm.insertvalue %10, %14[2] : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)> - acc.enter_data copyin(%arg5 : !llvm.ptr) create(%15 : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) +llvm.func @testenterdataop(%arg0: !llvm.ptr, %arg1 : !llvm.ptr) { + %0 = acc.create varPtr(%arg0 : !llvm.ptr) -> !llvm.ptr + %1 = acc.copyin varPtr(%arg1 : !llvm.ptr) -> !llvm.ptr + acc.enter_data dataOperands(%0, %1 : !llvm.ptr, !llvm.ptr) llvm.return } // CHECK: %struct.ident_t = type { i32, i32, i32, i32, ptr } -// CHECK: [[LOCSTR:@.*]] = private unnamed_addr constant [{{[0-9]*}} x i8] c";{{.*}};testenterdataop;{{[0-9]*}};{{[0-9]*}};;\00", align 1 -// CHECK: [[LOCGLOBAL:@.*]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 {{[0-9]*}}, ptr [[LOCSTR]] }, align 8 -// CHECK: [[MAPNAME1:@.*]] = private unnamed_addr constant [{{[0-9]*}} x i8] c";{{.*}};unknown;{{[0-9]*}};{{[0-9]*}};;\00", align 1 -// CHECK: [[MAPNAME2:@.*]] = private unnamed_addr constant [{{[0-9]*}} x i8] c";{{.*}};unknown;{{[0-9]*}};{{[0-9]*}};;\00", align 1 -// CHECK: [[MAPTYPES:@.*]] = private unnamed_addr constant [{{[0-9]*}} x i64] [i64 0, i64 1] -// CHECK: [[MAPNAMES:@.*]] = private constant [{{[0-9]*}} x ptr] [ptr [[MAPNAME1]], ptr [[MAPNAME2]]] +// CHECK: @[[LOCSTR:.*]] = private unnamed_addr constant [{{[0-9]*}} x i8] c";{{.*}};testenterdataop;{{[0-9]*}};{{[0-9]*}};;\00", align 1 +// CHECK: @[[LOCGLOBAL:.*]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 {{[0-9]*}}, ptr @[[LOCSTR]] }, align 8 +// CHECK: @[[MAPNAME1:.*]] = private unnamed_addr constant [{{[0-9]*}} x i8] c";{{.*}};unknown;{{[0-9]*}};{{[0-9]*}};;\00", align 1 +// CHECK: @[[MAPNAME2:.*]] = private unnamed_addr constant [{{[0-9]*}} x i8] c";{{.*}};unknown;{{[0-9]*}};{{[0-9]*}};;\00", align 1 +// CHECK: @[[MAPTYPES:.*]] = private unnamed_addr constant [{{[0-9]*}} x i64] [i64 0, i64 1] +// CHECK: @[[MAPNAMES:.*]] = private constant [{{[0-9]*}} x ptr] [ptr @[[MAPNAME1]], ptr @[[MAPNAME2]]] -// CHECK: define void @testenterdataop(ptr %{{.*}}, ptr %{{.*}}, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}, ptr [[SIMPLEPTR:%.*]]) -// CHECK: [[ARGBASE_ALLOCA:%.*]] = alloca [{{[0-9]*}} x ptr], align 8 -// CHECK: [[ARG_ALLOCA:%.*]] = alloca [{{[0-9]*}} x ptr], align 8 -// CHECK: [[SIZE_ALLOCA:%.*]] = alloca [{{[0-9]*}} x i64], align 8 +// CHECK: define void @testenterdataop(ptr %[[PTR0:.*]], ptr %[[PTR1:.*]]) +// CHECK: %[[OFFLOAD_BASEPTR:.*]] = alloca [{{[0-9]*}} x ptr] +// CHECK: %[[OFFLOAD_PTRS:.*]] = alloca [{{[0-9]*}} x ptr] +// CHECK: %[[OFFLOAD_SIZES:.*]] = alloca [{{[0-9]*}} x i64] -// CHECK: [[ARGBASE:%.*]] = extractvalue %openacc_data %{{.*}}, 0 -// CHECK: [[ARG:%.*]] = extractvalue %openacc_data %{{.*}}, 1 -// CHECK: [[ARGSIZE:%.*]] = extractvalue %openacc_data %{{.*}}, 2 -// CHECK: [[ARGBASEGEP:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARGBASE_ALLOCA]], i32 0, i32 0 -// CHECK: store { ptr, ptr, i64, [1 x i64], [1 x i64] } [[ARGBASE]], ptr [[ARGBASEGEP]], align 8 -// CHECK: [[ARGGEP:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARG_ALLOCA]], i32 0, i32 0 -// CHECK: store ptr [[ARG]], ptr [[ARGGEP]], align 8 -// CHECK: [[SIZEGEP:%.*]] = getelementptr inbounds [2 x i64], ptr [[SIZE_ALLOCA]], i32 0, i32 0 -// CHECK: store i64 [[ARGSIZE]], ptr [[SIZEGEP]], align 4 +// CHECK: %[[OFFLOAD_BASEPTR_GEP:.*]] = getelementptr inbounds [2 x ptr], ptr %[[OFFLOAD_BASEPTR]], i32 0, i32 0 +// CHECK: store ptr %[[PTR0]], ptr %[[OFFLOAD_BASEPTR_GEP]] +// CHECK: %[[OFFLOAD_PTRS_GEP:.*]] = getelementptr inbounds [2 x ptr], ptr %[[OFFLOAD_PTRS]], i32 0, i32 0 +// CHECK: store ptr %[[PTR0]], ptr %[[OFFLOAD_PTRS_GEP]] +// CHECK: %[[OFFLOAD_SIZES_GEP:.*]] = getelementptr inbounds [2 x i64], ptr %[[OFFLOAD_SIZES]], i32 0, i32 0 +// CHECK: store i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64), ptr %[[OFFLOAD_SIZES_GEP]] -// CHECK: [[ARGBASEGEP:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARGBASE_ALLOCA]], i32 0, i32 1 -// CHECK: store ptr [[SIMPLEPTR]], ptr [[ARGBASEGEP]], align 8 -// CHECK: [[ARGGEP:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARG_ALLOCA]], i32 0, i32 1 -// CHECK: store ptr [[SIMPLEPTR]], ptr [[ARGGEP]], align 8 -// CHECK: [[SIZEGEP:%.*]] = getelementptr inbounds [2 x i64], ptr [[SIZE_ALLOCA]], i32 0, i32 1 -// CHECK: store i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64), ptr [[SIZEGEP]], align 4 +// CHECK: %[[OFFLOAD_BASEPTR_GEP:.*]] = getelementptr inbounds [2 x ptr], ptr %[[OFFLOAD_BASEPTR]], i32 0, i32 1 +// CHECK: store ptr %[[PTR1]], ptr %[[OFFLOAD_BASEPTR_GEP]] +// CHECK: %[[OFFLOAD_PTRS_GEP:.*]] = getelementptr inbounds [2 x ptr], ptr %[[OFFLOAD_PTRS]], i32 0, i32 1 +// CHECK: store ptr %[[PTR1]], ptr %[[OFFLOAD_PTRS_GEP]] +// CHECK: %[[OFFLOAD_SIZES_GEP:.*]] = getelementptr inbounds [2 x i64], ptr %[[OFFLOAD_SIZES]], i32 0, i32 1 +// CHECK: store i64 ptrtoint (ptr getelementptr (ptr, ptr null, i32 1) to i64), ptr %[[OFFLOAD_SIZES_GEP]] -// CHECK: [[ARGBASE_ALLOCA_GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARGBASE_ALLOCA]], i32 0, i32 0 -// CHECK: [[ARG_ALLOCA_GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARG_ALLOCA]], i32 0, i32 0 -// CHECK: [[SIZE_ALLOCA_GEP:%.*]] = getelementptr inbounds [2 x i64], ptr [[SIZE_ALLOCA]], i32 0, i32 0 -// CHECK: call void @__tgt_target_data_begin_mapper(ptr [[LOCGLOBAL]], i64 -1, i32 2, ptr [[ARGBASE_ALLOCA_GEP]], ptr [[ARG_ALLOCA_GEP]], ptr [[SIZE_ALLOCA_GEP]], ptr [[MAPTYPES]], ptr [[MAPNAMES]], ptr null) +// CHECK: %[[OFFLOAD_BASEPTR_GEP:.*]] = getelementptr inbounds [2 x ptr], ptr %[[OFFLOAD_BASEPTR]], i32 0, i32 0 +// CHECK: %[[OFFLOAD_PTRS_GEP:.*]] = getelementptr inbounds [2 x ptr], ptr %[[OFFLOAD_PTRS]], i32 0, i32 0 +// CHECK: %[[OFFLOAD_SIZES_GEP:.*]] = getelementptr inbounds [2 x i64], ptr %[[OFFLOAD_SIZES]], i32 0, i32 0 + +// CHECK: call void @__tgt_target_data_begin_mapper(ptr @[[LOCGLOBAL]], i64 -1, i32 2, ptr %[[OFFLOAD_BASEPTR_GEP]], ptr %[[OFFLOAD_PTRS_GEP]], ptr %[[OFFLOAD_SIZES_GEP]], ptr @[[MAPTYPES]], ptr @[[MAPNAMES]], ptr null) // CHECK: declare void @__tgt_target_data_begin_mapper(ptr, i64, i32, ptr, ptr, ptr, ptr, ptr, ptr) #0