This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gomp] Fix VLA reductions (PR fortran/27395)


--- Begin Message ---
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 ---

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]