------- Comment #2 from dorit at gcc dot gnu dot org  2007-11-03 04:06 -------
testing this fix:

Index: tree-vect-transform.c
===================================================================
*** tree-vect-transform.c       (revision 129763)
--- tree-vect-transform.c       (working copy)
*************** get_initial_def_for_reduction (tree stmt
*** 2107,2113 ****
    tree vector_type;
    bool nested_in_vect_loop = false;

!   gcc_assert (INTEGRAL_TYPE_P (type) || SCALAR_FLOAT_TYPE_P (type));
    if (nested_in_vect_loop_p (loop, stmt))
      nested_in_vect_loop = true;
    else
--- 2107,2113 ----
    tree vector_type;
    bool nested_in_vect_loop = false;

!   gcc_assert (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type) ||
SCALAR_FLOAT_TYPE_P (type));
    if (nested_in_vect_loop_p (loop, stmt))
      nested_in_vect_loop = true;
    else
*************** get_initial_def_for_reduction (tree stmt
*** 2120,2136 ****
    case WIDEN_SUM_EXPR:
    case DOT_PROD_EXPR:
    case PLUS_EXPR:
!       if (nested_in_vect_loop)
!       *adjustment_def = vecdef;
!       else
!       *adjustment_def = init_val;
!     /* Create a vector of zeros for init_def.  */
!     if (INTEGRAL_TYPE_P (type))
!       def_for_init = build_int_cst (type, 0);
      else
        def_for_init = build_real (type, dconst0);
!       for (i = nunits - 1; i >= 0; --i)
!     t = tree_cons (NULL_TREE, def_for_init, t);
      vector_type = get_vectype_for_scalar_type (TREE_TYPE (def_for_init));
      gcc_assert (vector_type);
      init_def = build_vector (vector_type, t);
--- 2120,2136 ----
    case WIDEN_SUM_EXPR:
    case DOT_PROD_EXPR:
    case PLUS_EXPR:
!     if (nested_in_vect_loop)
!       *adjustment_def = vecdef;
      else
+       *adjustment_def = init_val;
+     /* Create a vector of zeros for init_def.  */
+     if (SCALAR_FLOAT_TYPE_P (type))
        def_for_init = build_real (type, dconst0);
!     else
!       def_for_init = build_int_cst (type, 0);
!     for (i = nunits - 1; i >= 0; --i)
!       t = tree_cons (NULL_TREE, def_for_init, t);
      vector_type = get_vectype_for_scalar_type (TREE_TYPE (def_for_init));
      gcc_assert (vector_type);
      init_def = build_vector (vector_type, t);
*************** vectorizable_reduction (tree stmt, block
*** 2716,2721 ****
--- 2716,2724 ----
      return false;
    scalar_dest = GIMPLE_STMT_OPERAND (stmt, 0);
    scalar_type = TREE_TYPE (scalar_dest);
+   if (!POINTER_TYPE_P (scalar_type) && !INTEGRAL_TYPE_P (scalar_type) 
+       && !SCALAR_FLOAT_TYPE_P (scalar_type))
+     return false;

    /* All uses but the last are expected to be defined in the loop.
       The last use is the reduction variable.  */


-- 


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

Reply via email to