"H.J. Lu via Gcc-patches" <gcc-patches@gcc.gnu.org> writes:
> On Fri, Apr 30, 2021 at 5:49 AM H.J. Lu <hjl.to...@gmail.com> wrote:
>>
>> On Fri, Apr 30, 2021 at 5:42 AM Richard Sandiford
>> <richard.sandif...@arm.com> wrote:
>> >
>> > "H.J. Lu via Gcc-patches" <gcc-patches@gcc.gnu.org> writes:
>> > > On Fri, Apr 30, 2021 at 2:06 AM Richard Sandiford
>> > > <richard.sandif...@arm.com> wrote:
>> > >>
>> > >> "H.J. Lu via Gcc-patches" <gcc-patches@gcc.gnu.org> writes:
>> > >> > gen_reg_rtx tracks stack alignment needed for pseudo registers so that
>> > >> > associated hard registers can be properly spilled onto stack.  But 
>> > >> > there
>> > >> > are cases where associated hard registers will never be spilled onto
>> > >> > stack.  gen_reg_rtx is changed to take an argument for register 
>> > >> > alignment
>> > >> > so that stack realignment can be avoided when not needed.
>> > >>
>> > >> How is it guaranteed that they will never be spilled though?
>> > >> I don't think that that guarantee exists for any kind of pseudo,
>> > >> except perhaps for the temporary pseudos that the RA creates to
>> > >> replace (match_scratch …)es.
>> > >>
>> > >
>> > > The caller of creating pseudo registers with specific alignment must
>> > > guarantee that they will never be spilled.   I am only using it in
>> > >
>> > >   /* Make operand1 a register if it isn't already.  */
>> > >   if (can_create_pseudo_p ()
>> > >       && !register_operand (op0, mode)
>> > >       && !register_operand (op1, mode))
>> > >     {
>> > >       /* NB: Don't increase stack alignment requirement when forcing
>> > >          operand1 into a pseudo register to copy data from one memory
>> > >          location to another since it doesn't require a spill.  */
>> > >       emit_move_insn (op0,
>> > >                       force_reg (GET_MODE (op0), op1,
>> > >                                  (UNITS_PER_WORD * BITS_PER_UNIT)));
>> > >       return;
>> > >     }
>> > >
>> > > for vector moves.  RA shouldn't spill it.
>> >
>> > But this is the point: it's a case of hoping that the RA won't spill it,
>> > rather than having a guarantee that it won't.
>> >
>> > Even if the moves start out adjacent, they could be separated by later
>> > RTL optimisations, particularly scheduling.  (I realise pre-RA scheduling
>> > isn't enabled by default for x86, but it can still be enabled explicitly.)
>> > Or if the same data is being copied to two locations, we might reuse
>> > values loaded by the first copy for the second copy as well.
>
> There are cases where pseudo vector registers are created as pure
> temporary registers in the backend and they shouldn't ever be spilled
> to stack.   They will be spilled to stack only if there are other 
> non-temporary
> vector register usage in which case stack will be properly re-aligned.
> Caller of creating pseudo registers with specific alignment guarantees
> that they are used only as pure temporary registers.

I don't think there's really a distinct category of pure temporary
registers though.  The things I mentioned above can happen for any
kind of pseudo register.

Thanks,
Richard

Reply via email to