On 11/1/24 4:32 PM, H.J. Lu wrote:
For targets, like x86, which define TARGET_PROMOTE_PROTOTYPES to return
true, all integer arguments smaller than int are passed as int:

[hjl@gnu-tgl-3 pr14907]$ cat x.c
extern int baz (char c1);

int
foo (char c1)
{
   return baz (c1);
}
[hjl@gnu-tgl-3 pr14907]$ gcc -S -O2 -m32 x.c
[hjl@gnu-tgl-3 pr14907]$ cat x.s
        .file   "x.c"
        .text
        .p2align 4
        .globl  foo
        .type   foo, @function
foo:
.LFB0:
        .cfi_startproc
        movsbl  4(%esp), %eax
        movl    %eax, 4(%esp)
        jmp     baz
        .cfi_endproc
.LFE0:
        .size   foo, .-foo
        .ident  "GCC: (GNU) 14.2.1 20240912 (Red Hat 14.2.1-3)"
        .section        .note.GNU-stack,"",@progbits
[hjl@gnu-tgl-3 pr14907]$

But integer promotion:

        movsbl  4(%esp), %eax
        movl    %eax, 4(%esp)

isn't necessary if incoming arguments and outgoing arguments are the
same.  Use unpromoted incoming integer arguments as outgoing arguments
if incoming integer arguments are the same as outgoing arguments to
avoid unnecessary integer promotion.
Is there a particular reason x86 can't use the same mechanisms that other targets used to expose how arguments are promoted and ultimately optimize away unnecessary promotions?

jeff

Reply via email to