------- Comment #43 from rguenther at suse dot de 2009-02-22 19:03 ------- Subject: Re: [4.2/4.3/4.4 regression] Uses lots of memory when compiling large initialized arrays
On Sun, 22 Feb 2009, hubicka at gcc dot gnu dot org wrote: > Actual representation of constructor don't seem to be major problem here. > > We seem to build _a lot_ (117MB) of CONVERT exprs just to call fold on it and > convert integer to proper type, so counting in INTEGER_CSTs should be just > slightly less than half of memory needed. This seems quite silly. > > The patch to not use HOST_WIDE_INT or similar for counting should save another > 70MB of garbage (and speed up compilation), so perhaps you could dig it out? > :)) > > Following patch: > Index: convert.c > =================================================================== > --- convert.c (revision 144352) > +++ convert.c (working copy) > @@ -749,6 +749,11 @@ convert_to_integer (tree type, tree expr > break; > } > > + /* When parsing long initializers, we might end up with a lot of casts. > + Shortcut this. */ > + if (TREE_CODE (expr) == INTEGER_CST) > + return fold_unary (CONVERT_EXPR, type, expr); fold_convert (). But maybe not valid to do here for C std reasons, who knows. > + > return build1 (CONVERT_EXPR, type, expr); And probably just generally using fold_convert () would be ok as well. Maybe they are there to make sure to build rvalues. > case REAL_TYPE: > > Cuts gabrage production in half: > c-typeck.c:6472 (output_init_element) 0: 0.0% > 47910400:100.0% 45541112:23.7% 26342936:99.5% 19 > ggc-common.c:187 (ggc_calloc) 67094608:46.1% 0: > 0.0% 67162736:34.9% 1088: 0.0% 58 > tree.c:1004 (build_int_cst_wide) 78264768:53.8% 0: > 0.0% 78266496:40.7% 0: 0.0% 3261068 > Total 145570627 47910416 > > 192171521 26481588 3275033 > source location Garbage Freed > > Leak Overhead Times > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12245