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

            Bug ID: 126533
           Summary: Compile time hog with gori_name_helper
           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: ---

/* gori_name_helper walks both SSA operands of every statement with no
   memoisation, so a depth-N DAG of two-operand statements costs 2^N.

   Entry point: gori_name_helper, gcc/gimple-range-gori.cc:1683, reached from
   gori_name_on_edge (1729) <- dom_ranger::range_on_edge (gimple-range.cc:858)
   <- fvrp_folder::value_on_edge, once per PHI argument.

   The sibling walk gori_calc_operands (gimple-range-gori.cc:1617) memoises
   with !r.has_range (si.ssaN) and is linear; this one has no cache, no depth
   limit and no in_chain_p test.

   Needs the fast-VRP path, selected automatically when the function has more
   than --param=vrp-block-limit blocks (150000).  Forced here with the param.

     gcc -O2 --param=vrp-block-limit=1   does not finish in 40 s
     gcc -O2                             0.02 s

   Depth 14 / 18 / 22 measure 0.35 s / 5.4 s / >40 s: one doubling per level.
   Control: change "int r = u;" to "int r = a22;" so the queried name is the
   condition operand and gori_name_helper returns at its first test; 0.02 s. 
*/
extern int g1 (int);
int f (int i, int j, int k)
{
  int u = k & 3;
  int a0 = i & 255, b0 = j & 255;
  int t1 = a0 * b0; int s1 = a0 - b0;
  int a1 = t1 & 255; int b1 = s1 & 255;
  int t2 = a1 * b1; int s2 = a1 - b1;
  int a2 = t2 & 255; int b2 = s2 & 255;
  int t3 = a2 * b2; int s3 = a2 - b2;
  int a3 = t3 & 255; int b3 = s3 & 255;
  int t4 = a3 * b3; int s4 = a3 - b3;
  int a4 = t4 & 255; int b4 = s4 & 255;
  int t5 = a4 * b4; int s5 = a4 - b4;
  int a5 = t5 & 255; int b5 = s5 & 255;
  int t6 = a5 * b5; int s6 = a5 - b5;
  int a6 = t6 & 255; int b6 = s6 & 255;
  int t7 = a6 * b6; int s7 = a6 - b6;
  int a7 = t7 & 255; int b7 = s7 & 255;
  int t8 = a7 * b7; int s8 = a7 - b7;
  int a8 = t8 & 255; int b8 = s8 & 255;
  int t9 = a8 * b8; int s9 = a8 - b8;
  int a9 = t9 & 255; int b9 = s9 & 255;
  int t10 = a9 * b9; int s10 = a9 - b9;
  int a10 = t10 & 255; int b10 = s10 & 255;
  int t11 = a10 * b10; int s11 = a10 - b10;
  int a11 = t11 & 255; int b11 = s11 & 255;
  int t12 = a11 * b11; int s12 = a11 - b11;
  int a12 = t12 & 255; int b12 = s12 & 255;
  int t13 = a12 * b12; int s13 = a12 - b12;
  int a13 = t13 & 255; int b13 = s13 & 255;
  int t14 = a13 * b13; int s14 = a13 - b13;
  int a14 = t14 & 255; int b14 = s14 & 255;
  int t15 = a14 * b14; int s15 = a14 - b14;
  int a15 = t15 & 255; int b15 = s15 & 255;
  int t16 = a15 * b15; int s16 = a15 - b15;
  int a16 = t16 & 255; int b16 = s16 & 255;
  int t17 = a16 * b16; int s17 = a16 - b16;
  int a17 = t17 & 255; int b17 = s17 & 255;
  int t18 = a17 * b17; int s18 = a17 - b17;
  int a18 = t18 & 255; int b18 = s18 & 255;
  int t19 = a18 * b18; int s19 = a18 - b18;
  int a19 = t19 & 255; int b19 = s19 & 255;
  int t20 = a19 * b19; int s20 = a19 - b19;
  int a20 = t20 & 255; int b20 = s20 & 255;
  int t21 = a20 * b20; int s21 = a20 - b20;
  int a21 = t21 & 255; int b21 = s21 & 255;
  int t22 = a21 * b21; int s22 = a21 - b21;
  int a22 = t22 & 255; int b22 = s22 & 255;
  int r = u;
  if (a22 < 5) r = g1 (u);
  return r;
}

Reply via email to