re PR tree-optimization/59038 (r204398 causes 186.crafty init.c to be miscompiled)
authorRichard Biener <rguenther@suse.de>
Fri, 8 Nov 2013 08:44:02 +0000 (08:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 8 Nov 2013 08:44:02 +0000 (08:44 +0000)
2013-11-08  Richard Biener  <rguenther@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.

From-SVN: r204561

gcc/ChangeLog
gcc/testsuite/gcc.dg/torture/pr59038.c [new file with mode: 0644]
gcc/tree-loop-distribution.c

index bd4715e..171032f 100644 (file)
@@ -1,3 +1,10 @@
+2013-11-08  Richard Biener  <rguenther@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.
+
 2013-11-08  Tom de Vries  <tom@codesourcery.com>
 
        * config/rs6000/t-xilinx: Remove duplicate contents.
diff --git a/gcc/testsuite/gcc.dg/torture/pr59038.c b/gcc/testsuite/gcc.dg/torture/pr59038.c
new file mode 100644 (file)
index 0000000..1694eca
--- /dev/null
@@ -0,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;
+}
index 4f9b848..45efad3 100644 (file)
@@ -1324,7 +1324,7 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
   for (int ii = 0; drs1.iterate (ii, &dr1); ++ii)
     for (int jj = 0; drs2.iterate (jj, &dr2); ++jj)
       {
-       int this_dir = -1;
+       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))
@@ -1350,8 +1350,17 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
              }
            /* 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)
+           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;