Commit be377c80 by Richard Biener Committed by Richard Biener

re PR tree-optimization/68553 (gcc.dg/vect/pr68445.c FAILs)

2015-11-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/68553
	* tree-vect-slp.c (vect_create_mask_and_perm): Skip VEC_PERM_EXPR
	generation for 1:1 permutations.
	(vect_transform_slp_perm_load): Detect 1:1 permutations.

From-SVN: r231006
parent c000cd7c
2015-11-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/68553
* tree-vect-slp.c (vect_create_mask_and_perm): Skip VEC_PERM_EXPR
generation for 1:1 permutations.
(vect_transform_slp_perm_load): Detect 1:1 permutations.
2015-11-27 Bernd Schmidt <bschmidt@redhat.com> 2015-11-27 Bernd Schmidt <bschmidt@redhat.com>
* gimple.h (nonbarrier_call_p): Declare. * gimple.h (nonbarrier_call_p): Declare.
...@@ -3224,12 +3224,18 @@ vect_create_mask_and_perm (gimple *stmt, ...@@ -3224,12 +3224,18 @@ vect_create_mask_and_perm (gimple *stmt,
first_vec = dr_chain[first_vec_indx]; first_vec = dr_chain[first_vec_indx];
second_vec = dr_chain[second_vec_indx]; second_vec = dr_chain[second_vec_indx];
/* Generate the permute statement. */ /* Generate the permute statement if necessary. */
perm_stmt = gimple_build_assign (perm_dest, VEC_PERM_EXPR, if (mask)
first_vec, second_vec, mask); {
data_ref = make_ssa_name (perm_dest, perm_stmt); perm_stmt = gimple_build_assign (perm_dest, VEC_PERM_EXPR,
gimple_set_lhs (perm_stmt, data_ref); first_vec, second_vec, mask);
vect_finish_stmt_generation (stmt, perm_stmt, gsi); data_ref = make_ssa_name (perm_dest, perm_stmt);
gimple_set_lhs (perm_stmt, data_ref);
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
}
else
/* If mask was NULL_TREE generate the requested identity transform. */
perm_stmt = SSA_NAME_DEF_STMT (first_vec);
/* Store the vector statement in NODE. */ /* Store the vector statement in NODE. */
SLP_TREE_VEC_STMTS (node)[stride_out * i + vect_stmts_counter] SLP_TREE_VEC_STMTS (node)[stride_out * i + vect_stmts_counter]
...@@ -3315,6 +3321,7 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain, ...@@ -3315,6 +3321,7 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
int index = 0; int index = 0;
int first_vec_index = -1; int first_vec_index = -1;
int second_vec_index = -1; int second_vec_index = -1;
bool noop_p = true;
for (int j = 0; j < unroll_factor; j++) for (int j = 0; j < unroll_factor; j++)
{ {
...@@ -3351,11 +3358,14 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain, ...@@ -3351,11 +3358,14 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
gcc_assert (mask_element >= 0 gcc_assert (mask_element >= 0
&& mask_element < 2 * nunits); && mask_element < 2 * nunits);
if (mask_element != index)
noop_p = false;
mask[index++] = mask_element; mask[index++] = mask_element;
if (index == nunits) if (index == nunits)
{ {
if (!can_vec_perm_p (mode, false, mask)) if (! noop_p
&& ! can_vec_perm_p (mode, false, mask))
{ {
if (dump_enabled_p ()) if (dump_enabled_p ())
{ {
...@@ -3371,11 +3381,16 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain, ...@@ -3371,11 +3381,16 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
if (!analyze_only) if (!analyze_only)
{ {
tree mask_vec, *mask_elts; tree mask_vec = NULL_TREE;
mask_elts = XALLOCAVEC (tree, nunits);
for (int l = 0; l < nunits; ++l) if (! noop_p)
mask_elts[l] = build_int_cst (mask_element_type, mask[l]); {
mask_vec = build_vector (mask_type, mask_elts); tree *mask_elts = XALLOCAVEC (tree, nunits);
for (int l = 0; l < nunits; ++l)
mask_elts[l] = build_int_cst (mask_element_type,
mask[l]);
mask_vec = build_vector (mask_type, mask_elts);
}
if (second_vec_index == -1) if (second_vec_index == -1)
second_vec_index = first_vec_index; second_vec_index = first_vec_index;
...@@ -3388,6 +3403,7 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain, ...@@ -3388,6 +3403,7 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
index = 0; index = 0;
first_vec_index = -1; first_vec_index = -1;
second_vec_index = -1; second_vec_index = -1;
noop_p = true;
} }
} }
} }
......
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