This patch by Tobias fixes PR50561. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard. 2012-02-15 Tobias Grosser <gros...@fim.uni-passau.de> PR tree-optimization/50561 * graphite-flattening.c (lst_project_loop): Do not remove old scattering dimensions after flattening. (lst_do_flatten): Likewise. * gcc.dg/graphite/pr50561.c: New testcase. Index: gcc/graphite-flattening.c =================================================================== *** gcc/graphite-flattening.c (revision 184259) --- gcc/graphite-flattening.c (working copy) *************** lst_project_loop (lst_p outer, lst_p inn *** 277,288 **** ppl_delete_Linear_Expression (expr); /* Remove inner loop and the static schedule of its body. */ ! ds = XNEWVEC (ppl_dimension_type, 2); ! ds[0] = inner_dim; ! ds[1] = inner_dim + 1; ! ppl_Polyhedron_remove_space_dimensions (poly, ds, 2); ! PBB_NB_SCATTERING_TRANSFORM (pbb) -= 2; ! free (ds); } mpz_clear (x); --- 277,302 ---- ppl_delete_Linear_Expression (expr); /* Remove inner loop and the static schedule of its body. */ ! /* FIXME: As long as we use PPL we are not able to remove the old ! scattering dimensions. The reason is that these dimensions are not ! entirely unused. They are not necessary as part of the scheduling ! vector, as the earlier dimensions already unambiguously define the ! execution time, however they may still be needed to carry modulo ! constraints as introduced e.g. by strip mining. The correct solution ! would be to project these dimensions out of the scattering polyhedra. ! In case they are still required to carry modulo constraints they should be kept ! internally as existentially quantified dimensions. PPL does only support ! projection of rational polyhedra, however in this case we need an integer ! projection. With isl this will be trivial to implement. For now we just ! leave the dimensions. This is a little ugly, but should be correct. */ ! if (0) { ! ds = XNEWVEC (ppl_dimension_type, 2); ! ds[0] = inner_dim; ! ds[1] = inner_dim + 1; ! ppl_Polyhedron_remove_space_dimensions (poly, ds, 2); ! PBB_NB_SCATTERING_TRANSFORM (pbb) -= 2; ! free (ds); ! } } mpz_clear (x); *************** lst_do_flatten (lst_p lst) *** 412,418 **** if (LST_LOOP_P (l)) { res |= lst_flatten_loop (l, zero); ! remove_unused_scattering_dimensions (l); } lst_update_scattering (lst); --- 426,446 ---- if (LST_LOOP_P (l)) { res |= lst_flatten_loop (l, zero); ! ! /* FIXME: As long as we use PPL we are not able to remove the old ! scattering dimensions. The reason is that these dimensions are not ! entirely unused. They are not necessary as part of the scheduling ! vector, as the earlier dimensions already unambiguously define the ! execution time, however they may still be needed to carry modulo ! constraints as introduced e.g. by strip mining. The correct solution ! would be to project these dimensions out of the scattering polyhedra. ! In case they are still required to carry modulo constraints they should be kept ! internally as existentially quantified dimensions. PPL does only support ! projection of rational polyhedra, however in this case we need an integer ! projection. With isl this will be trivial to implement. For now we just ! leave the dimensions. This is a little ugly, but should be correct. */ ! if (0) ! remove_unused_scattering_dimensions (l); } lst_update_scattering (lst); Index: gcc/testsuite/gcc.dg/graphite/pr50561.c =================================================================== *** gcc/testsuite/gcc.dg/graphite/pr50561.c (revision 0) --- gcc/testsuite/gcc.dg/graphite/pr50561.c (revision 0) *************** *** 0 **** --- 1,9 ---- + /* { dg-do compile } */ + /* { dg-options "-O2 -floop-flatten -floop-strip-mine" } */ + + void f (unsigned *s) + { + int n; + for (n = 0; n < 256; n++) + s[n] = 0; + }