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. 1. Drop targetm.promote_prototypes from C, C++ and Ada frontends and apply targetm.promote_prototypes during RTL call expansion. 2. Add expand_promote_outgoing_argument for TARGET_PROMOTE_PROTOTYPES targets to promote outgoing integer arguments when expanding builtin functions. 3. Adjust tests for the C frontend promotion removal. 4. gcc.dg/tree-ssa/pr108357.c fails with the C frontend promotion removal. This test passes for aarch64-linux. Comparing tree dumps between x86-64 and aarch64, differences are diff -upr x86/pr108357.c.098t.fixup_cfg3 aarch64/pr108357.c.098t.fixup_cfg3 --- x86/pr108357.c.098t.fixup_cfg3 2024-11-10 18:23:40.418419777 +0800 +++ aarch64/pr108357.c.098t.fixup_cfg3 2024-11-10 18:20:55.410902153 +0800 ... @@ -19,7 +19,7 @@ short int a (short int d, short int e) -;; Function main (main, funcdef_no=2, decl_uid=2806, cgraph_uid=3, symbol_order=4) (executed once) +;; Function main (main, funcdef_no=2, decl_uid=4429, cgraph_uid=3, symbol_order=4) (executed once) int main () { @@ -43,34 +43,28 @@ int main () _7 = e.1_6 * 5; _8 = (short int) _7; b = 0; - if (_8 != 0) - goto <bb 3>; [67.00%] - else - goto <bb 6>; [33.00%] - - <bb 3> [local count: 719407024]: c.4_9 = 0; _10 = c.4_9 == 0; _11 = (int) _10; _12 = (int) _8; if (_11 < _12) - goto <bb 5>; [50.00%] - else goto <bb 4>; [50.00%] + else + goto <bb 3>; [50.00%] ... diff -upr x86/pr108357.c.107t.ccp2 aarch64/pr108357.c.107t.ccp2 --- x86/pr108357.c.107t.ccp2 2024-11-10 18:23:40.419419775 +0800 +++ aarch64/pr108357.c.107t.ccp2 2024-11-10 18:20:55.411902150 +0800 ... @@ -59,7 +59,7 @@ short int a (short int d, short int e) -;; Function main (main, funcdef_no=2, decl_uid=2806, cgraph_uid=3, symbol_order=4) (executed once) +;; Function main (main, funcdef_no=2, decl_uid=4429, cgraph_uid=3, symbol_order=4) (executed once) Adding destination of edge (0 -> 2) to worklist @@ -73,35 +73,32 @@ Lattice value changed to VARYING. Addin Visiting statement: _2 = (short int) b.2_1; which is likely CONSTANT -Lattice value changed to VARYING. Adding SSA edges to worklist. +Lattice value changed to CONSTANT 0x0 (0xff). Adding SSA edges to worklist. +marking stmt to be not simulated again Visiting statement: _3 = _2 ^ 9854; which is likely CONSTANT -Lattice value changed to VARYING. Adding SSA edges to worklist. +Lattice value changed to CONSTANT 0x2600 (0xff). Adding SSA edges to worklist. +marking stmt to be not simulated again Visiting statement: e.1_6 = (unsigned short) _3; which is likely CONSTANT -Lattice value changed to VARYING. Adding SSA edges to worklist. +Lattice value changed to CONSTANT 0x2600 (0xff). Adding SSA edges to worklist. +marking stmt to be not simulated again Visiting statement: _7 = e.1_6 * 5; which is likely CONSTANT -Lattice value changed to VARYING. Adding SSA edges to worklist. +Lattice value changed to CONSTANT 0x8000 (0x7fff). Adding SSA edges to worklist. +marking stmt to be not simulated again ... The C frontend promotion removal causes inline strategy change which leads to this test failure. H.J. Lu (7): Improve outgoing integer argument promotion Add expand_promote_outgoing_argument i386: Use GET_MODE with lowpart_subreg i386: Adjust apx-ndd.c for frontend promotion removal vect-simd-clone-1[6-8][cd].c: Expect in-branch clones for x86 scev-cast.c: Adjusted ssa-fre-4.c: Skip for all targets gcc/ada/gcc-interface/utils.cc | 24 -- gcc/c/c-decl.cc | 40 --- gcc/c/c-typeck.cc | 19 +- gcc/calls.cc | 81 ++++++ gcc/config/i386/i386-expand.cc | 247 +++++++++--------- gcc/cp/call.cc | 10 - gcc/cp/typeck.cc | 13 +- gcc/expr.cc | 18 ++ gcc/expr.h | 1 + gcc/gimple.cc | 10 +- gcc/testsuite/gcc.dg/tree-ssa/scev-cast.c | 4 +- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-4.c | 6 +- .../gcc.dg/vect/vect-simd-clone-16c.c | 5 +- .../gcc.dg/vect/vect-simd-clone-16d.c | 4 +- .../gcc.dg/vect/vect-simd-clone-17c.c | 5 +- .../gcc.dg/vect/vect-simd-clone-17d.c | 5 +- .../gcc.dg/vect/vect-simd-clone-18c.c | 5 +- .../gcc.dg/vect/vect-simd-clone-18d.c | 5 +- gcc/testsuite/gcc.target/i386/apx-ndd.c | 9 +- gcc/testsuite/gcc.target/i386/pr14907-1.c | 21 ++ gcc/testsuite/gcc.target/i386/pr14907-10.c | 23 ++ gcc/testsuite/gcc.target/i386/pr14907-11.c | 12 + gcc/testsuite/gcc.target/i386/pr14907-12.c | 17 ++ gcc/testsuite/gcc.target/i386/pr14907-13.c | 12 + gcc/testsuite/gcc.target/i386/pr14907-14.c | 17 ++ gcc/testsuite/gcc.target/i386/pr14907-15.c | 26 ++ gcc/testsuite/gcc.target/i386/pr14907-16.c | 24 ++ gcc/testsuite/gcc.target/i386/pr14907-2.c | 21 ++ gcc/testsuite/gcc.target/i386/pr14907-3.c | 21 ++ gcc/testsuite/gcc.target/i386/pr14907-4.c | 21 ++ gcc/testsuite/gcc.target/i386/pr14907-5.c | 21 ++ gcc/testsuite/gcc.target/i386/pr14907-6.c | 21 ++ gcc/testsuite/gcc.target/i386/pr14907-7.c | 22 ++ gcc/testsuite/gcc.target/i386/pr14907-8.c | 23 ++ gcc/testsuite/gcc.target/i386/pr14907-9.c | 22 ++ gcc/testsuite/gfortran.dg/pr14907-1.f90 | 17 ++ gcc/tree.cc | 14 - 37 files changed, 588 insertions(+), 278 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-10.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-11.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-12.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-13.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-14.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-15.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-16.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-2.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-3.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-4.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-5.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-6.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-7.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-8.c create mode 100644 gcc/testsuite/gcc.target/i386/pr14907-9.c create mode 100644 gcc/testsuite/gfortran.dg/pr14907-1.f90 -- 2.47.0