diff options
| author | Mingming Liu <mingmingl@google.com> | 2025-09-10 15:25:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-10 15:25:31 -0700 |
| commit | 1417dafa1db9cb1b2b09438aa9f53ea5ab6e36e2 (patch) | |
| tree | 57f4b1f313c8cf74eed8819870f39c36ea263c68 /flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp | |
| parent | 898b813bc8a6d0276bf0f4769f5f2f64b34e632d (diff) | |
| parent | b8cefcb601ddaa18482555c4ff363c01a270c2fe (diff) | |
Merge branch 'main' into users/mingmingl-llvm/samplefdo-profile-formatusers/mingmingl-llvm/samplefdo-profile-format
Diffstat (limited to 'flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp')
| -rw-r--r-- | flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp b/flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp index c6aec96ceb5a..03f97ebdc635 100644 --- a/flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp +++ b/flang/lib/Optimizer/Transforms/SimplifyFIROperations.cpp @@ -210,19 +210,33 @@ public: mapper.map(region.getArguments(), regionArgs); for (mlir::Operation &op : region.front().without_terminator()) (void)rewriter.clone(op, mapper); + + auto yield = mlir::cast<fir::YieldOp>(region.front().getTerminator()); + assert(yield.getResults().size() < 2); + + return yield.getResults().empty() + ? mlir::Value{} + : mapper.lookup(yield.getResults()[0]); }; - if (!localizer.getInitRegion().empty()) - cloneLocalizerRegion(localizer.getInitRegion(), {localVar, localArg}, - rewriter.getInsertionPoint()); + if (!localizer.getInitRegion().empty()) { + // Prefer the value yielded from the init region to the allocated + // private variable in case the region is operating on arguments + // by-value (e.g. Fortran character boxes). + localAlloc = cloneLocalizerRegion(localizer.getInitRegion(), + {localVar, localAlloc}, + rewriter.getInsertionPoint()); + assert(localAlloc); + } if (localizer.getLocalitySpecifierType() == fir::LocalitySpecifierType::LocalInit) - cloneLocalizerRegion(localizer.getCopyRegion(), {localVar, localArg}, + cloneLocalizerRegion(localizer.getCopyRegion(), + {localVar, localAlloc}, rewriter.getInsertionPoint()); if (!localizer.getDeallocRegion().empty()) - cloneLocalizerRegion(localizer.getDeallocRegion(), {localArg}, + cloneLocalizerRegion(localizer.getDeallocRegion(), {localAlloc}, rewriter.getInsertionBlock()->end()); rewriter.replaceAllUsesWith(localArg, localAlloc); |
