[06/13] Check whether a vector of QIs can store all indices

Message ID 87r2s3lccy.fsf@linaro.org
State New
Headers show
Series
  • Make VEC_PERM_EXPR work for variable-length vectors
Related show

Commit Message

Richard Sandiford Dec. 9, 2017, 11:18 p.m.
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.


2017-12-09  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.

Comments

Richard Biener Dec. 12, 2017, 3:27 p.m. | #1
On Sun, Dec 10, 2017 at 12:18 AM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> 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.


Ok.

>

> 2017-12-09  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.

>

> Index: gcc/optabs-query.c

> ===================================================================

> --- gcc/optabs-query.c  2017-12-09 22:47:21.534314227 +0000

> +++ gcc/optabs-query.c  2017-12-09 22:47:25.861316866 +0000

> @@ -378,7 +378,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: gcc/optabs.c

> ===================================================================

> --- gcc/optabs.c        2017-12-09 22:47:23.878315657 +0000

> +++ gcc/optabs.c        2017-12-09 22:47:25.861316866 +0000

> @@ -5595,7 +5595,8 @@ expand_vec_perm_var (machine_mode mode,

>    /* 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)

Patch

Index: gcc/optabs-query.c
===================================================================
--- gcc/optabs-query.c	2017-12-09 22:47:21.534314227 +0000
+++ gcc/optabs-query.c	2017-12-09 22:47:25.861316866 +0000
@@ -378,7 +378,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: gcc/optabs.c
===================================================================
--- gcc/optabs.c	2017-12-09 22:47:23.878315657 +0000
+++ gcc/optabs.c	2017-12-09 22:47:25.861316866 +0000
@@ -5595,7 +5595,8 @@  expand_vec_perm_var (machine_mode mode,
   /* 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)