[flang-commits] [flang] [flang][OpenACC] add TODO for unstructured loops in acc loop directives (PR #163972)
via flang-commits
flang-commits at lists.llvm.org
Fri Oct 17 07:29:07 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-openacc
Author: None (jeanPerier)
<details>
<summary>Changes</summary>
The lowering of `!$acc loop` loops with an early exit currently ends-up "duplicating" the control flow in the acc.loop and inside it as explicit control flow (as if each iteration executes each iteration until the early exit).
Add a TODO for now.
---
Full diff: https://github.com/llvm/llvm-project/pull/163972.diff
2 Files Affected:
- (modified) flang/lib/Lower/OpenACC.cpp (+14-3)
- (modified) flang/test/Lower/OpenACC/acc-unstructured.f90 (+1)
``````````diff
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index cfb18914e8126..52503edabdbfc 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -2712,12 +2712,19 @@ genACC(Fortran::lower::AbstractConverter &converter,
const auto &loopDirective =
std::get<Fortran::parser::AccLoopDirective>(beginLoopDirective.t);
+ mlir::Location currentLocation =
+ converter.genLocation(beginLoopDirective.source);
bool needEarlyExitHandling = false;
- if (eval.lowerAsUnstructured())
+ if (eval.lowerAsUnstructured()) {
needEarlyExitHandling = hasEarlyReturn(eval);
+ // If the loop is lowered in an unstructured fashion, lowering generates
+ // explicit control flow that duplicates the looping semantics of the
+ // loops.
+ if (!needEarlyExitHandling)
+ TODO(currentLocation,
+ "loop with early exit inside OpenACC loop construct");
+ }
- mlir::Location currentLocation =
- converter.genLocation(beginLoopDirective.source);
Fortran::lower::StatementContext stmtCtx;
assert(loopDirective.v == llvm::acc::ACCD_loop &&
@@ -3516,6 +3523,10 @@ genACC(Fortran::lower::AbstractConverter &converter,
converter.genLocation(beginCombinedDirective.source);
Fortran::lower::StatementContext stmtCtx;
+ if (eval.lowerAsUnstructured())
+ TODO(currentLocation,
+ "loop with early exit inside OpenACC combined construct");
+
if (combinedDirective.v == llvm::acc::ACCD_kernels_loop) {
createComputeOp<mlir::acc::KernelsOp>(
converter, currentLocation, eval, semanticsContext, stmtCtx,
diff --git a/flang/test/Lower/OpenACC/acc-unstructured.f90 b/flang/test/Lower/OpenACC/acc-unstructured.f90
index c57af98770cf5..c42c7dddc5ca1 100644
--- a/flang/test/Lower/OpenACC/acc-unstructured.f90
+++ b/flang/test/Lower/OpenACC/acc-unstructured.f90
@@ -1,4 +1,5 @@
! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
+! XFAIL: *
subroutine test_unstructured1(a, b, c)
integer :: i, j, k
``````````
</details>
https://github.com/llvm/llvm-project/pull/163972
More information about the flang-commits
mailing list