@@ -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)
10541094EXPL_SPEC(mlir::acc::WaitOp)
10551095EXPL_SPEC(mlir::acc::HostDataOp)
10561096EXPL_SPEC(mlir::acc::EnterDataOp)
1097+ EXPL_SPEC(mlir::acc::ExitDataOp)
10571098#undef EXPL_SPEC
10581099
10591100template <typename ComputeOp, typename LoopOp>
0 commit comments