This fixes PR59903, guarding the PHI stmt case similar to the regular one.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Thanks, Richard. 2014-01-30 Richard Biener <rguent...@suse.de> PR tree-optimization/59903 * tree-vect-loop.c (vect_transform_loop): Guard multiple-types check properly. * gcc.dg/torture/pr59903.c: New testcase. Index: gcc/tree-vect-loop.c =================================================================== *** gcc/tree-vect-loop.c (revision 207238) --- gcc/tree-vect-loop.c (working copy) *************** vect_transform_loop (loop_vec_info loop_ *** 5869,5876 **** && !STMT_VINFO_LIVE_P (stmt_info)) continue; ! if ((TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info)) ! != (unsigned HOST_WIDE_INT) vectorization_factor) && dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "multiple-types.\n"); --- 5869,5877 ---- && !STMT_VINFO_LIVE_P (stmt_info)) continue; ! if (STMT_VINFO_VECTYPE (stmt_info) ! && (TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info)) ! != (unsigned HOST_WIDE_INT) vectorization_factor) && dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "multiple-types.\n"); Index: gcc/testsuite/gcc.dg/torture/pr59903.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr59903.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr59903.c (working copy) *************** *** 0 **** --- 1,56 ---- + /* { dg-do compile } */ + + int a, b, c, d, e, f, g, h, i[3], l, m, n, o, p, q, r; + + struct S0 + { + int f0; + int f1; + int f2; + int f3; + } j; + + static int + fn1 (int p1) + { + return p1 || ((p1 > 0) > (e << 1)); + } + + static struct S0 + fn2 (struct S0 p1) + { + char s; + struct S0 t = {0,0,0,0}; + int u = 2; + for (;;) + { + if (i[0]) + break; + for (m = 0; m < 4; m++) + for (p1.f0 = 0; p1.f0 < 3; p1.f0++) + { + j = t; + t.f3 = i[p1.f0]; + o = b || 1 >> b ? 0 : a < 0; + q = 1 % d; + if ((g < fn1 ((1 ^ (q & 1)) | n)) ^ u) + j.f3 |= p % 2; + s = j.f3 > 0 ? j.f3 : j.f3 << 1; + r = l = s && p1.f1 * c; + h = p1.f1; + } + } + return p1; + } + + int + main () + { + for (;f;) + { + struct S0 v = {0,0,0,0}; + fn2 (v); + j.f3 = 0; + } + return 0; + }