@@ -378,7 +378,8 @@ class OpenACCClauseCIREmitter final
378
378
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
379
379
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
380
380
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>) {
382
383
if (!operation.getAsyncAttr ())
383
384
return mlir::ArrayAttr{};
384
385
@@ -402,7 +403,8 @@ class OpenACCClauseCIREmitter final
402
403
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
403
404
mlir::acc::KernelsOp, mlir::acc::DataOp>) {
404
405
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>) {
406
408
if (!operation.getAsyncOperand ())
407
409
return mlir::ArrayAttr{};
408
410
@@ -427,7 +429,8 @@ class OpenACCClauseCIREmitter final
427
429
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
428
430
mlir::acc::KernelsOp, mlir::acc::DataOp>)
429
431
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>)
431
434
return operation.getAsyncOperandMutable ();
432
435
else if constexpr (isCombinedType<OpTy>)
433
436
return operation.computeOp .getAsyncOperands ();
@@ -563,7 +566,7 @@ class OpenACCClauseCIREmitter final
563
566
hasAsyncClause = true ;
564
567
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
565
568
mlir::acc::KernelsOp, mlir::acc::DataOp,
566
- mlir::acc::EnterDataOp>) {
569
+ mlir::acc::EnterDataOp, mlir::acc::ExitDataOp >) {
567
570
if (!clause.hasIntExpr ()) {
568
571
operation.addAsyncOnly (builder.getContext (), lastDeviceTypeValues);
569
572
} else {
@@ -593,8 +596,7 @@ class OpenACCClauseCIREmitter final
593
596
applyToComputeOp (clause);
594
597
} else {
595
598
// 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.
598
600
return clauseNotImplemented (clause);
599
601
}
600
602
}
@@ -625,7 +627,8 @@ class OpenACCClauseCIREmitter final
625
627
mlir::acc::KernelsOp, mlir::acc::InitOp,
626
628
mlir::acc::ShutdownOp, mlir::acc::SetOp,
627
629
mlir::acc::DataOp, mlir::acc::WaitOp,
628
- mlir::acc::HostDataOp, mlir::acc::EnterDataOp>) {
630
+ mlir::acc::HostDataOp, mlir::acc::EnterDataOp,
631
+ mlir::acc::ExitDataOp>) {
629
632
operation.getIfCondMutable ().append (
630
633
createCondition (clause.getConditionExpr ()));
631
634
} else if constexpr (isCombinedType<OpTy>) {
@@ -635,8 +638,7 @@ class OpenACCClauseCIREmitter final
635
638
// until we can write tests/know what we're doing with codegen to make
636
639
// sure we get it right.
637
640
// 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.
640
642
return clauseNotImplemented (clause);
641
643
}
642
644
}
@@ -681,7 +683,7 @@ class OpenACCClauseCIREmitter final
681
683
void VisitWaitClause (const OpenACCWaitClause &clause) {
682
684
if constexpr (isOneOfTypes<OpTy, mlir::acc::ParallelOp, mlir::acc::SerialOp,
683
685
mlir::acc::KernelsOp, mlir::acc::DataOp,
684
- mlir::acc::EnterDataOp>) {
686
+ mlir::acc::EnterDataOp, mlir::acc::ExitDataOp >) {
685
687
if (!clause.hasExprs ()) {
686
688
operation.addWaitOnly (builder.getContext (), lastDeviceTypeValues);
687
689
} else {
@@ -697,7 +699,7 @@ class OpenACCClauseCIREmitter final
697
699
applyToComputeOp (clause);
698
700
} else {
699
701
// 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 .
701
703
return clauseNotImplemented (clause);
702
704
}
703
705
}
@@ -910,11 +912,17 @@ class OpenACCClauseCIREmitter final
910
912
var, mlir::acc::DataClause::acc_copyout, clause.getModifierList (),
911
913
/* structured=*/ true ,
912
914
/* 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 );
913
921
} else if constexpr (isCombinedType<OpTy>) {
914
922
applyToComputeOp (clause);
915
923
} else {
916
924
// TODO: When we've implemented this for everything, switch this to an
917
- // unreachable. exit data, declare constructs remain .
925
+ // unreachable. declare construct remains .
918
926
return clauseNotImplemented (clause);
919
927
}
920
928
}
@@ -941,6 +949,38 @@ class OpenACCClauseCIREmitter final
941
949
}
942
950
}
943
951
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
+
944
984
void VisitUseDeviceClause (const OpenACCUseDeviceClause &clause) {
945
985
if constexpr (isOneOfTypes<OpTy, mlir::acc::HostDataOp>) {
946
986
for (const Expr *var : clause.getVarList ())
@@ -1054,6 +1094,7 @@ EXPL_SPEC(mlir::acc::SetOp)
1054
1094
EXPL_SPEC(mlir::acc::WaitOp)
1055
1095
EXPL_SPEC(mlir::acc::HostDataOp)
1056
1096
EXPL_SPEC(mlir::acc::EnterDataOp)
1097
+ EXPL_SPEC(mlir::acc::ExitDataOp)
1057
1098
#undef EXPL_SPEC
1058
1099
1059
1100
template <typename ComputeOp, typename LoopOp>
0 commit comments