aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-generic.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-11-24 11:45:52 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-11-24 11:45:52 +0100
commit3788cfb513d19a9b36311b1317aff2141a2c6a65 (patch)
tree64cec4dd60c911068b6646624ee5ba614d073759 /gcc/tree-vect-generic.c
parent3de2a40ecdfa37efa403d4b46ef116225acb0dc0 (diff)
downloadgcc-3788cfb513d19a9b36311b1317aff2141a2c6a65.zip
gcc-3788cfb513d19a9b36311b1317aff2141a2c6a65.tar.gz
gcc-3788cfb513d19a9b36311b1317aff2141a2c6a65.tar.bz2
re PR target/68483 (gcc 5.2: suboptimal code compared to 4.9)
PR target/68483 * tree-vect-generic.c (lower_vec_perm): If VEC_PERM_EXPR is valid vec_shr pattern, don't lower it even if can_vec_perm_p returns false. * optabs.c (shift_amt_for_vec_perm_mask): Return NULL_RTX whenever first is nelt or above. Don't mask expected with 2 * nelt - 1. * gcc.target/i386/pr68483-1.c: New test. * gcc.target/i386/pr68483-2.c: New test. From-SVN: r230797
Diffstat (limited to 'gcc/tree-vect-generic.c')
-rw-r--r--gcc/tree-vect-generic.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index af1af17..2c7adf7 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -1272,6 +1272,30 @@ lower_vec_perm (gimple_stmt_iterator *gsi)
update_stmt (stmt);
return;
}
+ /* Also detect vec_shr pattern - VEC_PERM_EXPR with zero
+ vector as VEC1 and a right element shift MASK. */
+ if (optab_handler (vec_shr_optab, TYPE_MODE (vect_type))
+ != CODE_FOR_nothing
+ && TREE_CODE (vec1) == VECTOR_CST
+ && initializer_zerop (vec1)
+ && sel_int[0]
+ && sel_int[0] < elements)
+ {
+ for (i = 1; i < elements; ++i)
+ {
+ unsigned int expected = i + sel_int[0];
+ /* Indices into the second vector are all equivalent. */
+ if (MIN (elements, (unsigned) sel_int[i])
+ != MIN (elements, expected))
+ break;
+ }
+ if (i == elements)
+ {
+ gimple_assign_set_rhs3 (stmt, mask);
+ update_stmt (stmt);
+ return;
+ }
+ }
}
else if (can_vec_perm_p (TYPE_MODE (vect_type), true, NULL))
return;