Skip to content

Commit 15a480c

Browse files
committed
[mlir][openacc] Cleanup acc.exit_data from old data clause operands
Since the new data operand operations have been added in D148389 and adopted on acc.exit_data in D149601, the old clause operands are no longer needed. The LegalizeDataOpForLLVMTranslation will become obsolete when all operations will be cleaned. For the time being only the appropriate part are being removed. processOperands will also receive some updates once all the operands will be coming from an acc data operand operation. Reviewed By: jeanPerier Differential Revision: https://reviews.llvm.org/D150145
1 parent 6db007a commit 15a480c

File tree

13 files changed

+185
-187
lines changed

13 files changed

+185
-187
lines changed

flang/lib/Lower/OpenACC.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1368,7 +1368,6 @@ genACCExitDataOp(Fortran::lower::AbstractConverter &converter,
13681368
addOperand(operands, operandSegments, async);
13691369
addOperand(operands, operandSegments, waitDevnum);
13701370
addOperands(operands, operandSegments, waitOperands);
1371-
operandSegments.append({0, 0, 0});
13721371
addOperands(operands, operandSegments, dataClauseOperands);
13731372

13741373
mlir::acc::ExitDataOp exitDataOp = createSimpleOp<mlir::acc::ExitDataOp>(

flang/lib/Optimizer/Transforms/OpenACC/OpenACCDataOperandConversion.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ void OpenACCDataOperandConversion::runOnOperation() {
116116
fir::LLVMTypeConverter converter(
117117
op.getOperation()->getParentOfType<mlir::ModuleOp>(), true);
118118
patterns.add<LegalizeDataOpForLLVMTranslation<acc::DataOp>>(converter);
119-
patterns.add<LegalizeDataOpForLLVMTranslation<acc::ExitDataOp>>(converter);
120119
patterns.add<LegalizeDataOpForLLVMTranslation<acc::ParallelOp>>(converter);
121120

122121
ConversionTarget target(*context);
@@ -147,13 +146,6 @@ void OpenACCDataOperandConversion::runOnOperation() {
147146
allDataOperandsAreConverted(op.getAttachOperands());
148147
});
149148

150-
target.addDynamicallyLegalOp<acc::ExitDataOp>(
151-
[allDataOperandsAreConverted](acc::ExitDataOp op) {
152-
return allDataOperandsAreConverted(op.getCopyoutOperands()) &&
153-
allDataOperandsAreConverted(op.getDeleteOperands()) &&
154-
allDataOperandsAreConverted(op.getDetachOperands());
155-
});
156-
157149
target.addDynamicallyLegalOp<acc::ParallelOp>(
158150
[allDataOperandsAreConverted](acc::ParallelOp op) {
159151
return allDataOperandsAreConverted(op.getReductionOperands()) &&

flang/test/Transforms/OpenACC/convert-data-operands-to-llvmir.fir

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,6 @@ fir.global internal @_QFEa : !fir.array<10xf32> {
3030
fir.has_value %0 : !fir.array<10xf32>
3131
}
3232

33-
func.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} {
34-
%0 = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
35-
acc.exit_data copyout(%0 : !fir.ref<!fir.array<10xf32>>)
36-
return
37-
}
38-
39-
// CHECK-LABEL: func.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} {
40-
// CHECK: %[[ADDR:.*]] = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
41-
// CHECK: %[[CAST1:.*]] = builtin.unrealized_conversion_cast %[[ADDR]] : !fir.ref<!fir.array<10xf32>> to !llvm.ptr<array<10 x f32>>
42-
// CHECK: acc.exit_data copyout(%[[CAST1]] : !llvm.ptr<array<10 x f32>>)
43-
44-
// LLVMIR-LABEL: llvm.func @_QQsub_enter_exit() attributes {fir.bindc_name = "a"} {
45-
// LLVMIR: %[[ADDR:.*]] = llvm.mlir.addressof @_QFEa : !llvm.ptr<array<10 x f32>>
46-
// LLVMIR: acc.exit_data copyout(%[[ADDR]] : !llvm.ptr<array<10 x f32>>)
47-
48-
// -----
49-
50-
fir.global internal @_QFEa : !fir.array<10xf32> {
51-
%0 = fir.undefined !fir.array<10xf32>
52-
fir.has_value %0 : !fir.array<10xf32>
53-
}
54-
5533
func.func @_QQsub_parallel() attributes {fir.bindc_name = "test"} {
5634
%0 = fir.address_of(@_QFEa) : !fir.ref<!fir.array<10xf32>>
5735
%1 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFEi"}

mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -813,9 +813,6 @@ def OpenACC_ExitDataOp : OpenACC_Op<"exit_data", [AttrSizedOperandSegments]> {
813813
Optional<IntOrIndex>:$waitDevnum,
814814
Variadic<IntOrIndex>:$waitOperands,
815815
UnitAttr:$wait,
816-
Variadic<AnyType>:$copyoutOperands,
817-
Variadic<AnyType>:$deleteOperands,
818-
Variadic<AnyType>:$detachOperands,
819816
Variadic<OpenACC_PointerLikeTypeInterface>:$dataClauseOperands,
820817
UnitAttr:$finalize);
821818

@@ -833,9 +830,6 @@ def OpenACC_ExitDataOp : OpenACC_Op<"exit_data", [AttrSizedOperandSegments]> {
833830
| `async` `(` $asyncOperand `:` type($asyncOperand) `)`
834831
| `wait_devnum` `(` $waitDevnum `:` type($waitDevnum) `)`
835832
| `wait` `(` $waitOperands `:` type($waitOperands) `)`
836-
| `copyout` `(` $copyoutOperands `:` type($copyoutOperands) `)`
837-
| `delete` `(` $deleteOperands `:` type($deleteOperands) `)`
838-
| `detach` `(` $detachOperands `:` type($detachOperands) `)`
839833
| `dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
840834
)
841835
attr-dict-with-keyword

mlir/lib/Conversion/OpenACCToLLVM/OpenACCToLLVM.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ class LegalizeDataOpForLLVMTranslation : public ConvertOpToLLVMPattern<Op> {
156156
void mlir::populateOpenACCToLLVMConversionPatterns(
157157
LLVMTypeConverter &converter, RewritePatternSet &patterns) {
158158
patterns.add<LegalizeDataOpForLLVMTranslation<acc::DataOp>>(converter);
159-
patterns.add<LegalizeDataOpForLLVMTranslation<acc::ExitDataOp>>(converter);
160159
patterns.add<LegalizeDataOpForLLVMTranslation<acc::ParallelOp>>(converter);
161160
}
162161

@@ -208,13 +207,6 @@ void ConvertOpenACCToLLVMPass::runOnOperation() {
208207
allDataOperandsAreConverted(op.getAttachOperands());
209208
});
210209

211-
target.addDynamicallyLegalOp<acc::ExitDataOp>(
212-
[allDataOperandsAreConverted](acc::ExitDataOp op) {
213-
return allDataOperandsAreConverted(op.getCopyoutOperands()) &&
214-
allDataOperandsAreConverted(op.getDeleteOperands()) &&
215-
allDataOperandsAreConverted(op.getDetachOperands());
216-
});
217-
218210
target.addDynamicallyLegalOp<acc::ParallelOp>(
219211
[allDataOperandsAreConverted](acc::ParallelOp op) {
220212
return allDataOperandsAreConverted(op.getReductionOperands()) &&

mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -542,11 +542,9 @@ LogicalResult acc::ExitDataOp::verify() {
542542
// 2.6.6. Data Exit Directive restriction
543543
// At least one copyout, delete, or detach clause must appear on an exit data
544544
// directive.
545-
if (getCopyoutOperands().empty() && getDeleteOperands().empty() &&
546-
getDetachOperands().empty() && getDataClauseOperands().empty())
547-
return emitError(
548-
"at least one operand in copyout, delete or detach must appear on the "
549-
"exit data operation");
545+
if (getDataClauseOperands().empty())
546+
return emitError("at least one operand must be present in dataOperands on "
547+
"the exit data operation");
550548

551549
// The async attribute represent the async clause without value. Therefore the
552550
// attribute and operand cannot appear at the same time.
@@ -565,8 +563,7 @@ LogicalResult acc::ExitDataOp::verify() {
565563
}
566564

567565
unsigned ExitDataOp::getNumDataOperands() {
568-
return getCopyoutOperands().size() + getDeleteOperands().size() +
569-
getDetachOperands().size() + getDataClauseOperands().size();
566+
return getDataClauseOperands().size();
570567
}
571568

572569
Value ExitDataOp::getDataOperand(unsigned i) {

mlir/lib/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,31 @@ processDataOperands(llvm::IRBuilderBase &builder,
202202

203203
unsigned index = 0;
204204

205+
llvm::SmallVector<mlir::Value> deleteOperands, copyoutOperands;
206+
for (mlir::Value dataOp : op.getDataClauseOperands()) {
207+
if (auto devicePtrOp = mlir::dyn_cast_or_null<acc::GetDevicePtrOp>(
208+
dataOp.getDefiningOp())) {
209+
for (auto &u : devicePtrOp.getAccPtr().getUses()) {
210+
if (mlir::dyn_cast_or_null<acc::DeleteOp>(u.getOwner()))
211+
deleteOperands.push_back(devicePtrOp.getVarPtr());
212+
else if (mlir::dyn_cast_or_null<acc::CopyoutOp>(u.getOwner()))
213+
copyoutOperands.push_back(devicePtrOp.getVarPtr());
214+
}
215+
}
216+
}
217+
218+
auto nbTotalOperands = deleteOperands.size() + copyoutOperands.size();
219+
205220
// Delete operands are handled as `delete` call.
206-
if (failed(processOperands(builder, moduleTranslation, op,
207-
op.getDeleteOperands(), op.getNumDataOperands(),
208-
kDeleteFlag, flags, names, index, mapperAllocas)))
221+
if (failed(processOperands(builder, moduleTranslation, op, deleteOperands,
222+
nbTotalOperands, kDeleteFlag, flags, names, index,
223+
mapperAllocas)))
209224
return failure();
210225

211226
// Copyout operands are handled as `from` call.
212-
if (failed(processOperands(builder, moduleTranslation, op,
213-
op.getCopyoutOperands(), op.getNumDataOperands(),
214-
kHostCopyoutFlag, flags, names, index,
215-
mapperAllocas)))
227+
if (failed(processOperands(builder, moduleTranslation, op, copyoutOperands,
228+
nbTotalOperands, kHostCopyoutFlag, flags, names,
229+
index, mapperAllocas)))
216230
return failure();
217231

218232
return success();
@@ -509,7 +523,8 @@ LogicalResult OpenACCDialectLLVMIRTranslationInterface::convertOperation(
509523
"unexpected OpenACC terminator with operands");
510524
return success();
511525
})
512-
.Case<acc::CreateOp, acc::CopyinOp, acc::UpdateDeviceOp>([](auto op) {
526+
.Case<acc::CreateOp, acc::CopyinOp, acc::CopyoutOp, acc::DeleteOp,
527+
acc::UpdateDeviceOp, acc::GetDevicePtrOp>([](auto op) {
513528
// NOP
514529
return success();
515530
})

mlir/test/Conversion/OpenACCToLLVM/convert-data-operands-to-llvmir.mlir

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,5 @@
11
// RUN: mlir-opt -convert-openacc-to-llvm='use-opaque-pointers=1' -split-input-file %s | FileCheck %s
22

3-
func.func @testexitdataop(%a: memref<10xf32>, %b: memref<10xf32>) -> () {
4-
acc.exit_data copyout(%b : memref<10xf32>) delete(%a : memref<10xf32>)
5-
return
6-
}
7-
8-
// CHECK: acc.exit_data copyout(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) delete(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>)
9-
10-
// -----
11-
12-
func.func @testexitdataop(%a: !llvm.ptr, %b: memref<10xf32>) -> () {
13-
acc.exit_data copyout(%b : memref<10xf32>) delete(%a : !llvm.ptr)
14-
return
15-
}
16-
17-
// CHECK: acc.exit_data copyout(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) delete(%{{.*}} : !llvm.ptr)
18-
19-
// -----
20-
21-
func.func @testexitdataop(%a: memref<10xi64>, %b: memref<10xf32>) -> () {
22-
acc.exit_data copyout(%b : memref<10xf32>) delete(%a : memref<10xi64>) attributes {async}
23-
return
24-
}
25-
26-
// CHECK: acc.exit_data copyout(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) delete(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) attributes {async}
27-
28-
// -----
29-
30-
func.func @testexitdataop(%a: memref<10xf32>, %b: memref<10xf32>) -> () {
31-
%ifCond = arith.constant true
32-
acc.exit_data if(%ifCond) copyout(%b : memref<10xf32>) delete(%a : memref<10xf32>)
33-
return
34-
}
35-
36-
// CHECK: acc.exit_data if(%{{.*}}) copyout(%{{.*}} : !llvm.struct<"openacc_data", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>) delete(%{{.*}} : !llvm.struct<"openacc_data.1", (struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>, ptr, i64)>)
37-
38-
// -----
39-
403
func.func @testdataregion(%a: memref<10xf32>, %b: memref<10xf32>) -> () {
414
acc.data copy(%b : memref<10xf32>) copyout(%a : memref<10xf32>) {
425
acc.parallel {

mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
1313

1414
// -----
1515

16-
func.func @testexitdataop(%a: memref<10xf32>, %ifCond: i1) -> () {
17-
acc.exit_data if(%ifCond) delete(%a: memref<10xf32>)
16+
func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
17+
%0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
18+
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
19+
acc.delete accPtr(%0 : memref<f32>)
1820
return
1921
}
2022

21-
// CHECK: func @testexitdataop(%{{.*}}: memref<10xf32>, [[IFCOND:%.*]]: i1)
23+
// CHECK: func @testexitdataop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1)
2224
// CHECK: scf.if [[IFCOND]] {
23-
// CHECK-NEXT: acc.exit_data delete(%{{.*}} : memref<10xf32>)
25+
// CHECK-NEXT: acc.exit_data dataOperands(%{{.*}} : memref<f32>)
2426
// CHECK-NEXT: }
2527

2628
// -----
@@ -88,21 +90,25 @@ func.func @enter_data_false(%d1 : memref<f32>) {
8890

8991
// -----
9092

91-
func.func @exit_data_true(%d1 : memref<10xf32>) {
93+
func.func @exit_data_true(%d1 : memref<f32>) {
9294
%true = arith.constant true
93-
acc.exit_data if(%true) delete(%d1 : memref<10xf32>) attributes {async}
95+
%0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
96+
acc.exit_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
97+
acc.delete accPtr(%0 : memref<f32>)
9498
return
9599
}
96100

97101
// CHECK-LABEL: func.func @exit_data_true
98102
// CHECK-NOT:if
99-
// CHECK:acc.exit_data delete
103+
// CHECK:acc.exit_data dataOperands
100104

101105
// -----
102106

103-
func.func @exit_data_false(%d1 : memref<10xf32>) {
107+
func.func @exit_data_false(%d1 : memref<f32>) {
104108
%false = arith.constant false
105-
acc.exit_data if(%false) delete(%d1 : memref<10xf32>) attributes {async}
109+
%0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
110+
acc.exit_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
111+
acc.delete accPtr(%0 : memref<f32>)
106112
return
107113
}
108114

mlir/test/Dialect/OpenACC/canonicalize.mlir

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,23 @@ func.func @testenterdataop(%a: memref<f32>) -> () {
2323

2424
// -----
2525

26-
func.func @testexitdataop(%a: memref<10xf32>) -> () {
26+
func.func @testexitdataop(%a: memref<f32>) -> () {
2727
%ifCond = arith.constant true
28-
acc.exit_data if(%ifCond) delete(%a: memref<10xf32>)
28+
%0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
29+
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
30+
acc.delete accPtr(%0 : memref<f32>)
2931
return
3032
}
3133

32-
// CHECK: acc.exit_data delete(%{{.*}} : memref<10xf32>)
34+
// CHECK: acc.exit_data dataOperands(%{{.*}} : memref<f32>)
3335

3436
// -----
3537

36-
func.func @testexitdataop(%a: memref<10xf32>) -> () {
38+
func.func @testexitdataop(%a: memref<f32>) -> () {
3739
%ifCond = arith.constant false
38-
acc.exit_data if(%ifCond) delete(%a: memref<10xf32>)
40+
%0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
41+
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
42+
acc.delete accPtr(%0 : memref<f32>)
3943
return
4044
}
4145

@@ -80,13 +84,15 @@ func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
8084

8185
// -----
8286

83-
func.func @testexitdataop(%a: memref<10xf32>, %ifCond: i1) -> () {
84-
acc.exit_data if(%ifCond) delete(%a: memref<10xf32>)
87+
func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
88+
%0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
89+
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
90+
acc.delete accPtr(%0 : memref<f32>)
8591
return
8692
}
8793

88-
// CHECK: func @testexitdataop(%{{.*}}: memref<10xf32>, [[IFCOND:%.*]]: i1)
89-
// CHECK: acc.exit_data if(%{{.*}}) delete(%{{.*}} : memref<10xf32>)
94+
// CHECK: func @testexitdataop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1)
95+
// CHECK: acc.exit_data if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>)
9096

9197
// -----
9298

mlir/test/Dialect/OpenACC/invalid.mlir

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,22 +167,26 @@ acc.loop {
167167

168168
// -----
169169

170-
// expected-error@+1 {{at least one operand in copyout, delete or detach must appear on the exit data operation}}
170+
// expected-error@+1 {{at least one operand must be present in dataOperands on the exit data operation}}
171171
acc.exit_data attributes {async}
172172

173173
// -----
174174

175175
%cst = arith.constant 1 : index
176-
%value = memref.alloc() : memref<10xf32>
176+
%value = memref.alloc() : memref<f32>
177+
%0 = acc.getdeviceptr varPtr(%value : memref<f32>) -> memref<f32>
177178
// expected-error@+1 {{async attribute cannot appear with asyncOperand}}
178-
acc.exit_data async(%cst: index) delete(%value : memref<10xf32>) attributes {async}
179+
acc.exit_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async}
180+
acc.delete accPtr(%0 : memref<f32>)
179181

180182
// -----
181183

182184
%cst = arith.constant 1 : index
183-
%value = memref.alloc() : memref<10xf32>
185+
%value = memref.alloc() : memref<f32>
186+
%0 = acc.getdeviceptr varPtr(%value : memref<f32>) -> memref<f32>
184187
// expected-error@+1 {{wait_devnum cannot appear without waitOperands}}
185-
acc.exit_data wait_devnum(%cst: index) delete(%value : memref<10xf32>)
188+
acc.exit_data wait_devnum(%cst: index) dataOperands(%0 : memref<f32>)
189+
acc.delete accPtr(%0 : memref<f32>)
186190

187191
// -----
188192

0 commit comments

Comments
 (0)