https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90801

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |compile-time-hog
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-06-11
     Ever confirmed|0                           |1
      Known to fail|                            |9.1.0

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed with GCC 9.1.0 and -fsyntax-only.

  N       time
100000    4.2s
200000   14.7s
300000   31.7s

memory use isn't as much as of a problem.

Samples: 200  of event 'cycles:ppp', Event count (approx.): 90115299747038      
Overhead  Command  Shared Object     Symbol                                     
  79.41%  cc1plus  libc-2.22.so      [.] __memmove_avx_unaligned
  10.98%  cc1plus  [unknown]         [k] 0xffffffff81189984
   1.87%  cc1plus  cc1plus           [.] cp_fold_r
   1.07%  cc1plus  cc1plus           [.] decay_conversion
   1.07%  cc1plus  cc1plus           [.] mark_use
   0.93%  cc1plus  cc1plus           [.] cp_fold

So this is the known issue in split_nonconstant_init_1 doing

      FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx,
                                field_index, value)
        {
...
            }
          else if (!initializer_constant_valid_p (value, inner_type))
            {
              tree code;
              tree sub;

              /* FIXME: Ordered removal is O(1) so the whole function is
                 worst-case quadratic. This could be fixed using an aside
                 bitmap to record which elements must be removed and remove
                 them all at the same time. Or by merging
                 split_non_constant_init into process_init_constructor_array,
                 that is separating constants from non-constants while building
                 the vector.  */
              CONSTRUCTOR_ELTS (init)->ordered_remove (idx);
              --idx;

Reply via email to