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

--- Comment #4 from amker at gcc dot gnu.org ---
So there are couple of concerns here.
A) I moved iv_canon pass after loop split so that new loop generated can be
completely unrolled if niter is known and small.  As a result, we don't need to
skip such loops in following optimizers like distribution and graphite.  This
case shows it is cunroll that is wanted, rather than ivcanon.
B) iv_canon adds count-to-zero IV in type of unsigned, but graphite requires
signed iv as in below code:

static bool
loop_ivs_can_be_represented (loop_p loop)
{
  unsigned type_long_long = TYPE_PRECISION (long_long_integer_type_node);
  for (gphi_iterator psi = gsi_start_phis (loop->header); !gsi_end_p (psi);
       gsi_next (&psi))
    {
      gphi *phi = psi.phi ();
      tree res = PHI_RESULT (phi);
      tree type = TREE_TYPE (res);

      if (TYPE_UNSIGNED (type) && TYPE_PRECISION (type) >= type_long_long)
        return false;
    }

  return true;
}

This check could be relaxed?  Given we know all values of the new unsigned IV
can be represented by the corresponding signed type.

C) What do we want to test for this test?  Is it the loop nest multiplying
matrix or the two initialization loops for A/B array?  I guess it's the former?
 For now it's the latter which are tiled.

Reply via email to