diff mbox series

Fortran: improve location data for OpenACC/OpenMP directives [PR97782]

Message ID d26a556b-4af3-f1da-3606-ccb176ea2376@codesourcery.com
State New
Headers show
Series Fortran: improve location data for OpenACC/OpenMP directives [PR97782] | expand

Commit Message

Tobias Burnus Nov. 12, 2020, 11:45 a.m. UTC
For code like
  !$acc kernels
     ... a lot of loops and other code
  !$acc end kernels

gfortran generates
   #pragma ..._kernels
     {
       ... lot of code
     }

As the PR shows, the location associated with the #pragma
is not the 'acc kernels' line but the one near the 'acc end kernel'
line.

The reason is that first the {...} code is generated and only then
the outer #pragma. And using input_location as location then points to
the wrong line:
  ...
  oacc_clauses = gfc_trans_omp_clauses (...) // fine so far
  stmt = gfc_trans_omp_code (code->block->next, true); // translates {...}
  stmt = build2_loc (input_location, construct_code, ... // wrong location

This patch tries to fix this in most cases; I am sure I missed some and
others could be handled better.

In the testsuite, it affects two tests by moving a 'dg-message' line with
   optimized: assigned OpenACC gang loop parallelism
from the loop-line one up to the 'kernels'-line; I think either location
is fine.

The PR has a testcase (not included) which works with -fopt-info-omp-all.
In principle, it should also have an effect on warnings (if there are
any) and it unsurprisingly affects --fdump-tree-*-lineno.

Comments, remarks, does it look good to you?

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter

Comments

Thomas Schwinge Nov. 12, 2020, 12:09 p.m. UTC | #1
Hi Tobias!

On 2020-11-12T12:45:24+0100, Tobias Burnus <tobias@codesourcery.com> wrote:
> For code like
>   !$acc kernels
>      ... a lot of loops and other code
>   !$acc end kernels
>
> gfortran generates
>    #pragma ..._kernels
>      {
>        ... lot of code
>      }
>
> As the PR shows, the location associated with the #pragma
> is not the 'acc kernels' line but the one near the 'acc end kernel'
> line.
>
> The reason is that first the {...} code is generated and only then
> the outer #pragma. And using input_location as location then points to
> the wrong line:
>   ...
>   oacc_clauses = gfc_trans_omp_clauses (...) // fine so far
>   stmt = gfc_trans_omp_code (code->block->next, true); // translates {...}
>   stmt = build2_loc (input_location, construct_code, ... // wrong location
>
> This patch tries to fix this in most cases; I am sure I missed some and
> others could be handled better.

I guess we eventually should get rid of *all* such uses of
'input_location' (and then 'gfc_set_backend_locus', etc., too)...  ;-)
(One step at a time.)  :-)

> In the testsuite, it affects two tests by moving a 'dg-message' line with
>    optimized: assigned OpenACC gang loop parallelism
> from the loop-line one up to the 'kernels'-line; I think either location
> is fine.

That change is good: for current 'parloops' OpenACC 'kernels', these
diagnostics are actually expected on the 'kernels' directive line, not on
'loop's.

> The PR has a testcase (not included) which works with -fopt-info-omp-all.

Your call whether you'd like to include that one (why not?) -- but then,
I'll establish further/similar testsuite coverage with other pending
patches of mine.

> In principle, it should also have an effect on warnings (if there are
> any) and it unsurprisingly affects --fdump-tree-*-lineno.
>
> Comments, remarks, does it look good to you?

I have not verified all the details, but it conceptually looks good to
me, thanks.

    Reviewed-by: Thomas Schwinge <thomas@codesourcery.com>

Will you then please backport that to releases/gcc-10 branch, too?


Grüße
 Thomas


> Fortran: improve location data for OpenACC/OpenMP directives [PR97782]
>
> gcc/fortran/ChangeLog:
>
>       PR fortran/97782
>       * trans-openmp.c (gfc_trans_oacc_construct, gfc_trans_omp_parallel_do,
>       gfc_trans_omp_parallel_do_simd, gfc_trans_omp_parallel_sections,
>       gfc_trans_omp_parallel_workshare, gfc_trans_omp_sections
>       gfc_trans_omp_single, gfc_trans_omp_task, gfc_trans_omp_teams
>       gfc_trans_omp_target, gfc_trans_omp_target_data,
>       gfc_trans_omp_workshare): Use code->loc instead of input_location
>       when building the OMP_/OACC_ construct.
>
> gcc/testsuite/ChangeLog:
>
>       PR fortran/97782
>       * gfortran.dg/goacc/classify-kernels-unparallelized.f95: Move dg-message
>       one line up.
>       * gfortran.dg/goacc/classify-kernels.f95: Likewise.
>
>  gcc/fortran/trans-openmp.c                         | 50 +++++++++++-----------
>  .../goacc/classify-kernels-unparallelized.f95      |  4 +-
>  .../gfortran.dg/goacc/classify-kernels.f95         |  4 +-
>  3 files changed, 30 insertions(+), 28 deletions(-)
>
> diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
> index d2559bd0c0a..6b4ad6a7050 100644
> --- a/gcc/fortran/trans-openmp.c
> +++ b/gcc/fortran/trans-openmp.c
> @@ -3922,8 +3922,8 @@ gfc_trans_oacc_construct (gfc_code *code)
>    oacc_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
>                                       code->loc, false, true);
>    stmt = gfc_trans_omp_code (code->block->next, true);
> -  stmt = build2_loc (input_location, construct_code, void_type_node, stmt,
> -                  oacc_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), construct_code,
> +                  void_type_node, stmt, oacc_clauses);
>    gfc_add_expr_to_block (&block, stmt);
>    return gfc_finish_block (&block);
>  }
> @@ -5351,8 +5351,8 @@ gfc_trans_omp_parallel_do (gfc_code *code, stmtblock_t *pblock,
>      }
>    else if (TREE_CODE (stmt) != BIND_EXPR)
>      stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
> -  stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
> +                  void_type_node, stmt, omp_clauses);
>    OMP_PARALLEL_COMBINED (stmt) = 1;
>    gfc_add_expr_to_block (&block, stmt);
>    return gfc_finish_block (&block);
> @@ -5394,8 +5394,8 @@ gfc_trans_omp_parallel_do_simd (gfc_code *code, stmtblock_t *pblock,
>      stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
>    if (flag_openmp)
>      {
> -      stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
> -                      omp_clauses);
> +      stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
> +                      void_type_node, stmt, omp_clauses);
>        OMP_PARALLEL_COMBINED (stmt) = 1;
>      }
>    gfc_add_expr_to_block (&block, stmt);
> @@ -5421,8 +5421,8 @@ gfc_trans_omp_parallel_sections (gfc_code *code)
>      stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
>    else
>      poplevel (0, 0);
> -  stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
> +                  void_type_node, stmt, omp_clauses);
>    OMP_PARALLEL_COMBINED (stmt) = 1;
>    gfc_add_expr_to_block (&block, stmt);
>    return gfc_finish_block (&block);
> @@ -5444,8 +5444,8 @@ gfc_trans_omp_parallel_workshare (gfc_code *code)
>    pushlevel ();
>    stmt = gfc_trans_omp_workshare (code, &workshare_clauses);
>    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
> -  stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
> +                  void_type_node, stmt, omp_clauses);
>    OMP_PARALLEL_COMBINED (stmt) = 1;
>    gfc_add_expr_to_block (&block, stmt);
>    return gfc_finish_block (&block);
> @@ -5457,6 +5457,7 @@ gfc_trans_omp_sections (gfc_code *code, gfc_omp_clauses *clauses)
>    stmtblock_t block, body;
>    tree omp_clauses, stmt;
>    bool has_lastprivate = clauses->lists[OMP_LIST_LASTPRIVATE] != NULL;
> +  location_t loc = gfc_get_location (&code->loc);
>
>    gfc_start_block (&block);
>
> @@ -5477,8 +5478,7 @@ gfc_trans_omp_sections (gfc_code *code, gfc_omp_clauses *clauses)
>      }
>    stmt = gfc_finish_block (&body);
>
> -  stmt = build2_loc (input_location, OMP_SECTIONS, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (loc, OMP_SECTIONS, void_type_node, stmt, omp_clauses);
>    gfc_add_expr_to_block (&block, stmt);
>
>    return gfc_finish_block (&block);
> @@ -5489,8 +5489,8 @@ gfc_trans_omp_single (gfc_code *code, gfc_omp_clauses *clauses)
>  {
>    tree omp_clauses = gfc_trans_omp_clauses (NULL, clauses, code->loc);
>    tree stmt = gfc_trans_omp_code (code->block->next, true);
> -  stmt = build2_loc (input_location, OMP_SINGLE, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), OMP_SINGLE, void_type_node,
> +                  stmt, omp_clauses);
>    return stmt;
>  }
>
> @@ -5506,8 +5506,8 @@ gfc_trans_omp_task (gfc_code *code)
>    pushlevel ();
>    stmt = gfc_trans_omp_code (code->block->next, true);
>    stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
> -  stmt = build2_loc (input_location, OMP_TASK, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), OMP_TASK, void_type_node,
> +                  stmt, omp_clauses);
>    gfc_add_expr_to_block (&block, stmt);
>    return gfc_finish_block (&block);
>  }
> @@ -5649,8 +5649,8 @@ gfc_trans_omp_teams (gfc_code *code, gfc_omp_clauses *clausesa,
>    if (flag_openmp)
>      {
>        stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
> -      stmt = build2_loc (input_location, OMP_TEAMS, void_type_node, stmt,
> -                      omp_clauses);
> +      stmt = build2_loc (gfc_get_location (&code->loc), OMP_TEAMS,
> +                      void_type_node, stmt, omp_clauses);
>        if (combined)
>       OMP_TEAMS_COMBINED (stmt) = 1;
>      }
> @@ -5753,8 +5753,8 @@ gfc_trans_omp_target (gfc_code *code)
>      }
>    if (flag_openmp)
>      {
> -      stmt = build2_loc (input_location, OMP_TARGET, void_type_node, stmt,
> -                      omp_clauses);
> +      stmt = build2_loc (gfc_get_location (&code->loc), OMP_TARGET,
> +                      void_type_node, stmt, omp_clauses);
>        if (code->op != EXEC_OMP_TARGET)
>       OMP_TARGET_COMBINED (stmt) = 1;
>        cfun->has_omp_target = true;
> @@ -5815,8 +5815,8 @@ gfc_trans_omp_target_data (gfc_code *code)
>    omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
>                                      code->loc);
>    stmt = gfc_trans_omp_code (code->block->next, true);
> -  stmt = build2_loc (input_location, OMP_TARGET_DATA, void_type_node, stmt,
> -                  omp_clauses);
> +  stmt = build2_loc (gfc_get_location (&code->loc), OMP_TARGET_DATA,
> +                  void_type_node, stmt, omp_clauses);
>    gfc_add_expr_to_block (&block, stmt);
>    return gfc_finish_block (&block);
>  }
> @@ -5876,6 +5876,7 @@ gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
>    bool singleblock_in_progress = false;
>    /* True if previous gfc_code in workshare construct is not workshared.  */
>    bool prev_singleunit;
> +  location_t loc = gfc_get_location (&code->loc);
>
>    code = code->block->next;
>
> @@ -5966,7 +5967,7 @@ gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
>               {
>                 /* Finish single block and add it to pblock.  */
>                 tmp = gfc_finish_block (&singleblock);
> -               tmp = build2_loc (input_location, OMP_SINGLE,
> +               tmp = build2_loc (loc, OMP_SINGLE,
>                                   void_type_node, tmp, NULL_TREE);
>                 gfc_add_expr_to_block (pblock, tmp);
>                 /* Add current gfc_code to pblock.  */
> @@ -5982,6 +5983,7 @@ gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
>                 gfc_init_block (&singleblock);
>                 gfc_add_expr_to_block (&singleblock, res);
>                 singleblock_in_progress = true;
> +               loc = gfc_get_location (&code->loc);
>               }
>             else
>               /* Add the new statement to the block.  */
> @@ -5996,7 +5998,7 @@ gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
>      {
>        /* Finish single block and add it to pblock.  */
>        tmp = gfc_finish_block (&singleblock);
> -      tmp = build2_loc (input_location, OMP_SINGLE, void_type_node, tmp,
> +      tmp = build2_loc (loc, OMP_SINGLE, void_type_node, tmp,
>                       clauses->nowait
>                       ? build_omp_clause (input_location, OMP_CLAUSE_NOWAIT)
>                       : NULL_TREE);
> diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95
> index 08772428c4c..6cca3d6eefb 100644
> --- a/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95
> +++ b/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95
> @@ -19,8 +19,8 @@ program main
>
>    call setup(a, b)
>
> -  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
> -  do i = 0, n - 1 ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
> +  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
> +  do i = 0, n - 1
>       c(i) = a(f (i)) + b(f (i))
>    end do
>    !$acc end kernels
> diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95
> index f2c4736e111..715a983bb26 100644
> --- a/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95
> +++ b/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95
> @@ -15,8 +15,8 @@ program main
>
>    call setup(a, b)
>
> -  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
> -  do i = 0, n - 1 ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
> +  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
> +  do i = 0, n - 1
>       c(i) = a(i) + b(i)
>    end do
>    !$acc end kernels
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
Thomas Schwinge Nov. 12, 2020, 7:26 p.m. UTC | #2
Hi!

On 2020-11-12T12:45:24+0100, Tobias Burnus <tobias@codesourcery.com> wrote:
> For code like
>   !$acc kernels
>      ... a lot of loops and other code
>   !$acc end kernels
>
> gfortran generates
>    #pragma ..._kernels
>      {
>        ... lot of code
>      }
>
> As the PR shows, the location associated with the #pragma
> is not the 'acc kernels' line but the one near the 'acc end kernel'
> line.
>
> The reason is that [...]

> This patch [...]

> In principle, it should also have an effect on warnings (if there are
> any)

..., and there are -- one, at least (and somewhat bogus, but still).  ;-)
I've thus pushed "Adjust 'libgomp.oacc-fortran/attach-descriptor-1.f90'
for improved location information" to master branch in commit
9106c51e57c06e88a0dddf994fb5432b4bbe68c0, see attached.  (Not (yet)
relevant for releases/gcc-10 branch; the commit introducing that testcase
isn't there yet -- that's to be discussed in a different thread.)


Grüße
 Thomas


-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
diff mbox series

Patch

Fortran: improve location data for OpenACC/OpenMP directives [PR97782]

gcc/fortran/ChangeLog:

	PR fortran/97782
	* trans-openmp.c (gfc_trans_oacc_construct, gfc_trans_omp_parallel_do,
	gfc_trans_omp_parallel_do_simd, gfc_trans_omp_parallel_sections,
	gfc_trans_omp_parallel_workshare, gfc_trans_omp_sections
	gfc_trans_omp_single, gfc_trans_omp_task, gfc_trans_omp_teams
	gfc_trans_omp_target, gfc_trans_omp_target_data,
	gfc_trans_omp_workshare): Use code->loc instead of input_location
	when building the OMP_/OACC_ construct.

gcc/testsuite/ChangeLog:

	PR fortran/97782
	* gfortran.dg/goacc/classify-kernels-unparallelized.f95: Move dg-message
	one line up.
	* gfortran.dg/goacc/classify-kernels.f95: Likewise.

 gcc/fortran/trans-openmp.c                         | 50 +++++++++++-----------
 .../goacc/classify-kernels-unparallelized.f95      |  4 +-
 .../gfortran.dg/goacc/classify-kernels.f95         |  4 +-
 3 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index d2559bd0c0a..6b4ad6a7050 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -3922,8 +3922,8 @@  gfc_trans_oacc_construct (gfc_code *code)
   oacc_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
 					code->loc, false, true);
   stmt = gfc_trans_omp_code (code->block->next, true);
-  stmt = build2_loc (input_location, construct_code, void_type_node, stmt,
-		     oacc_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), construct_code,
+		     void_type_node, stmt, oacc_clauses);
   gfc_add_expr_to_block (&block, stmt);
   return gfc_finish_block (&block);
 }
@@ -5351,8 +5351,8 @@  gfc_trans_omp_parallel_do (gfc_code *code, stmtblock_t *pblock,
     }
   else if (TREE_CODE (stmt) != BIND_EXPR)
     stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
-  stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
+		     void_type_node, stmt, omp_clauses);
   OMP_PARALLEL_COMBINED (stmt) = 1;
   gfc_add_expr_to_block (&block, stmt);
   return gfc_finish_block (&block);
@@ -5394,8 +5394,8 @@  gfc_trans_omp_parallel_do_simd (gfc_code *code, stmtblock_t *pblock,
     stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
   if (flag_openmp)
     {
-      stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
-			 omp_clauses);
+      stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
+			 void_type_node, stmt, omp_clauses);
       OMP_PARALLEL_COMBINED (stmt) = 1;
     }
   gfc_add_expr_to_block (&block, stmt);
@@ -5421,8 +5421,8 @@  gfc_trans_omp_parallel_sections (gfc_code *code)
     stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
   else
     poplevel (0, 0);
-  stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
+		     void_type_node, stmt, omp_clauses);
   OMP_PARALLEL_COMBINED (stmt) = 1;
   gfc_add_expr_to_block (&block, stmt);
   return gfc_finish_block (&block);
@@ -5444,8 +5444,8 @@  gfc_trans_omp_parallel_workshare (gfc_code *code)
   pushlevel ();
   stmt = gfc_trans_omp_workshare (code, &workshare_clauses);
   stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
-  stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), OMP_PARALLEL,
+		     void_type_node, stmt, omp_clauses);
   OMP_PARALLEL_COMBINED (stmt) = 1;
   gfc_add_expr_to_block (&block, stmt);
   return gfc_finish_block (&block);
@@ -5457,6 +5457,7 @@  gfc_trans_omp_sections (gfc_code *code, gfc_omp_clauses *clauses)
   stmtblock_t block, body;
   tree omp_clauses, stmt;
   bool has_lastprivate = clauses->lists[OMP_LIST_LASTPRIVATE] != NULL;
+  location_t loc = gfc_get_location (&code->loc);
 
   gfc_start_block (&block);
 
@@ -5477,8 +5478,7 @@  gfc_trans_omp_sections (gfc_code *code, gfc_omp_clauses *clauses)
     }
   stmt = gfc_finish_block (&body);
 
-  stmt = build2_loc (input_location, OMP_SECTIONS, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (loc, OMP_SECTIONS, void_type_node, stmt, omp_clauses);
   gfc_add_expr_to_block (&block, stmt);
 
   return gfc_finish_block (&block);
@@ -5489,8 +5489,8 @@  gfc_trans_omp_single (gfc_code *code, gfc_omp_clauses *clauses)
 {
   tree omp_clauses = gfc_trans_omp_clauses (NULL, clauses, code->loc);
   tree stmt = gfc_trans_omp_code (code->block->next, true);
-  stmt = build2_loc (input_location, OMP_SINGLE, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), OMP_SINGLE, void_type_node,
+		     stmt, omp_clauses);
   return stmt;
 }
 
@@ -5506,8 +5506,8 @@  gfc_trans_omp_task (gfc_code *code)
   pushlevel ();
   stmt = gfc_trans_omp_code (code->block->next, true);
   stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
-  stmt = build2_loc (input_location, OMP_TASK, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), OMP_TASK, void_type_node,
+		     stmt, omp_clauses);
   gfc_add_expr_to_block (&block, stmt);
   return gfc_finish_block (&block);
 }
@@ -5649,8 +5649,8 @@  gfc_trans_omp_teams (gfc_code *code, gfc_omp_clauses *clausesa,
   if (flag_openmp)
     {
       stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
-      stmt = build2_loc (input_location, OMP_TEAMS, void_type_node, stmt,
-			 omp_clauses);
+      stmt = build2_loc (gfc_get_location (&code->loc), OMP_TEAMS,
+			 void_type_node, stmt, omp_clauses);
       if (combined)
 	OMP_TEAMS_COMBINED (stmt) = 1;
     }
@@ -5753,8 +5753,8 @@  gfc_trans_omp_target (gfc_code *code)
     }
   if (flag_openmp)
     {
-      stmt = build2_loc (input_location, OMP_TARGET, void_type_node, stmt,
-			 omp_clauses);
+      stmt = build2_loc (gfc_get_location (&code->loc), OMP_TARGET,
+			 void_type_node, stmt, omp_clauses);
       if (code->op != EXEC_OMP_TARGET)
 	OMP_TARGET_COMBINED (stmt) = 1;
       cfun->has_omp_target = true;
@@ -5815,8 +5815,8 @@  gfc_trans_omp_target_data (gfc_code *code)
   omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
 				       code->loc);
   stmt = gfc_trans_omp_code (code->block->next, true);
-  stmt = build2_loc (input_location, OMP_TARGET_DATA, void_type_node, stmt,
-		     omp_clauses);
+  stmt = build2_loc (gfc_get_location (&code->loc), OMP_TARGET_DATA,
+		     void_type_node, stmt, omp_clauses);
   gfc_add_expr_to_block (&block, stmt);
   return gfc_finish_block (&block);
 }
@@ -5876,6 +5876,7 @@  gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
   bool singleblock_in_progress = false;
   /* True if previous gfc_code in workshare construct is not workshared.  */
   bool prev_singleunit;
+  location_t loc = gfc_get_location (&code->loc);
 
   code = code->block->next;
 
@@ -5966,7 +5967,7 @@  gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
 		{
 		  /* Finish single block and add it to pblock.  */
 		  tmp = gfc_finish_block (&singleblock);
-		  tmp = build2_loc (input_location, OMP_SINGLE,
+		  tmp = build2_loc (loc, OMP_SINGLE,
 				    void_type_node, tmp, NULL_TREE);
 		  gfc_add_expr_to_block (pblock, tmp);
 		  /* Add current gfc_code to pblock.  */
@@ -5982,6 +5983,7 @@  gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
 		  gfc_init_block (&singleblock);
 		  gfc_add_expr_to_block (&singleblock, res);
 		  singleblock_in_progress = true;
+		  loc = gfc_get_location (&code->loc);
 		}
 	      else
 		/* Add the new statement to the block.  */
@@ -5996,7 +5998,7 @@  gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
     {
       /* Finish single block and add it to pblock.  */
       tmp = gfc_finish_block (&singleblock);
-      tmp = build2_loc (input_location, OMP_SINGLE, void_type_node, tmp,
+      tmp = build2_loc (loc, OMP_SINGLE, void_type_node, tmp,
 			clauses->nowait
 			? build_omp_clause (input_location, OMP_CLAUSE_NOWAIT)
 			: NULL_TREE);
diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95
index 08772428c4c..6cca3d6eefb 100644
--- a/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95
@@ -19,8 +19,8 @@  program main
 
   call setup(a, b)
 
-  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
-  do i = 0, n - 1 ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC seq loop parallelism" }
+  do i = 0, n - 1
      c(i) = a(f (i)) + b(f (i))
   end do
   !$acc end kernels
diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95
index f2c4736e111..715a983bb26 100644
--- a/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95
@@ -15,8 +15,8 @@  program main
 
   call setup(a, b)
 
-  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
-  do i = 0, n - 1 ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC gang loop parallelism" }
+  do i = 0, n - 1
      c(i) = a(i) + b(i)
   end do
   !$acc end kernels