[flang-commits] [flang] [flang] Implement conditional expressions lowering (F2023) (PR #186490)
Caroline Newcombe via flang-commits
flang-commits at lists.llvm.org
Mon Apr 6 14:40:43 PDT 2026
================
@@ -1821,6 +1821,196 @@ class HlfirBuilder {
llvm_unreachable("unknown descriptor inquiry");
}
+ /// Build nested if-then-else chain by walking the right-skewed
+ /// ConditionalExpr tree. The assignValue callback generates and assigns
+ /// each value to avoid evaluating non-taken branches.
+ template <typename T, typename Callback>
+ void
+ buildConditionalIfChain(const Fortran::evaluate::ConditionalExpr<T> &condExpr,
+ const Callback &assignValue) {
+ const mlir::Location loc{getLoc()};
+ fir::FirOpBuilder &builder{getBuilder()};
+ getStmtCtx().pushScope();
+ const hlfir::EntityWithAttributes condEntity{gen(condExpr.condition())};
+ mlir::Value condition{hlfir::loadTrivialScalar(loc, builder, condEntity)};
+ condition = builder.createConvert(loc, builder.getI1Type(), condition);
+ builder.genIfOp(loc, {}, condition, /*withElseRegion=*/true)
+ .genThen([&]() {
+ getStmtCtx().pushScope();
+ assignValue(condExpr.thenValue());
+ getStmtCtx().finalizeAndPop();
+ })
+ .genElse([&]() {
+ // Recurse for nested ConditionalExpr; else assign terminal value.
+ if (const auto *nested =
+ std::get_if<Fortran::evaluate::ConditionalExpr<T>>(
+ &condExpr.elseValue().u)) {
+ buildConditionalIfChain(*nested, assignValue);
+ } else {
+ getStmtCtx().pushScope();
+ assignValue(condExpr.elseValue());
+ getStmtCtx().finalizeAndPop();
+ }
+ })
+ .end();
+ getStmtCtx().finalizeAndPop();
+ }
+
+ /// Generate scalar conditional with lazy evaluation using assignment.
+ /// Creates a temporary and assigns the selected branch value to it.
+ template <typename T>
+ hlfir::Entity genScalarConditionalLazy(
----------------
cenewcombe wrote:
This is a fair nit, I have removed from all
https://github.com/llvm/llvm-project/pull/186490
More information about the flang-commits
mailing list