PING [Patch][Middle-end]Add -fzero-call-used-regs=[skip|used-gpr|all-gpr|used|all]

Uros Bizjak ubizjak@gmail.com
Thu Aug 6 09:31:47 GMT 2020


On Thu, Aug 6, 2020 at 10:42 AM Jakub Jelinek <jakub@redhat.com> wrote:
>
> On Thu, Aug 06, 2020 at 10:31:27AM +0200, Richard Biener wrote:
> > > For x86, for example, even though the GPR registers are 64-bit, we only need to zero the lower 32-bit. etc.
> >
> > That's an optimization, yes.
>
> But, does the code need to care?

No, because this is only an implementation detail. The RTL code should
still use DImode clears. These are emitted using 32bit insns,
implicitly zero-extended to 64bits, so in effect they implement DImode
clears.

Uros.

> If one compiles:
> void
> foo ()
> {
>   register unsigned long long a __asm ("rax");
>   register unsigned long long b __asm ("rsi");
>   register unsigned long long c __asm ("r8");
>   register unsigned long long d __asm ("r9");
>   a = 0;
>   b = 0;
>   c = 0;
>   d = 0;
>   asm volatile ("" : : "r" (a), "r" (b), "r" (c), "r" (d));
> }
> then the backend uses *movdi_xor patterns which are emitted
> as xorl instructions (i.e. just 32-bit).  If you need to emit them
> at a spot where the flags register is or might be live, then
> *movdi_internal is used instead, but that one will also emit
> a 32-bit movl $0, %r8d etc. instruction (because (const_int 0) is
> zero extended 32-bit integer).
>
>         Jakub
>


More information about the Gcc-patches mailing list