[Bug tree-optimization/63605] [4.8/4.9/5 Regression] wrong code at -O3 on x86_64-linux-gnu
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Nov 7 12:31:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63605
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
vect__4.18_102 = MEM[(int *)vectp_b.17_73];
vect_d_5.19_103 = vect__4.18_102 >> 1;
vect_patt_13.20_104 = VEC_COND_EXPR <vect__4.18_102 < { 0, 0, 0, 0 }, { 1, 1,
1, 1 }, { 0, 0, 0, 0 }>;
late forwprop does this in forward_propagate_into_cond by dispatching to fold
Replaced 'vect_d_5.19_103 != { 0, 0, 0, 0 }' with 'vect__4.18_102 < { 0, 0,
0, 0 }'
Replaced 'vect_d_5.19_80 != { 0, 0, 0, 0 }' with 'vect__4.18_79 < { 0, 0, 0,
0 }'
I suppose via
/* Fold (X >> C) != 0 into X < 0 if C is one less than the width
of X. Similarly fold (X >> C) == 0 into X >= 0. */
if (TREE_CODE (arg0) == RSHIFT_EXPR
&& integer_zerop (arg1)
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
{
tree arg00 = TREE_OPERAND (arg0, 0);
tree arg01 = TREE_OPERAND (arg0, 1);
tree itype = TREE_TYPE (arg00);
if (wi::eq_p (arg01, TYPE_PRECISION (itype) - 1))
which checks TYPE_VECTOR_SUBPARTS here ^^^^^^
{
if (TYPE_UNSIGNED (itype))
{
itype = signed_type_for (itype);
arg00 = fold_convert_loc (loc, itype, arg00);
}
return fold_build2_loc (loc, code == EQ_EXPR ? GE_EXPR : LT_EXPR,
type, arg00, build_zero_cst (itype));
}
}
a simple guard with INTEGRAL_TYPE_P (TREE_TYPE (arg0)) fixes this.
Or using element_precision.
More information about the Gcc-bugs
mailing list