This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/33987] [4.3 regression] internal compiler error: in get_initial_def_for_reduction, at tree-vect-transform.c:2110 with -O3 -msse2
- From: "dorit at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 3 Nov 2007 04:06:45 -0000
- Subject: [Bug tree-optimization/33987] [4.3 regression] internal compiler error: in get_initial_def_for_reduction, at tree-vect-transform.c:2110 with -O3 -msse2
- References: <bug-33987-5606@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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