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

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
  <bb 3> [local count: 1014686025]:
  # a.4_18 = PHI <_4(8), 0(2)>
  b = 2147480647;
  _1 = ~a.4_18;
  _2 = _1 * 2147480647;
  a = _2;
  foo ();
  a.2_3 = a;
  if (a.2_3 == 0)
    goto <bb 5>; [5.50%]
  else
    goto <bb 4>; [94.50%]

  <bb 4> [local count: 958878295]:
  _4 = a.4_18 + -2;
  a = _4;
  if (_4 >= -2)
    goto <bb 8>; [94.50%]
  else
    goto <bb 5>; [5.50%]

  <bb 8> [local count: 906139989]:
  goto <bb 3>; [100.00%]

and we get

(set_scalar_evolution
  instantiated_below = 2
  (scalar = _1)
  (scalar_evolution = {-1, +, 2}_1))
)

this is ~{0, + -2} which I think we handle as -1 - X

And we get

(set_scalar_evolution
  instantiated_below = 2
  (scalar = _2)
  (scalar_evolution = {-2147480647, +, -6002(OVF)}_1))
)

and that's wrong, the 2nd iteration _2 should be 1 * 2147480647 but indeed
the difference isn't representable in the signed integer increment of the
CHREC.

It's probably safes to go chrec_dont_know here, the alternative would be
probably (int){-2147480647u, +, -6002u}_1 which likely doesn't help much
in practice?

Reply via email to