re PR tree-optimization/65063 (gcc.dg/vect/vect-double-reduc-6.c FAILs with -O3 ...
authorRichard Biener <rguenther@suse.de>
Wed, 18 Feb 2015 13:08:58 +0000 (13:08 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 18 Feb 2015 13:08:58 +0000 (13:08 +0000)
2015-02-18  Richard Biener  <rguenther@suse.de>

PR tree-optimization/65063
* tree-predcom.c (determine_unroll_factor): Return 1 if we
have replaced looparound PHIs.

* gcc.dg/pr65063.c: New testcase.

From-SVN: r220788

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr65063.c [new file with mode: 0644]
gcc/tree-predcom.c

index 6cf817b..9523db0 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/65063
+       * tree-predcom.c (determine_unroll_factor): Return 1 if we
+       have replaced looparound PHIs.
+
 2015-02-18  Martin Liska  <mliska@suse.cz>
 
        * lto-streamer.c (lto_streamer_init): Encapsulate
index 0a1a328..5bbdfbb 100644 (file)
@@ -1,5 +1,10 @@
 2015-02-18  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/65063
+       * gcc.dg/pr65063.c: New testcase.
+
+2015-02-18  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/62217
        * gcc.dg/tree-ssa/cunroll-11.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/pr65063.c b/gcc/testsuite/gcc.dg/pr65063.c
new file mode 100644 (file)
index 0000000..bcbdbf0
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-tree-loop-ivcanon -fno-tree-vectorize" } */
+
+static int in[8][4];
+static int out[4];
+static const int check_result[] = {0, 16, 256, 4096};
+
+static inline void foo ()
+{
+  int sum;
+  int i, j, k;
+  for (k = 0; k < 4; k++)
+    {
+      sum = 1;
+      for (j = 0; j < 4; j++)
+       for (i = 0; i < 4; i++)
+         sum *= in[i + k][j];
+      out[k] = sum;
+    }
+}
+
+int main ()
+{
+  int i, j, k;
+  for (i = 0; i < 8; i++)
+    for (j = 0; j < 4; j++)
+      in[i][j] = (i + 2) / 3;
+  foo ();
+  for (k = 0; k < 4; k++)
+    if (out[k] != check_result[k])
+      __builtin_abort ();
+  return 0;
+}
index 8dac1ba..03a38b4 100644 (file)
@@ -1775,9 +1775,21 @@ determine_unroll_factor (vec<chain_p> chains)
 
   FOR_EACH_VEC_ELT (chains, i, chain)
     {
-      if (chain->type == CT_INVARIANT || chain->combined)
+      if (chain->type == CT_INVARIANT)
        continue;
 
+      if (chain->combined)
+       {
+         /* For combined chains, we can't handle unrolling if we replace
+            looparound PHIs.  */
+         dref a;
+         unsigned j;
+         for (j = 1; chain->refs.iterate (j, &a); j++)
+           if (gimple_code (a->stmt) == GIMPLE_PHI)
+             return 1;
+         continue;
+       }
+
       /* The best unroll factor for this chain is equal to the number of
         temporary variables that we create for it.  */
       af = chain->length;