--- Begin Message ---
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Henderson <rth>, Diego Novillo <dnovillo>
- Cc: gcc-patcheas at gcc dot gnu dot org
- Date: Wed, 3 May 2006 05:27:56 -0400
- Subject: [gomp] Fix VLA reductions (PR fortran/27395)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
The first change is obvious typo fix, without the latter omp_notice_variable
will add the placeholder var (which really must be local var, as it is an
artificial placeholder) to outer OMP contexts, causing ICEs in
make_decl_rtl.
Ok for trunk?
2006-05-03 Jakub Jelinek <jakub@redhat.com>
PR fortran/27395
* gimplify.c (gimplify_scan_omp_clauses): Compare OMP_CLAUSE_CODE
rather than TREE_CODE to OMP_CLAUSE_REDUCTION. Set also GOVD_SEEN
bit for OMP_CLAUSE_REDUCTION_PLACEHOLDER.
* testsuite/libgomp.fortran/pr27395-1.f90: New test.
* testsuite/libgomp.fortran/pr27395-2.f90: New test.
--- gcc/gimplify.c.jj 2006-05-02 16:20:05.000000000 +0200
+++ gcc/gimplify.c 2006-05-03 10:49:20.000000000 +0200
@@ -4510,11 +4510,11 @@ gimplify_scan_omp_clauses (tree *list_p,
&& DECL_BY_REFERENCE (TREE_OPERAND (decl, 0)))
OMP_CLAUSE_DECL (c) = decl = TREE_OPERAND (decl, 0);
omp_add_variable (ctx, decl, flags);
- if (TREE_CODE (c) == OMP_CLAUSE_REDUCTION
+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
&& OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
{
omp_add_variable (ctx, OMP_CLAUSE_REDUCTION_PLACEHOLDER (c),
- GOVD_LOCAL);
+ GOVD_LOCAL | GOVD_SEEN);
gimplify_omp_ctxp = ctx;
push_gimplify_context ();
gimplify_stmt (&OMP_CLAUSE_REDUCTION_INIT (c));
--- libgomp/testsuite/libgomp.fortran/pr27395-1.f90.jj 2006-05-03 11:04:20.000000000 +0200
+++ libgomp/testsuite/libgomp.fortran/pr27395-1.f90 2006-05-03 11:04:15.000000000 +0200
@@ -0,0 +1,31 @@
+! PR fortran/27395
+! { dg-do run }
+
+program pr27395_1
+ implicit none
+ integer, parameter :: n=10,m=1001
+ integer :: i
+ integer, dimension(n) :: sumarray
+ call foo(n,m,sumarray)
+ do i=1,n
+ if (sumarray(i).ne.m*i) call abort
+ end do
+end program pr27395_1
+
+subroutine foo(n,m,sumarray)
+ use omp_lib, only : omp_get_thread_num
+ implicit none
+ integer, intent(in) :: n,m
+ integer, dimension(n), intent(out) :: sumarray
+ integer :: i,j
+ sumarray(:)=0
+!$OMP PARALLEL DEFAULT(shared) NUM_THREADS(4)
+!$OMP DO PRIVATE(j,i), REDUCTION(+:sumarray)
+ do j=1,m
+ do i=1,n
+ sumarray(i)=sumarray(i)+i
+ end do
+ end do
+!$OMP END DO
+!$OMP END PARALLEL
+end subroutine foo
--- libgomp/testsuite/libgomp.fortran/pr27395-2.f90.jj 2006-05-03 11:04:20.000000000 +0200
+++ libgomp/testsuite/libgomp.fortran/pr27395-2.f90 2006-05-03 11:06:34.000000000 +0200
@@ -0,0 +1,30 @@
+! PR fortran/27395
+! { dg-do run }
+
+program pr27395_2
+ implicit none
+ integer, parameter :: n=10,m=1001
+ integer :: i
+ call foo(n,m)
+end program pr27395_2
+
+subroutine foo(n,m)
+ use omp_lib, only : omp_get_thread_num
+ implicit none
+ integer, intent(in) :: n,m
+ integer :: i,j
+ integer, dimension(n) :: sumarray
+ sumarray(:)=0
+!$OMP PARALLEL DEFAULT(shared) NUM_THREADS(4)
+!$OMP DO PRIVATE(j,i), REDUCTION(+:sumarray)
+ do j=1,m
+ do i=1,n
+ sumarray(i)=sumarray(i)+i
+ end do
+ end do
+!$OMP END DO
+!$OMP END PARALLEL
+ do i=1,n
+ if (sumarray(i).ne.m*i) call abort
+ end do
+end subroutine foo
Jakub
--- End Message ---