On 11/4/24 5:42 PM, H.J. Lu wrote:
On Tue, Nov 5, 2024 at 8:07 AM Jeff Law <jeffreya...@gmail.com> wrote:



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 define TARGET_PROMOTE_PROTOTYPES to return false
to avoid this issue.   Changing x86 TARGET_PROMOTE_PROTOTYPES
to return false will break LLVM which assumes that incoming char/short
arguments on x86 are always extended to int.   The following targets
Then my suggestion would be to cover this in REE somehow. We started looking at that a couple years ago and set it aside. But the basic idea was to expose the ABI guarantees to REE, then let REE do its thing.

Jeff

Reply via email to