------- Comment #42 from hubicka at gcc dot gnu dot org 2009-02-22 11:21 ------- 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); + return build1 (CONVERT_EXPR, type, expr); 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 I will give the patch testing, but I am not too hopeful it will just work. ;) Honza -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12245