@@ -55,36 +55,42 @@ static inline void genOmpAtomicHintAndMemoryOrderClauses(
5555 mlir::omp::ClauseMemoryOrderKindAttr &memoryOrder) {
5656 fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
5757 for (const Fortran::parser::OmpAtomicClause &clause : clauseList.v ) {
58- if (const auto *hintClause =
59- std::get_if<Fortran::parser::OmpHintClause>(&clause.u )) {
60- const auto *expr = Fortran::semantics::GetExpr (hintClause->v );
61- uint64_t hintExprValue = *Fortran::evaluate::ToInt64 (*expr);
62- hint = firOpBuilder.getI64IntegerAttr (hintExprValue);
63- } else if (const auto *ompMemoryOrderClause =
64- std::get_if<Fortran::parser::OmpMemoryOrderClause>(
65- &clause.u )) {
66- if (std::get_if<Fortran::parser::OmpClause::Acquire>(
67- &ompMemoryOrderClause->v .u )) {
68- memoryOrder = mlir::omp::ClauseMemoryOrderKindAttr::get (
69- firOpBuilder.getContext (),
70- mlir::omp::ClauseMemoryOrderKind::Acquire);
71- } else if (std::get_if<Fortran::parser::OmpClause::Relaxed>(
72- &ompMemoryOrderClause->v .u )) {
73- memoryOrder = mlir::omp::ClauseMemoryOrderKindAttr::get (
74- firOpBuilder.getContext (),
75- mlir::omp::ClauseMemoryOrderKind::Relaxed);
76- } else if (std::get_if<Fortran::parser::OmpClause::SeqCst>(
77- &ompMemoryOrderClause->v .u )) {
78- memoryOrder = mlir::omp::ClauseMemoryOrderKindAttr::get (
79- firOpBuilder.getContext (),
80- mlir::omp::ClauseMemoryOrderKind::Seq_cst);
81- } else if (std::get_if<Fortran::parser::OmpClause::Release>(
82- &ompMemoryOrderClause->v .u )) {
83- memoryOrder = mlir::omp::ClauseMemoryOrderKindAttr::get (
84- firOpBuilder.getContext (),
85- mlir::omp::ClauseMemoryOrderKind::Release);
86- }
87- }
58+ common::visit (
59+ common::visitors{
60+ [&](const parser::OmpMemoryOrderClause &s) {
61+ auto kind = common::visit (
62+ common::visitors{
63+ [&](const parser::OmpClause::AcqRel &) {
64+ return mlir::omp::ClauseMemoryOrderKind::Acq_rel;
65+ },
66+ [&](const parser::OmpClause::Acquire &) {
67+ return mlir::omp::ClauseMemoryOrderKind::Acquire;
68+ },
69+ [&](const parser::OmpClause::Relaxed &) {
70+ return mlir::omp::ClauseMemoryOrderKind::Relaxed;
71+ },
72+ [&](const parser::OmpClause::Release &) {
73+ return mlir::omp::ClauseMemoryOrderKind::Release;
74+ },
75+ [&](const parser::OmpClause::SeqCst &) {
76+ return mlir::omp::ClauseMemoryOrderKind::Seq_cst;
77+ },
78+ [&](auto &&) -> mlir::omp::ClauseMemoryOrderKind {
79+ llvm_unreachable (" Unexpected clause" );
80+ },
81+ },
82+ s.v .u );
83+ memoryOrder = mlir::omp::ClauseMemoryOrderKindAttr::get (
84+ firOpBuilder.getContext (), kind);
85+ },
86+ [&](const parser::OmpHintClause &s) {
87+ const auto *expr = Fortran::semantics::GetExpr (s.v );
88+ uint64_t hintExprValue = *Fortran::evaluate::ToInt64 (*expr);
89+ hint = firOpBuilder.getI64IntegerAttr (hintExprValue);
90+ },
91+ [&](const parser::OmpFailClause &) {},
92+ },
93+ clause.u );
8894 }
8995}
9096
0 commit comments