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

vries at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|ICE with                    |[graphite] ICE with
                   |-floop-nest-optimize        |-floop-nest-optimize

--- Comment #1 from vries at gcc dot gnu.org ---
The first basic block starts with the load from m:
...
;;   basic block 2, loop depth 0, count 0, freq 2, maybe hot
  # VUSE <.MEM_11(D)>
  _8 = mD.1755[0];
  if (_8 > 0)
    goto <bb 7>;
  else
    goto <bb 19>;
...

The load is labelled as S_2:
...
Converting dr: pdr_0 (read
in gimple stmt: _8 = m[0];
data accesses: [P_8] -> { S_2[] -> [1, 0] }
subscript sizes: { [1, 0] }
)
To polyhedral representation:
  - access functions: [P_8] -> { S_2[] -> [1, 0] }
  - subscripts: { [1, 0] }
...

And after the loop nest transformation, the S_2 statement is now the last:
...
AST generated by isl:
{
  for (int c1 = 0; c1 < P_8; c1 += 51)
    for (int c2 = 0; c2 < P_8; c2 += 51)
      for (int c3 = c1; c3 <= min(P_8 - 1, c1 + 50); c3 += 1)
        for (int c4 = c2; c4 <= min(P_8 - 1, c2 + 50); c4 += 1)
          S_4(c3, c4);
  for (int c1 = 0; c1 <= 19; c1 += 1)
    for (int c2 = 0; c2 < P_8; c2 += 1) {
      S_10(c1, c2);
      for (int c4 = 0; c4 < P_8; c4 += 1)
        S_11(c1, c2, c4);
    }
  S_2();
}
...
while P_8 is dependent on the result (_8) of S_2.

So either:
- the transformation is invalid because is doesn't respect the dependence from
  S_2 to _P8, or
- the code generation mechanism fails to instantiate P_8 before the first use.

Reply via email to