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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |glisse at gcc dot gnu.org

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Reproudces with -O -ftree-vrp, the issue shows up when VRP2 is enabled but only
when IVOPTs mangled the code.

FRE1 via folding turns

  <bb 2> :
d:
  a.0_1 = a;
  b.1_2 = b;
  _3 = a.0_1 + b.1_2;
  _4 = _3 + 2147483647;
  c = _4;
  c.2_5 = c;
  if (c.2_5 <= 0)
    goto <bb 3>; [INV]
  else
    goto <bb 4>; [INV]

  <bb 3> :
  // predicted unlikely by goto predictor.
  c.3_6 = c;
  _7 = c.3_6 + 1;
  a = _7;
  // predicted unlikely by goto predictor.
  goto <bb 2>; [INV]

into

  <bb 3> :
  // predicted unlikely by goto predictor.
  _7 = _3 - -2147483648;
  a = _7;
  // predicted unlikely by goto predictor.
  goto <bb 2>; [INV]

that's the

  /* (A +- CST1) +- CST2 -> A + CST3
     Use view_convert because it is safe for vectors and equivalent for
     scalars.  */
...
           /* X+INT_MAX+1 is X-INT_MIN.  */
           (if (INTEGRAL_TYPE_P (type)
                && wi::to_wide (cst) == wi::min_value (type))
            (neg_inner_op @0 { wide_int_to_tree (type, wi::to_wide (cst)); })

case.

Originally we compute { 0, +, 1 } here, now in the first iteration
we do 0 - -2147483648.

It does not look like that's OK.  This was added by r8-1516-ged73f46f30cabe.

Reply via email to