[flang-commits] [flang] [Flang] Fix lowering failure for some constructs inside a CHANGE TEAM (PR #184342)
Jean-Didier PAILLEUX via flang-commits
flang-commits at lists.llvm.org
Fri Mar 27 08:09:47 PDT 2026
https://github.com/JDPailleux updated https://github.com/llvm/llvm-project/pull/184342
>From 84838fc15e4456228fa71eba60940c3f41e6908e Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Tue, 3 Mar 2026 14:38:11 +0100
Subject: [PATCH 1/4] [Flang] Moving MIFOpConverion pass earlier
Moving this pass earlier is necessary because we are moving the body of
the mif.change_team operation. If this operation have at least one
operation with a body too, moving these operations (notably in fir.if,
for example) after they have been translated into several blocks can
be dangerous and can generate an error of translation.
---
flang/lib/Optimizer/Passes/Pipelines.cpp | 2 +-
flang/test/Driver/bbc-mlir-pass-pipeline.f90 | 1 +
.../test/Driver/mlir-debug-pass-pipeline.f90 | 2 +-
flang/test/Driver/mlir-pass-pipeline.f90 | 2 +-
flang/test/Fir/MIF/change_team2.mlir | 101 ++++++++++++++++++
flang/test/Fir/basic-program.fir | 2 +-
6 files changed, 106 insertions(+), 4 deletions(-)
create mode 100644 flang/test/Fir/MIF/change_team2.mlir
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index 9b73d587ee7bc..73f92bf26e025 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -176,6 +176,7 @@ void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config) {
/// \param pm - MLIR pass manager that will hold the pipeline definition
void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
MLIRToLLVMPassPipelineConfig &pc) {
+ pm.addPass(fir::createMIFOpConversion());
// Early Optimizer EP Callback
pc.invokeFIROptEarlyEPCallbacks(pm, pc.OptLevel);
@@ -371,7 +372,6 @@ void createDebugPasses(mlir::PassManager &pm,
void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
MLIRToLLVMPassPipelineConfig config,
llvm::StringRef inputFilename) {
- pm.addPass(fir::createMIFOpConversion());
fir::addBoxedProcedurePass(pm);
if (config.OptLevel.isOptimizingForSpeed() && config.AliasAnalysis &&
!disableFirAliasTags && !useOldAliasTags)
diff --git a/flang/test/Driver/bbc-mlir-pass-pipeline.f90 b/flang/test/Driver/bbc-mlir-pass-pipeline.f90
index 21697485a2a89..ebd86e4aad170 100644
--- a/flang/test/Driver/bbc-mlir-pass-pipeline.f90
+++ b/flang/test/Driver/bbc-mlir-pass-pipeline.f90
@@ -9,6 +9,7 @@
! CHECK: Pass statistics report
! CHECK: Fortran::lower::VerifierPass
+! CHECK-NEXT: MIFOpConversion
! CHECK-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
diff --git a/flang/test/Driver/mlir-debug-pass-pipeline.f90 b/flang/test/Driver/mlir-debug-pass-pipeline.f90
index 3f6bde2ded67b..db7bc052f3f27 100644
--- a/flang/test/Driver/mlir-debug-pass-pipeline.f90
+++ b/flang/test/Driver/mlir-debug-pass-pipeline.f90
@@ -43,6 +43,7 @@
! ALL-NEXT: LowerHLFIRIntrinsics
! ALL-NEXT: BufferizeHLFIR
! ALL-NEXT: ConvertHLFIRtoFIR
+! ALL-NEXT: MIFOpConversion
! ALL-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
@@ -107,7 +108,6 @@
! ALL-NEXT: CSE
! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
-! ALL-NEXT: MIFOpConversion
! ALL-NEXT: BoxedProcedurePass
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'gpu.module', 'omp.declare_mapper', 'omp.declare_reduction', 'omp.private']
diff --git a/flang/test/Driver/mlir-pass-pipeline.f90 b/flang/test/Driver/mlir-pass-pipeline.f90
index 630076a7947ff..ed434877f0da3 100644
--- a/flang/test/Driver/mlir-pass-pipeline.f90
+++ b/flang/test/Driver/mlir-pass-pipeline.f90
@@ -88,6 +88,7 @@
! O2-NEXT: 'omp.private' Pipeline
! O2-NEXT: InlineHLFIRAssign
! ALL-NEXT: ConvertHLFIRtoFIR
+! ALL-NEXT: MIFOpConversion
! ALL-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
@@ -159,7 +160,6 @@
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
! O2-NEXT: 'func.func' Pipeline
! O2-NEXT: SetRuntimeCallAttributes
-! ALL-NEXT: MIFOpConversion
! ALL-NEXT: BoxedProcedurePass
! O2-NEXT: AddAliasTags
diff --git a/flang/test/Fir/MIF/change_team2.mlir b/flang/test/Fir/MIF/change_team2.mlir
new file mode 100644
index 0000000000000..4d18eb6827795
--- /dev/null
+++ b/flang/test/Fir/MIF/change_team2.mlir
@@ -0,0 +1,101 @@
+// RUN: fir-opt --mif-convert %s | FileCheck %s
+
+module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little", "dlti.mangling_mode" = "e", "dlti.legal_int_widths" = array<i32: 8, 16, 32, 64>, "dlti.stack_alignment" = 128 : i64>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang version 23.0.0 (git at github.com:SiPearl/llvm-project.git 5acb5b14086f4f61f007a6fc14a86e930bd1d247)", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
+ func.func @_QQmain() attributes {fir.bindc_name = "TEST_NESTED_TEAMS"} {
+ %0 = fir.dummy_scope : !fir.dscope
+ %1 = fir.alloca i32 {bindc_name = "me", uniq_name = "_QFEme"}
+ %2:2 = hlfir.declare %1 {uniq_name = "_QFEme"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ %3 = fir.alloca i32 {bindc_name = "ni", uniq_name = "_QFEni"}
+ %4:2 = hlfir.declare %3 {uniq_name = "_QFEni"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ %5 = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_global", uniq_name = "_QFEteam_global"}
+ %6:2 = hlfir.declare %5 {uniq_name = "_QFEteam_global"} : (!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}>>)
+ %7 = 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 %7 to %6#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}>>
+ %8 = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_sub", uniq_name = "_QFEteam_sub"}
+ %9:2 = hlfir.declare %8 {uniq_name = "_QFEteam_sub"} : (!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}>>)
+ %10 = 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 %10 to %9#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}>>
+ %11 = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
+ %12:2 = hlfir.declare %11 {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ %13 = mif.this_image : () -> i32
+ hlfir.assign %13 to %2#0 : i32, !fir.ref<i32>
+ %14 = mif.num_images : () -> i32
+ hlfir.assign %14 to %4#0 : i32, !fir.ref<i32>
+ %c1_i32 = arith.constant 1 : i32
+ %15 = fir.embox %6#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 %c1_i32 team_var %15 : (i32, !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> ()
+ %c2_i32 = arith.constant 2 : i32
+ %16 = fir.load %2#0 : !fir.ref<i32>
+ %17 = arith.remsi %16, %c2_i32 : i32
+ %c1_i32_0 = arith.constant 1 : i32
+ %18 = arith.addi %17, %c1_i32_0 : i32
+ %19 = fir.embox %9#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 %18 team_var %19 : (i32, !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> ()
+ %20 = fir.embox %6#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 %20 : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) {
+ %c6_i32 = arith.constant 6 : i32
+ %21 = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
+ %22 = fir.convert %21 : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
+ %c15_i32 = arith.constant 15 : i32
+ %23 = fir.call @_FortranAioBeginExternalListOutput(%c6_i32, %22, %c15_i32) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
+ %24 = fir.address_of(@_QQclX44616E73206C61207465616D20676C6F62616C65) : !fir.ref<!fir.char<1,20>>
+ %c20 = arith.constant 20 : index
+ %25:2 = hlfir.declare %24 typeparams %c20 {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX44616E73206C61207465616D20676C6F62616C65"} : (!fir.ref<!fir.char<1,20>>, index) -> (!fir.ref<!fir.char<1,20>>, !fir.ref<!fir.char<1,20>>)
+ %26 = fir.convert %25#0 : (!fir.ref<!fir.char<1,20>>) -> !fir.ref<i8>
+ %27 = fir.convert %c20 : (index) -> i64
+ %28 = fir.call @_FortranAioOutputAscii(%23, %26, %27) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
+ %29 = fir.call @_FortranAioEndIoStatement(%23) fastmath<contract> : (!fir.ref<i8>) -> i32
+ %30 = fir.load %2#0 : !fir.ref<i32>
+ %c2_i32_1 = arith.constant 2 : i32
+ %31 = arith.cmpi eq, %30, %c2_i32_1 : i32
+ fir.if %31 {
+ %33 = fir.load %4#0 : !fir.ref<i32>
+ %c0_i32 = arith.constant 0 : i32
+ %34 = arith.addi %33, %c0_i32 : i32
+ hlfir.assign %34 to %12#0 : i32, !fir.ref<i32>
+ } else {
+ %c2_i32_2 = arith.constant 2 : i32
+ %33 = fir.load %2#0 : !fir.ref<i32>
+ %34 = arith.muli %c2_i32_2, %33 : i32
+ hlfir.assign %34 to %12#0 : i32, !fir.ref<i32>
+ }
+ %32 = fir.embox %9#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 %32 : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) {
+ %c6_i32_2 = arith.constant 6 : i32
+ %33 = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
+ %34 = fir.convert %33 : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
+ %c23_i32 = arith.constant 23 : i32
+ %35 = fir.call @_FortranAioBeginExternalListOutput(%c6_i32_2, %34, %c23_i32) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
+ %36 = fir.address_of(@_QQclX327beca4c668cfd5c48dd70a28c39c6d) : !fir.ref<!fir.char<1,36>>
+ %c36 = arith.constant 36 : index
+ %37:2 = hlfir.declare %36 typeparams %c36 {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX327beca4c668cfd5c48dd70a28c39c6d"} : (!fir.ref<!fir.char<1,36>>, index) -> (!fir.ref<!fir.char<1,36>>, !fir.ref<!fir.char<1,36>>)
+ %38 = fir.convert %37#0 : (!fir.ref<!fir.char<1,36>>) -> !fir.ref<i8>
+ %39 = fir.convert %c36 : (index) -> i64
+ %40 = fir.call @_FortranAioOutputAscii(%35, %38, %39) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
+ %41 = fir.call @_FortranAioEndIoStatement(%35) fastmath<contract> : (!fir.ref<i8>) -> i32
+ mif.end_team : () -> ()
+ }
+ mif.end_team : () -> ()
+ }
+ return
+ }
+}
+// CHECK: fir.call @_QMprifPprif_change_team(%[[VAL_3:.*]], %[[VAL_1:.*]], %[[VAL_2:.*]], %[[VAL_2:.*]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+
+// Just to show that we can handle operations with body inside change_team
+// CHECK: fir.if %[[COND:.*]] {
+// CHECK: } else {
+// CHECK: }
+
+// We can handle also another change_team operation inside.
+// CHECK: %[[VAL_4:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_5:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_6:.*]] = fir.convert %[[TEAM2:.*]] : ({{.*}}) -> !fir.box<none>
+// CHECK: fir.call @_QMprifPprif_change_team(%[[VAL_6]], %[[VAL_4]], %[[VAL_5]], %[[VAL_5]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+
+// CHECK: %[[VAL_7:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_8:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_7]], %[[VAL_8]], %[[VAL_8]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: %[[VAL_9:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_10:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_9]], %[[VAL_10]], %[[VAL_10]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
diff --git a/flang/test/Fir/basic-program.fir b/flang/test/Fir/basic-program.fir
index 5f84395b36037..dde8dd1a32e95 100644
--- a/flang/test/Fir/basic-program.fir
+++ b/flang/test/Fir/basic-program.fir
@@ -80,6 +80,7 @@ func.func @_QQmain() {
// PASSES-NEXT: ConvertHLFIRtoFIR
// PASSES-NEXT: LowerWorkshare
// PASSES-NEXT: LowerWorkdistribute
+// PASSES-NEXT: MIFOpConversion
// PASSES-NEXT: CSE
// PASSES-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
@@ -147,7 +148,6 @@ func.func @_QQmain() {
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
// PASSES-NEXT: 'func.func' Pipeline
// PASSES-NEXT: SetRuntimeCallAttributes
-// PASSES-NEXT: MIFOpConversion
// PASSES-NEXT: BoxedProcedurePass
// PASSES-NEXT: AddAliasTags
>From 106241b3edc159d9cb0722e6cc87d4e9e35f4c1b Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Mon, 16 Mar 2026 10:38:57 +0100
Subject: [PATCH 2/4] Updating ChangeTeamOp conversion + revert of
MIFOpConversion place
---
flang/lib/Optimizer/Passes/Pipelines.cpp | 2 +-
.../Optimizer/Transforms/MIFOpConversion.cpp | 101 ++++++++------
flang/test/Driver/bbc-mlir-pass-pipeline.f90 | 1 -
.../test/Driver/mlir-debug-pass-pipeline.f90 | 2 +-
flang/test/Driver/mlir-pass-pipeline.f90 | 2 +-
flang/test/Fir/MIF/change_team2.mlir | 128 +++++++++++++++---
flang/test/Fir/basic-program.fir | 2 +-
7 files changed, 171 insertions(+), 67 deletions(-)
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index 73f92bf26e025..9b73d587ee7bc 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -176,7 +176,6 @@ void registerDefaultInlinerPass(MLIRToLLVMPassPipelineConfig &config) {
/// \param pm - MLIR pass manager that will hold the pipeline definition
void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm,
MLIRToLLVMPassPipelineConfig &pc) {
- pm.addPass(fir::createMIFOpConversion());
// Early Optimizer EP Callback
pc.invokeFIROptEarlyEPCallbacks(pm, pc.OptLevel);
@@ -372,6 +371,7 @@ void createDebugPasses(mlir::PassManager &pm,
void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
MLIRToLLVMPassPipelineConfig config,
llvm::StringRef inputFilename) {
+ pm.addPass(fir::createMIFOpConversion());
fir::addBoxedProcedurePass(pm);
if (config.OptLevel.isOptimizingForSpeed() && config.AliasAnalysis &&
!disableFirAliasTags && !useOldAliasTags)
diff --git a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
index fed941c0afbe6..1b4fe5c130e5e 100644
--- a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
@@ -17,6 +17,7 @@
#include "flang/Optimizer/Support/DataLayout.h"
#include "flang/Optimizer/Support/InternalNames.h"
#include "flang/Runtime/stop.h"
+#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
#include "mlir/IR/Matchers.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
@@ -658,6 +659,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> {
@@ -668,7 +691,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);
@@ -685,47 +707,39 @@ 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.
+ auto endTeamOp = mlir::dyn_cast<mif::EndTeamOp>(lastBlock->getTerminator());
+ if (endTeamOp) {
+ rewriter.setInsertionPoint(endTeamOp);
+ genPrifEndTeamCallOp(endTeamOp, rewriter);
+ mlir::cf::BranchOp::create(rewriter, loc, newBlock);
+ rewriter.eraseOp(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;
@@ -815,6 +829,7 @@ class MIFOpConversion : public fir::impl::MIFOpConversionBase<MIFOpConversion> {
mif::populateMIFOpConversionPatterns(patterns);
target.addLegalDialect<fir::FIROpsDialect>();
+ target.addLegalDialect<mlir::cf::ControlFlowDialect>();
target.addLegalOp<mlir::ModuleOp>();
if (mlir::failed(mlir::applyPartialConversion(getOperation(), target,
@@ -828,13 +843,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/Driver/bbc-mlir-pass-pipeline.f90 b/flang/test/Driver/bbc-mlir-pass-pipeline.f90
index ebd86e4aad170..21697485a2a89 100644
--- a/flang/test/Driver/bbc-mlir-pass-pipeline.f90
+++ b/flang/test/Driver/bbc-mlir-pass-pipeline.f90
@@ -9,7 +9,6 @@
! CHECK: Pass statistics report
! CHECK: Fortran::lower::VerifierPass
-! CHECK-NEXT: MIFOpConversion
! CHECK-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
diff --git a/flang/test/Driver/mlir-debug-pass-pipeline.f90 b/flang/test/Driver/mlir-debug-pass-pipeline.f90
index db7bc052f3f27..3f6bde2ded67b 100644
--- a/flang/test/Driver/mlir-debug-pass-pipeline.f90
+++ b/flang/test/Driver/mlir-debug-pass-pipeline.f90
@@ -43,7 +43,6 @@
! ALL-NEXT: LowerHLFIRIntrinsics
! ALL-NEXT: BufferizeHLFIR
! ALL-NEXT: ConvertHLFIRtoFIR
-! ALL-NEXT: MIFOpConversion
! ALL-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
@@ -108,6 +107,7 @@
! ALL-NEXT: CSE
! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
+! ALL-NEXT: MIFOpConversion
! ALL-NEXT: BoxedProcedurePass
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'gpu.module', 'omp.declare_mapper', 'omp.declare_reduction', 'omp.private']
diff --git a/flang/test/Driver/mlir-pass-pipeline.f90 b/flang/test/Driver/mlir-pass-pipeline.f90
index ed434877f0da3..630076a7947ff 100644
--- a/flang/test/Driver/mlir-pass-pipeline.f90
+++ b/flang/test/Driver/mlir-pass-pipeline.f90
@@ -88,7 +88,6 @@
! O2-NEXT: 'omp.private' Pipeline
! O2-NEXT: InlineHLFIRAssign
! ALL-NEXT: ConvertHLFIRtoFIR
-! ALL-NEXT: MIFOpConversion
! ALL-NEXT: CSE
! Ideally, we need an output with only the pass names, but
! there is currently no way to get that, so in order to
@@ -160,6 +159,7 @@
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
! O2-NEXT: 'func.func' Pipeline
! O2-NEXT: SetRuntimeCallAttributes
+! ALL-NEXT: MIFOpConversion
! ALL-NEXT: BoxedProcedurePass
! O2-NEXT: AddAliasTags
diff --git a/flang/test/Fir/MIF/change_team2.mlir b/flang/test/Fir/MIF/change_team2.mlir
index 4d18eb6827795..e53a64e7daef5 100644
--- a/flang/test/Fir/MIF/change_team2.mlir
+++ b/flang/test/Fir/MIF/change_team2.mlir
@@ -80,22 +80,114 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vec
return
}
}
-// CHECK: fir.call @_QMprifPprif_change_team(%[[VAL_3:.*]], %[[VAL_1:.*]], %[[VAL_2:.*]], %[[VAL_2:.*]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-// Just to show that we can handle operations with body inside change_team
-// CHECK: fir.if %[[COND:.*]] {
-// CHECK: } else {
-// CHECK: }
-
-// We can handle also another change_team operation inside.
-// CHECK: %[[VAL_4:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_5:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: %[[VAL_6:.*]] = fir.convert %[[TEAM2:.*]] : ({{.*}}) -> !fir.box<none>
-// CHECK: fir.call @_QMprifPprif_change_team(%[[VAL_6]], %[[VAL_4]], %[[VAL_5]], %[[VAL_5]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-
-// CHECK: %[[VAL_7:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_8:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_7]], %[[VAL_8]], %[[VAL_8]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-// CHECK: %[[VAL_9:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_10:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_9]], %[[VAL_10]], %[[VAL_10]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: %[[VAL_0:.*]] = fir.alloca i64
+// CHECK: %[[VAL_1:.*]] = fir.alloca i64
+// CHECK: %[[VAL_2:.*]] = fir.alloca i32
+// CHECK: %[[VAL_3:.*]] = fir.alloca i32
+// CHECK: %[[VAL_4:.*]] = fir.dummy_scope : !fir.dscope
+// CHECK: %[[VAL_5:.*]] = fir.alloca i32 {bindc_name = "me", uniq_name = "_QFEme"}
+// CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]] {uniq_name = "_QFEme"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+// CHECK: %[[VAL_7:.*]] = fir.alloca i32 {bindc_name = "ni", uniq_name = "_QFEni"}
+// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_7]] {uniq_name = "_QFEni"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+// CHECK: %[[VAL_9:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_global", uniq_name = "_QFEteam_global"}
+// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_9:.*]] {uniq_name = "_QFEteam_global"} : (!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_11:.*]] = 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_11:.*]] to %[[VAL_10:.*]]#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_12:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_sub", uniq_name = "_QFEteam_sub"}
+// CHECK: %[[VAL_13:.*]]:2 = hlfir.declare %[[VAL_12:.*]] {uniq_name = "_QFEteam_sub"} : (!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_14:.*]] = 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_14]] to %[[VAL_13]]#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_15:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
+// CHECK: %[[VAL_16:.*]]:2 = hlfir.declare %[[VAL_15]] {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+// CHECK: %[[VAL_17:.*]] = fir.absent !fir.box<none>
+// CHECK: fir.call @_QMprifPprif_this_image_no_coarray(%[[VAL_17]], %[[VAL_3]]) : (!fir.box<none>, !fir.ref<i32>) -> ()
+// CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
+// CHECK: hlfir.assign %[[VAL_18]] to %[[VAL_6]]#0 : i32, !fir.ref<i32>
+// CHECK: fir.call @_QMprifPprif_num_images(%[[VAL_2]]) : (!fir.ref<i32>) -> ()
+// CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
+// CHECK: hlfir.assign %[[VAL_19]] to %[[VAL_8]]#0 : i32, !fir.ref<i32>
+// CHECK: %[[C1_I32:.*]] = arith.constant 1 : i32
+// CHECK: %[[VAL_20:.*]] = fir.embox %[[VAL_10]]#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_21:.*]] = fir.convert %[[C1_I32]] : (i32) -> i64
+// CHECK: fir.store %[[VAL_21]] to %[[VAL_1]] : !fir.ref<i64>
+// CHECK: %[[VAL_22:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_23:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_24:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_20]] : (!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_25]], %[[VAL_22]], %[[VAL_23]], %[[VAL_24]], %[[VAL_24]]) : (!fir.ref<i64>, !fir.box<none>, !fir.ref<i32>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: %[[C2_I32:.*]] = arith.constant 2 : i32
+// CHECK: %[[VAL_26:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<i32>
+// CHECK: %[[VAL_27:.*]] = arith.remsi %[[VAL_26]], %[[C2_I32]] : i32
+// CHECK: %[[C1_I32_0:.*]] = arith.constant 1 : i32
+// CHECK: %[[VAL_28:.*]] = arith.addi %[[VAL_27]], %[[C1_I32_0]] : i32
+// CHECK: %[[VAL_29:.*]] = fir.embox %[[VAL_13]]#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_30:.*]] = fir.convert %[[VAL_28]] : (i32) -> i64
+// CHECK: fir.store %[[VAL_30]] to %[[VAL_0]] : !fir.ref<i64>
+// CHECK: %[[VAL_31:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_32:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_33:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_29]] : (!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_0]], %[[VAL_34]], %[[VAL_31]], %[[VAL_32]], %[[VAL_33]], %[[VAL_33]]) : (!fir.ref<i64>, !fir.box<none>, !fir.ref<i32>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: %[[VAL_35:.*]] = fir.embox %[[VAL_10]]#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_36:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_37:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_35]] : (!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_38]], %[[VAL_36]], %[[VAL_37]], %[[VAL_37]]) : (!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: %[[C6_I32:.*]] = arith.constant 6 : i32
+// CHECK: %[[VAL_39:.*]] = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
+// CHECK: %[[VAL_40:.*]] = fir.convert %[[VAL_39]] : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
+// CHECK: %[[C15_I32:.*]] = arith.constant 15 : i32
+// CHECK: %[[VAL_41:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[C6_I32]], %[[VAL_40]], %[[C15_I32]]) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
+// CHECK: %[[VAL_42:.*]] = fir.address_of(@_QQclX44616E73206C61207465616D20676C6F62616C65) : !fir.ref<!fir.char<1,20>>
+// CHECK: %[[C20:.*]] = arith.constant 20 : index
+// CHECK: %[[VAL_43:.*]]:2 = hlfir.declare %[[VAL_42]] typeparams %[[C20]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX44616E73206C61207465616D20676C6F62616C65"} : (!fir.ref<!fir.char<1,20>>, index) -> (!fir.ref<!fir.char<1,20>>, !fir.ref<!fir.char<1,20>>)
+// CHECK: %[[VAL_44:.*]] = fir.convert %[[VAL_43]]#0 : (!fir.ref<!fir.char<1,20>>) -> !fir.ref<i8>
+// CHECK: %[[VAL_45:.*]] = fir.convert %[[C20]] : (index) -> i64
+// CHECK: %[[VAL_46:.*]] = fir.call @_FortranAioOutputAscii(%[[VAL_41]], %[[VAL_44]], %[[VAL_45]]) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
+// CHECK: %[[VAL_47:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_41]]) fastmath<contract> : (!fir.ref<i8>) -> i32
+// CHECK: %[[VAL_48:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<i32>
+// CHECK: %[[C2_I32_1:.*]] = arith.constant 2 : i32
+// CHECK: %[[VAL_49:.*]] = arith.cmpi eq, %[[VAL_48]], %[[C2_I32_1]] : i32
+// CHECK: fir.if %49 {
+// CHECK: %[[VAL_67:.*]] = fir.load %[[VAL_8]]#0 : !fir.ref<i32>
+// CHECK: %[[C0_I32:.*]] = arith.constant 0 : i32
+// CHECK: hlfir.assign %[[VAL_67]] to %[[VAL_16]]#0 : i32, !fir.ref<i32>
+// CHECK: } else {
+// CHECK: %[[C2_I32_3:.*]] = arith.constant 2 : i32
+// CHECK: %[[VAL_67:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<i32>
+// CHECK: %[[VAL_68:.*]] = arith.muli %[[VAL_67]], %[[C2_I32_3]] : i32
+// CHECK: hlfir.assign %[[VAL_68]] to %[[VAL_16]]#0 : i32, !fir.ref<i32>
+// CHECK: }
+// CHECK: %[[VAL_50:.*]] = fir.embox %[[VAL_13]]#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_51:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_52:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: %[[VAL_53:.*]] = fir.convert %[[VAL_50]] : (!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_53]], %[[VAL_51]], %[[VAL_52]], %[[VAL_52]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: cf.br ^bb2
+// CHECK: ^bb2: // pred: ^bb1
+// CHECK: %[[C6_I32_2:.*]] = arith.constant 6 : i32
+// CHECK: %[[VAL_54:.*]] = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
+// CHECK: %[[VAL_55:.*]] = fir.convert %[[VAL_54]] : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
+// CHECK: %[[C23_I32:.*]] = arith.constant 23 : i32
+// CHECK: %[[VAL_56:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[C6_I32_2]], %[[VAL_55]], %[[C23_I32]]) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
+// CHECK: %[[VAL_57:.*]] = fir.address_of(@_QQclX327beca4c668cfd5c48dd70a28c39c6d) : !fir.ref<!fir.char<1,36>>
+// CHECK: %[[C36:.*]] = arith.constant 36 : index
+// CHECK: %[[VAL_58:.*]]:2 = hlfir.declare %[[VAL_57]] typeparams %[[C36]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX327beca4c668cfd5c48dd70a28c39c6d"} : (!fir.ref<!fir.char<1,36>>, index) -> (!fir.ref<!fir.char<1,36>>, !fir.ref<!fir.char<1,36>>)
+// CHECK: %[[VAL_59:.*]] = fir.convert %[[VAL_58]]#0 : (!fir.ref<!fir.char<1,36>>) -> !fir.ref<i8>
+// CHECK: %[[VAL_60:.*]] = fir.convert %[[C36]] : (index) -> i64
+// CHECK: %[[VAL_61:.*]] = fir.call @_FortranAioOutputAscii(%[[VAL_56]], %[[VAL_59]], %[[VAL_60]]) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
+// CHECK: %[[VAL_62:.*]] = fir.call @_FortranAioEndIoStatement(%56) fastmath<contract> : (!fir.ref<i8>) -> i32
+// CHECK: %[[VAL_63:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_64:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_63]], %[[VAL_64]], %[[VAL_64]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: cf.br ^bb3
+// CHECK: ^bb3: // pred: ^bb2
+// CHECK: %[[VAL_65:.*]] = fir.absent !fir.ref<i32>
+// CHECK: %[[VAL_66:.*]] = fir.absent !fir.box<!fir.char<1,?>>
+// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_65]], %[[VAL_66]], %[[VAL_66]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// CHECK: cf.br ^bb4
+// CHECK: ^bb4: // pred: ^bb3
+// CHECK: return
diff --git a/flang/test/Fir/basic-program.fir b/flang/test/Fir/basic-program.fir
index dde8dd1a32e95..5f84395b36037 100644
--- a/flang/test/Fir/basic-program.fir
+++ b/flang/test/Fir/basic-program.fir
@@ -80,7 +80,6 @@ func.func @_QQmain() {
// PASSES-NEXT: ConvertHLFIRtoFIR
// PASSES-NEXT: LowerWorkshare
// PASSES-NEXT: LowerWorkdistribute
-// PASSES-NEXT: MIFOpConversion
// PASSES-NEXT: CSE
// PASSES-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
@@ -148,6 +147,7 @@ func.func @_QQmain() {
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
// PASSES-NEXT: 'func.func' Pipeline
// PASSES-NEXT: SetRuntimeCallAttributes
+// PASSES-NEXT: MIFOpConversion
// PASSES-NEXT: BoxedProcedurePass
// PASSES-NEXT: AddAliasTags
>From 3e57dc1595edbe17ccef016bfc57c2146150cad6 Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Tue, 17 Mar 2026 13:51:35 +0100
Subject: [PATCH 3/4] Applying comment from Dan Bonachea (with clang-format) +
Updating test
---
.../Optimizer/Transforms/MIFOpConversion.cpp | 8 +-
flang/test/Fir/MIF/change_team2.mlir | 313 ++++++++----------
flang/test/Lower/MIF/change_team2.f90 | 19 +-
3 files changed, 161 insertions(+), 179 deletions(-)
diff --git a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
index 1b4fe5c130e5e..b1e22b9cf68a6 100644
--- a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
@@ -727,13 +727,15 @@ struct MIFChangeTeamOpConversion
mlir::cf::BranchOp::create(rewriter, loc, firstBlock);
// Removing mif.end_team operation and add the call to prif_end_team.
- auto endTeamOp = mlir::dyn_cast<mif::EndTeamOp>(lastBlock->getTerminator());
- if (endTeamOp) {
+ 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.eraseOp(op);
return mlir::success();
diff --git a/flang/test/Fir/MIF/change_team2.mlir b/flang/test/Fir/MIF/change_team2.mlir
index e53a64e7daef5..9405c41fce664 100644
--- a/flang/test/Fir/MIF/change_team2.mlir
+++ b/flang/test/Fir/MIF/change_team2.mlir
@@ -1,82 +1,72 @@
// RUN: fir-opt --mif-convert %s | FileCheck %s
+// mlir generated by the example in flang/test/Lower/MIF/change_team2.f90
module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little", "dlti.mangling_mode" = "e", "dlti.legal_int_widths" = array<i32: 8, 16, 32, 64>, "dlti.stack_alignment" = 128 : i64>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang version 23.0.0 (git at github.com:SiPearl/llvm-project.git 5acb5b14086f4f61f007a6fc14a86e930bd1d247)", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
- func.func @_QQmain() attributes {fir.bindc_name = "TEST_NESTED_TEAMS"} {
+ func.func @_QQmain() {
%0 = fir.dummy_scope : !fir.dscope
- %1 = fir.alloca i32 {bindc_name = "me", uniq_name = "_QFEme"}
- %2:2 = hlfir.declare %1 {uniq_name = "_QFEme"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
- %3 = fir.alloca i32 {bindc_name = "ni", uniq_name = "_QFEni"}
- %4:2 = hlfir.declare %3 {uniq_name = "_QFEni"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
- %5 = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_global", uniq_name = "_QFEteam_global"}
- %6:2 = hlfir.declare %5 {uniq_name = "_QFEteam_global"} : (!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}>>)
- %7 = 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 %7 to %6#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}>>
- %8 = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_sub", uniq_name = "_QFEteam_sub"}
- %9:2 = hlfir.declare %8 {uniq_name = "_QFEteam_sub"} : (!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}>>)
- %10 = 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 %10 to %9#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}>>
- %11 = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
- %12:2 = hlfir.declare %11 {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
- %13 = mif.this_image : () -> i32
- hlfir.assign %13 to %2#0 : i32, !fir.ref<i32>
- %14 = mif.num_images : () -> i32
- hlfir.assign %14 to %4#0 : i32, !fir.ref<i32>
- %c1_i32 = arith.constant 1 : i32
- %15 = fir.embox %6#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 %c1_i32 team_var %15 : (i32, !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> ()
+ %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
- %16 = fir.load %2#0 : !fir.ref<i32>
- %17 = arith.remsi %16, %c2_i32 : i32
- %c1_i32_0 = arith.constant 1 : i32
- %18 = arith.addi %17, %c1_i32_0 : i32
- %19 = fir.embox %9#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 %18 team_var %19 : (i32, !fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) -> ()
- %20 = fir.embox %6#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 %20 : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) {
- %c6_i32 = arith.constant 6 : i32
- %21 = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
- %22 = fir.convert %21 : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
- %c15_i32 = arith.constant 15 : i32
- %23 = fir.call @_FortranAioBeginExternalListOutput(%c6_i32, %22, %c15_i32) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
- %24 = fir.address_of(@_QQclX44616E73206C61207465616D20676C6F62616C65) : !fir.ref<!fir.char<1,20>>
- %c20 = arith.constant 20 : index
- %25:2 = hlfir.declare %24 typeparams %c20 {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX44616E73206C61207465616D20676C6F62616C65"} : (!fir.ref<!fir.char<1,20>>, index) -> (!fir.ref<!fir.char<1,20>>, !fir.ref<!fir.char<1,20>>)
- %26 = fir.convert %25#0 : (!fir.ref<!fir.char<1,20>>) -> !fir.ref<i8>
- %27 = fir.convert %c20 : (index) -> i64
- %28 = fir.call @_FortranAioOutputAscii(%23, %26, %27) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
- %29 = fir.call @_FortranAioEndIoStatement(%23) fastmath<contract> : (!fir.ref<i8>) -> i32
- %30 = fir.load %2#0 : !fir.ref<i32>
- %c2_i32_1 = arith.constant 2 : i32
- %31 = arith.cmpi eq, %30, %c2_i32_1 : i32
- fir.if %31 {
- %33 = fir.load %4#0 : !fir.ref<i32>
- %c0_i32 = arith.constant 0 : i32
- %34 = arith.addi %33, %c0_i32 : i32
- hlfir.assign %34 to %12#0 : i32, !fir.ref<i32>
- } else {
- %c2_i32_2 = arith.constant 2 : i32
- %33 = fir.load %2#0 : !fir.ref<i32>
- %34 = arith.muli %c2_i32_2, %33 : i32
- hlfir.assign %34 to %12#0 : i32, !fir.ref<i32>
- }
- %32 = fir.embox %9#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 %32 : (!fir.box<!fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}>>) {
- %c6_i32_2 = arith.constant 6 : i32
- %33 = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
- %34 = fir.convert %33 : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
- %c23_i32 = arith.constant 23 : i32
- %35 = fir.call @_FortranAioBeginExternalListOutput(%c6_i32_2, %34, %c23_i32) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
- %36 = fir.address_of(@_QQclX327beca4c668cfd5c48dd70a28c39c6d) : !fir.ref<!fir.char<1,36>>
- %c36 = arith.constant 36 : index
- %37:2 = hlfir.declare %36 typeparams %c36 {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX327beca4c668cfd5c48dd70a28c39c6d"} : (!fir.ref<!fir.char<1,36>>, index) -> (!fir.ref<!fir.char<1,36>>, !fir.ref<!fir.char<1,36>>)
- %38 = fir.convert %37#0 : (!fir.ref<!fir.char<1,36>>) -> !fir.ref<i8>
- %39 = fir.convert %c36 : (index) -> i64
- %40 = fir.call @_FortranAioOutputAscii(%35, %38, %39) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
- %41 = fir.call @_FortranAioEndIoStatement(%35) fastmath<contract> : (!fir.ref<i8>) -> i32
- mif.end_team : () -> ()
- }
+ %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
}
}
@@ -84,110 +74,87 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vec
// CHECK: %[[VAL_0:.*]] = fir.alloca i64
// CHECK: %[[VAL_1:.*]] = fir.alloca i64
// CHECK: %[[VAL_2:.*]] = fir.alloca i32
-// CHECK: %[[VAL_3:.*]] = fir.alloca i32
-// CHECK: %[[VAL_4:.*]] = fir.dummy_scope : !fir.dscope
-// CHECK: %[[VAL_5:.*]] = fir.alloca i32 {bindc_name = "me", uniq_name = "_QFEme"}
-// CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]] {uniq_name = "_QFEme"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
-// CHECK: %[[VAL_7:.*]] = fir.alloca i32 {bindc_name = "ni", uniq_name = "_QFEni"}
-// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_7]] {uniq_name = "_QFEni"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
-// CHECK: %[[VAL_9:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_global", uniq_name = "_QFEteam_global"}
-// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_9:.*]] {uniq_name = "_QFEteam_global"} : (!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_11:.*]] = 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_11:.*]] to %[[VAL_10:.*]]#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_12:.*]] = fir.alloca !fir.type<_QM__fortran_builtinsT__builtin_team_type{_QM__fortran_builtinsT__builtin_team_type.__id:i64}> {bindc_name = "team_sub", uniq_name = "_QFEteam_sub"}
-// CHECK: %[[VAL_13:.*]]:2 = hlfir.declare %[[VAL_12:.*]] {uniq_name = "_QFEteam_sub"} : (!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_14:.*]] = 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_14]] to %[[VAL_13]]#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_15:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
-// CHECK: %[[VAL_16:.*]]:2 = hlfir.declare %[[VAL_15]] {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
-// CHECK: %[[VAL_17:.*]] = fir.absent !fir.box<none>
-// CHECK: fir.call @_QMprifPprif_this_image_no_coarray(%[[VAL_17]], %[[VAL_3]]) : (!fir.box<none>, !fir.ref<i32>) -> ()
-// CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
-// CHECK: hlfir.assign %[[VAL_18]] to %[[VAL_6]]#0 : i32, !fir.ref<i32>
-// CHECK: fir.call @_QMprifPprif_num_images(%[[VAL_2]]) : (!fir.ref<i32>) -> ()
-// CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
-// CHECK: hlfir.assign %[[VAL_19]] to %[[VAL_8]]#0 : i32, !fir.ref<i32>
-// CHECK: %[[C1_I32:.*]] = arith.constant 1 : i32
-// CHECK: %[[VAL_20:.*]] = fir.embox %[[VAL_10]]#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_21:.*]] = fir.convert %[[C1_I32]] : (i32) -> i64
-// CHECK: fir.store %[[VAL_21]] to %[[VAL_1]] : !fir.ref<i64>
-// CHECK: %[[VAL_22:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_23:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_24:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_20]] : (!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_25]], %[[VAL_22]], %[[VAL_23]], %[[VAL_24]], %[[VAL_24]]) : (!fir.ref<i64>, !fir.box<none>, !fir.ref<i32>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-// CHECK: %[[C2_I32:.*]] = arith.constant 2 : i32
-// CHECK: %[[VAL_26:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<i32>
-// CHECK: %[[VAL_27:.*]] = arith.remsi %[[VAL_26]], %[[C2_I32]] : i32
-// CHECK: %[[C1_I32_0:.*]] = arith.constant 1 : i32
-// CHECK: %[[VAL_28:.*]] = arith.addi %[[VAL_27]], %[[C1_I32_0]] : i32
-// CHECK: %[[VAL_29:.*]] = fir.embox %[[VAL_13]]#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_30:.*]] = fir.convert %[[VAL_28]] : (i32) -> i64
-// CHECK: fir.store %[[VAL_30]] to %[[VAL_0]] : !fir.ref<i64>
-// CHECK: %[[VAL_31:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_32:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_33:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_29]] : (!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_0]], %[[VAL_34]], %[[VAL_31]], %[[VAL_32]], %[[VAL_33]], %[[VAL_33]]) : (!fir.ref<i64>, !fir.box<none>, !fir.ref<i32>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-// CHECK: %[[VAL_35:.*]] = fir.embox %[[VAL_10]]#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_36:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_37:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_35]] : (!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_38]], %[[VAL_36]], %[[VAL_37]], %[[VAL_37]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// 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: %[[C6_I32:.*]] = arith.constant 6 : i32
-// CHECK: %[[VAL_39:.*]] = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
-// CHECK: %[[VAL_40:.*]] = fir.convert %[[VAL_39]] : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
-// CHECK: %[[C15_I32:.*]] = arith.constant 15 : i32
-// CHECK: %[[VAL_41:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[C6_I32]], %[[VAL_40]], %[[C15_I32]]) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
-// CHECK: %[[VAL_42:.*]] = fir.address_of(@_QQclX44616E73206C61207465616D20676C6F62616C65) : !fir.ref<!fir.char<1,20>>
-// CHECK: %[[C20:.*]] = arith.constant 20 : index
-// CHECK: %[[VAL_43:.*]]:2 = hlfir.declare %[[VAL_42]] typeparams %[[C20]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX44616E73206C61207465616D20676C6F62616C65"} : (!fir.ref<!fir.char<1,20>>, index) -> (!fir.ref<!fir.char<1,20>>, !fir.ref<!fir.char<1,20>>)
-// CHECK: %[[VAL_44:.*]] = fir.convert %[[VAL_43]]#0 : (!fir.ref<!fir.char<1,20>>) -> !fir.ref<i8>
-// CHECK: %[[VAL_45:.*]] = fir.convert %[[C20]] : (index) -> i64
-// CHECK: %[[VAL_46:.*]] = fir.call @_FortranAioOutputAscii(%[[VAL_41]], %[[VAL_44]], %[[VAL_45]]) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
-// CHECK: %[[VAL_47:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_41]]) fastmath<contract> : (!fir.ref<i8>) -> i32
-// CHECK: %[[VAL_48:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<i32>
-// CHECK: %[[C2_I32_1:.*]] = arith.constant 2 : i32
-// CHECK: %[[VAL_49:.*]] = arith.cmpi eq, %[[VAL_48]], %[[C2_I32_1]] : i32
-// CHECK: fir.if %49 {
-// CHECK: %[[VAL_67:.*]] = fir.load %[[VAL_8]]#0 : !fir.ref<i32>
-// CHECK: %[[C0_I32:.*]] = arith.constant 0 : i32
-// CHECK: hlfir.assign %[[VAL_67]] to %[[VAL_16]]#0 : i32, !fir.ref<i32>
-// CHECK: } else {
-// CHECK: %[[C2_I32_3:.*]] = arith.constant 2 : i32
-// CHECK: %[[VAL_67:.*]] = fir.load %[[VAL_6]]#0 : !fir.ref<i32>
-// CHECK: %[[VAL_68:.*]] = arith.muli %[[VAL_67]], %[[C2_I32_3]] : i32
-// CHECK: hlfir.assign %[[VAL_68]] to %[[VAL_16]]#0 : i32, !fir.ref<i32>
-// CHECK: }
-// CHECK: %[[VAL_50:.*]] = fir.embox %[[VAL_13]]#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_51:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_52:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: %[[VAL_53:.*]] = fir.convert %[[VAL_50]] : (!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_53]], %[[VAL_51]], %[[VAL_52]], %[[VAL_52]]) : (!fir.box<none>, !fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-// CHECK: cf.br ^bb2
+// 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: %[[C6_I32_2:.*]] = arith.constant 6 : i32
-// CHECK: %[[VAL_54:.*]] = fir.address_of(@_QQclX662561532848a47f9eb7ab919b187d63) : !fir.ref<!fir.char<1,49>>
-// CHECK: %[[VAL_55:.*]] = fir.convert %[[VAL_54]] : (!fir.ref<!fir.char<1,49>>) -> !fir.ref<i8>
-// CHECK: %[[C23_I32:.*]] = arith.constant 23 : i32
-// CHECK: %[[VAL_56:.*]] = fir.call @_FortranAioBeginExternalListOutput(%[[C6_I32_2]], %[[VAL_55]], %[[C23_I32]]) fastmath<contract> : (i32, !fir.ref<i8>, i32) -> !fir.ref<i8>
-// CHECK: %[[VAL_57:.*]] = fir.address_of(@_QQclX327beca4c668cfd5c48dd70a28c39c6d) : !fir.ref<!fir.char<1,36>>
-// CHECK: %[[C36:.*]] = arith.constant 36 : index
-// CHECK: %[[VAL_58:.*]]:2 = hlfir.declare %[[VAL_57]] typeparams %[[C36]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQclX327beca4c668cfd5c48dd70a28c39c6d"} : (!fir.ref<!fir.char<1,36>>, index) -> (!fir.ref<!fir.char<1,36>>, !fir.ref<!fir.char<1,36>>)
-// CHECK: %[[VAL_59:.*]] = fir.convert %[[VAL_58]]#0 : (!fir.ref<!fir.char<1,36>>) -> !fir.ref<i8>
-// CHECK: %[[VAL_60:.*]] = fir.convert %[[C36]] : (index) -> i64
-// CHECK: %[[VAL_61:.*]] = fir.call @_FortranAioOutputAscii(%[[VAL_56]], %[[VAL_59]], %[[VAL_60]]) fastmath<contract> : (!fir.ref<i8>, !fir.ref<i8>, i64) -> i1
-// CHECK: %[[VAL_62:.*]] = fir.call @_FortranAioEndIoStatement(%56) fastmath<contract> : (!fir.ref<i8>) -> i32
-// CHECK: %[[VAL_63:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_64:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_63]], %[[VAL_64]], %[[VAL_64]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
-// CHECK: cf.br ^bb3
-// CHECK: ^bb3: // pred: ^bb2
-// CHECK: %[[VAL_65:.*]] = fir.absent !fir.ref<i32>
-// CHECK: %[[VAL_66:.*]] = fir.absent !fir.box<!fir.char<1,?>>
-// CHECK: fir.call @_QMprifPprif_end_team(%[[VAL_65]], %[[VAL_66]], %[[VAL_66]]) : (!fir.ref<i32>, !fir.box<!fir.char<1,?>>, !fir.box<!fir.char<1,?>>) -> ()
+// 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 3 : i32
+// CHECK: %[[FALSE_6:.*]] = arith.constant false
+// CHECK: %[[FALSE_7:.*]] = arith.constant false
+// CHECK: fir.call @_FortranAStopStatement(%[[C3_i32]], %[[FALSE_6]], %[[FALSE_7]]) fastmath<contract> : (i32, i1, i1) -> ()
+// CHECK: fir.unreachable
+// CHECK: ^bb8: // pred: ^bb6
// CHECK: return
+
diff --git a/flang/test/Lower/MIF/change_team2.f90 b/flang/test/Lower/MIF/change_team2.f90
index 68a60bb4ffc1a..58131cd98c455 100644
--- a/flang/test/Lower/MIF/change_team2.f90
+++ b/flang/test/Lower/MIF/change_team2.f90
@@ -9,12 +9,25 @@
integer :: new_team, image_status
new_team = mod(this_image(),2)+1
form team (new_team,team)
- ! COARRAY: mif.change_team %[[TEAM:.*]] : ({{.*}}) {
change team (team)
if (team_number() /= new_team) STOP 1
end team
- ! COARRAY: mif.end_team
- ! COARRAY: }
+ ! COARRAY: mif.change_team %[[TEAM:.*]] : ({{.*}}) {
+ ! COARRAY: %[[VAL_1:.*]] = mif.team_number : () -> i64
+ ! COARRAY: %[[VAL_2:.*]] = fir.convert %[[VAL_1]] : (i64) -> i32
+ ! COARRAY: %[[VAL_3:.*]] = fir.load %[[VAR_1:.*]]#0 : !fir.ref<i32>
+ ! COARRAY: %[[VAL_4:.*]] = arith.cmpi ne, %[[VAL_2]], %[[VAL_3]] : i32
+ ! COARRAY: cf.cond_br %[[VAL_4]], ^bb1, ^bb2
+ ! COARRAY: ^bb1: // pred: ^bb0
+ ! COARRAY: %[[C1_I32:.*]] = arith.constant 1 : i32
+ ! COARRAY: %[[FALSE_1:.*]] = arith.constant false
+ ! COARRAY: %[[FALSE_2:.*]] = arith.constant false
+ ! COARRAY: fir.call @_FortranAStopStatement(%[[C1_I32]], %[[FALSE_1]], %[[FALSE_2]]) fastmath<contract> : (i32, i1, i1) -> ()
+ ! COARRAY: fir.unreachable
+ ! COARRAY: ^bb2: // pred: ^bb0
+ ! COARRAY: mif.end_team : () -> ()
+ ! COARRAY: }
+
if (runtime_popcnt(0_16) /= 0) STOP 2
if (runtime_poppar(1_16) /= 1) STOP 3
contains
>From 01b7dc2e11a6ffde2f806f0c3d96dee99e32eccf Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Fri, 27 Mar 2026 16:09:22 +0100
Subject: [PATCH 4/4] Apply Jean Perrier's feedback
---
.../flang/Optimizer/Transforms/Passes.td | 3 +-
.../Optimizer/Transforms/MIFOpConversion.cpp | 2 -
flang/test/Fir/MIF/change_team2.mlir | 126 +++++++++---------
3 files changed, 64 insertions(+), 67 deletions(-)
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td
index d812e271b158d..5f07d434fd752 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.td
+++ b/flang/include/flang/Optimizer/Transforms/Passes.td
@@ -639,7 +639,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 b1e22b9cf68a6..22d2bf18509e2 100644
--- a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
@@ -830,8 +830,6 @@ class MIFOpConversion : public fir::impl::MIFOpConversionBase<MIFOpConversion> {
mif::populateMIFOpConversionPatterns(patterns);
- target.addLegalDialect<fir::FIROpsDialect>();
- target.addLegalDialect<mlir::cf::ControlFlowDialect>();
target.addLegalOp<mlir::ModuleOp>();
if (mlir::failed(mlir::applyPartialConversion(getOperation(), target,
diff --git a/flang/test/Fir/MIF/change_team2.mlir b/flang/test/Fir/MIF/change_team2.mlir
index 9405c41fce664..7ce2510a88656 100644
--- a/flang/test/Fir/MIF/change_team2.mlir
+++ b/flang/test/Fir/MIF/change_team2.mlir
@@ -1,74 +1,72 @@
// RUN: fir-opt --mif-convert %s | FileCheck %s
// mlir generated by the example in flang/test/Lower/MIF/change_team2.f90
-module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little", "dlti.mangling_mode" = "e", "dlti.legal_int_widths" = array<i32: 8, 16, 32, 64>, "dlti.stack_alignment" = 128 : i64>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang version 23.0.0 (git at github.com:SiPearl/llvm-project.git 5acb5b14086f4f61f007a6fc14a86e930bd1d247)", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
- 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
+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
- %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) -> ()
+ %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
- %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
+ 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
More information about the flang-commits
mailing list