Commit 5d8c32cb by Richard Biener Committed by Richard Biener

re PR tree-optimization/87785 (ICE in dr_misalignment, at tree-vectorizer.h:1245…

re PR tree-optimization/87785 (ICE in dr_misalignment, at tree-vectorizer.h:1245 on 454.calculix with -Ofast and -flto)

2018-10-29  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/87785
	* tree-vect-slp.c (vect_build_slp_tree_2): Remove loads argument
	and processing.
	(vect_build_slp_tree): Likewise.
	(vect_gather_slp_loads): New function.
	(vect_analyze_slp_instance): Gather loads separately from the
	SLP tree build.

From-SVN: r265588
parent c8fda30f
2018-10-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/87785
* tree-vect-slp.c (vect_build_slp_tree_2): Remove loads argument
and processing.
(vect_build_slp_tree): Likewise.
(vect_gather_slp_loads): New function.
(vect_analyze_slp_instance): Gather loads separately from the
SLP tree build.
2018-10-29 Martin Liska <mliska@suse.cz> 2018-10-29 Martin Liska <mliska@suse.cz>
* Makefile.in: Make dependency to json.o. * Makefile.in: Make dependency to json.o.
...@@ -1032,7 +1032,6 @@ static slp_tree ...@@ -1032,7 +1032,6 @@ static slp_tree
vect_build_slp_tree_2 (vec_info *vinfo, vect_build_slp_tree_2 (vec_info *vinfo,
vec<stmt_vec_info> stmts, unsigned int group_size, vec<stmt_vec_info> stmts, unsigned int group_size,
poly_uint64 *max_nunits, poly_uint64 *max_nunits,
vec<slp_tree> *loads,
bool *matches, unsigned *npermutes, unsigned *tree_size, bool *matches, unsigned *npermutes, unsigned *tree_size,
unsigned max_tree_size, unsigned max_tree_size,
scalar_stmts_to_slp_tree_map_t *bst_map); scalar_stmts_to_slp_tree_map_t *bst_map);
...@@ -1040,7 +1039,7 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1040,7 +1039,7 @@ vect_build_slp_tree_2 (vec_info *vinfo,
static slp_tree static slp_tree
vect_build_slp_tree (vec_info *vinfo, vect_build_slp_tree (vec_info *vinfo,
vec<stmt_vec_info> stmts, unsigned int group_size, vec<stmt_vec_info> stmts, unsigned int group_size,
poly_uint64 *max_nunits, vec<slp_tree> *loads, poly_uint64 *max_nunits,
bool *matches, unsigned *npermutes, unsigned *tree_size, bool *matches, unsigned *npermutes, unsigned *tree_size,
unsigned max_tree_size, unsigned max_tree_size,
scalar_stmts_to_slp_tree_map_t *bst_map) scalar_stmts_to_slp_tree_map_t *bst_map)
...@@ -1055,7 +1054,7 @@ vect_build_slp_tree (vec_info *vinfo, ...@@ -1055,7 +1054,7 @@ vect_build_slp_tree (vec_info *vinfo,
return *leader; return *leader;
} }
slp_tree res = vect_build_slp_tree_2 (vinfo, stmts, group_size, max_nunits, slp_tree res = vect_build_slp_tree_2 (vinfo, stmts, group_size, max_nunits,
loads, matches, npermutes, tree_size, matches, npermutes, tree_size,
max_tree_size, bst_map); max_tree_size, bst_map);
/* Keep a reference for the bst_map use. */ /* Keep a reference for the bst_map use. */
if (res) if (res)
...@@ -1075,7 +1074,6 @@ static slp_tree ...@@ -1075,7 +1074,6 @@ static slp_tree
vect_build_slp_tree_2 (vec_info *vinfo, vect_build_slp_tree_2 (vec_info *vinfo,
vec<stmt_vec_info> stmts, unsigned int group_size, vec<stmt_vec_info> stmts, unsigned int group_size,
poly_uint64 *max_nunits, poly_uint64 *max_nunits,
vec<slp_tree> *loads,
bool *matches, unsigned *npermutes, unsigned *tree_size, bool *matches, unsigned *npermutes, unsigned *tree_size,
unsigned max_tree_size, unsigned max_tree_size,
scalar_stmts_to_slp_tree_map_t *bst_map) scalar_stmts_to_slp_tree_map_t *bst_map)
...@@ -1149,7 +1147,6 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1149,7 +1147,6 @@ vect_build_slp_tree_2 (vec_info *vinfo,
{ {
*max_nunits = this_max_nunits; *max_nunits = this_max_nunits;
node = vect_create_new_slp_node (stmts); node = vect_create_new_slp_node (stmts);
loads->safe_push (node);
return node; return node;
} }
...@@ -1173,7 +1170,6 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1173,7 +1170,6 @@ vect_build_slp_tree_2 (vec_info *vinfo,
} }
auto_vec<slp_tree, 4> children; auto_vec<slp_tree, 4> children;
auto_vec<slp_tree> this_loads;
stmt_info = stmts[0]; stmt_info = stmts[0];
...@@ -1184,7 +1180,6 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1184,7 +1180,6 @@ vect_build_slp_tree_2 (vec_info *vinfo,
FOR_EACH_VEC_ELT (oprnds_info, i, oprnd_info) FOR_EACH_VEC_ELT (oprnds_info, i, oprnd_info)
{ {
slp_tree child; slp_tree child;
unsigned old_nloads = this_loads.length ();
unsigned old_tree_size = this_tree_size; unsigned old_tree_size = this_tree_size;
unsigned int j; unsigned int j;
...@@ -1207,7 +1202,7 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1207,7 +1202,7 @@ vect_build_slp_tree_2 (vec_info *vinfo,
if ((child = vect_build_slp_tree (vinfo, oprnd_info->def_stmts, if ((child = vect_build_slp_tree (vinfo, oprnd_info->def_stmts,
group_size, &this_max_nunits, group_size, &this_max_nunits,
&this_loads, matches, npermutes, matches, npermutes,
&this_tree_size, &this_tree_size,
max_tree_size, bst_map)) != NULL) max_tree_size, bst_map)) != NULL)
{ {
...@@ -1227,7 +1222,6 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1227,7 +1222,6 @@ vect_build_slp_tree_2 (vec_info *vinfo,
if (!grandchild) if (!grandchild)
{ {
/* Roll back. */ /* Roll back. */
this_loads.truncate (old_nloads);
this_tree_size = old_tree_size; this_tree_size = old_tree_size;
FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild) FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild)
vect_free_slp_tree (grandchild, false); vect_free_slp_tree (grandchild, false);
...@@ -1350,7 +1344,7 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1350,7 +1344,7 @@ vect_build_slp_tree_2 (vec_info *vinfo,
bool *tem = XALLOCAVEC (bool, group_size); bool *tem = XALLOCAVEC (bool, group_size);
if ((child = vect_build_slp_tree (vinfo, oprnd_info->def_stmts, if ((child = vect_build_slp_tree (vinfo, oprnd_info->def_stmts,
group_size, &this_max_nunits, group_size, &this_max_nunits,
&this_loads, tem, npermutes, tem, npermutes,
&this_tree_size, &this_tree_size,
max_tree_size, bst_map)) != NULL) max_tree_size, bst_map)) != NULL)
{ {
...@@ -1396,7 +1390,6 @@ vect_build_slp_tree_2 (vec_info *vinfo, ...@@ -1396,7 +1390,6 @@ vect_build_slp_tree_2 (vec_info *vinfo,
if (!grandchild) if (!grandchild)
{ {
/* Roll back. */ /* Roll back. */
this_loads.truncate (old_nloads);
this_tree_size = old_tree_size; this_tree_size = old_tree_size;
FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild) FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (child), j, grandchild)
vect_free_slp_tree (grandchild, false); vect_free_slp_tree (grandchild, false);
...@@ -1433,7 +1426,6 @@ fail: ...@@ -1433,7 +1426,6 @@ fail:
if (tree_size) if (tree_size)
*tree_size += this_tree_size; *tree_size += this_tree_size;
*max_nunits = this_max_nunits; *max_nunits = this_max_nunits;
loads->safe_splice (this_loads);
node = vect_create_new_slp_node (stmts); node = vect_create_new_slp_node (stmts);
SLP_TREE_TWO_OPERATORS (node) = two_operators; SLP_TREE_TWO_OPERATORS (node) = two_operators;
...@@ -1646,6 +1638,38 @@ vect_attempt_slp_rearrange_stmts (slp_instance slp_instn) ...@@ -1646,6 +1638,38 @@ vect_attempt_slp_rearrange_stmts (slp_instance slp_instn)
return true; return true;
} }
/* Gather loads in the SLP graph NODE and populate the INST loads array. */
static void
vect_gather_slp_loads (slp_instance inst, slp_tree node,
hash_set<slp_tree> &visited)
{
if (visited.add (node))
return;
if (SLP_TREE_CHILDREN (node).length () == 0)
{
stmt_vec_info stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
if (STMT_VINFO_GROUPED_ACCESS (stmt_info)
&& DR_IS_READ (STMT_VINFO_DATA_REF (stmt_info)))
SLP_INSTANCE_LOADS (inst).safe_push (node);
}
else
{
unsigned i;
slp_tree child;
FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
vect_gather_slp_loads (inst, child, visited);
}
}
static void
vect_gather_slp_loads (slp_instance inst, slp_tree node)
{
hash_set<slp_tree> visited;
vect_gather_slp_loads (inst, node, visited);
}
/* Check if the required load permutations in the SLP instance /* Check if the required load permutations in the SLP instance
SLP_INSTN are supported. */ SLP_INSTN are supported. */
...@@ -1861,7 +1885,6 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -1861,7 +1885,6 @@ vect_analyze_slp_instance (vec_info *vinfo,
unsigned int group_size; unsigned int group_size;
tree vectype, scalar_type = NULL_TREE; tree vectype, scalar_type = NULL_TREE;
unsigned int i; unsigned int i;
vec<slp_tree> loads;
struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info); struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
vec<stmt_vec_info> scalar_stmts; vec<stmt_vec_info> scalar_stmts;
...@@ -1929,8 +1952,6 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -1929,8 +1952,6 @@ vect_analyze_slp_instance (vec_info *vinfo,
scalar_stmts.safe_push (next_info); scalar_stmts.safe_push (next_info);
} }
loads.create (group_size);
/* Build the tree for the SLP instance. */ /* Build the tree for the SLP instance. */
bool *matches = XALLOCAVEC (bool, group_size); bool *matches = XALLOCAVEC (bool, group_size);
unsigned npermutes = 0; unsigned npermutes = 0;
...@@ -1938,7 +1959,7 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -1938,7 +1959,7 @@ vect_analyze_slp_instance (vec_info *vinfo,
= new scalar_stmts_to_slp_tree_map_t (); = new scalar_stmts_to_slp_tree_map_t ();
poly_uint64 max_nunits = nunits; poly_uint64 max_nunits = nunits;
node = vect_build_slp_tree (vinfo, scalar_stmts, group_size, node = vect_build_slp_tree (vinfo, scalar_stmts, group_size,
&max_nunits, &loads, matches, &npermutes, &max_nunits, matches, &npermutes,
NULL, max_tree_size, bst_map); NULL, max_tree_size, bst_map);
/* The map keeps a reference on SLP nodes built, release that. */ /* The map keeps a reference on SLP nodes built, release that. */
for (scalar_stmts_to_slp_tree_map_t::iterator it = bst_map->begin (); for (scalar_stmts_to_slp_tree_map_t::iterator it = bst_map->begin ();
...@@ -1965,13 +1986,11 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -1965,13 +1986,11 @@ vect_analyze_slp_instance (vec_info *vinfo,
"size not a multiple of the vector size " "size not a multiple of the vector size "
"in basic block SLP\n"); "in basic block SLP\n");
vect_free_slp_tree (node, false); vect_free_slp_tree (node, false);
loads.release ();
return false; return false;
} }
/* Fatal mismatch. */ /* Fatal mismatch. */
matches[group_size / const_max_nunits * const_max_nunits] = false; matches[group_size / const_max_nunits * const_max_nunits] = false;
vect_free_slp_tree (node, false); vect_free_slp_tree (node, false);
loads.release ();
} }
else else
{ {
...@@ -1980,12 +1999,13 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -1980,12 +1999,13 @@ vect_analyze_slp_instance (vec_info *vinfo,
SLP_INSTANCE_TREE (new_instance) = node; SLP_INSTANCE_TREE (new_instance) = node;
SLP_INSTANCE_GROUP_SIZE (new_instance) = group_size; SLP_INSTANCE_GROUP_SIZE (new_instance) = group_size;
SLP_INSTANCE_UNROLLING_FACTOR (new_instance) = unrolling_factor; SLP_INSTANCE_UNROLLING_FACTOR (new_instance) = unrolling_factor;
SLP_INSTANCE_LOADS (new_instance) = loads; SLP_INSTANCE_LOADS (new_instance) = vNULL;
vect_gather_slp_loads (new_instance, node);
/* Compute the load permutation. */ /* Compute the load permutation. */
slp_tree load_node; slp_tree load_node;
bool loads_permuted = false; bool loads_permuted = false;
FOR_EACH_VEC_ELT (loads, i, load_node) FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (new_instance), i, load_node)
{ {
vec<unsigned> load_permutation; vec<unsigned> load_permutation;
int j; int j;
...@@ -2038,7 +2058,7 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -2038,7 +2058,7 @@ vect_analyze_slp_instance (vec_info *vinfo,
&& dr && vect_store_lanes_supported (vectype, group_size, false)) && dr && vect_store_lanes_supported (vectype, group_size, false))
{ {
slp_tree load_node; slp_tree load_node;
FOR_EACH_VEC_ELT (loads, i, load_node) FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (new_instance), i, load_node)
{ {
stmt_vec_info stmt_vinfo = DR_GROUP_FIRST_ELEMENT stmt_vec_info stmt_vinfo = DR_GROUP_FIRST_ELEMENT
(SLP_TREE_SCALAR_STMTS (load_node)[0]); (SLP_TREE_SCALAR_STMTS (load_node)[0]);
...@@ -2049,7 +2069,7 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -2049,7 +2069,7 @@ vect_analyze_slp_instance (vec_info *vinfo,
DR_GROUP_SIZE (stmt_vinfo), false)) DR_GROUP_SIZE (stmt_vinfo), false))
break; break;
} }
if (i == loads.length ()) if (i == SLP_INSTANCE_LOADS (new_instance).length ())
{ {
if (dump_enabled_p ()) if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
...@@ -2077,7 +2097,6 @@ vect_analyze_slp_instance (vec_info *vinfo, ...@@ -2077,7 +2097,6 @@ vect_analyze_slp_instance (vec_info *vinfo,
/* Failed to SLP. */ /* Failed to SLP. */
/* Free the allocated memory. */ /* Free the allocated memory. */
scalar_stmts.release (); scalar_stmts.release ();
loads.release ();
} }
/* For basic block SLP, try to break the group up into multiples of the /* For basic block SLP, try to break the group up into multiples of the
......
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