I am testing the following obvious patch on x86_64-unknown-linux-gnu. Richard.
2016-03-24 Richard Biener <rguent...@suse.de> PR tree-optimization/70396 * tree-vect-stmts.c (vectorizable_comparison): Use get_vectype_for_scalar_type. * gcc.dg/torture/pr70396.c: New testcase. Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c (revision 234453) +++ gcc/tree-vect-stmts.c (working copy) @@ -7790,8 +7789,8 @@ vectorizable_comparison (gimple *stmt, g /* Invariant comparison. */ if (!vectype) { - vectype = build_vector_type (TREE_TYPE (rhs1), nunits); - if (tree_to_shwi (TYPE_SIZE_UNIT (vectype)) != current_vector_size) + vectype = get_vectype_for_scalar_type (TREE_TYPE (rhs1)); + if (TYPE_VECTOR_SUBPARTS (vectype) != nunits) return false; } else if (nunits != TYPE_VECTOR_SUBPARTS (vectype)) Index: gcc/testsuite/gcc.dg/torture/pr70396.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr70396.c (revision 0) +++ gcc/testsuite/gcc.dg/torture/pr70396.c (working copy) @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +struct S2 { + signed f1 : 3; +}; +int a[]; +int b, c; +char d; +void fn1() { + struct S2 e; + b / e.f1; + c = 2; + for (; c; c++) { + d = 0; + a[c] = ~e.f1 != d; + } +}