[v5,0/7] Correct outgoing integer argument promotion

Message ID 20241204044951.509713-1-hjl.tools@gmail.com
Headers
Series Correct outgoing integer argument promotion |

Message

H.J. Lu Dec. 4, 2024, 4:49 a.m. UTC
  Changes from v4:

1. Rename gcc/testsuite/gfortran.dg/pr14907-1.f90 to
gcc/testsuite/gfortran.dg/pr112877-1.f90
2. Mention

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48274
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112877

Changes from v3:

1. Split improvement of outgoing integer argument promotion into 3
patches.
2. Drop the expand_promote_outgoing_argument change.  The bug

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117547

should be fixed differently in the x86 backend.

3. Update testcase adjustments.

--
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 when the incoming argument can be copied to the outgoing
argument without any changes.

1. Honor TARGET_PROMOTE_PROTOTYPES during RTL expand.
2. Drop targetm.promote_prototypes from C, C++ and Ada frontends.
3. Use incoming small integer argument type if possible.
4. Adjust tests for the C frontend promotion removal.
5. gcc.dg/tree-ssa/pr108357.c fails with the C frontend promotion removal.
This is a known issue:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108357

H.J. Lu (7):
  Honor TARGET_PROMOTE_PROTOTYPES during RTL expand
  Drop targetm.promote_prototypes from C, C++ and Ada frontends
  Use incoming small integer argument type if possible
  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: Enable for all targets and adjust scan matches
  ssa-fre-4.c: Enable for all targets and adjust scan match

 gcc/ada/gcc-interface/utils.cc                | 24 -----------
 gcc/c/c-decl.cc                               | 40 -------------------
 gcc/c/c-typeck.cc                             | 19 ++-------
 gcc/calls.cc                                  | 36 +++++++++++++++++
 gcc/cp/call.cc                                | 10 -----
 gcc/cp/typeck.cc                              | 13 ++----
 gcc/gimple.cc                                 | 10 +----
 gcc/testsuite/gcc.dg/tree-ssa/scev-cast.c     |  5 +--
 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/pr112877-1.f90      | 17 ++++++++
 gcc/tree.cc                                   | 14 -------
 34 files changed, 399 insertions(+), 157 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/pr112877-1.f90