Skip to content

Commit 63c7fe3

Browse files
committed
[flang] support fir.alloca operations inside of omp reduction ops
Advise to place the alloca at the start of the first block of whichever region (init or combiner) we are currently inside. It probably isn't safe to put an alloca inside of a combiner region because this will be executed multiple times. But that would be a bug to fix in Lower/OpenMP.cpp, not here.
1 parent 85df005 commit 63c7fe3

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

flang/lib/Optimizer/Builder/FIRBuilder.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ mlir::Block *fir::FirOpBuilder::getAllocaBlock() {
208208
.getParentOfType<mlir::omp::OutlineableOpenMPOpInterface>()) {
209209
return ompOutlineableIface.getAllocaBlock();
210210
}
211+
if (mlir::isa<mlir::omp::ReductionDeclareOp>(getRegion().getParentOp()))
212+
return &getRegion().front();
211213
if (auto accRecipeIface =
212214
getRegion().getParentOfType<mlir::acc::RecipeInterface>()) {
213215
return accRecipeIface.getAllocaBlock(getRegion());

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,15 @@ class FIROpConversion : public mlir::ConvertOpToLLVMPattern<FromOp> {
410410
mlir::ConversionPatternRewriter &rewriter) const {
411411
auto thisPt = rewriter.saveInsertionPoint();
412412
mlir::Operation *parentOp = rewriter.getInsertionBlock()->getParentOp();
413-
mlir::Block *insertBlock = getBlockForAllocaInsert(parentOp);
414-
rewriter.setInsertionPointToStart(insertBlock);
413+
if (mlir::isa<mlir::omp::ReductionDeclareOp>(parentOp)) {
414+
// ReductionDeclareOp has multiple child regions. We want to get the first
415+
// block of whichever of those regions we are currently in
416+
mlir::Region *parentRegion = rewriter.getInsertionBlock()->getParent();
417+
rewriter.setInsertionPointToStart(&parentRegion->front());
418+
} else {
419+
mlir::Block *insertBlock = getBlockForAllocaInsert(parentOp);
420+
rewriter.setInsertionPointToStart(insertBlock);
421+
}
415422
auto size = genI32Constant(loc, rewriter, 1);
416423
unsigned allocaAs = getAllocaAddressSpace(rewriter);
417424
unsigned programAs = getProgramAddressSpace(rewriter);

0 commit comments

Comments
 (0)