[llvm-branch-commits] [flang] release/22.x: [flang] Fix crash with coarray teams #171048 (#172259) (PR #176207)

2026-01-15 Thread Katherine Rasmussen via llvm-branch-commits

https://github.com/ktras approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/176207
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [flang] release/22.x: [flang] Fix crash with coarray teams #171048 (#172259) (PR #176207)

2026-01-15 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-flang-fir-hlfir

Author: None (llvmbot)


Changes

Backport 1d4f9ac37c043198d823e85e3cd777dc970d8b75

Requested by: @ktras

---
Full diff: https://github.com/llvm/llvm-project/pull/176207.diff


7 Files Affected:

- (modified) flang/include/flang/Lower/MultiImageFortran.h (+3-2) 
- (modified) flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td (+6-6) 
- (modified) flang/lib/Lower/Bridge.cpp (+40-20) 
- (modified) flang/lib/Lower/MultiImageFortran.cpp (+6-11) 
- (modified) flang/lib/Optimizer/Builder/IntrinsicCall.cpp (+5-3) 
- (modified) flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp (+6-7) 
- (added) flang/test/Lower/MIF/change_team2.f90 (+29) 


``diff
diff --git a/flang/include/flang/Lower/MultiImageFortran.h 
b/flang/include/flang/Lower/MultiImageFortran.h
index d9dc9cf051f4c..82d415a219ae9 100644
--- a/flang/include/flang/Lower/MultiImageFortran.h
+++ b/flang/include/flang/Lower/MultiImageFortran.h
@@ -11,6 +11,7 @@
 
 #include "flang/Lower/AbstractConverter.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
+#include "flang/Optimizer/Dialect/MIF/MIFOps.h"
 
 namespace Fortran {
 
@@ -51,8 +52,8 @@ void genSyncTeamStatement(AbstractConverter &, const 
parser::SyncTeamStmt &);
 
 void genChangeTeamConstruct(AbstractConverter &, pft::Evaluation &eval,
 const parser::ChangeTeamConstruct &);
-void genChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
-   const parser::ChangeTeamStmt &);
+mif::ChangeTeamOp genChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
+const parser::ChangeTeamStmt &);
 void genEndChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
   const parser::EndChangeTeamStmt &);
 void genFormTeamStatement(AbstractConverter &, pft::Evaluation &eval,
diff --git a/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td 
b/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
index a6c7d0a07b019..0d95123b0f9e5 100644
--- a/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
+++ b/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
@@ -346,9 +346,7 @@ def mif_EndTeamOp : mif_Op<"end_team", 
[AttrSizedOperandSegments, Terminator,
 // yet supported by the dialect. The argument is therefore not yet supported by
 // this operation and will be added later.
 
//===--===//
-def mif_ChangeTeamOp
-: region_Op<"change_team", [AttrSizedOperandSegments,
-SingleBlockImplicitTerminator<"EndTeamOp">]> {
+def mif_ChangeTeamOp : region_Op<"change_team", [AttrSizedOperandSegments]> {
   let summary = "Changes the current team.";
   let description = [{
 The CHANGE TEAM construct changes the current team to the specified new
@@ -365,15 +363,17 @@ def mif_ChangeTeamOp
   let arguments = (ins AnyRefOrBoxType:$team,
   Arg, "", [MemWrite]>:$stat,
   Arg, "", [MemWrite]>:$errmsg);
-  let regions = (region SizedRegion<1>:$region);
+
+  // The region can contain multiple blocks if the `change_team` construct
+  // contains constructs that create multiple blocks.
+  let regions = (region MinSizedRegion<1>:$region);
 
   let skipDefaultBuilders = 1;
   let builders =
   [OpBuilder<(ins "mlir::Value":$team,
-   CArg<"bool", "true">:$ensureTermination,
CArg<"llvm::ArrayRef", "{}">:$attributes)>,
OpBuilder<(ins "mlir::Value":$team, "mlir::Value":$stat,
-   "mlir::Value":$errmsg, CArg<"bool", "true">:$ensureTermination,
+   "mlir::Value":$errmsg,
CArg<"llvm::ArrayRef", "{}">:$attributes)>];
 
   let extraClassDeclaration = [{
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 5cf3daccc4630..2d9947530cae8 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -4180,29 +4180,47 @@ class FirConverter : public 
Fortran::lower::AbstractConverter {
   void genFIR(const Fortran::parser::ChangeTeamConstruct &construct) {
 Fortran::lower::StatementContext stmtCtx;
 pushActiveConstruct(getEval(), stmtCtx);
+Fortran::lower::pft::Evaluation &eval = getEval();
+bool unstructuredContext = eval.lowerAsUnstructured();
+
+// CHANGE TEAM statement
+Fortran::lower::pft::Evaluation &changeTeamStmtEval =
+eval.getFirstNestedEvaluation();
+auto *changeTeamStmt =
+changeTeamStmtEval.getIf();
+assert(changeTeamStmt && "ChangeTeamStmt not found");
+mif::ChangeTeamOp changeOp =
+genChangeTeamStmt(*this, changeTeamStmtEval, *changeTeamStmt);
+mlir::Block *entryBlock = changeOp.getBody();
+builder->setInsertionPointToStart(entryBlock);
+
+if (unstructuredContext)
+  Fortran::lower::createEmptyRegionBlocks(
+  *builder, eval.getNestedEvaluations());
+builder->setInsertionPointToStart(entryBlock);
+
+// CHANGE TEAM body code.
+auto iter = eval.getNestedEvaluations().begin()++;
+ 

[llvm-branch-commits] [flang] release/22.x: [flang] Fix crash with coarray teams #171048 (#172259) (PR #176207)

2026-01-15 Thread via llvm-branch-commits

llvmbot wrote:

@ktras What do you think about merging this PR to the release branch?

https://github.com/llvm/llvm-project/pull/176207
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [flang] release/22.x: [flang] Fix crash with coarray teams #171048 (#172259) (PR #176207)

2026-01-15 Thread via llvm-branch-commits

https://github.com/llvmbot milestoned 
https://github.com/llvm/llvm-project/pull/176207
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [flang] release/22.x: [flang] Fix crash with coarray teams #171048 (#172259) (PR #176207)

2026-01-15 Thread via llvm-branch-commits

https://github.com/llvmbot created 
https://github.com/llvm/llvm-project/pull/176207

Backport 1d4f9ac37c043198d823e85e3cd777dc970d8b75

Requested by: @ktras

>From caabfb8fc9e4b92168392be765a00baa29880cd2 Mon Sep 17 00:00:00 2001
From: Jean-Didier PAILLEUX 
Date: Thu, 15 Jan 2026 18:02:07 +0100
Subject: [PATCH] [flang] Fix crash with coarray teams #171048 (#172259)

This PR updates the `CHANGE TEAM` construct to fix the bug mentioned in
the issue #171048.
When a construct such as `IfConstruct` was present in the `CHANGE TEAM`
region, several BB were created but outside the region.

(cherry picked from commit 1d4f9ac37c043198d823e85e3cd777dc970d8b75)
---
 flang/include/flang/Lower/MultiImageFortran.h |  5 +-
 .../flang/Optimizer/Dialect/MIF/MIFOps.td | 12 ++--
 flang/lib/Lower/Bridge.cpp| 60 ---
 flang/lib/Lower/MultiImageFortran.cpp | 17 ++
 flang/lib/Optimizer/Builder/IntrinsicCall.cpp |  8 ++-
 flang/lib/Optimizer/Dialect/MIF/MIFOps.cpp| 13 ++--
 flang/test/Lower/MIF/change_team2.f90 | 29 +
 7 files changed, 95 insertions(+), 49 deletions(-)
 create mode 100644 flang/test/Lower/MIF/change_team2.f90

diff --git a/flang/include/flang/Lower/MultiImageFortran.h 
b/flang/include/flang/Lower/MultiImageFortran.h
index d9dc9cf051f4c..82d415a219ae9 100644
--- a/flang/include/flang/Lower/MultiImageFortran.h
+++ b/flang/include/flang/Lower/MultiImageFortran.h
@@ -11,6 +11,7 @@
 
 #include "flang/Lower/AbstractConverter.h"
 #include "flang/Optimizer/Builder/BoxValue.h"
+#include "flang/Optimizer/Dialect/MIF/MIFOps.h"
 
 namespace Fortran {
 
@@ -51,8 +52,8 @@ void genSyncTeamStatement(AbstractConverter &, const 
parser::SyncTeamStmt &);
 
 void genChangeTeamConstruct(AbstractConverter &, pft::Evaluation &eval,
 const parser::ChangeTeamConstruct &);
-void genChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
-   const parser::ChangeTeamStmt &);
+mif::ChangeTeamOp genChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
+const parser::ChangeTeamStmt &);
 void genEndChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
   const parser::EndChangeTeamStmt &);
 void genFormTeamStatement(AbstractConverter &, pft::Evaluation &eval,
diff --git a/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td 
b/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
index a6c7d0a07b019..0d95123b0f9e5 100644
--- a/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
+++ b/flang/include/flang/Optimizer/Dialect/MIF/MIFOps.td
@@ -346,9 +346,7 @@ def mif_EndTeamOp : mif_Op<"end_team", 
[AttrSizedOperandSegments, Terminator,
 // yet supported by the dialect. The argument is therefore not yet supported by
 // this operation and will be added later.
 
//===--===//
-def mif_ChangeTeamOp
-: region_Op<"change_team", [AttrSizedOperandSegments,
-SingleBlockImplicitTerminator<"EndTeamOp">]> {
+def mif_ChangeTeamOp : region_Op<"change_team", [AttrSizedOperandSegments]> {
   let summary = "Changes the current team.";
   let description = [{
 The CHANGE TEAM construct changes the current team to the specified new
@@ -365,15 +363,17 @@ def mif_ChangeTeamOp
   let arguments = (ins AnyRefOrBoxType:$team,
   Arg, "", [MemWrite]>:$stat,
   Arg, "", [MemWrite]>:$errmsg);
-  let regions = (region SizedRegion<1>:$region);
+
+  // The region can contain multiple blocks if the `change_team` construct
+  // contains constructs that create multiple blocks.
+  let regions = (region MinSizedRegion<1>:$region);
 
   let skipDefaultBuilders = 1;
   let builders =
   [OpBuilder<(ins "mlir::Value":$team,
-   CArg<"bool", "true">:$ensureTermination,
CArg<"llvm::ArrayRef", "{}">:$attributes)>,
OpBuilder<(ins "mlir::Value":$team, "mlir::Value":$stat,
-   "mlir::Value":$errmsg, CArg<"bool", "true">:$ensureTermination,
+   "mlir::Value":$errmsg,
CArg<"llvm::ArrayRef", "{}">:$attributes)>];
 
   let extraClassDeclaration = [{
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 5cf3daccc4630..2d9947530cae8 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -4180,29 +4180,47 @@ class FirConverter : public 
Fortran::lower::AbstractConverter {
   void genFIR(const Fortran::parser::ChangeTeamConstruct &construct) {
 Fortran::lower::StatementContext stmtCtx;
 pushActiveConstruct(getEval(), stmtCtx);
+Fortran::lower::pft::Evaluation &eval = getEval();
+bool unstructuredContext = eval.lowerAsUnstructured();
+
+// CHANGE TEAM statement
+Fortran::lower::pft::Evaluation &changeTeamStmtEval =
+eval.getFirstNestedEvaluation();
+auto *changeTeamStmt =
+changeTeamStmtEval.getIf();
+assert(changeTeamStmt && "ChangeTeamStmt not found")