On 12/4/24 1:47 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 the incoming small integer argument type for the incoming argument if
the incoming small integer argument is copied to the outgoing argument
without any modification.

gcc/

        PR middle-end/14907
        * calls.cc: (get_small_int_arg_type): New function.
        (initialize_argument_information): Call get_small_int_arg_type to
        get the small integer argument type.
Wouldn't this break a target where sub-integer arguments are passed as-is? Do we have any such targets?

For targets that do promote, how is this different than PROMOTE_MODE? What about targets where signedness of the type matters (Alpha accoriding to the PROMOTE_MODE documentation).

Jeff


Reply via email to