]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
openmp: Handle clauses with gimple sequences in convert_nonlocal_omp_clauses properly
authorKwok Cheung Yeung <kcy@codesourcery.com>
Tue, 18 Aug 2020 15:55:21 +0000 (08:55 -0700)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Tue, 18 Aug 2020 15:55:21 +0000 (08:55 -0700)
This is a backport from master of commit
676b5525e8333005bdc1c596ed086f1da27a450f.

If the walk_body on the various sequences of reduction, lastprivate and/or linear
clauses needs to create a temporary variable, we should declare that variable
in that sequence rather than outside, where it would need to be privatized inside of
the construct.

2020-08-08  Jakub Jelinek  <jakub@redhat.com>

PR fortran/93553
* tree-nested.c (convert_nonlocal_omp_clauses): For
OMP_CLAUSE_REDUCTION, OMP_CLAUSE_LASTPRIVATE and OMP_CLAUSE_LINEAR
save info->new_local_var_chain around walks of the clause gimple
sequences and declare_vars if needed into the sequence.

2020-08-08  Tobias Burnus  <tobias@codesourcery.com>

PR fortran/93553
* testsuite/libgomp.fortran/pr93553.f90: New test.

gcc/ChangeLog.omp
gcc/tree-nested.c
libgomp/ChangeLog.omp
libgomp/testsuite/libgomp.fortran/pr93553.f90 [new file with mode: 0644]

index 34622a3bfa1b091e6eac2f0b4749af53dc64c65f..063eda3da5e1d726002c736404027e5ae26fee51 100644 (file)
@@ -1,3 +1,14 @@
+2020-08-18  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       Backport from mainline
+       2020-08-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/93553
+       * tree-nested.c (convert_nonlocal_omp_clauses): For
+       OMP_CLAUSE_REDUCTION, OMP_CLAUSE_LASTPRIVATE and OMP_CLAUSE_LINEAR
+       save info->new_local_var_chain around walks of the clause gimple
+       sequences and declare_vars if needed into the sequence.
+
 2020-07-30  Julian Brown  <julian@codesourcery.com>
 
        * config/gcn/gcn-tree.c (gcn_goacc_get_worker_red_decl): Do not
index 7476a3a3def03ff9f78f5cec8c0b7f892447a26c..e42f0b6a2d273dac3d5820aa5918560f445a6a06 100644 (file)
@@ -1424,12 +1424,22 @@ convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
              if (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause))
                DECL_CONTEXT (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause))
                  = info->context;
+             tree save_local_var_chain = info->new_local_var_chain;
+             info->new_local_var_chain = NULL;
+             gimple_seq *seq = &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause);
              walk_body (convert_nonlocal_reference_stmt,
-                        convert_nonlocal_reference_op, info,
-                        &OMP_CLAUSE_REDUCTION_GIMPLE_INIT (clause));
+                        convert_nonlocal_reference_op, info, seq);
+             if (info->new_local_var_chain)
+               declare_vars (info->new_local_var_chain,
+                             gimple_seq_first_stmt (*seq), false);
+             info->new_local_var_chain = NULL;
+             seq = &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause);
              walk_body (convert_nonlocal_reference_stmt,
-                        convert_nonlocal_reference_op, info,
-                        &OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (clause));
+                        convert_nonlocal_reference_op, info, seq);
+             if (info->new_local_var_chain)
+               declare_vars (info->new_local_var_chain,
+                             gimple_seq_first_stmt (*seq), false);
+             info->new_local_var_chain = save_local_var_chain;
              DECL_CONTEXT (OMP_CLAUSE_REDUCTION_PLACEHOLDER (clause))
                = old_context;
              if (OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (clause))
@@ -1439,15 +1449,31 @@ convert_nonlocal_omp_clauses (tree *pclauses, struct walk_stmt_info *wi)
          break;
 
        case OMP_CLAUSE_LASTPRIVATE:
-         walk_body (convert_nonlocal_reference_stmt,
-                    convert_nonlocal_reference_op, info,
-                    &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause));
+         {
+           tree save_local_var_chain = info->new_local_var_chain;
+           info->new_local_var_chain = NULL;
+           gimple_seq *seq = &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause);
+           walk_body (convert_nonlocal_reference_stmt,
+                      convert_nonlocal_reference_op, info, seq);
+           if (info->new_local_var_chain)
+             declare_vars (info->new_local_var_chain,
+                           gimple_seq_first_stmt (*seq), false);
+           info->new_local_var_chain = save_local_var_chain;
+         }
          break;
 
        case OMP_CLAUSE_LINEAR:
-         walk_body (convert_nonlocal_reference_stmt,
-                    convert_nonlocal_reference_op, info,
-                    &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause));
+         {
+           tree save_local_var_chain = info->new_local_var_chain;
+           info->new_local_var_chain = NULL;
+           gimple_seq *seq = &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause);
+           walk_body (convert_nonlocal_reference_stmt,
+                      convert_nonlocal_reference_op, info, seq);
+           if (info->new_local_var_chain)
+             declare_vars (info->new_local_var_chain,
+                           gimple_seq_first_stmt (*seq), false);
+           info->new_local_var_chain = save_local_var_chain;
+         }
          break;
 
        default:
index 6c3f695ba4e9a8f32efa1a1db316a5860c542c4b..4601eae2af4a59a725af67ec4472487f3300962b 100644 (file)
@@ -1,3 +1,11 @@
+2020-08-18  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       Backport from mainline
+       2020-08-08  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR fortran/93553
+       * testsuite/libgomp.fortran/pr93553.f90: New test.
+
 2020-08-18  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        Backport from mainline
diff --git a/libgomp/testsuite/libgomp.fortran/pr93553.f90 b/libgomp/testsuite/libgomp.fortran/pr93553.f90
new file mode 100644 (file)
index 0000000..5d6f10f
--- /dev/null
@@ -0,0 +1,21 @@
+program p
+   implicit none
+   integer :: x(8) = 0
+   call sub(x)
+end
+subroutine sub(x)
+   implicit none
+   integer i
+   integer :: x(8)
+   integer :: c(8) = [(11*i, i=1,8)]
+   call s
+   if (any (x /= c)) stop 1
+contains
+   subroutine s
+      integer :: i
+      !$omp parallel do reduction(+:x)
+      do i = 1, 8
+         x(i) = c(i)
+      end do
+   end
+end