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

            Bug ID: 106234
           Summary: [13 Regression] stack overflow from range_from_dom
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

Some recent commit on the testcase below with -O2 -funswitch-loops
-fno-thread-jumps blows the stack due to deep recursion

#0  0x0000000000f33a1b in range_query::get_tree_range (this=0x5bc6d78, r=..., 
    expr=0x7ffff68e10f0, stmt=0x7fffe99fafa0)
    at /space/rguenther/src/gcc/gcc/value-query.cc:214
#1  0x0000000001892bfc in ranger_cache::range_of_expr (this=<optimized out>, 
    r=..., name=<optimized out>, stmt=<optimized out>)
    at /space/rguenther/src/gcc/gcc/gimple-range-cache.cc:978
...
(gdb) up 10000
#7950 0x00000000007103eb in main (argc=8, argv=0x7fffffffdd48)
    at /space/rguenther/src/gcc/gcc/main.cc:39
39        int r = toplev.main (argc, argv);

with range_from_dom appearing a lot of times.  -fno-tree-dominator-opts
-fno-tree-vrp "fixes" this.

extern int foo (int);

int bar(int flag)
{
  int res = 0;
#define A \
  for (int i = 0; i < 1024; ++i) if (flag) res ^= foo(i);
#define B A A A A A A A A A A
#define C B B B B B B B B B B
#define D C C C C C C C C C C
#define E D D D D D D D D D D
  E
  return res;
}


it looks like range_from_dom walks up immediate dominators but in that loop
recurses to itself!?  isn't that quadratic?  shouldn't the recursion stop
at the next immediate dominator of the recursion invoker?

Reply via email to