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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |ice-checking

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, so it's caused by us tiling the original schedule and ISL splitting the
outer loop.

for (int c0 = 0; c0 < -P_2; c0 += 1) {
  S_4(c0);
  for (int c1 = 0; c1 <= 2; c1 += 1)
    S_5(c0, c1);
  S_16(c0);
  if (P_19 + 6 * c0 == 18446744073709551610)
    S_9((-P_19 + 18446744073709551610) / 6);
  S_10(c0);
}

becomes

  for (int c0 = P_19; c0 <= min(18446744073709551609, -6 * P_2 + P_19 - 6); c0
+= 6) {
    S_4((-P_19 + c0) / 6);
    S_16((-P_19 + c0) / 6);
    for (int c2 = 0; c2 <= 2; c2 += 1)
      S_5((-P_19 + c0) / 6, c2);
    S_10((-P_19 + c0) / 6);
  }
  if (P_19 >= 6 * P_2 + 18446744073709551616 && (P_19 - 4) % 6 == 0) {
    S_16((-P_19 + 18446744073709551610) / 6);
    S_4((-P_19 + 18446744073709551610) / 6);
    for (int c2 = 0; c2 <= 2; c2 += 1)
      S_5((-P_19 + 18446744073709551610) / 6, c2);
    S_9((-P_19 + 18446744073709551610) / 6);
    S_10((-P_19 + 18446744073709551610) / 6);
  }
  for (int c0 = ((P_19 + 1) % 6) + 18446744073709551611; c0 < -6 * P_2 + P_19 -
5; c0 += 6) {
    S_4((-P_19 + c0) / 6);
    S_16((-P_19 + c0) / 6);
    for (int c2 = 0; c2 <= 2; c2 += 1)
      S_5((-P_19 + c0) / 6, c2);
    S_10((-P_19 + c0) / 6);
  }

exposing constants that are too large for our choosen code-generation type
(signed long long).

For some reason -fgraphite-identity performs a similar "transform".

Note that this code-gen error is somewhat "expected" until we do better
with selecting wider types for code-generation.  Note that
18446744073709551616 doesn't even fit unsigned long long.  For -m64 we
use __int128 which is why the bug doesn't trigger there.

Reply via email to