release/22.x: [flang] Fix lowering failure for some constructs inside a CHANGE TEAM (#184342)#190237
Open
bonachea wants to merge 1 commit intollvm:release/22.xfrom
Open
release/22.x: [flang] Fix lowering failure for some constructs inside a CHANGE TEAM (#184342)#190237bonachea wants to merge 1 commit intollvm:release/22.xfrom
bonachea wants to merge 1 commit intollvm:release/22.xfrom
Conversation
…llvm#184342) This PR is here to fix the `CHANGE_TEAM` construct if it contains an IF/ELSE (construct with a body too) in its body, for example. (cherry picked from commit 0625467)
Member
|
@llvm/pr-subscribers-flang-fir-hlfir Author: Dan Bonachea (bonachea) ChangesBackport 0625467 This PR is here to fix the Patch is 21.77 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/190237.diff 4 Files Affected:
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td
index d9f52025fe104..5ebef0b8d701f 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.td
+++ b/flang/include/flang/Optimizer/Transforms/Passes.td
@@ -629,7 +629,8 @@ def OptimizeArrayRepacking
def MIFOpConversion : Pass<"mif-convert", "mlir::ModuleOp"> {
let summary = "Convert some MIF operations to runtime calls";
- let dependentDialects = ["fir::FIROpsDialect", "mlir::LLVM::LLVMDialect"];
+ let dependentDialects = ["fir::FIROpsDialect", "mlir::LLVM::LLVMDialect",
+ "mlir::cf::ControlFlowDialect"];
}
def LoopInvariantCodeMotion : Pass<"flang-licm", "::mlir::func::FuncOp"> {
diff --git a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
index 0d3d2f6c144ff..192b78626ce06 100644
--- a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
@@ -16,6 +16,7 @@
#include "flang/Optimizer/HLFIR/HLFIROps.h"
#include "flang/Optimizer/Support/DataLayout.h"
#include "flang/Optimizer/Support/InternalNames.h"
+#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
#include "mlir/IR/Matchers.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
@@ -519,6 +520,28 @@ struct MIFFormTeamOpConversion
}
};
+/// Generate runtime call to 'prif_end_team' from mif.end_team operation.
+fir::CallOp genPrifEndTeamCallOp(mif::EndTeamOp op,
+ mlir::PatternRewriter &rewriter) {
+ auto mod = op->template getParentOfType<mlir::ModuleOp>();
+ fir::FirOpBuilder builder(rewriter, mod);
+ mlir::Location loc = op.getLoc();
+ mlir::Type errmsgTy = getPRIFErrmsgType(builder);
+ mlir::FunctionType ftype = mlir::FunctionType::get(
+ builder.getContext(),
+ /*inputs*/ {getPRIFStatType(builder), errmsgTy, errmsgTy},
+ /*results*/ {});
+ mlir::func::FuncOp funcOp =
+ builder.createFunction(loc, getPRIFProcName("end_team"), ftype);
+
+ mlir::Value stat = genStatPRIF(builder, loc, op.getStat());
+ auto [errmsgArg, errmsgAllocArg] =
+ genErrmsgPRIF(builder, loc, op.getErrmsg());
+ llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
+ builder, loc, ftype, stat, errmsgArg, errmsgAllocArg);
+ return fir::CallOp::create(rewriter, loc, funcOp, args);
+}
+
/// Convert mif.change_team operation to runtime call of 'prif_change_team'
struct MIFChangeTeamOpConversion
: public mlir::OpRewritePattern<mif::ChangeTeamOp> {
@@ -529,7 +552,6 @@ struct MIFChangeTeamOpConversion
mlir::PatternRewriter &rewriter) const override {
auto mod = op->template getParentOfType<mlir::ModuleOp>();
fir::FirOpBuilder builder(rewriter, mod);
- builder.setInsertionPoint(op);
mlir::Location loc = op.getLoc();
mlir::Type errmsgTy = getPRIFErrmsgType(builder);
@@ -546,47 +568,41 @@ struct MIFChangeTeamOpConversion
genErrmsgPRIF(builder, loc, op.getErrmsg());
llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
builder, loc, ftype, op.getTeam(), stat, errmsgArg, errmsgAllocArg);
- fir::CallOp::create(builder, loc, funcOp, args);
- mlir::Operation *changeOp = op.getOperation();
- auto &bodyRegion = op.getRegion();
- mlir::Block &bodyBlock = bodyRegion.front();
+ mlir::Operation *changeTeamOp = op.getOperation();
+ mlir::Block *currentBlock = changeTeamOp->getBlock();
+
+ mlir::Block *newBlock = rewriter.splitBlock(
+ currentBlock, std::next(changeTeamOp->getIterator()));
+ rewriter.setInsertionPoint(changeTeamOp);
+ // Creation of the call to prif_change_team
+ fir::CallOp::create(rewriter, loc, funcOp, args);
+
+ // Inlining all the region into the new block
+ mlir::Region &teamRegion = op.getRegion();
+ mlir::Block *firstBlock = &teamRegion.front();
+ mlir::Block *lastBlock = &teamRegion.back();
+ rewriter.inlineRegionBefore(teamRegion, newBlock);
+
+ rewriter.setInsertionPointToEnd(currentBlock);
+ mlir::cf::BranchOp::create(rewriter, loc, firstBlock);
+
+ // Removing mif.end_team operation and add the call to prif_end_team.
+ if (auto endTeamOp =
+ mlir::dyn_cast<mif::EndTeamOp>(lastBlock->getTerminator())) {
+ rewriter.setInsertionPoint(endTeamOp);
+ genPrifEndTeamCallOp(endTeamOp, rewriter);
+ mlir::cf::BranchOp::create(rewriter, loc, newBlock);
+ rewriter.eraseOp(endTeamOp);
+ } else
+ fir::emitFatalError(loc,
+ "internal error: missing expected mif::EndTeamOp");
- rewriter.inlineBlockBefore(&bodyBlock, changeOp);
rewriter.eraseOp(op);
return mlir::success();
}
};
-/// Convert mif.end_team operation to runtime call of 'prif_end_team'
-struct MIFEndTeamOpConversion : public mlir::OpRewritePattern<mif::EndTeamOp> {
- using OpRewritePattern::OpRewritePattern;
-
- mlir::LogicalResult
- matchAndRewrite(mif::EndTeamOp op,
- mlir::PatternRewriter &rewriter) const override {
- auto mod = op->template getParentOfType<mlir::ModuleOp>();
- fir::FirOpBuilder builder(rewriter, mod);
- mlir::Location loc = op.getLoc();
- mlir::Type errmsgTy = getPRIFErrmsgType(builder);
- mlir::FunctionType ftype = mlir::FunctionType::get(
- builder.getContext(),
- /*inputs*/ {getPRIFStatType(builder), errmsgTy, errmsgTy},
- /*results*/ {});
- mlir::func::FuncOp funcOp =
- builder.createFunction(loc, getPRIFProcName("end_team"), ftype);
-
- mlir::Value stat = genStatPRIF(builder, loc, op.getStat());
- auto [errmsgArg, errmsgAllocArg] =
- genErrmsgPRIF(builder, loc, op.getErrmsg());
- llvm::SmallVector<mlir::Value> args = fir::runtime::createArguments(
- builder, loc, ftype, stat, errmsgArg, errmsgAllocArg);
- fir::CallOp callOp = fir::CallOp::create(builder, loc, funcOp, args);
- rewriter.replaceOp(op, callOp);
- return mlir::success();
- }
-};
-
/// Convert mif.get_team operation to runtime call of 'prif_get_team'
struct MIFGetTeamOpConversion : public mlir::OpRewritePattern<mif::GetTeamOp> {
using OpRewritePattern::OpRewritePattern;
@@ -675,7 +691,7 @@ class MIFOpConversion : public fir::impl::MIFOpConversionBase<MIFOpConversion> {
mif::populateMIFOpConversionPatterns(patterns);
- target.addLegalDialect<fir::FIROpsDialect>();
+ target.addLegalDialect<fir::FIROpsDialect, mlir::cf::ControlFlowDialect>();
target.addLegalOp<mlir::ModuleOp>();
if (mlir::failed(mlir::applyPartialConversion(getOperation(), target,
@@ -689,13 +705,11 @@ class MIFOpConversion : public fir::impl::MIFOpConversionBase<MIFOpConversion> {
} // namespace
void mif::populateMIFOpConversionPatterns(mlir::RewritePatternSet &patterns) {
- patterns.insert<MIFInitOpConversion, MIFThisImageOpConversion,
- MIFNumImagesOpConversion, MIFSyncAllOpConversion,
- MIFSyncImagesOpConversion, MIFSyncMemoryOpConversion,
- MIFSyncTeamOpConversion, MIFCoBroadcastOpConversion,
- MIFCoMaxOpConversion, MIFCoMinOpConversion,
- MIFCoSumOpConversion, MIFFormTeamOpConversion,
- MIFChangeTeamOpConversion, MIFEndTeamOpConversion,
- MIFGetTeamOpConversion, MIFTeamNumberOpConversion>(
- patterns.getContext());
+ patterns.insert<
+ MIFInitOpConversion, MIFThisImageOpConversion, MIFNumImagesOpConversion,
+ MIFSyncAllOpConversion, MIFSyncImagesOpConversion,
+ MIFSyncMemoryOpConversion, MIFSyncTeamOpConversion,
+ MIFCoBroadcastOpConversion, MIFCoMaxOpConversion, MIFCoMinOpConversion,
+ MIFCoSumOpConversion, MIFFormTeamOpConversion, MIFChangeTeamOpConversion,
+ MIFGetTeamOpConversion, MIFTeamNumberOpConversion>(patterns.getContext());
}
diff --git a/flang/test/Fir/MIF/change_team2.mlir b/flang/test/Fir/MIF/change_team2.mlir
new file mode 100644
index 0000000000000..7ce2510a88656
--- /dev/null
+++ b/flang/test/Fir/MIF/change_team2.mlir
@@ -0,0 +1,158 @@
+// RUN: fir-opt --mif-convert %s | FileCheck %s
+// mlir generated by the example in flang/test/Lower/MIF/change_team2.f90
+
+func.func @_QQmain() {
+ %0 = fir.dummy_scope : !fir.dscope
+ %1 = fir.alloca i32 {bindc_name = "image_status", uniq_name = "_QFEimage_status"}
+ %2:2 = hlfir.declare %1 {uniq_name = "_QFEimage_status"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ %3 = fir.alloca i32 {bindc_name = "new_team", uniq_name = "_QFEnew_team"}
+ %4:2 = hlfir.declare %3 {uniq_name = "_QFEnew_team"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ %5 = fir.address_of(@_QMiso_fortran_envECstat_failed_image) : !fir.ref<i32>
+ %6:2 = hlfir.declare %5 {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QMiso_fortran_envECstat_failed_image"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ %7 = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team", uniq_name = "_QFEteam"}
+ %8:2 = hlfir.declare %7 {uniq_name = "_QFEteam"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>)
+ %9 = fir.address_of(@_QQ_QM__fortran_builtinsT__builtin_team_type.DerivedInit) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+ fir.copy %9 to %8#0 no_overlap : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+ %10 = mif.this_image : () -> i32
+ %c2_i32 = arith.constant 2 : i32
+ %11 = arith.remsi %10, %c2_i32 : i32
+ %c1_i32 = arith.constant 1 : i32
+ %12 = arith.addi %11, %c1_i32 : i32
+ hlfir.assign %12 to %4#0 : i32, !fir.ref<i32>
+ %13 = fir.load %4#0 : !fir.ref<i32>
+ %14 = fir.embox %8#0 : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+ mif.form_team team_number %13 team_var %14 : (i32, !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> ()
+ %15 = fir.embox %8#0 : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+ mif.change_team %15 : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) {
+ %22 = mif.team_number : () -> i64
+ %23 = fir.convert %22 : (i64) -> i32
+ %24 = fir.load %4#0 : !fir.ref<i32>
+ %25 = arith.cmpi ne, %23, %24 : i32
+ cf.cond_br %25, ^bb1, ^bb2
+ ^bb1: // pred: ^bb0
+ %c1_i32_5 = arith.constant 1 : i32
+ %false_6 = arith.constant false
+ %false_7 = arith.constant false
+ fir.call @_FortranAStopStatement(%c1_i32_5, %false_6, %false_7) fastmath<contract> : (i32, i1, i1) -> ()
+ fir.unreachable
+ ^bb2: // pred: ^bb0
+ mif.end_team : () -> ()
+ }
+ %c0_i128 = arith.constant 0 : i128
+ %16:3 = hlfir.associate %c0_i128 {adapt.valuebyref} : (i128) -> (!fir.ref<i128>, !fir.ref<i128>, i1)
+ %17 = fir.call @_QFPruntime_popcnt(%16#0) fastmath<contract> : (!fir.ref<i128>) -> i32
+ %c0_i32 = arith.constant 0 : i32
+ %18 = arith.cmpi ne, %17, %c0_i32 : i32
+ hlfir.end_associate %16#1, %16#2 : !fir.ref<i128>, i1
+ cf.cond_br %18, ^bb1, ^bb2
+^bb1: // pred: ^bb0
+ %c2_i32_0 = arith.constant 2 : i32
+ %false = arith.constant false
+ %false_1 = arith.constant false
+ fir.call @_FortranAStopStatement(%c2_i32_0, %false, %false_1) fastmath<contract> : (i32, i1, i1) -> ()
+ fir.unreachable
+^bb2: // pred: ^bb0
+ %c1_i128 = arith.constant 1 : i128
+ %19:3 = hlfir.associate %c1_i128 {adapt.valuebyref} : (i128) -> (!fir.ref<i128>, !fir.ref<i128>, i1)
+ %20 = fir.call @_QFPruntime_poppar(%19#0) fastmath<contract> : (!fir.ref<i128>) -> i32
+ %c1_i32_2 = arith.constant 1 : i32
+ %21 = arith.cmpi ne, %20, %c1_i32_2 : i32
+ hlfir.end_associate %19#1, %19#2 : !fir.ref<i128>, i1
+ cf.cond_br %21, ^bb3, ^bb4
+^bb3: // pred: ^bb2
+ %c3_i32 = arith.constant 3 : i32
+ %false_3 = arith.constant false
+ %false_4 = arith.constant false
+ fir.call @_FortranAStopStatement(%c3_i32, %false_3, %false_4) fastmath<contract> : (i32, i1, i1) -> ()
+ fir.unreachable
+^bb4: // pred: ^bb2
+ return
+}
+
+// CHECK: %[[VAL_0:.*]] = fir.alloca i64
+// CHECK: %[[VAL_1:.*]] = fir.alloca i64
+// CHECK: %[[VAL_2:.*]] = fir.alloca i32
+// CHECK: %[[VAL_3:.*]] = fir.dummy_scope : !fir.dscope
+// CHECK: %[[VAL_4:.*]] = fir.alloca i32 {bindc_name = "image_status", uniq_name = "_QFEimage_status"}
+// CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] {uniq_name = "_QFEimage_status"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+// CHECK: %[[VAL_6:.*]] = fir.alloca i32 {bindc_name = "new_team", uniq_name = "_QFEnew_team"}
+// CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]] {uniq_name = "_QFEnew_team"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+// CHECK: %[[VAL_8:.*]] = fir.address_of(@_QMiso_fortran_envECstat_failed_image) : !fir.ref<i32>
+// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_8]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QMiso_fortran_envECstat_failed_image"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+// CHECK: %[[VAL_10:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team", uniq_name = "_QFEteam"}
+// CHECK: %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_10]] {uniq_name = "_QFEteam"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>)
+// CHECK: %[[VAL_12:.*]] = fir.address_of(@_QQ_QM__fortran_builtinsT__builtin_team_type.DerivedInit) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+// CHECK: fir.copy %[[VAL_12]] to %[[VAL_11]]#0 no_overlap : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>, !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+// CHECK: %[[VAL_13:.*]] = fir.absent !fir.box<none>
+// CHECK: fir.call @_QMprifPprif_this_image_no_coarray(%[[VAL_13]], %[[VAL_2]]) : (!fir.box<none>, !fir.ref<i32>) -> ()
+// CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
+// CHECK: %[[C2_i32:.*]] = arith.constant 2 : i32
+// CHECK: %[[VAL_15:.*]] = arith.remsi %[[VAL_14]], %[[C2_i32]] : i32
+// CHECK: %[[C1_i32:.*]] = arith.constant 1 : i32
+// CHECK: %[[VAL_16:.*]] = arith.addi %[[VAL_15]], %[[C1_i32]] : i32
+// CHECK: hlfir.assign %[[VAL_16]] to %[[VAL_7]]#0 : i32, !fir.ref<i32>
+// CHECK: %[[VAL_17:.*]] = fir.load %[[VAL_7]]#0 : !fir.ref<i32>
+// CHECK: %[[VAL_18:.*]] = fir.embox %[[VAL_11]]#0 : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+// CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_17]] : (i32) -> i64
+// CHECK: fir.store %[[VAL_19]] to %[[VAL_1]] : !fir.ref<i64>
+// CHECK: %[[VAL_20:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_21:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_22:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_18]] : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> !fir.box<none>
+// CHECK: fir.call @_QMprifPprif_form_team(%[[VAL_1]], %[[VAL_23]], %[[VAL_20]], %[[VAL_21]], %[[VAL_22]], %[[VAL_22]]) : (!fir.ref<i64>, !fir.box<none>, !fir.ref<i32>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: %[[VAL_24:.*]] = fir.embox %[[VAL_11]]#0 : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>
+// CHECK: %[[VAL_25:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_26:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_24]] : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> !fir.box<none>
+// CHECK: fir.call @_QMprifPprif_change_team(%[[VAL_27]], %[[VAL_25]], %[[VAL_26]], %[[VAL_26]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: cf.br ^bb1
+// CHECK: ^bb1: // pred: ^bb0
+// CHECK: %[[VAL_28:.*]] = fir.absent !fir.box<none>
+// CHECK: fir.call @_QMprifPprif_team_number(%[[VAL_28]], %[[VAL_0]]) : (!fir.box<none>, !fir.ref<i64>) -> ()
+// CHECK: %[[VAL_29:.*]] = fir.load %0 : !fir.ref<i64>
+// CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> i32
+// CHECK: %[[VAL_31:.*]] = fir.load %[[VAL_7]]#0 : !fir.ref<i32>
+// CHECK: %[[VAL_32:.*]] = arith.cmpi ne, %[[VAL_30]], %[[VAL_31]] : i32
+// CHECK: cf.cond_br %[[VAL_32]], ^bb2, ^bb3
+// CHECK: ^bb2: // pred: ^bb1
+// CHECK: %[[C1_i32_0:.*]] = arith.constant 1 : i32
+// CHECK: %[[FALSE:.*]] = arith.constant false
+// CHECK: %[[FALSE_1:.*]] = arith.constant false
+// CHECK: fir.call @_FortranAStopStatement(%[[C1_i32_0]], %[[FALSE]], %[[FALSE_1]]) fastmath<contract> : (i32, i1, i1) -> ()
+// CHECK: fir.unreachable
+// CHECK: ^bb3: // pred: ^bb1
+// CHECK: %[[VAL_33:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_34:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_33]], %[[VAL_34]], %[[VAL_34]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: cf.br ^bb4
+// CHECK: ^bb4: // pred: ^bb3
+// CHECK: %[[C0_i128:.*]] = arith.constant 0 : i128
+// CHECK: %[[VAL_35:.*]]:3 = hlfir.associate %[[C0_i128]] {adapt.valuebyref} : (i128) -> (!fir.ref<i128>, !fir.ref<i128>, i1)
+// CHECK: %[[VAL_36:.*]] = fir.call @_QFPruntime_popcnt(%[[VAL_35]]#0) fastmath<contract> : (!fir.ref<i128>) -> i32
+// CHECK: %[[C0_i32:.*]] = arith.constant 0 : i32
+// CHECK: %[[VAL_37:.*]] = arith.cmpi ne, %[[VAL_36]], %[[C0_i32]] : i32
+// CHECK: hlfir.end_associate %[[VAL_35]]#1, %[[VAL_35]]#2 : !fir.ref<i128>, i1
+// CHECK: cf.cond_br %[[VAL_37]], ^bb5, ^bb6
+// CHECK: ^bb5: // pred: ^bb4
+// CHECK: %[[C2_i32_2:.*]] = arith.constant 2 : i32
+// CHECK: %[[FALSE_3:.*]] = arith.constant false
+// CHECK: %[[FALSE_4:.*]] = arith.constant false
+// CHECK: fir.call @_FortranAStopStatement(%[[C2_i32_2]], %[[FALSE_3]], %[[FALSE_4]]) fastmath<contract> : (i32, i1, i1) -> ()
+// CHECK: fir.unreachable
+// CHECK: ^bb6: // pred: ^bb4
+// CHECK: %[[C1_i128:.*]] = arith.constant 1 : i128
+// CHECK: %[[VAL_38:.*]]:3 = hlfir.associate %[[C1_i128]] {adapt.valuebyref} : (i128) -> (!fir.ref<i128>, !fir.ref<i128>, i1)
+// CHECK: %[[VAL_39:.*]] = fir.call @_QFPruntime_poppar(%[[VAL_38]]#0) fastmath<contract> : (!fir.ref<i128>) -> i32
+// CHECK: %[[C1_i32_5:.*]] = arith.constant 1 : i32
+// CHECK: %[[VAL_40:.*]] = arith.cmpi ne, %[[VAL_39]], %[[C1_i32_5]] : i32
+// CHECK: hlfir.end_associate %[[VAL_38]]#1, %[[VAL_38]]#2 : !fir.ref<i128>, i1
+// CHECK: cf.cond_br %40, ^bb7, ^bb8
+// CHECK: ^bb7: // pred: ^bb6
+// CHECK: %[[C3_i32:.*]] = arith.constant...
[truncated]
|
JDPailleux
approved these changes
Apr 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Backport 0625467
This PR is here to fix the
CHANGE_TEAMconstruct if it contains an IF/ELSE (construct with a body too) in its body, for example.