[patch, fortran] PR20923 gfortran slow for large array constructors
Jerry DeLisle
jvdelisle@verizon.net
Sat Dec 5 06:19:00 GMT 2009
Hi folks,
This patch cuts the compilation time for some programs with large array
constructors in half. It does this by traversing the constructor and only
calling the more complicated expand_constructor for expression types that are
EXPR_ARRAY.
Since gfc_constant_ac can be called recursively, this simplification indeed has
significant benefit.
I do not see a real need for another test case since all it would accomplish is
lengthen the time it takes to run the test suite. One interesting side effect
of this was an ICE in gfc_conv_array_constructor_expr, at
fortran/trans-expr.c:3832. This occurs with the following test case where the
limit of 65535 is exceeded.
integer, parameter :: n=65536
integer, parameter :: i(n)=(/(mod(k,2),k=1,n)/)
integer, parameter :: m(n)=i(n:1:-1)
print *, i(1), m(1), i(n), m(n)
end
This takes several minutes before hitting the error:
integer, parameter :: i(n)=(/(mod(k,2),k=1,n)/)
1
Error: The number of elements in the array constructor at (1) requires an
increase of the allowed 65535 upper limit. See -fmax-array-constructor option
The ICE occurs after the error message.
I tried several ways to avoid the ICE with no avail. I opted to change the
error to a gfc_fatal_error. If one thinks about it, this really is a fatal error.
The test case which shows the improvement is:
program sel
implicit none
integer,parameter :: n=1000
integer :: i,j
real,dimension(n*n) :: vect
vect(:) = (/ ((( (i+j+3)),i=1,n),j=1,n) /)
end
$ time gfc44 pr20923.f90
real 0m18.616s
user 0m17.173s
sys 0m0.063s
$ time gfc pr20923.f90
real 0m9.467s
user 0m8.764s
sys 0m0.044s
Regression tested on x86-64=linux-gnu. OK for trunk? Is this sufficient to
close the PR or shall I leave it open?
Regards,
Jerry
2009-12-04 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/20923
* trans-array.c (gfc_conv_array_initializer): Change gfc_error_now to
gfc_fatal_error.
* array.c (count_elements): Whitespace. (extract_element): Whitespace.
(is_constant_element): Changed name from constant_element.
(gfc_constant_element): Only use expand_construuctor for expression
types of EXPR_ARRAY. If expression type is EXPR_CONSTANT, no need to
call gfc_is_constant_expr.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pr20923-6.diff
Type: text/x-patch
Size: 3812 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20091205/0c13ebf4/attachment.bin>
More information about the Gcc-patches
mailing list