Hello,

This PR concerns a huge compile time regression since
-ftrack-macro-expansion=2 became the default. It turns out that
gengtype generates code that is quadratic in the GTY((length)) of
arrays, and in this case (a PCH for a Boost header...) there are 183k
maps for macro expansion line maps in such an array. For comparison:
there are 2732 "ordinary" line maps...

The solution I've come up with, is to hoist a check that's inside the
loop over the elements in the array into the loop test, so that you
get changes in gtype-desc.c like this:

@@ -8963,7 +8963,7 @@ gt_pch_p_9line_maps (ATTRIBUTE_UNUSED vo
     size_t l0 = (size_t)(((*x).info_ordinary).used);
     if ((*x).info_ordinary.maps != NULL) {
       size_t i0;
-      for (i0 = 0; i0 != (size_t)(l0); i0++) {
+      for (i0 = 0; i0 != (size_t)(l0) && ((void
*)(*x).info_ordinary.maps == this_obj); i0++) {
         switch (((*x).info_ordinary.maps[i0]).reason == LC_ENTER_MACRO)
           {
           case 0:

Inside the loop there are more tests against this_obj, but GCC cannot
perform the unswitching with -funswitch-loops because it cannot
determine that the test is loop invariant (everything is a void*
pointer, there are indirect function calls, and all kinds of other
nasty stuff that inhibit good optimization of the gt-* stuff). So my
patch makes gengtype emit the test in the loop test.

The effect is quite dramatic: Compile time for the test case goes from
>9 minutes to 12 seconds on powerpc64-unknown-linux-gnu :-)

Bootstrapped&tested on powerpc64-unknown-linux-gnu. OK for trunk?

Ciao!
Steven

Attachment: PR53880.diff
Description: Binary data

Reply via email to