+2015-05-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/66142
+ * tree-if-conv.c (if_convertible_phi_p): Don't give up on
+ virtual phis that feed themselves.
+
2015-05-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/66314
+2015-05-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/66142
+ * gcc.dg/vect/pr66142.c: New test.
+
2015-05-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/66314
--- /dev/null
+/* PR middle-end/66142 */
+/* { dg-do compile } */
+/* { dg-additional-options "-ffast-math -fopenmp-simd" } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+struct A { float x, y; };
+struct B { struct A t, w; };
+
+static inline float
+bar (const struct B *x)
+{
+ struct A r;
+ float b, c, d;
+ r.x = x->t.x;
+ r.y = x->t.y;
+ b = r.x * x->w.x + r.y * x->w.y;
+ c = b + r.x * r.x + r.y * r.y;
+ if (c > 0.0f)
+ return c + 3.0f;
+ return 0.0f;
+}
+
+void
+foo (float *a, float *b, float *c)
+{
+ int i;
+ float z = 0.0f;
+ float u = *a;
+#pragma omp simd
+ for (i = 0; i < 32; i++)
+ {
+ float x = b[i];
+ float y = c[i];
+ struct B r;
+ r.t.x = 1.0f;
+ r.t.y = u;
+ r.w.x = x;
+ r.w.y = y;
+ z += bar (&r);
+ }
+ *a = z;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 1 "vect" { target vect_condition } } } */
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_phi_result (phi))
{
- if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI)
+ if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
+ && USE_STMT (use_p) != (gimple) phi)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Difficult to handle this virtual phi.\n");