[flang-commits] [flang] [flang] Allow lowering of sub-expressions to be overridden (PR #69944)
via flang-commits
flang-commits at lists.llvm.org
Tue Oct 24 04:15:24 PDT 2023
================
@@ -269,11 +220,37 @@ static inline void genOmpAccAtomicUpdateStatement(
// }
// return
// }
- mlir::Value updateVar = converter.getSymbolAddress(*name->symbol);
- if (auto decl = updateVar.getDefiningOp<hlfir::DeclareOp>())
- updateVar = decl.getBase();
- firOpBuilder.setInsertionPointAfter(tempOp);
+ Fortran::lower::ExprToValueMap exprValueOverrides;
+ // Lower any non atomic sub-expression before the atomic operation, and
+ // map its lowered value to the semantic representation.
+ const Fortran::lower::SomeExpr *nonAtomicSubExpr{nullptr};
+ std::visit(
+ [&](const auto &op) -> void {
+ using T = std::decay_t<decltype(op)>;
+ if constexpr (std::is_base_of<Fortran::parser::Expr::IntrinsicBinary,
+ T>::value) {
+ const auto &exprLeft{std::get<0>(op.t)};
+ const auto &exprRight{std::get<1>(op.t)};
+ if (exprLeft.value().source == assignmentStmtVariable.GetSource())
+ nonAtomicSubExpr = Fortran::semantics::GetExpr(exprRight);
+ else
+ nonAtomicSubExpr = Fortran::semantics::GetExpr(exprLeft);
+ }
----------------
jeanPerier wrote:
I suppose you can indeed go through the intrinsic function arguments here too yes, @NimishMishra, I do not plan to work on this, so I am happy if you do in a later patch!
https://github.com/llvm/llvm-project/pull/69944
More information about the flang-commits
mailing list