Commit e67f39f7 by Richard Biener Committed by Richard Biener

re PR tree-optimization/58137 ([trunk, ICE] full unroll + AVX2 vectorization)

2013-09-05  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/58137
	* tree-vect-stmts.c (get_vectype_for_scalar_type_and_size):
	Do not create vectors of pointers.
	* tree-vect-loop.c (get_initial_def_for_induction): Use proper
	types for the components of the vector initializer.
	* tree-cfg.c (verify_gimple_assign_binary): Remove special-casing
	allowing pointer vectors with PLUS_EXPR/MINUS_EXPR.

	* gcc.target/i386/pr58137.c: New testcase.

From-SVN: r202282
parent 568cda29
2013-09-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/58137
* tree-vect-stmts.c (get_vectype_for_scalar_type_and_size):
Do not create vectors of pointers.
* tree-vect-loop.c (get_initial_def_for_induction): Use proper
types for the components of the vector initializer.
* tree-cfg.c (verify_gimple_assign_binary): Remove special-casing
allowing pointer vectors with PLUS_EXPR/MINUS_EXPR.
2013-09-05 Martin Jambor <mjambor@suse.cz> 2013-09-05 Martin Jambor <mjambor@suse.cz>
* ipa-prop.c (remove_described_reference): Accept missing references, * ipa-prop.c (remove_described_reference): Accept missing references,
......
2013-09-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/58137
* gcc.target/i386/pr58137.c: New testcase.
2013-09-05 Martin Jambor <mjambor@suse.cz> 2013-09-05 Martin Jambor <mjambor@suse.cz>
* g++.dg/ipa/remref-1.C: New test. * g++.dg/ipa/remref-1.C: New test.
......
/* { dg-do compile } */
/* { dg-options "-O3 -mavx2" } */
typedef unsigned int U32;
struct sv {
void* sv_any;
U32 sv_refcnt;
U32 sv_flags;
};
typedef struct sv SV;
struct xrv {
SV * xrv_rv;
};
typedef struct xrv XRV;
extern XRV * PL_xrv_root;
void
more_xrv (void)
{
register XRV* xrv;
register XRV* xrvend;
xrv = PL_xrv_root;
xrvend = &xrv[200 / sizeof (XRV) - 1];
while (xrv < xrvend)
{
xrv->xrv_rv = (SV*)(xrv + 1);
xrv++;
}
xrv->xrv_rv = 0;
}
...@@ -3571,11 +3571,10 @@ verify_gimple_assign_binary (gimple stmt) ...@@ -3571,11 +3571,10 @@ verify_gimple_assign_binary (gimple stmt)
case PLUS_EXPR: case PLUS_EXPR:
case MINUS_EXPR: case MINUS_EXPR:
{ {
/* We use regular PLUS_EXPR and MINUS_EXPR for vectors. tree lhs_etype = lhs_type;
??? This just makes the checker happy and may not be what is tree rhs1_etype = rhs1_type;
intended. */ tree rhs2_etype = rhs2_type;
if (TREE_CODE (lhs_type) == VECTOR_TYPE if (TREE_CODE (lhs_type) == VECTOR_TYPE)
&& POINTER_TYPE_P (TREE_TYPE (lhs_type)))
{ {
if (TREE_CODE (rhs1_type) != VECTOR_TYPE if (TREE_CODE (rhs1_type) != VECTOR_TYPE
|| TREE_CODE (rhs2_type) != VECTOR_TYPE) || TREE_CODE (rhs2_type) != VECTOR_TYPE)
...@@ -3583,22 +3582,13 @@ verify_gimple_assign_binary (gimple stmt) ...@@ -3583,22 +3582,13 @@ verify_gimple_assign_binary (gimple stmt)
error ("invalid non-vector operands to vector valued plus"); error ("invalid non-vector operands to vector valued plus");
return true; return true;
} }
lhs_type = TREE_TYPE (lhs_type); lhs_etype = TREE_TYPE (lhs_type);
rhs1_type = TREE_TYPE (rhs1_type); rhs1_etype = TREE_TYPE (rhs1_type);
rhs2_type = TREE_TYPE (rhs2_type); rhs2_etype = TREE_TYPE (rhs2_type);
/* PLUS_EXPR is commutative, so we might end up canonicalizing
the pointer to 2nd place. */
if (POINTER_TYPE_P (rhs2_type))
{
tree tem = rhs1_type;
rhs1_type = rhs2_type;
rhs2_type = tem;
}
goto do_pointer_plus_expr_check;
} }
if (POINTER_TYPE_P (lhs_type) if (POINTER_TYPE_P (lhs_etype)
|| POINTER_TYPE_P (rhs1_type) || POINTER_TYPE_P (rhs1_etype)
|| POINTER_TYPE_P (rhs2_type)) || POINTER_TYPE_P (rhs2_etype))
{ {
error ("invalid (pointer) operands to plus/minus"); error ("invalid (pointer) operands to plus/minus");
return true; return true;
...@@ -3610,7 +3600,6 @@ verify_gimple_assign_binary (gimple stmt) ...@@ -3610,7 +3600,6 @@ verify_gimple_assign_binary (gimple stmt)
case POINTER_PLUS_EXPR: case POINTER_PLUS_EXPR:
{ {
do_pointer_plus_expr_check:
if (!POINTER_TYPE_P (rhs1_type) if (!POINTER_TYPE_P (rhs1_type)
|| !useless_type_conversion_p (lhs_type, rhs1_type) || !useless_type_conversion_p (lhs_type, rhs1_type)
|| !ptrofftype_p (rhs2_type)) || !ptrofftype_p (rhs2_type))
......
...@@ -3133,7 +3133,6 @@ get_initial_def_for_induction (gimple iv_phi) ...@@ -3133,7 +3133,6 @@ get_initial_def_for_induction (gimple iv_phi)
stmt_vec_info stmt_vinfo = vinfo_for_stmt (iv_phi); stmt_vec_info stmt_vinfo = vinfo_for_stmt (iv_phi);
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo); loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo);
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
tree scalar_type;
tree vectype; tree vectype;
int nunits; int nunits;
edge pe = loop_preheader_edge (loop); edge pe = loop_preheader_edge (loop);
...@@ -3185,8 +3184,7 @@ get_initial_def_for_induction (gimple iv_phi) ...@@ -3185,8 +3184,7 @@ get_initial_def_for_induction (gimple iv_phi)
gcc_assert (ok); gcc_assert (ok);
pe = loop_preheader_edge (iv_loop); pe = loop_preheader_edge (iv_loop);
scalar_type = TREE_TYPE (init_expr); vectype = get_vectype_for_scalar_type (TREE_TYPE (init_expr));
vectype = get_vectype_for_scalar_type (scalar_type);
resvectype = get_vectype_for_scalar_type (TREE_TYPE (PHI_RESULT (iv_phi))); resvectype = get_vectype_for_scalar_type (TREE_TYPE (PHI_RESULT (iv_phi)));
gcc_assert (vectype); gcc_assert (vectype);
nunits = TYPE_VECTOR_SUBPARTS (vectype); nunits = TYPE_VECTOR_SUBPARTS (vectype);
...@@ -3229,8 +3227,11 @@ get_initial_def_for_induction (gimple iv_phi) ...@@ -3229,8 +3227,11 @@ get_initial_def_for_induction (gimple iv_phi)
/* iv_loop is the loop to be vectorized. Create: /* iv_loop is the loop to be vectorized. Create:
vec_init = [X, X+S, X+2*S, X+3*S] (S = step_expr, X = init_expr) */ vec_init = [X, X+S, X+2*S, X+3*S] (S = step_expr, X = init_expr) */
new_var = vect_get_new_vect_var (scalar_type, vect_scalar_var, "var_"); new_var = vect_get_new_vect_var (TREE_TYPE (vectype),
new_name = force_gimple_operand (init_expr, &stmts, false, new_var); vect_scalar_var, "var_");
new_name = force_gimple_operand (fold_convert (TREE_TYPE (vectype),
init_expr),
&stmts, false, new_var);
if (stmts) if (stmts)
{ {
new_bb = gsi_insert_seq_on_edge_immediate (pe, stmts); new_bb = gsi_insert_seq_on_edge_immediate (pe, stmts);
...@@ -3243,9 +3244,8 @@ get_initial_def_for_induction (gimple iv_phi) ...@@ -3243,9 +3244,8 @@ get_initial_def_for_induction (gimple iv_phi)
for (i = 1; i < nunits; i++) for (i = 1; i < nunits; i++)
{ {
/* Create: new_name_i = new_name + step_expr */ /* Create: new_name_i = new_name + step_expr */
enum tree_code code = POINTER_TYPE_P (scalar_type) new_name = fold_build2 (PLUS_EXPR, TREE_TYPE (new_name),
? POINTER_PLUS_EXPR : PLUS_EXPR; new_name, step_expr);
new_name = fold_build2 (code, scalar_type, new_name, step_expr);
if (!is_gimple_min_invariant (new_name)) if (!is_gimple_min_invariant (new_name))
{ {
init_stmt = gimple_build_assign (new_var, new_name); init_stmt = gimple_build_assign (new_var, new_name);
......
...@@ -6203,8 +6203,7 @@ get_vectype_for_scalar_type_and_size (tree scalar_type, unsigned size) ...@@ -6203,8 +6203,7 @@ get_vectype_for_scalar_type_and_size (tree scalar_type, unsigned size)
corresponding to that mode. The theory is that any use that corresponding to that mode. The theory is that any use that
would cause problems with this will disable vectorization anyway. */ would cause problems with this will disable vectorization anyway. */
else if (!SCALAR_FLOAT_TYPE_P (scalar_type) else if (!SCALAR_FLOAT_TYPE_P (scalar_type)
&& !INTEGRAL_TYPE_P (scalar_type) && !INTEGRAL_TYPE_P (scalar_type))
&& !POINTER_TYPE_P (scalar_type))
scalar_type = lang_hooks.types.type_for_mode (inner_mode, 1); scalar_type = lang_hooks.types.type_for_mode (inner_mode, 1);
/* We can't build a vector type of elements with alignment bigger than /* We can't build a vector type of elements with alignment bigger than
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment