mbox series

[v3,0/7] Improve outgoing integer argument promotion

Message ID 20241110125550.787007-1-hjl.tools@gmail.com
Headers show
Series Improve outgoing integer argument promotion | expand

Message

H.J. Lu Nov. 10, 2024, 12:55 p.m. UTC
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