[llvm-branch-commits] [flang] release/22.x: [flang] Fix crash with coarray teams #171048 (#172259) (PR #176207)
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)
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)
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)
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)
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")
