[flang-commits] [flang] [flang][OpenMP] Support user-defined declare reduction with derived types (PR #184897)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Wed Mar 18 03:14:27 PDT 2026
================
@@ -3867,12 +3911,35 @@ static ReductionProcessor::GenCombinerCBTy processReductionCombiner(
if (expectedType == refType.getElementType())
exprResult = fir::LoadOp::create(builder, loc, exprResult);
}
+ // For component-level derived-type combiners (e.g.
+ // omp_out%x = omp_out%x + omp_in%x), the assignment was
+ // not performed during expression lowering since
+ // convertExprToValue only evaluates the RHS value.
+ // The result type won't match the reduction variable type.
+ // Use the typed assignment LHS to store to the correct
+ // component, then skip the whole-variable fir.store below.
+ if (isByRef &&
+ exprResult.getType() != fir::unwrapRefType(lhs.getType())) {
+ if (assign) {
+ lower::StatementContext assignCtx;
+ hlfir::Entity lhsEntity = lower::convertExprToHLFIR(
+ loc, converter, assign->lhs, symTable, assignCtx);
+ hlfir::AssignOp::create(builder, loc, exprResult, lhsEntity);
+ assignCtx.finalizeAndPop();
+ } else {
+ // Fallback: store to omp_out directly (shouldn't normally
+ // happen for well-formed component-level combiners).
+ fir::StoreOp::create(builder, loc, exprResult, ompOutVar);
+ }
+ return mlir::Value{};
+ }
return exprResult;
}},
evalExpr.u);
stmtCtx.finalizeAndPop();
if (isByRef) {
- fir::StoreOp::create(builder, loc, result, lhs);
+ if (result)
+ fir::StoreOp::create(builder, loc, result, lhs);
----------------
tblah wrote:
Maybe instead of having two different paths it would be cleaner to always do the store above?
https://github.com/llvm/llvm-project/pull/184897
More information about the flang-commits
mailing list