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