[flang-commits] [flang] [flang][Lower] Treat directives with nested evaluations as constructs (PR #91614)
via flang-commits
flang-commits at lists.llvm.org
Thu May 9 09:08:43 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Krzysztof Parzyszek (kparzysz)
<details>
<summary>Changes</summary>
When generating block terminators in `genFIR(Evaluation)`, treat `Directives` with nested evaluations the same way as `Constructs` to determine the successor block.
This fixes https://github.com/llvm/llvm-project/issues/91526
---
Full diff: https://github.com/llvm/llvm-project/pull/91614.diff
2 Files Affected:
- (modified) flang/lib/Lower/Bridge.cpp (+7-3)
- (added) flang/test/Lower/branching-directive.f90 (+25)
``````````diff
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 4902886712e92..79d6bbf65cbf7 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -4548,9 +4548,13 @@ class FirConverter : public Fortran::lower::AbstractConverter {
// constructs, this can be done for either the end construct statement,
// or for the construct itself, which will skip this code if the
// end statement was visited first and generated a branch.
- Fortran::lower::pft::Evaluation *successor =
- eval.isConstruct() ? eval.getLastNestedEvaluation().lexicalSuccessor
- : eval.lexicalSuccessor;
+ Fortran::lower::pft::Evaluation *successor = [&]() {
+ if (eval.isConstruct() ||
+ (eval.isDirective() && eval.hasNestedEvaluations()))
+ return eval.getLastNestedEvaluation().lexicalSuccessor;
+ return eval.lexicalSuccessor;
+ }();
+
if (successor && blockIsUnterminated()) {
if (successor->isIntermediateConstructStmt() &&
successor->parentConstruct->lowerAsUnstructured())
diff --git a/flang/test/Lower/branching-directive.f90 b/flang/test/Lower/branching-directive.f90
new file mode 100644
index 0000000000000..a0a147f1053a4
--- /dev/null
+++ b/flang/test/Lower/branching-directive.f90
@@ -0,0 +1,25 @@
+!RUN: flang-new -fc1 -emit-hlfir -fopenmp -o - %s | FileCheck %s
+
+!https://github.com/llvm/llvm-project/issues/91526
+
+!CHECK: cf.cond_br %{{[0-9]+}}, ^bb[[THEN:[0-9]+]], ^bb[[ELSE:[0-9]+]]
+!CHECK: ^bb[[THEN]]:
+!CHECK: cf.br ^bb[[EXIT:[0-9]+]]
+!CHECK: ^bb[[ELSE]]:
+!CHECK: fir.call @_FortranAStopStatement
+!CHECK: fir.unreachable
+!CHECK: ^bb[[EXIT]]:
+
+subroutine simple(y)
+ implicit none
+ logical, intent(in) :: y
+ integer :: i
+ if (y) then
+!$omp parallel
+ i = 1
+!$omp end parallel
+ else
+ stop 1
+ end if
+end subroutine simple
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/91614
More information about the flang-commits
mailing list