uniquify_nodes has quadratic loop removing types from variant lists: /* Remove us from our main variant list if we are not the variant leader. */ if (TYPE_MAIN_VARIANT (t) != t) { tem = TYPE_MAIN_VARIANT (t); while (tem && TYPE_NEXT_VARIANT (tem) != t) tem = TYPE_NEXT_VARIANT (tem); if (tem) TYPE_NEXT_VARIANT (tem) = TYPE_NEXT_VARIANT (t); TYPE_NEXT_VARIANT (t) = NULL_TREE; } this consume a lot of time building Mozilla (and was introduced by Michael's patch cleaning up the stream in process). Can't we do a bit better here? (this was introduced in 4.7) Honza
I don't see how we can do better. Or well, we can put in an assert instead (we stream TYPE_NEXT_VARIANT as NULL). #ifdef ENABLE_CHECKING if (TYPE_MAIN_VARIANT (t) != t) { tem = TYPE_MAIN_VARIANT (t); while (tem && TYPE_NEXT_VARIANT (tem) != t) tem = TYPE_NEXT_VARIANT (tem); gcc_assert (!tem && !TYPE_NEXT_VARIANT (t)); } #endif
Patch pre-approved (also for 4.7) if it passes your testing.
Author: hubicka Date: Wed Sep 12 16:26:19 2012 New Revision: 191228 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=191228 Log: PR lto/54312 * lto.c (uniquify_nodes): Remove quadratic loop checking if the type is variant leader. Modified: trunk/gcc/lto/ChangeLog trunk/gcc/lto/lto.c
Author: rguenth Date: Thu Sep 20 14:51:59 2012 New Revision: 191568 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=191568 Log: 2012-09-20 Richard Guenther <rguenther@suse.de> Backport from mainline 2012-09-11 Jan Hubicka <jh@suse.cz> PR lto/54312 * lto.c (uniquify_nodes): Remove quadratic loop checking if the type is variant leader. Modified: branches/gcc-4_7-branch/gcc/lto/ChangeLog branches/gcc-4_7-branch/gcc/lto/lto.c
Fixed for 4.7.3.