On Mon, Apr 10, 2017 at 12:08:50PM -0500, Bill Schmidt wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80376 shows an ICE on invalid
> code when using certain flavors of the vec_xxpermdi intrinsic.  The root
> cause is that we were not checking the parameter for a legal value, and an
> illegal value was being provided by the user (only an integer constant is
> permissible for argument 3).
> 
> However, this brings up a slightly larger problem, in that the invalid
> vec_xxpermdi call is nested within another call.  We have a lot of cases
> in rs6000.c where we signal an error message and replace the offending
> construct with a const0_rtx.  In this case, that const0_rtx was being used
> as a vector argument to another call, leading to a follow-up ICE that is
> not easy to parse.

i386 does this:

/* Errors in the source file can cause expand_expr to return const0_rtx
   where we expect a vector.  To avoid crashing, use one of the vector
   clear instructions.  */
static rtx
safe_vector_operand (rtx x, machine_mode mode)
{
  if (x == const0_rtx)
    x = CONST0_RTX (mode);
  return x;
}

used in e.g. ix86_expand_binop_builtin as
  if (VECTOR_MODE_P (mode0))
    op0 = safe_vector_operand (op0, mode0);
We might want something similar :-)

> Index: gcc/config/rs6000/rs6000.c
> ===================================================================
> --- gcc/config/rs6000/rs6000.c        (revision 246804)
> +++ gcc/config/rs6000/rs6000.c        (working copy)
> @@ -15586,6 +15586,11 @@ rs6000_expand_ternop_builtin (enum insn_code icode
>             || icode == CODE_FOR_vsx_xxpermdi_v2di
>             || icode == CODE_FOR_vsx_xxpermdi_v2df_be
>             || icode == CODE_FOR_vsx_xxpermdi_v2di_be
> +        || icode == CODE_FOR_vsx_xxpermdi_v1ti
> +        || icode == CODE_FOR_vsx_xxpermdi_v4sf
> +        || icode == CODE_FOR_vsx_xxpermdi_v4si
> +        || icode == CODE_FOR_vsx_xxpermdi_v8hi
> +        || icode == CODE_FOR_vsx_xxpermdi_v16qi
>             || icode == CODE_FOR_vsx_xxsldwi_v16qi
>             || icode == CODE_FOR_vsx_xxsldwi_v8hi
>             || icode == CODE_FOR_vsx_xxsldwi_v4si

The existing code is indented with spaces only; please keep the style
consistent (fixing it is fine, but then the whole block or function).

> --- gcc/config/rs6000/vector.md       (revision 246804)
> +++ gcc/config/rs6000/vector.md       (working copy)
> @@ -109,6 +109,11 @@
>      {
>        if (CONSTANT_P (operands[1]))
>       {
> +       /* Handle cascading error conditions.  */
> +       if (VECTOR_MODE_P (<MODE>mode)
> +           && !VECTOR_MODE_P (GET_MODE (operands[1])))
> +         internal_error ("non-vector constant found where vector expected");
> +
>         if (FLOAT128_VECTOR_P (<MODE>mode))
>           {
>             if (!easy_fp_constant (operands[1], <MODE>mode))

You might not need this with the suggestion above?

The patch is okay if you want that for now; it's an improvement over
what we have.


Segher

Reply via email to