[flang-commits] [flang] [flang][OpenACC] Attach a source location to the skipped-directive warning (PR #224348)
via flang-commits
flang-commits at lists.llvm.org
Thu Sep 17 09:04:00 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-openacc
Author: Eugene Epshteyn (eugeneepshteyn)
<details>
<summary>Changes</summary>
Follow-up to #<!-- -->223579.
Fix the source location of "compiler directive ignored: it appears between loop levels of a collapsed or tiled loop nest" warning. Harden `flang/test/Lower/OpenACC/acc-loop-collapse-directive-between-loops.f90` test.
Assisted-by: AI
---
Full diff: https://github.com/llvm/llvm-project/pull/224348.diff
2 Files Affected:
- (modified) flang/lib/Lower/Bridge.cpp (+9-3)
- (modified) flang/test/Lower/OpenACC/acc-loop-collapse-directive-between-loops.f90 (+41-4)
``````````diff
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 4af51dfb569f2..64fd597c7ad3f 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -3527,9 +3527,15 @@ class FirConverter : public Fortran::lower::AbstractConverter {
if (e->isA<Fortran::parser::NonLabelDoStmt>())
continue;
if (e->isDirective()) {
- mlir::emitWarning(genLocation(e->position),
- "compiler directive ignored: it appears between "
- "loop levels of a collapsed or tiled loop nest");
+ // Directive evaluations carry no position (enterConstructOrDirective
+ // in PFTBuilder.cpp creates them without one), so e->position maps to
+ // an unknown location; point the warning at the directive's own
+ // source text instead.
+ mlir::Location loc = genLocation(e->position);
+ if (const auto *dir = e->getIf<Fortran::parser::CompilerDirective>())
+ loc = genLocation(dir->source);
+ mlir::emitWarning(loc, "compiler directive ignored: it appears between "
+ "loop levels of a collapsed or tiled loop nest");
continue;
}
TODO(genLocation(e->position),
diff --git a/flang/test/Lower/OpenACC/acc-loop-collapse-directive-between-loops.f90 b/flang/test/Lower/OpenACC/acc-loop-collapse-directive-between-loops.f90
index e2e13c2ee2984..8d008f2aadd22 100644
--- a/flang/test/Lower/OpenACC/acc-loop-collapse-directive-between-loops.f90
+++ b/flang/test/Lower/OpenACC/acc-loop-collapse-directive-between-loops.f90
@@ -1,4 +1,5 @@
! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
+! RUN: bbc -fopenacc -emit-hlfir %s -o %t 2>&1 | FileCheck %s --check-prefix=WARN
! Verify that a compiler directive (e.g. !DIR$ IVDEP) appearing between the
! levels of a collapsed loop nest does not get mistaken for the next nested
@@ -23,7 +24,7 @@ subroutine collapse2_directive_between_loops(n, a)
! CHECK-LABEL: func.func @_QPcollapse2_directive_between_loops(
! CHECK: acc.parallel
-! CHECK: acc.loop combined(parallel)
+! CHECK: acc.loop combined(parallel) {{.*}} control(%{{[^ ]+}} : i32, %{{[^ ]+}} : i32) =
! CHECK: hlfir.designate
! CHECK: hlfir.assign
! CHECK: acc.yield
@@ -48,7 +49,7 @@ subroutine collapse3_directive_between_loops(n, a)
! CHECK-LABEL: func.func @_QPcollapse3_directive_between_loops(
! CHECK: acc.parallel
-! CHECK: acc.loop combined(parallel)
+! CHECK: acc.loop combined(parallel) {{.*}} control(%{{[^ ]+}} : i32, %{{[^ ]+}} : i32, %{{[^ ]+}} : i32) =
! CHECK: hlfir.designate
! CHECK: hlfir.assign
! CHECK: acc.yield
@@ -76,7 +77,7 @@ subroutine collapse3_directive_between_inner_loops(n, a)
! CHECK-LABEL: func.func @_QPcollapse3_directive_between_inner_loops(
! CHECK: acc.parallel
-! CHECK: acc.loop combined(parallel)
+! CHECK: acc.loop combined(parallel) {{.*}} control(%{{[^ ]+}} : i32, %{{[^ ]+}} : i32, %{{[^ ]+}} : i32) =
! CHECK: hlfir.designate
! CHECK: hlfir.assign
! CHECK: acc.yield
@@ -99,7 +100,43 @@ subroutine tile_directive_between_loops(n, a)
! CHECK-LABEL: func.func @_QPtile_directive_between_loops(
! CHECK: acc.parallel
-! CHECK: acc.loop combined(parallel) {{.*}} tile(
+! CHECK: acc.loop combined(parallel) {{.*}} tile({{.*}} control(%{{[^ ]+}} : i32, %{{[^ ]+}} : i32) =
! CHECK: hlfir.designate
! CHECK: hlfir.assign
! CHECK: acc.yield
+
+! collapse(force: ...) explicitly allows intervening code between the loop
+! levels; the strict per-level descent (and its "directive ignored" warning)
+! must not run for it -- the force lowering sinks the prologue statements
+! (and the directive) into the collapsed body instead.
+subroutine collapse_force_stmt_between_loops(n, a, s)
+ integer, intent(in) :: n
+ integer :: a(n,n), s
+ integer :: i, j
+
+ !$acc parallel loop collapse(force:2) copy(a)
+ do i = 1, n
+ s = s + i
+!DIR$ IVDEP
+ do j = 1, n
+ a(j,i) = 1
+ end do
+ end do
+ !$acc end parallel loop
+end subroutine
+
+! CHECK-LABEL: func.func @_QPcollapse_force_stmt_between_loops(
+! CHECK: acc.parallel
+! CHECK: acc.loop combined(parallel) {{.*}} control(%{{[^ ]+}} : i32, %{{[^ ]+}} : i32) =
+! CHECK: hlfir.assign
+! CHECK: hlfir.assign
+! CHECK: acc.yield
+! CHECK: collapse([2])
+
+! One warning per skipped directive, each carrying the directive's source
+! location, in subroutine order; the force subroutine must not warn.
+! WARN: warning: loc("{{.*}}acc-loop-collapse-directive-between-loops.f90":{{[0-9]+}}:{{[0-9]+}}): compiler directive ignored: it appears between loop levels of a collapsed or tiled loop nest
+! WARN: warning: loc("{{.*}}acc-loop-collapse-directive-between-loops.f90":{{[0-9]+}}:{{[0-9]+}}): compiler directive ignored: it appears between loop levels of a collapsed or tiled loop nest
+! WARN: warning: loc("{{.*}}acc-loop-collapse-directive-between-loops.f90":{{[0-9]+}}:{{[0-9]+}}): compiler directive ignored: it appears between loop levels of a collapsed or tiled loop nest
+! WARN: warning: loc("{{.*}}acc-loop-collapse-directive-between-loops.f90":{{[0-9]+}}:{{[0-9]+}}): compiler directive ignored: it appears between loop levels of a collapsed or tiled loop nest
+! WARN-NOT: compiler directive ignored
``````````
</details>
https://github.com/llvm/llvm-project/pull/224348
More information about the flang-commits
mailing list