Bug 54312 - uniquify_nodes takes 12% of Mozilla LTO build
Summary: uniquify_nodes takes 12% of Mozilla LTO build
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: lto (show other bugs)
Version: lto
: P3 normal
Target Milestone: 4.7.3
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks: mozillametabug
  Show dependency treegraph
 
Reported: 2012-08-18 09:46 UTC by Jan Hubicka
Modified: 2012-09-20 14:52 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jan Hubicka 2012-08-18 09:46:55 UTC
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
Comment 1 Richard Biener 2012-08-20 07:29:00 UTC
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
Comment 2 Richard Biener 2012-09-11 11:03:52 UTC
Patch pre-approved (also for 4.7) if it passes your testing.
Comment 3 Jan Hubicka 2012-09-12 16:26:31 UTC
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
Comment 4 Richard Biener 2012-09-20 14:52:07 UTC
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
Comment 5 Richard Biener 2012-09-20 14:52:23 UTC
Fixed for 4.7.3.