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

            Bug ID: 126538
           Summary: Compile time hog with gimple-range-phi and bitint
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: compile-time-hog
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ktkachov at gcc dot gnu.org
  Target Milestone: ---

/* Entry point: phi_group::calculate_using_modifier,
gcc/gimple-range-phi.cc:167
        num_iter = TYPE_PRECISION (m_vr.type ()) + 1;

   This is NOT a wrong-code case: the range that comes out is correct.  It is a
   compile-time explosion.  The iteration budget is the precision of the group
   type, and each iteration folds the modifier over an int_range_max of that
   same precision, so the cost is cubic in the precision.  _BitInt allows
   65535 bits, and this ten-line function then needs about 41000 iterations of
   a 65535-bit multiply.

     gcc -O2 -c phigrp-02-bitint-iteration-hog.c        167 s
     gcc -O1 -c ...                                       0.02 s   (no ranger
vrp)
     gcc -O2 -fno-tree-vrp -c ...                         0.8 s
     x = x + 3 instead of x * 3, -O2                      0.44 s   (PLUS skips
                                                           the iteration)

   Scaling of the -O2 time with the precision, one function per file:
     512 0.02  1024 0.04  2048 0.08  4096 0.18  8192 0.63
     16384 3.5  32768 22.8  65535 167.

   Dump evidence, at precision 16384 so the dump is quick:
     PHI ANALYZER : New PHI GROUP < x_1 > : range : [irange] T [1, 1][3, +INF]
       Modifier : x_8 = x_1 * 3;
       Initial range was [irange] T [1, 1]  */

typedef _BitInt(65535) T;

__attribute__((noipa)) T
f (int n)
{
  T x = 1;
  for (int i = 0; i < n; i++)
    x = x * 3;
  return x;
}

int
main (void)
{
  return (int) f (2) - 9;
}

Reply via email to