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

--- Comment #5 from Andrew Macleod <amacleod at redhat dot com> ---
hmm. yeah. its triggering some kind of pathological edge evaluation between
GORI and cache updating.

There is a long sequence of dependent stmts, presumably the unrolled loop, and
a sequential series of conditions.. ie:
  _4 = (short unsigned int) c.2_1;
  _5 = _4 + 65535;
  a_lsm.19_30 = a;
  _49 = _4 + 65534;
  _12 = _5 & _49;
  _46 = _12 + 65535;
  _48 = _12 & _46;
  _59 = _48 + 65535;
  _60 = _48 & _59;
<...>
if (_12 != 0)
if (_48 != 0)
if (_60 != 0)
<...>
note the interdependence of say _48 and _12.  
Evaluating _48 evaluates _12 and _46.  _46 evaluates _12 as well, and then it
continues..  
Edge evaluation still has no caching, so its calculated as required.  This is
causing a cascading exponential growth of edge evaluations the further we go.

Caching outgoing edge evaluations should resolve this, as would identifying the
situation with 2 operands that have an interdependence and evaluating them
together rather than independently, thus removing the exponential explosion.

still considering...

.

Reply via email to