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]

[Patch, fortran] PR38033 - Bounds of a pointer/allocatable array not stabilized


This patch follows from the thread started by Thomas Bruel.  It is
quite self explanatory.  The testcase checks that only one call of
SIZE is made.

Bootstrapped and regtested on FC9/x86_i64 - OK for trunk?

Paul

2008-10-13  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/38033
	* trans-array.c (gfc_trans_create_temp_array): Stabilize the
	'to' expression.
	(gfc_conv_loop_setup): Use the end expression for the loop 'to'
	if it is available.

2008-10-13  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/38033
	* gfortran.dg/array_section_2.f90: New test.
Index: gcc/fortran/trans-array.c
===================================================================
--- gcc/fortran/trans-array.c	(revision 141716)
+++ gcc/fortran/trans-array.c	(working copy)
@@ -650,8 +650,10 @@
 	{
 	  /* Callee allocated arrays may not have a known bound yet.  */
 	  if (loop->to[n])
-	      loop->to[n] = fold_build2 (MINUS_EXPR, gfc_array_index_type,
-					 loop->to[n], loop->from[n]);
+	    loop->to[n] =
+		gfc_evaluate_now (fold_build2 (MINUS_EXPR,
+				  gfc_array_index_type, loop->to[n],
+				  loop->from[n]), pre);
 	  loop->from[n] = gfc_index_zero_node;
 	}
 
@@ -3511,8 +3513,13 @@
 	      break;
 
 	    case GFC_SS_SECTION:
-	      loop->to[n] = gfc_conv_section_upper_bound (loopspec[n], n,
-							  &loop->pre);
+	      /* Use the end expression if it exists and is not constant,
+		 so that it is only evaluated once.  */
+	      if (info->end[n] && !INTEGER_CST_P (info->end[n]))
+		loop->to[n] = info->end[n];
+	      else
+		loop->to[n] = gfc_conv_section_upper_bound (loopspec[n], n,
+							    &loop->pre);
 	      break;
 
             case GFC_SS_FUNCTION:
Index: gcc/testsuite/gfortran.dg/array_section_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/array_section_2.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/array_section_2.f90	(revision 0)
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! PR38033 - size(a) was not stabilized correctly and so the expression was
+! evaluated twice outside the loop and then within the scalarization loops.
+!
+! Contributed by Thomas Bruel  <tmbdev@gmail.com>
+!
+program test
+   integer, parameter :: n = 100
+   real, pointer :: a(:),temp(:)  ! pointer or allocatable have the same effect
+   allocate(a(n), temp(n))
+   temp(1:size(a)) = a
+end program
+! { dg-final { scan-tree-dump-times "size0" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }

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