[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