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
This commit is contained in:
Richard Biener 2015-11-27 11:17:51 +00:00 committed by Richard Biener
parent c000cd7c93
commit be377c804b
2 changed files with 35 additions and 12 deletions

View File

@ -1,3 +1,10 @@
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>
* gimple.h (nonbarrier_call_p): Declare.

View File

@ -3224,12 +3224,18 @@ vect_create_mask_and_perm (gimple *stmt,
first_vec = dr_chain[first_vec_indx];
second_vec = dr_chain[second_vec_indx];
/* Generate the permute statement. */
perm_stmt = gimple_build_assign (perm_dest, VEC_PERM_EXPR,
first_vec, second_vec, mask);
data_ref = make_ssa_name (perm_dest, perm_stmt);
gimple_set_lhs (perm_stmt, data_ref);
vect_finish_stmt_generation (stmt, perm_stmt, gsi);
/* Generate the permute statement if necessary. */
if (mask)
{
perm_stmt = gimple_build_assign (perm_dest, VEC_PERM_EXPR,
first_vec, second_vec, mask);
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. */
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,
int index = 0;
int first_vec_index = -1;
int second_vec_index = -1;
bool noop_p = true;
for (int j = 0; j < unroll_factor; j++)
{
@ -3351,11 +3358,14 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
gcc_assert (mask_element >= 0
&& mask_element < 2 * nunits);
if (mask_element != index)
noop_p = false;
mask[index++] = mask_element;
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 ())
{
@ -3371,11 +3381,16 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
if (!analyze_only)
{
tree mask_vec, *mask_elts;
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);
tree mask_vec = NULL_TREE;
if (! noop_p)
{
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)
second_vec_index = first_vec_index;
@ -3388,6 +3403,7 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
index = 0;
first_vec_index = -1;
second_vec_index = -1;
noop_p = true;
}
}
}