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

Reply via email to