------- Comment #7 from irar at il dot ibm dot com 2010-06-13 12:01 ------- (In reply to comment #6) > (In reply to comment #5) > > The bug is in creation of a neutral value for BIT_AND_EXPR. What is the > > correct > > way to create it for all types? I found > > double-int.h:#define ALL_ONES (~((unsigned HOST_WIDE_INT) 0)) > > but it won't work for signed. > > build_int_cst (type, -1)
OK, thanks. > > At least in tree-vect-slp.c:1669 this seems to be buggy. The > case for BIT_AND_EXPR should be separated from that of MULT_EXPR. Right, this is buggy too, but the failure here is in reduction (get_initial_def_for_reduction), not in SLP. Is it safe to assume that operands of BIT_AND_EXPR are of integral type? If so, I'll test the following patch: Index: tree-vect-loop.c =================================================================== --- tree-vect-loop.c (revision 160524) +++ tree-vect-loop.c (working copy) @@ -2871,12 +2871,15 @@ get_initial_def_for_reduction (gimple st *adjustment_def = init_val; } - if (code == MULT_EXPR || code == BIT_AND_EXPR) + if (code == MULT_EXPR) { real_init_val = dconst1; int_init_val = 1; } + if (code == BIT_AND_EXPR) + int_init_val = -1; + if (SCALAR_FLOAT_TYPE_P (scalar_type)) def_for_init = build_real (scalar_type, real_init_val); else Index: tree-vect-slp.c =================================================================== --- tree-vect-slp.c (revision 160524) +++ tree-vect-slp.c (working copy) @@ -1662,7 +1662,6 @@ vect_get_constant_vectors (slp_tree slp_ break; case MULT_EXPR: - case BIT_AND_EXPR: if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (op))) neutral_op = build_real (TREE_TYPE (op), dconst1); else @@ -1670,6 +1669,10 @@ vect_get_constant_vectors (slp_tree slp_ break; + case BIT_AND_EXPR: + neutral_op = build_int_cst (TREE_TYPE (op), -1); + break; + default: neutral_op = NULL; } Thanks, Ira -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44507