@@ -376,10 +376,19 @@ class OpenACCClauseCIREmitter final
376376 // on all operation types.
377377 mlir::ArrayAttr getAsyncOnlyAttr () {
378378 if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
379- mlir::acc::KernelsOp, mlir::acc::DataOp>)
379+ mlir::acc::KernelsOp, mlir::acc::DataOp>) {
380380 return operation.getAsyncOnlyAttr ();
381- else if constexpr (isCombinedType<OpTy>)
381+ } else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
382+ if (!operation.getAsyncAttr ())
383+ return mlir::ArrayAttr{};
384+
385+ llvm::SmallVector<mlir::Attribute> devTysTemp;
386+ devTysTemp.push_back (mlir::acc::DeviceTypeAttr::get (
387+ builder.getContext (), mlir::acc::DeviceType::None));
388+ return mlir::ArrayAttr::get (builder.getContext (), devTysTemp);
389+ } else if constexpr (isCombinedType<OpTy>) {
382390 return operation.computeOp .getAsyncOnlyAttr ();
391+ }
383392
384393 // Note: 'wait' has async as well, but it cannot have data clauses, so we
385394 // don't have to handle them here.
@@ -391,10 +400,19 @@ class OpenACCClauseCIREmitter final
391400 // on all operation types.
392401 mlir::ArrayAttr getAsyncOperandsDeviceTypeAttr () {
393402 if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
394- mlir::acc::KernelsOp, mlir::acc::DataOp>)
403+ mlir::acc::KernelsOp, mlir::acc::DataOp>) {
395404 return operation.getAsyncOperandsDeviceTypeAttr ();
396- else if constexpr (isCombinedType<OpTy>)
405+ } else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
406+ if (!operation.getAsyncOperand ())
407+ return mlir::ArrayAttr{};
408+
409+ llvm::SmallVector<mlir::Attribute> devTysTemp;
410+ devTysTemp.push_back (mlir::acc::DeviceTypeAttr::get (
411+ builder.getContext (), mlir::acc::DeviceType::None));
412+ return mlir::ArrayAttr::get (builder.getContext (), devTysTemp);
413+ } else if constexpr (isCombinedType<OpTy>) {
397414 return operation.computeOp .getAsyncOperandsDeviceTypeAttr ();
415+ }
398416
399417 // Note: 'wait' has async as well, but it cannot have data clauses, so we
400418 // don't have to handle them here.
@@ -409,6 +427,8 @@ class OpenACCClauseCIREmitter final
409427 if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
410428 mlir::acc::KernelsOp, mlir::acc::DataOp>)
411429 return operation.getAsyncOperands ();
430+ else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>)
431+ return operation.getAsyncOperandMutable ();
412432 else if constexpr (isCombinedType<OpTy>)
413433 return operation.computeOp .getAsyncOperands ();
414434
@@ -542,10 +562,11 @@ class OpenACCClauseCIREmitter final
542562 void VisitAsyncClause (const OpenACCAsyncClause &clause) {
543563 hasAsyncClause = true ;
544564 if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
545- mlir::acc::KernelsOp, mlir::acc::DataOp>) {
546- if (!clause.hasIntExpr ())
565+ mlir::acc::KernelsOp, mlir::acc::DataOp,
566+ mlir::acc::EnterDataOp>) {
567+ if (!clause.hasIntExpr ()) {
547568 operation.addAsyncOnly (builder.getContext (), lastDeviceTypeValues);
548- else {
569+ } else {
549570
550571 mlir::Value intExpr;
551572 {
@@ -572,8 +593,8 @@ class OpenACCClauseCIREmitter final
572593 applyToComputeOp (clause);
573594 } else {
574595 // TODO: When we've implemented this for everything, switch this to an
575- // unreachable. Combined constructs remain. Data, enter data, exit data,
576- // update constructs remain.
596+ // unreachable. Combined constructs remain. Exit data, update constructs
597+ // remain.
577598 return clauseNotImplemented (clause);
578599 }
579600 }
@@ -604,7 +625,7 @@ class OpenACCClauseCIREmitter final
604625 mlir::acc::KernelsOp, mlir::acc::InitOp,
605626 mlir::acc::ShutdownOp, mlir::acc::SetOp,
606627 mlir::acc::DataOp, mlir::acc::WaitOp,
607- mlir::acc::HostDataOp>) {
628+ mlir::acc::HostDataOp, mlir::acc::EnterDataOp >) {
608629 operation.getIfCondMutable ().append (
609630 createCondition (clause.getConditionExpr ()));
610631 } else if constexpr (isCombinedType<OpTy>) {
@@ -659,7 +680,8 @@ class OpenACCClauseCIREmitter final
659680
660681 void VisitWaitClause (const OpenACCWaitClause &clause) {
661682 if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
662- mlir::acc::KernelsOp, mlir::acc::DataOp>) {
683+ mlir::acc::KernelsOp, mlir::acc::DataOp,
684+ mlir::acc::EnterDataOp>) {
663685 if (!clause.hasExprs ()) {
664686 operation.addWaitOnly (builder.getContext (), lastDeviceTypeValues);
665687 } else {
@@ -866,11 +888,16 @@ class OpenACCClauseCIREmitter final
866888 var, mlir::acc::DataClause::acc_copyin, clause.getModifierList (),
867889 /* structured=*/ true ,
868890 /* implicit=*/ false );
891+ } else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
892+ for (const Expr *var : clause.getVarList ())
893+ addDataOperand<mlir::acc::CopyinOp>(
894+ var, mlir::acc::DataClause::acc_copyin, clause.getModifierList (),
895+ /* structured=*/ false , /* implicit=*/ false );
869896 } else if constexpr (isCombinedType<OpTy>) {
870897 applyToComputeOp (clause);
871898 } else {
872899 // TODO: When we've implemented this for everything, switch this to an
873- // unreachable. enter-data, declare constructs remain .
900+ // unreachable. declare construct remains .
874901 return clauseNotImplemented (clause);
875902 }
876903 }
@@ -900,11 +927,16 @@ class OpenACCClauseCIREmitter final
900927 var, mlir::acc::DataClause::acc_create, clause.getModifierList (),
901928 /* structured=*/ true ,
902929 /* implicit=*/ false );
930+ } else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
931+ for (const Expr *var : clause.getVarList ())
932+ addDataOperand<mlir::acc::CreateOp>(
933+ var, mlir::acc::DataClause::acc_create, clause.getModifierList (),
934+ /* structured=*/ false , /* implicit=*/ false );
903935 } else if constexpr (isCombinedType<OpTy>) {
904936 applyToComputeOp (clause);
905937 } else {
906938 // TODO: When we've implemented this for everything, switch this to an
907- // unreachable. enter-data, declare constructs remain .
939+ // unreachable. declare construct remains .
908940 return clauseNotImplemented (clause);
909941 }
910942 }
@@ -974,12 +1006,15 @@ class OpenACCClauseCIREmitter final
9741006 addDataOperand<mlir::acc::AttachOp, mlir::acc::DetachOp>(
9751007 var, mlir::acc::DataClause::acc_attach, {}, /* structured=*/ true ,
9761008 /* implicit=*/ false );
1009+ } else if constexpr (isOneOfTypes<OpTy, mlir::acc::EnterDataOp>) {
1010+ for (const Expr *var : clause.getVarList ())
1011+ addDataOperand<mlir::acc::AttachOp>(
1012+ var, mlir::acc::DataClause::acc_attach, {},
1013+ /* structured=*/ false , /* implicit=*/ false );
9771014 } else if constexpr (isCombinedType<OpTy>) {
9781015 applyToComputeOp (clause);
9791016 } else {
980- // TODO: When we've implemented this for everything, switch this to an
981- // unreachable. enter data remains.
982- return clauseNotImplemented (clause);
1017+ llvm_unreachable (" Unknown construct kind in VisitAttachClause" );
9831018 }
9841019 }
9851020};
@@ -1018,6 +1053,7 @@ EXPL_SPEC(mlir::acc::ShutdownOp)
10181053EXPL_SPEC(mlir::acc::SetOp)
10191054EXPL_SPEC(mlir::acc::WaitOp)
10201055EXPL_SPEC(mlir::acc::HostDataOp)
1056+ EXPL_SPEC(mlir::acc::EnterDataOp)
10211057#undef EXPL_SPEC
10221058
10231059template <typename ComputeOp, typename LoopOp>
0 commit comments