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