[flang-commits] [flang] [Flang][OpenMP] Fix crash and IR errors for user-defined reduction on allocatable variables (PR #186765)
via flang-commits
flang-commits at lists.llvm.org
Wed Jul 22 12:48:49 PDT 2026
================
@@ -803,6 +804,185 @@ bool ReductionProcessor::processReductionArguments(
&redOperator.u)) {
if (!ReductionProcessor::supportedIntrinsicProcReduction(
*reductionIntrinsic)) {
+ if (isByRef) {
+ // create a new declare_reduction for the boxed type, reusing
+ // the existing init and combiner
+ semantics::Symbol *sym = reductionIntrinsic->v.sym();
+ llvm::StringRef baseName = {sym->name().begin(),
+ sym->name().size()};
+ mlir::ModuleOp module = builder.getModule();
+ auto existingDecl = module.lookupSymbol<OpType>(baseName);
+ if (!existingDecl) {
+ TODO(currentLocation,
+ "User-defined reductions on allocatable or pointer "
+ "variables: cannot find base reduction declaration");
+ }
+
+ std::string byrefName = getReductionName(
+ baseName, builder.getKindMap(), redType, isByRef);
+
+ mlir::Region &existingInitRegion =
+ existingDecl.getInitializerRegion();
+ auto genInitValueCB =
+ [&existingInitRegion](fir::FirOpBuilder &builder,
+ mlir::Location loc, mlir::Type elemTy,
+ mlir::Value) -> mlir::Value {
+ // unwrap box type to get the scalar element type
+ mlir::Type scalarTy = unwrapSeqOrBoxedType(elemTy);
+ // find a constant-producing op in the existing init region
+ mlir::Operation *constOp = nullptr;
+ existingInitRegion.walk([&](mlir::Operation *op) {
----------------
MattPD wrote:
Verified: the scalar `omp_priv = omp_orig` path reads the original element, and the array case is a clean TODO. Thanks.
https://github.com/llvm/llvm-project/pull/186765
More information about the flang-commits
mailing list