http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56695
--- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> 2013-03-27 10:08:02 UTC --- (In reply to comment #9) > That said, it should look like, unconditionally(!) > > unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vectype))); > tree cmp_type = build_nonstandard_integer_type (prec, > TYPE_UNSIGNED (TREE_OPERAND (cond_expr, 0))); > vec_cmp_type = get_same_sized_vectype (cmp_type, vectype); > if (vec_cmp_type == NULL_TREE) > return false; > > whether the result is integral or not doesn't matter. You can still have > > foo_signed = uns1 < uns2 ? bar_signed : bar2_signed; Err, it's just the vector comparison result (boolean mask) type. So if (!INTEGRAL_TYPE_P (TREE_TYPE (vectype)) || !TYPE_UNSIGNED (TREE_TYPE (vectype))) { unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vectype))); tree cmp_type = build_nonstandard_integer_type (prec, 1); vec_cmp_type = get_same_sized_vectype (cmp_type, vectype); if (vec_cmp_type == NULL_TREE) return false; } or simply unconditionally use an unsigned mask type: unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vectype))); tree cmp_type = build_nonstandard_integer_type (prec, 1); vec_cmp_type = get_same_sized_vectype (cmp_type, vectype); if (vec_cmp_type == NULL_TREE) return false; and remove the initialization of vec_cmp_type earlier.