@@ -286,16 +286,39 @@ class OpenACCClauseCIREmitter final
286286 std::move (bounds)};
287287 }
288288
289+ mlir::acc::DataClauseModifier
290+ convertModifiers (OpenACCModifierKind modifiers) {
291+ using namespace mlir ::acc;
292+ static_assert (static_cast <int >(OpenACCModifierKind::Zero) ==
293+ static_cast <int >(DataClauseModifier::zero) &&
294+ static_cast <int >(OpenACCModifierKind::Readonly) ==
295+ static_cast <int >(DataClauseModifier::readonly) &&
296+ static_cast <int >(OpenACCModifierKind::AlwaysIn) ==
297+ static_cast <int >(DataClauseModifier::alwaysin) &&
298+ static_cast <int >(OpenACCModifierKind::AlwaysOut) ==
299+ static_cast <int >(DataClauseModifier::alwaysout) &&
300+ static_cast <int >(OpenACCModifierKind::Capture) ==
301+ static_cast <int >(DataClauseModifier::capture));
302+
303+ DataClauseModifier mlirModifiers{};
304+
305+ // The MLIR representation of this represents `always` as `alwaysin` +
306+ // `alwaysout`. So do a small fixup here.
307+ if (isOpenACCModifierBitSet (modifiers, OpenACCModifierKind::Always)) {
308+ mlirModifiers = mlirModifiers | DataClauseModifier::always;
309+ modifiers &= ~OpenACCModifierKind::Always;
310+ }
311+
312+ mlirModifiers = mlirModifiers | static_cast <DataClauseModifier>(modifiers);
313+ return mlirModifiers;
314+ }
315+
289316 template <typename BeforeOpTy, typename AfterOpTy>
290317 void addDataOperand (const Expr *varOperand, mlir::acc::DataClause dataClause,
291- bool structured, bool implicit) {
318+ OpenACCModifierKind modifiers, bool structured,
319+ bool implicit) {
292320 DataOperandInfo opInfo = getDataOperandInfo (dirKind, varOperand);
293321
294- // TODO: OpenACC: we should comprehend the 'modifier-list' here for the data
295- // operand. At the moment, we don't have a uniform way to assign these
296- // properly, and the dialect cannot represent anything other than 'readonly'
297- // and 'zero' on copyin/copyout/create, so for now, we skip it.
298-
299322 auto beforeOp =
300323 builder.create <BeforeOpTy>(opInfo.beginLoc , opInfo.varValue , structured,
301324 implicit, opInfo.name , opInfo.bounds );
@@ -323,6 +346,8 @@ class OpenACCClauseCIREmitter final
323346 // Set the 'rest' of the info for both operations.
324347 beforeOp.setDataClause (dataClause);
325348 afterOp.setDataClause (dataClause);
349+ beforeOp.setModifiers (convertModifiers (modifiers));
350+ afterOp.setModifiers (convertModifiers (modifiers));
326351
327352 // Make sure we record these, so 'async' values can be updated later.
328353 dataOperands.push_back (beforeOp.getOperation ());
@@ -331,7 +356,8 @@ class OpenACCClauseCIREmitter final
331356
332357 template <typename BeforeOpTy>
333358 void addDataOperand (const Expr *varOperand, mlir::acc::DataClause dataClause,
334- bool structured, bool implicit) {
359+ OpenACCModifierKind modifiers, bool structured,
360+ bool implicit) {
335361 DataOperandInfo opInfo = getDataOperandInfo (dirKind, varOperand);
336362 auto beforeOp =
337363 builder.create <BeforeOpTy>(opInfo.beginLoc , opInfo.varValue , structured,
@@ -340,6 +366,8 @@ class OpenACCClauseCIREmitter final
340366
341367 // Set the 'rest' of the info for the operation.
342368 beforeOp.setDataClause (dataClause);
369+ beforeOp.setModifiers (convertModifiers (modifiers));
370+
343371 // Make sure we record these, so 'async' values can be updated later.
344372 dataOperands.push_back (beforeOp.getOperation ());
345373 }
@@ -818,7 +846,8 @@ class OpenACCClauseCIREmitter final
818846 mlir::acc::KernelsOp>) {
819847 for (auto var : clause.getVarList ())
820848 addDataOperand<mlir::acc::CopyinOp, mlir::acc::CopyoutOp>(
821- var, mlir::acc::DataClause::acc_copy, /* structured=*/ true ,
849+ var, mlir::acc::DataClause::acc_copy, clause.getModifierList (),
850+ /* structured=*/ true ,
822851 /* implicit=*/ false );
823852 } else if constexpr (isCombinedType<OpTy>) {
824853 applyToComputeOp (clause);
@@ -833,8 +862,8 @@ class OpenACCClauseCIREmitter final
833862 if constexpr (isOneOfTypes<OpTy, mlir::acc::HostDataOp>) {
834863 for (auto var : clause.getVarList ())
835864 addDataOperand<mlir::acc::UseDeviceOp>(
836- var, mlir::acc::DataClause::acc_use_device,
837- /* structured= */ true , /* implicit=*/ false );
865+ var, mlir::acc::DataClause::acc_use_device, {}, /* structured= */ true ,
866+ /* implicit=*/ false );
838867 } else {
839868 llvm_unreachable (" Unknown construct kind in VisitUseDeviceClause" );
840869 }
@@ -845,7 +874,8 @@ class OpenACCClauseCIREmitter final
845874 mlir::acc::KernelsOp>) {
846875 for (auto var : clause.getVarList ())
847876 addDataOperand<mlir::acc::DevicePtrOp>(
848- var, mlir::acc::DataClause::acc_deviceptr, /* structured=*/ true ,
877+ var, mlir::acc::DataClause::acc_deviceptr, {},
878+ /* structured=*/ true ,
849879 /* implicit=*/ false );
850880 } else if constexpr (isCombinedType<OpTy>) {
851881 applyToComputeOp (clause);
@@ -861,7 +891,7 @@ class OpenACCClauseCIREmitter final
861891 mlir::acc::KernelsOp>) {
862892 for (auto var : clause.getVarList ())
863893 addDataOperand<mlir::acc::NoCreateOp, mlir::acc::DeleteOp>(
864- var, mlir::acc::DataClause::acc_no_create, /* structured=*/ true ,
894+ var, mlir::acc::DataClause::acc_no_create, {}, /* structured=*/ true ,
865895 /* implicit=*/ false );
866896 } else if constexpr (isCombinedType<OpTy>) {
867897 applyToComputeOp (clause);
@@ -877,7 +907,7 @@ class OpenACCClauseCIREmitter final
877907 mlir::acc::KernelsOp>) {
878908 for (auto var : clause.getVarList ())
879909 addDataOperand<mlir::acc::PresentOp, mlir::acc::DeleteOp>(
880- var, mlir::acc::DataClause::acc_present, /* structured=*/ true ,
910+ var, mlir::acc::DataClause::acc_present, {}, /* structured=*/ true ,
881911 /* implicit=*/ false );
882912 } else if constexpr (isCombinedType<OpTy>) {
883913 applyToComputeOp (clause);
@@ -893,7 +923,7 @@ class OpenACCClauseCIREmitter final
893923 mlir::acc::KernelsOp>) {
894924 for (auto var : clause.getVarList ())
895925 addDataOperand<mlir::acc::AttachOp, mlir::acc::DetachOp>(
896- var, mlir::acc::DataClause::acc_attach, /* structured=*/ true ,
926+ var, mlir::acc::DataClause::acc_attach, {}, /* structured=*/ true ,
897927 /* implicit=*/ false );
898928 } else if constexpr (isCombinedType<OpTy>) {
899929 applyToComputeOp (clause);
0 commit comments