------- Comment #8 from rguenth at gcc dot gnu dot org  2010-06-13 12:25 -------
(In reply to comment #7)
> (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?

Yes, I think so (vector types are ok as well, but we don't vectorize with
vector types around, maybe fixed-point types are ok as well, but we
have no vector modes for them)

> 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;
>          }

Looks good.

Thanks,
Richard.

> Thanks,
> Ira
> 


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44507

Reply via email to