Check whether a vector of QIs can store all indices
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 2 Jan 2018 18:26:35 +0000 (18:26 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 2 Jan 2018 18:26:35 +0000 (18:26 +0000)
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  <richard.sandiford@linaro.org>

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
gcc/optabs-query.c
gcc/optabs.c

index 821442fa72435b0f17437fd7165907f0087fae4d..c7091a906f91d4b598d6d1d8e1fe25d8fc8cbfd6 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-02  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * 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  <richard.sandiford@linaro.org>
 
        * Makefile.in (OBJS): Add vec-perm-indices.o.
index 4060b4fc4db6578faa202facfd64472937113b5f..73966647808f36a0c924a54d787bda771f56c958 100644 (file)
@@ -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)
index 9099ba2914321ad41751eb30b3526cd0d66f307d..3a41a6560221b0411fd025956451e95b21c79ba2 100644 (file)
@@ -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)