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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we are code-generating

  for (int c0 = 0; c0 <= 1; c0 += 1)
    S_5(c0);
  S_21();
  if (((-P_9 + 18446744073709551615) % 18446744073709551616) + P_1 <=
18446744073709551614 || ((-P_9 + 18446744073709551615) % 18446744073709551616)
+ P_1 >= 18446744073709551616)
    S_7();
  S_9();
  for (int c0 = 0; c0 < -P_2; c0 += 1)
    S_8(c0);
  S_22();

specifically we ICE on -P_9 + 18446744073709551615.  Of course we can't
materialize 18446744073709551616 for the comparisons either.

We have no way of preserving the infinite precision math ISL does here with
the set of types on i?86-linux where __int128_t is missing.  And of course
we generally miss a strategy to deal with the fact that ISL generated math
is infinite precision but our input is not.

The best idea here is to figure out why the condition ends up in the above
form from the "simple" zq != (long long unsigned int) qi.  The complication
is of course the modulo "reduction" constraints we build from the
(long long unsigned int) qi cast.  This gets expressed as

  (P_9 - 18446744073709551616*floor((P_9)/18446744073709551616))

which looks even wrong to me.  This doesn't properly produce -1UL from -1.
Hmm.

Reply via email to