Skip to content
Snippets Groups Projects
Commit eb4d5b85 authored by PeixinQiao's avatar PeixinQiao
Browse files

[flang] Fix semantic analysis for "forall" targeted by "label"

As Fortran 2018 3.18 states, the branch target statement can be
`forall-construct-stmt`, but cannot be `forall-stmt`. `forall-stmt` is
wrapped by `Statement` in `action-stmt` and `action-stmt` can be one
branch target statement. Fix the semantic analysis and add two
regression test cases in lowering.

Reviewed By: Jean Perier

Differential Revision: https://reviews.llvm.org/D123373
parent 34e1b477
No related branches found
No related tags found
No related merge requests found
......@@ -122,7 +122,6 @@ constexpr Legality IsLegalBranchTarget(const parser::Statement<A> &) {
std::is_same_v<A, parser::CriticalStmt> ||
std::is_same_v<A, parser::EndCriticalStmt> ||
std::is_same_v<A, parser::ForallConstructStmt> ||
std::is_same_v<A, parser::ForallStmt> ||
std::is_same_v<A, parser::WhereConstructStmt> ||
std::is_same_v<A, parser::EndFunctionStmt> ||
std::is_same_v<A, parser::EndMpSubprogramStmt> ||
......@@ -230,7 +229,7 @@ public:
parser::BlockStmt, parser::ChangeTeamStmt, parser::CriticalStmt,
parser::IfThenStmt, parser::NonLabelDoStmt, parser::SelectCaseStmt,
parser::SelectRankStmt, parser::SelectTypeStmt,
parser::WhereConstructStmt>;
parser::ForallConstructStmt, parser::WhereConstructStmt>;
using LabeledConstructEndStmts = std::tuple<parser::EndAssociateStmt,
parser::EndBlockStmt, parser::EndChangeTeamStmt,
parser::EndCriticalStmt, parser::EndDoStmt, parser::EndForallStmt,
......
! Test forall lowering
! RUN: bbc -emit-fir %s -o - | FileCheck %s
!*** Test forall targeted by label
subroutine test4_forall_construct()
integer :: a(2) = 1
100 forall (i=1:2)
a(i) = a(i) + 1
end forall
if (a(1) > 3) goto 200
goto 100
200 return
end subroutine test4_forall_construct
! CHECK-LABEL: func @_QPtest4_forall_construct
! CHECK: cf.br ^bb1
! CHECK: ^bb1: // 2 preds: ^bb0, ^bb2
! CHECK: %{{.*}} = fir.do_loop
! CHECK: cf.cond_br %{{.*}}, ^bb2, ^bb3
! CHECK: ^bb2: // pred: ^bb1
! CHECK: cf.br ^bb1
! CHECK: ^bb3: // pred: ^bb1
! CHECK: cf.br ^bb4
! CHECK: ^bb4: // pred: ^bb3
! CHECK: return
subroutine test4_forall_construct2()
integer :: a(2) = 1
100 forall (i=1:2) a(i) = a(i) + 1
if (a(1) > 3) goto 200
goto 100
200 return
end subroutine test4_forall_construct2
! CHECK-LABEL: func @_QPtest4_forall_construct2
! CHECK: cf.br ^bb1
! CHECK: ^bb1: // 2 preds: ^bb0, ^bb2
! CHECK: %{{.*}} = fir.do_loop
! CHECK: cf.cond_br %{{.*}}, ^bb2, ^bb3
! CHECK: ^bb2: // pred: ^bb1
! CHECK: cf.br ^bb1
! CHECK: ^bb3: // pred: ^bb1
! CHECK: cf.br ^bb4
! CHECK: ^bb4: // pred: ^bb3
! CHECK: return
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment