diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -1129,6 +1129,9 @@ bool addWaitAttr = false; bool addSelfAttr = false; + bool hasDefaultNone = false; + bool hasDefaultPresent = false; + fir::FirOpBuilder &builder = converter.getFirOpBuilder(); // Lower clauses values mapped to operands. @@ -1282,6 +1285,14 @@ &clause.u)) { genReductions(reductionClause->v, converter, semanticsContext, stmtCtx, reductionOperands, reductionRecipes); + } else if (const auto *defaultClause = + std::get_if( + &clause.u)) { + if ((defaultClause->v).v == llvm::acc::DefaultValue::ACC_Default_none) + hasDefaultNone = true; + else if ((defaultClause->v).v == + llvm::acc::DefaultValue::ACC_Default_present) + hasDefaultPresent = true; } } @@ -1319,6 +1330,11 @@ if (addSelfAttr) computeOp.setSelfAttrAttr(builder.getUnitAttr()); + if (hasDefaultNone) + computeOp.setDefaultAttr(mlir::acc::ClauseDefaultValue::None); + if (hasDefaultPresent) + computeOp.setDefaultAttr(mlir::acc::ClauseDefaultValue::Present); + if constexpr (!std::is_same_v) { if (!privatizations.empty()) computeOp.setPrivatizationsAttr( diff --git a/flang/test/Lower/OpenACC/acc-kernels.f90 b/flang/test/Lower/OpenACC/acc-kernels.f90 --- a/flang/test/Lower/OpenACC/acc-kernels.f90 +++ b/flang/test/Lower/OpenACC/acc-kernels.f90 @@ -277,4 +277,16 @@ ! CHECK: acc.terminator ! CHECK-NEXT: }{{$}} +!$acc kernels default(none) +!$acc end kernels + +! CHECK: acc.kernels { +! CHECK: } attributes {defaultAttr = #acc} + +!$acc kernels default(present) +!$acc end kernels + +! CHECK: acc.kernels { +! CHECK: } attributes {defaultAttr = #acc} + end subroutine acc_kernels diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90 --- a/flang/test/Lower/OpenACC/acc-parallel.f90 +++ b/flang/test/Lower/OpenACC/acc-parallel.f90 @@ -329,4 +329,16 @@ ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} +!$acc parallel default(none) +!$acc end parallel + +! CHECK: acc.parallel { +! CHECK: } attributes {defaultAttr = #acc} + +!$acc parallel default(present) +!$acc end parallel + +! CHECK: acc.parallel { +! CHECK: } attributes {defaultAttr = #acc} + end subroutine acc_parallel diff --git a/flang/test/Lower/OpenACC/acc-serial.f90 b/flang/test/Lower/OpenACC/acc-serial.f90 --- a/flang/test/Lower/OpenACC/acc-serial.f90 +++ b/flang/test/Lower/OpenACC/acc-serial.f90 @@ -265,4 +265,16 @@ ! CHECK: acc.yield ! CHECK-NEXT: }{{$}} +!$acc serial default(none) +!$acc end serial + +! CHECK: acc.serial { +! CHECK: } attributes {defaultAttr = #acc} + +!$acc serial default(present) +!$acc end serial + +! CHECK: acc.serial { +! CHECK: } attributes {defaultAttr = #acc} + end subroutine