From: PeixinQiao Date: Fri, 8 Apr 2022 16:27:53 +0000 (+0800) Subject: [flang] Fix semantic analysis for "forall" targeted by "label" X-Git-Tag: upstream/15.0.7~10988 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=eb4d5b852e1d922bce2f538bbafb688786ae2738;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/flang/lib/Semantics/resolve-labels.cpp b/flang/lib/Semantics/resolve-labels.cpp index 783ed91..b099d24 100644 --- a/flang/lib/Semantics/resolve-labels.cpp +++ b/flang/lib/Semantics/resolve-labels.cpp @@ -122,7 +122,6 @@ constexpr Legality IsLegalBranchTarget(const parser::Statement &) { std::is_same_v || std::is_same_v || std::is_same_v || - std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || @@ -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 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