On Fri, Jan 05, 2018 at 11:26:59AM +0000, Richard Sandiford wrote:
> Ping.  Here's the patch updated to apply on top of the v8.4 and
> __builtin_load_no_speculate support.
> 
> Richard Sandiford <richard.sandif...@linaro.org> writes:
> > This patch switches the AArch64 port to use 2 poly_int coefficients
> > and updates code as necessary to keep it compiling.
> >
> > One potentially-significant change is to
> > aarch64_hard_regno_caller_save_mode.  The old implementation
> > was written in a pretty conservative way: it changed the default
> > behaviour for single-register values, but used the default handling
> > for multi-register values.
> >
> > I don't think that's necessary, since the interesting cases for this
> > macro are usually the single-register ones.  Multi-register modes take
> > up the whole of the constituent registers and the move patterns for all
> > multi-register modes should be equally good.
> >
> > Using the original mode for multi-register cases stops us from using
> > SVE modes to spill multi-register NEON values.  This was caught by
> > gcc.c-torture/execute/pr47538.c.
> >
> > Also, aarch64_shift_truncation_mask used GET_MODE_BITSIZE - 1.
> > GET_MODE_UNIT_BITSIZE - 1 is equivalent for the cases that it handles
> > (which are all scalars), and I think it's more obvious, since if we ever
> > do use this for elementwise shifts of vector modes, the mask will depend
> > on the number of bits in each element rather than the number of bits in
> > the whole vector.
This is OK for trunk, with whatever modifications are needed to make the
rebase work. I do have one question and one minor comment; you can assume
that if you do make modifications in response to these that the patch is
still OK.

> Index: gcc/config/aarch64/aarch64.c
> ===================================================================
> --- gcc/config/aarch64/aarch64.c      2018-01-05 11:24:44.647408566 +0000
> +++ gcc/config/aarch64/aarch64.c      2018-01-05 11:24:44.867399574 +0000
> @@ -2262,8 +2258,12 @@ aarch64_pass_by_reference (cumulative_ar
>    int nregs;
>  
>    /* GET_MODE_SIZE (BLKmode) is useless since it is 0.  */
> -  size = (mode == BLKmode && type)
> -    ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
> +  if (mode == BLKmode && type)
> +    size = int_size_in_bytes (type);
> +  else
> +    /* No frontends can create types with variable-sized modes, so we
> +       shouldn't be asked to pass or return them.  */
> +    size = GET_MODE_SIZE (mode).to_constant ();

I presume that the assertion in your comment is checked in the
GET_MODE_SIZE (mode).to_constant (); call? If not, is it worth making the
assert explicit here?

> @@ -11874,8 +11921,9 @@ aarch64_simd_valid_immediate (rtx op, si
>    unsigned int n_elts;
>    if (const_vec_duplicate_p (op, &elt))
>      n_elts = 1;
> -  else if (GET_CODE (op) == CONST_VECTOR)
> -    n_elts = CONST_VECTOR_NUNITS (op);
> +  else if (GET_CODE (op) == CONST_VECTOR
> +        && CONST_VECTOR_NUNITS (op).is_constant (&n_elts))
> +    ;
>    else
>      return false;
>  

A comment in the empty else if case would be useful for clarity.

Thanks,
James

Reply via email to