mirror of git://gcc.gnu.org/git/gcc.git
Include phis in SLP unrolling calculation
Without this we'd pick an unrolling factor based purely on longs, ignoring the ints. It's posssible that vect_get_smallest_scalar_type should also handle shifts, but I think we'd still want this as a belt-and-braces fix. 2017-09-18 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * tree-vect-slp.c (vect_record_max_nunits): New function, split out from... (vect_build_slp_tree_1): ...here. (vect_build_slp_tree_2): Call it for phis too. gcc/testsuite/ * gcc.dg/vect/slp-multitypes-13.c: New test. From-SVN: r252933
This commit is contained in:
parent
7251b0bfbf
commit
b161f2c927
|
|
@ -1,3 +1,10 @@
|
||||||
|
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
|
||||||
|
|
||||||
|
* tree-vect-slp.c (vect_record_max_nunits): New function,
|
||||||
|
split out from...
|
||||||
|
(vect_build_slp_tree_1): ...here.
|
||||||
|
(vect_build_slp_tree_2): Call it for phis too.
|
||||||
|
|
||||||
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
|
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
|
||||||
|
|
||||||
* tree-vect-stmts.c (vectorizable_mask_load_store): Pass mask_vectype
|
* tree-vect-stmts.c (vectorizable_mask_load_store): Pass mask_vectype
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
|
||||||
|
|
||||||
|
* gcc.dg/vect/slp-multitypes-13.c: New test.
|
||||||
|
|
||||||
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
|
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
|
||||||
|
|
||||||
* gfortran.dg/vect/mask-store-1.f90: New test.
|
* gfortran.dg/vect/mask-store-1.f90: New test.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
|
||||||
|
void
|
||||||
|
f (long *x, int n)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
x[i * 2] = 1L << i;
|
||||||
|
x[i * 2 + 1] = 1L << i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -480,6 +480,48 @@ again:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A subroutine of vect_build_slp_tree for checking VECTYPE, which is the
|
||||||
|
caller's attempt to find the vector type in STMT with the narrowest
|
||||||
|
element type. Return true if VECTYPE is nonnull and if it is valid
|
||||||
|
for VINFO. When returning true, update MAX_NUNITS to reflect the
|
||||||
|
number of units in VECTYPE. VINFO, GORUP_SIZE and MAX_NUNITS are
|
||||||
|
as for vect_build_slp_tree. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
vect_record_max_nunits (vec_info *vinfo, gimple *stmt, unsigned int group_size,
|
||||||
|
tree vectype, unsigned int *max_nunits)
|
||||||
|
{
|
||||||
|
if (!vectype)
|
||||||
|
{
|
||||||
|
if (dump_enabled_p ())
|
||||||
|
{
|
||||||
|
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
|
||||||
|
"Build SLP failed: unsupported data-type in ");
|
||||||
|
dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, stmt, 0);
|
||||||
|
dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
|
||||||
|
}
|
||||||
|
/* Fatal mismatch. */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If populating the vector type requires unrolling then fail
|
||||||
|
before adjusting *max_nunits for basic-block vectorization. */
|
||||||
|
if (is_a <bb_vec_info> (vinfo)
|
||||||
|
&& TYPE_VECTOR_SUBPARTS (vectype) > group_size)
|
||||||
|
{
|
||||||
|
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
|
||||||
|
"Build SLP failed: unrolling required "
|
||||||
|
"in basic block SLP\n");
|
||||||
|
/* Fatal mismatch. */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case of multiple types we need to detect the smallest type. */
|
||||||
|
if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype))
|
||||||
|
*max_nunits = TYPE_VECTOR_SUBPARTS (vectype);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Verify if the scalar stmts STMTS are isomorphic, require data
|
/* Verify if the scalar stmts STMTS are isomorphic, require data
|
||||||
permutation or are of unsupported types of operation. Return
|
permutation or are of unsupported types of operation. Return
|
||||||
|
|
@ -560,38 +602,14 @@ vect_build_slp_tree_1 (vec_info *vinfo, unsigned char *swap,
|
||||||
|
|
||||||
scalar_type = vect_get_smallest_scalar_type (stmt, &dummy, &dummy);
|
scalar_type = vect_get_smallest_scalar_type (stmt, &dummy, &dummy);
|
||||||
vectype = get_vectype_for_scalar_type (scalar_type);
|
vectype = get_vectype_for_scalar_type (scalar_type);
|
||||||
if (!vectype)
|
if (!vect_record_max_nunits (vinfo, stmt, group_size, vectype,
|
||||||
{
|
max_nunits))
|
||||||
if (dump_enabled_p ())
|
{
|
||||||
{
|
|
||||||
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
|
|
||||||
"Build SLP failed: unsupported data-type ");
|
|
||||||
dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
|
|
||||||
scalar_type);
|
|
||||||
dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
|
|
||||||
}
|
|
||||||
/* Fatal mismatch. */
|
/* Fatal mismatch. */
|
||||||
matches[0] = false;
|
matches[0] = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If populating the vector type requires unrolling then fail
|
|
||||||
before adjusting *max_nunits for basic-block vectorization. */
|
|
||||||
if (is_a <bb_vec_info> (vinfo)
|
|
||||||
&& TYPE_VECTOR_SUBPARTS (vectype) > group_size)
|
|
||||||
{
|
|
||||||
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
|
|
||||||
"Build SLP failed: unrolling required "
|
|
||||||
"in basic block SLP\n");
|
|
||||||
/* Fatal mismatch. */
|
|
||||||
matches[0] = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* In case of multiple types we need to detect the smallest type. */
|
|
||||||
if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype))
|
|
||||||
*max_nunits = TYPE_VECTOR_SUBPARTS (vectype);
|
|
||||||
|
|
||||||
if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
|
if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
|
||||||
{
|
{
|
||||||
rhs_code = CALL_EXPR;
|
rhs_code = CALL_EXPR;
|
||||||
|
|
@ -1018,6 +1036,12 @@ vect_build_slp_tree_2 (vec_info *vinfo,
|
||||||
the recursion. */
|
the recursion. */
|
||||||
if (gimple_code (stmt) == GIMPLE_PHI)
|
if (gimple_code (stmt) == GIMPLE_PHI)
|
||||||
{
|
{
|
||||||
|
tree scalar_type = TREE_TYPE (PHI_RESULT (stmt));
|
||||||
|
tree vectype = get_vectype_for_scalar_type (scalar_type);
|
||||||
|
if (!vect_record_max_nunits (vinfo, stmt, group_size, vectype,
|
||||||
|
max_nunits))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
vect_def_type def_type = STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt));
|
vect_def_type def_type = STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt));
|
||||||
/* Induction from different IVs is not supported. */
|
/* Induction from different IVs is not supported. */
|
||||||
if (def_type == vect_induction_def)
|
if (def_type == vect_induction_def)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue