Hi Jakub, Your timing is astonishing. This was next on my list of TODOs - not for this particular PR but to deal with the rodata bloat eg. 84487. I presume that this patch will make the latter go away?
Yes, this is good for trunk and, if it fixes 84487, 8-branch as well. Thanks Paul On Mon, 25 Feb 2019 at 23:02, Jakub Jelinek <ja...@redhat.com> wrote: > > Hi! > > When initializing whole array with a const, we can save quite some compile > time memory (and time in some cases) by using RANGE_EXPRs, instead of > duplicating the same initializer thousands of times in the CONSTRUCTOR. > In some cases the gimplifier even can optimize those better. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2019-02-25 Jakub Jelinek <ja...@redhat.com> > > PR fortran/43210 > * trans-array.c (gfc_conv_array_initializer): Use RANGE_EXPR instead > of duplicating the initializer possibly many times. > > --- gcc/fortran/trans-array.c.jj 2019-02-10 12:05:42.753718023 +0100 > +++ gcc/fortran/trans-array.c 2019-02-25 18:11:44.948166509 +0100 > @@ -5986,7 +5986,6 @@ gfc_conv_array_initializer (tree type, g > { > gfc_constructor *c; > tree tmp; > - offset_int wtmp; > gfc_se se; > tree index, range; > vec<constructor_elt, va_gc> *v = NULL; > @@ -6009,13 +6008,10 @@ gfc_conv_array_initializer (tree type, g > else > gfc_conv_structure (&se, expr, 1); > > - wtmp = wi::to_offset (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + 1; > - /* This will probably eat buckets of memory for large arrays. */ > - while (wtmp != 0) > - { > - CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, se.expr); > - wtmp -= 1; > - } > + CONSTRUCTOR_APPEND_ELT (v, build2 (RANGE_EXPR, gfc_array_index_type, > + TYPE_MIN_VALUE (TYPE_DOMAIN (type)), > + TYPE_MAX_VALUE (TYPE_DOMAIN (type))), > + se.expr); > break; > > case EXPR_ARRAY: > > Jakub -- "If you can't explain it simply, you don't understand it well enough" - Albert Einstein