This fixes PR59038 by reverting the wrong fix for PR58955 and instead
installing the correct fix (fingers crossing).

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2013-11-07  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/59038
        PR tree-optimization/58955
        * tree-loop-distribution.c (pg_add_dependence_edges): Revert
        previous change.  Handle known dependences correctly.

        * gcc.dg/torture/pr59038.c: New testcase.

Index: gcc/tree-loop-distribution.c
===================================================================
*** gcc/tree-loop-distribution.c        (revision 204506)
--- gcc/tree-loop-distribution.c        (working copy)
*************** pg_add_dependence_edges (struct graph *r
*** 1324,1330 ****
    for (int ii = 0; drs1.iterate (ii, &dr1); ++ii)
      for (int jj = 0; drs2.iterate (jj, &dr2); ++jj)
        {
!       int this_dir = -1;
        ddr_p ddr;
        /* Re-shuffle data-refs to be in dominator order.  */
        if (rdg_vertex_for_stmt (rdg, DR_STMT (dr1))
--- 1324,1330 ----
    for (int ii = 0; drs1.iterate (ii, &dr1); ++ii)
      for (int jj = 0; drs2.iterate (jj, &dr2); ++jj)
        {
!       int this_dir = 1;
        ddr_p ddr;
        /* Re-shuffle data-refs to be in dominator order.  */
        if (rdg_vertex_for_stmt (rdg, DR_STMT (dr1))
*************** pg_add_dependence_edges (struct graph *r
*** 1350,1357 ****
              }
            /* Known dependences can still be unordered througout the
               iteration space, see gcc.dg/tree-ssa/ldist-16.c.  */
!           if (DDR_NUM_DIST_VECTS (ddr) == 0)
              this_dir = 2;
          }
        else
          this_dir = 0;
--- 1350,1366 ----
              }
            /* Known dependences can still be unordered througout the
               iteration space, see gcc.dg/tree-ssa/ldist-16.c.  */
!           if (DDR_NUM_DIST_VECTS (ddr) != 1)
              this_dir = 2;
+           /* If the overlap is exact preserve stmt order.  */
+           else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0), 1))
+             ;
+           else
+             {
+               /* Else as the distance vector is lexicographic positive
+                  swap the dependence direction.  */
+               this_dir = -this_dir;
+             }
          }
        else
          this_dir = 0;
Index: gcc/testsuite/gcc.dg/torture/pr59038.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr59038.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr59038.c      (working copy)
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do run } */
+ 
+ extern void abort (void);
+ 
+ unsigned char first_ones_8bit[256];
+ unsigned char connected_passed[256];
+ 
+ int
+ main ()
+ {
+   int i, j;
+   for (i=0;i<256;i++){
+       connected_passed[i]=0;
+       first_ones_8bit[i]=0;
+       for (j=7;j>0;j--){
+         if ((i & (3<<(7-j))) == (3<<(7-j))){
+             connected_passed[i]=j;
+             break;
+         }
+       }
+   }
+   if (connected_passed[3] != 7)
+     abort ();
+   return 0;
+ }

Reply via email to