+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
+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
--- /dev/null
+/* { 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;
+}
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;