This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, fortran] PR38033 - Bounds of a pointer/allocatable array not stabilized
- From: "Paul Richard Thomas" <paul dot richard dot thomas at gmail dot com>
- To: "Fortran List" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 13 Nov 2008 21:33:25 +0100
- Subject: [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" } }