subreg vs vec_select
Segher Boessenkool
segher@kernel.crashing.org
Wed Sep 9 21:09:54 GMT 2020
Hi Ilya,
On Wed, Sep 09, 2020 at 11:50:56AM +0200, Ilya Leoshkevich via Gcc wrote:
> I have a vector pseudo containing a single 128-bit value (V1TFmode) and
> I need to access its last 64 bits (DFmode). Which of the two options
> is better?
>
> (subreg:DF (reg:V1TF) 8)
>
> or
>
> (vec_select:DF (subreg:V2DF (reg:V1TF) 0) (parallel [(const_int 1)]))
>
> If I use the first one, I run into a problem with set_noop_p (): it
> thinks that
>
> (set (subreg:DF (reg:TF %f0) 8) (subreg:DF (reg:V1TF %f0) 8))
>
> is a no-op, because it doesn't check the mode after stripping the
> subreg:
>
> https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/rtlanal.c;h=5ae38b79#l1616
>
> However this is not correct, because SET_DEST is the second register in
> a register pair, and SET_SRC is half of a vector register that overlaps
> the first register in the corresponding pair. So it looks as if mode
> needs to be considered there.
Yes.
> This helps:
>
> --- a/gcc/rtlanal.c
> +++ b/gcc/rtlanal.c
> @@ -1619,6 +1619,8 @@ set_noop_p (const_rtx set)
> return 0;
> src = SUBREG_REG (src);
> dst = SUBREG_REG (dst);
> + if (GET_MODE (src) != GET_MODE (dst))
> + return 0;
> }
>
> but I'm not sure whether I'm not missing something about subreg
> semantics in the first place.
You probably should just see if both modes are the same number of hard
registers? HARD_REGNO_NREGS.
Segher
More information about the Gcc
mailing list