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;
+ }

Reply via email to