From 6da64f1b329f57c07f22ec034bc7bc4b0dc9e87b Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 2 Jan 2018 18:26:35 +0000 Subject: [PATCH] Check whether a vector of QIs can store all indices The patch to remove the vec_perm_const optab checked whether replacing a constant permute with a variable permute is safe, or whether it might truncate the indices. This patch adds a corresponding check for whether variable permutes can be lowered to QImode-based permutes. 2018-01-02 Richard Sandiford gcc/ * optabs-query.c (can_vec_perm_var_p): Check whether lowering to qimode could truncate the indices. * optabs.c (expand_vec_perm_var): Likewise. From-SVN: r256094 --- gcc/ChangeLog | 6 ++++++ gcc/optabs-query.c | 3 ++- gcc/optabs.c | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 821442fa724..c7091a906f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-01-02 Richard Sandiford + + * optabs-query.c (can_vec_perm_var_p): Check whether lowering + to qimode could truncate the indices. + * optabs.c (expand_vec_perm_var): Likewise. + 2018-01-02 Richard Sandiford * Makefile.in (OBJS): Add vec-perm-indices.o. diff --git a/gcc/optabs-query.c b/gcc/optabs-query.c index 4060b4fc4db..73966647808 100644 --- a/gcc/optabs-query.c +++ b/gcc/optabs-query.c @@ -390,7 +390,8 @@ can_vec_perm_var_p (machine_mode mode) /* We allow fallback to a QI vector mode, and adjust the mask. */ machine_mode qimode; - if (!qimode_for_vec_perm (mode).exists (&qimode)) + if (!qimode_for_vec_perm (mode).exists (&qimode) + || GET_MODE_NUNITS (qimode) > GET_MODE_MASK (QImode) + 1) return false; if (direct_optab_handler (vec_perm_optab, qimode) == CODE_FOR_nothing) diff --git a/gcc/optabs.c b/gcc/optabs.c index 9099ba29143..3a41a656022 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5623,7 +5623,8 @@ expand_vec_perm_var (machine_mode mode, rtx v0, rtx v1, rtx sel, rtx target) /* As a special case to aid several targets, lower the element-based permutation to a byte-based permutation and try again. */ machine_mode qimode; - if (!qimode_for_vec_perm (mode).exists (&qimode)) + if (!qimode_for_vec_perm (mode).exists (&qimode) + || GET_MODE_NUNITS (qimode) > GET_MODE_MASK (QImode) + 1) return NULL_RTX; icode = direct_optab_handler (vec_perm_optab, qimode); if (icode == CODE_FOR_nothing) -- 2.30.2