Skip to content

Commit e382471

Browse files
committed
[OpenACC][CIR] Implement 'exit data' construct + clauses
Similar to 'enter data', except the data clauses have a 'getdeviceptr' operation before, so that they can properly use the 'exit' operation correctly. While this is a touch awkward, it fits perfectly into the existing infrastructure. Same as with 'enter data', we had to add some add-functions for async and wait.
1 parent 33d2082 commit e382471

File tree

5 files changed

+260
-14
lines changed

5 files changed

+260
-14
lines changed

clang/lib/CIR/CodeGen/CIRGenOpenACCClause.cpp

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ class OpenACCClauseCIREmitter final
378378
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
379379
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
380380
return operation.getAsyncOnlyAttr();
381-
} else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
381+
} else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp,
382+
mlir::acc::ExitDataOp>) {
382383
if (!operation.getAsyncAttr())
383384
return mlir::ArrayAttr{};
384385

@@ -402,7 +403,8 @@ class OpenACCClauseCIREmitter final
402403
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
403404
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
404405
return operation.getAsyncOperandsDeviceTypeAttr();
405-
} else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
406+
} else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp,
407+
mlir::acc::ExitDataOp>) {
406408
if (!operation.getAsyncOperand())
407409
return mlir::ArrayAttr{};
408410

@@ -427,7 +429,8 @@ class OpenACCClauseCIREmitter final
427429
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
428430
mlir::acc::KernelsOp, mlir::acc::DataOp>)
429431
return operation.getAsyncOperands();
430-
else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>)
432+
else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp,
433+
mlir::acc::ExitDataOp>)
431434
return operation.getAsyncOperandMutable();
432435
else if constexpr (isCombinedType<OpTy>)
433436
return operation.computeOp.getAsyncOperands();
@@ -563,7 +566,7 @@ class OpenACCClauseCIREmitter final
563566
hasAsyncClause = true;
564567
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
565568
mlir::acc::KernelsOp, mlir::acc::DataOp,
566-
mlir::acc::EnterDataOp>) {
569+
mlir::acc::EnterDataOp, mlir::acc::ExitDataOp>) {
567570
if (!clause.hasIntExpr()) {
568571
operation.addAsyncOnly(builder.getContext(), lastDeviceTypeValues);
569572
} else {
@@ -593,8 +596,7 @@ class OpenACCClauseCIREmitter final
593596
applyToComputeOp(clause);
594597
} else {
595598
// TODO: When we've implemented this for everything, switch this to an
596-
// unreachable. Combined constructs remain. Exit data, update constructs
597-
// remain.
599+
// unreachable. Combined constructs remain. update construct remains.
598600
return clauseNotImplemented(clause);
599601
}
600602
}
@@ -625,7 +627,8 @@ class OpenACCClauseCIREmitter final
625627
mlir::acc::KernelsOp, mlir::acc::InitOp,
626628
mlir::acc::ShutdownOp, mlir::acc::SetOp,
627629
mlir::acc::DataOp, mlir::acc::WaitOp,
628-
mlir::acc::HostDataOp, mlir::acc::EnterDataOp>) {
630+
mlir::acc::HostDataOp, mlir::acc::EnterDataOp,
631+
mlir::acc::ExitDataOp>) {
629632
operation.getIfCondMutable().append(
630633
createCondition(clause.getConditionExpr()));
631634
} else if constexpr (isCombinedType<OpTy>) {
@@ -635,8 +638,7 @@ class OpenACCClauseCIREmitter final
635638
// until we can write tests/know what we're doing with codegen to make
636639
// sure we get it right.
637640
// TODO: When we've implemented this for everything, switch this to an
638-
// unreachable. Enter data, exit data, host_data, update constructs
639-
// remain.
641+
// unreachable. update construct remains.
640642
return clauseNotImplemented(clause);
641643
}
642644
}
@@ -681,7 +683,7 @@ class OpenACCClauseCIREmitter final
681683
void VisitWaitClause(const OpenACCWaitClause &clause) {
682684
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
683685
mlir::acc::KernelsOp, mlir::acc::DataOp,
684-
mlir::acc::EnterDataOp>) {
686+
mlir::acc::EnterDataOp, mlir::acc::ExitDataOp>) {
685687
if (!clause.hasExprs()) {
686688
operation.addWaitOnly(builder.getContext(), lastDeviceTypeValues);
687689
} else {
@@ -697,7 +699,7 @@ class OpenACCClauseCIREmitter final
697699
applyToComputeOp(clause);
698700
} else {
699701
// TODO: When we've implemented this for everything, switch this to an
700-
// unreachable. Enter data, exit data, update constructs remain.
702+
// unreachable. update construct remains.
701703
return clauseNotImplemented(clause);
702704
}
703705
}
@@ -910,11 +912,17 @@ class OpenACCClauseCIREmitter final
910912
var, mlir::acc::DataClause::acc_copyout, clause.getModifierList(),
911913
/*structured=*/true,
912914
/*implicit=*/false);
915+
} else if constexpr (isOneOfTypes<OpTy, mlir::acc::ExitDataOp>) {
916+
for (const Expr *var : clause.getVarList())
917+
addDataOperand<mlir::acc::GetDevicePtrOp, mlir::acc::CopyoutOp>(
918+
var, mlir::acc::DataClause::acc_copyout, clause.getModifierList(),
919+
/*structured=*/false,
920+
/*implicit=*/false);
913921
} else if constexpr (isCombinedType<OpTy>) {
914922
applyToComputeOp(clause);
915923
} else {
916924
// TODO: When we've implemented this for everything, switch this to an
917-
// unreachable. exit data, declare constructs remain.
925+
// unreachable. declare construct remains.
918926
return clauseNotImplemented(clause);
919927
}
920928
}
@@ -941,6 +949,38 @@ class OpenACCClauseCIREmitter final
941949
}
942950
}
943951

952+
void VisitDeleteClause(const OpenACCDeleteClause &clause) {
953+
if constexpr (isOneOfTypes<OpTy, mlir::acc::ExitDataOp>) {
954+
for (const Expr *var : clause.getVarList())
955+
addDataOperand<mlir::acc::GetDevicePtrOp, mlir::acc::DeleteOp>(
956+
var, mlir::acc::DataClause::acc_delete, {},
957+
/*structured=*/false,
958+
/*implicit=*/false);
959+
} else {
960+
llvm_unreachable("Unknown construct kind in VisitDeleteClause");
961+
}
962+
}
963+
964+
void VisitDetachClause(const OpenACCDetachClause &clause) {
965+
if constexpr (isOneOfTypes<OpTy, mlir::acc::ExitDataOp>) {
966+
for (const Expr *var : clause.getVarList())
967+
addDataOperand<mlir::acc::GetDevicePtrOp, mlir::acc::DetachOp>(
968+
var, mlir::acc::DataClause::acc_detach, {},
969+
/*structured=*/false,
970+
/*implicit=*/false);
971+
} else {
972+
llvm_unreachable("Unknown construct kind in VisitDetachClause");
973+
}
974+
}
975+
976+
void VisitFinalizeClause(const OpenACCFinalizeClause &clause) {
977+
if constexpr (isOneOfTypes<OpTy, mlir::acc::ExitDataOp>) {
978+
operation.setFinalize(true);
979+
} else {
980+
llvm_unreachable("Unknown construct kind in VisitFinalizeClause");
981+
}
982+
}
983+
944984
void VisitUseDeviceClause(const OpenACCUseDeviceClause &clause) {
945985
if constexpr (isOneOfTypes<OpTy, mlir::acc::HostDataOp>) {
946986
for (const Expr *var : clause.getVarList())
@@ -1054,6 +1094,7 @@ EXPL_SPEC(mlir::acc::SetOp)
10541094
EXPL_SPEC(mlir::acc::WaitOp)
10551095
EXPL_SPEC(mlir::acc::HostDataOp)
10561096
EXPL_SPEC(mlir::acc::EnterDataOp)
1097+
EXPL_SPEC(mlir::acc::ExitDataOp)
10571098
#undef EXPL_SPEC
10581099

10591100
template <typename ComputeOp, typename LoopOp>

clang/lib/CIR/CodeGen/CIRGenStmtOpenACC.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,15 @@ mlir::LogicalResult CIRGenFunction::emitOpenACCEnterDataConstruct(
255255
s.clauses());
256256
return mlir::success();
257257
}
258+
258259
mlir::LogicalResult CIRGenFunction::emitOpenACCExitDataConstruct(
259260
const OpenACCExitDataConstruct &s) {
260-
cgm.errorNYI(s.getSourceRange(), "OpenACC ExitData Construct");
261-
return mlir::failure();
261+
mlir::Location start = getLoc(s.getSourceRange().getBegin());
262+
emitOpenACCOp<ExitDataOp>(start, s.getDirectiveKind(), s.getDirectiveLoc(),
263+
s.clauses());
264+
return mlir::success();
262265
}
266+
263267
mlir::LogicalResult
264268
CIRGenFunction::emitOpenACCUpdateConstruct(const OpenACCUpdateConstruct &s) {
265269
cgm.errorNYI(s.getSourceRange(), "OpenACC Update Construct");

0 commit comments

Comments
 (0)