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.