aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.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/optabs.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/optabs.c')
-rw-r--r--gcc/optabs.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 5545302..40ef582 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5232,12 +5232,12 @@ shift_amt_for_vec_perm_mask (rtx sel)
return NULL_RTX;
first = INTVAL (CONST_VECTOR_ELT (sel, 0));
- if (first >= 2*nelt)
+ if (first >= nelt)
return NULL_RTX;
for (i = 1; i < nelt; i++)
{
int idx = INTVAL (CONST_VECTOR_ELT (sel, i));
- unsigned int expected = (i + first) & (2 * nelt - 1);
+ unsigned int expected = i + first;
/* Indices into the second vector are all equivalent. */
if (idx < 0 || (MIN (nelt, (unsigned) idx) != MIN (nelt, expected)))
return NULL_RTX;