This is a follow-up to
https://gcc.gnu.org/pipermail/gcc-patches/2024-September/663238.html
The primary changes are about error handling and documentation updates.
Now, we error out whenever a hard register constraint is used more than
once across an alternative for outputs or inputs. For example, the
following is allowed for register asm
register int y __asm__ ("0") = x;
__asm__ ("" : "=r" (y) : "0" (y), "r" (y));
and the analogue for hard register constraints
int y = x;
__asm__ ("" : "={0}" (y) : "0" (y), "{0}" (y)); // invalid
is rejected.
Furthermore, for hard register constraints we fail if an output object
is used more than once as e.g.
int x;
asm ("" : "=r" (x), "={1}" (x)); // rejected
although
int x;
asm ("" : "=r" (x), "=r" (x));
is accepted.
Thus, in total the changes make hard register constraints more strict in
order to prevent subtle bugs.
Stefan Schulze Frielinghaus (4):
Hard register constraints
Error handling for hard register constraints
genoutput: Verify hard register constraints
Rewrite register asm into hard register constraints
gcc/cfgexpand.cc | 42 ---
gcc/common.opt | 4 +
gcc/config/cris/cris.cc | 6 +-
gcc/config/i386/i386.cc | 6 +
gcc/config/s390/s390.cc | 6 +-
gcc/doc/extend.texi | 178 +++++++++++
gcc/doc/md.texi | 6 +
gcc/function.cc | 116 ++++++++
gcc/genoutput.cc | 60 ++++
gcc/genpreds.cc | 4 +-
gcc/gimplify.cc | 236 ++++++++++++++-
gcc/gimplify_reg_info.h | 169 +++++++++++
gcc/ira.cc | 79 ++++-
gcc/lra-constraints.cc | 13 +
gcc/output.h | 2 +
gcc/recog.cc | 11 +-
gcc/stmt.cc | 278 +++++++++++++++++-
gcc/stmt.h | 9 +-
gcc/testsuite/gcc.dg/asm-hard-reg-1.c | 85 ++++++
gcc/testsuite/gcc.dg/asm-hard-reg-2.c | 33 +++
gcc/testsuite/gcc.dg/asm-hard-reg-3.c | 25 ++
gcc/testsuite/gcc.dg/asm-hard-reg-4.c | 50 ++++
gcc/testsuite/gcc.dg/asm-hard-reg-5.c | 36 +++
gcc/testsuite/gcc.dg/asm-hard-reg-6.c | 60 ++++
gcc/testsuite/gcc.dg/asm-hard-reg-7.c | 41 +++
gcc/testsuite/gcc.dg/asm-hard-reg-8.c | 49 +++
.../gcc.dg/asm-hard-reg-demotion-1.c | 19 ++
.../gcc.dg/asm-hard-reg-demotion-2.c | 19 ++
.../gcc.dg/asm-hard-reg-demotion-error-1.c | 29 ++
gcc/testsuite/gcc.dg/asm-hard-reg-demotion.h | 52 ++++
gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c | 83 ++++++
gcc/testsuite/gcc.dg/asm-hard-reg-error-2.c | 26 ++
gcc/testsuite/gcc.dg/asm-hard-reg-error-3.c | 27 ++
gcc/testsuite/gcc.dg/asm-hard-reg-error-4.c | 24 ++
gcc/testsuite/gcc.dg/asm-hard-reg-error-5.c | 13 +
gcc/testsuite/gcc.dg/pr87600-2.c | 30 +-
gcc/testsuite/gcc.dg/pr87600-3.c | 35 +++
.../gcc.target/s390/asm-hard-reg-1.c | 103 +++++++
.../gcc.target/s390/asm-hard-reg-2.c | 43 +++
.../gcc.target/s390/asm-hard-reg-3.c | 42 +++
.../gcc.target/s390/asm-hard-reg-4.c | 6 +
.../gcc.target/s390/asm-hard-reg-5.c | 6 +
.../gcc.target/s390/asm-hard-reg-longdouble.h | 18 ++
gcc/testsuite/lib/scanasm.exp | 4 +
gcc/toplev.cc | 4 +
45 files changed, 2087 insertions(+), 100 deletions(-)
create mode 100644 gcc/gimplify_reg_info.h
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-1.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-2.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-3.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-4.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-5.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-6.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-7.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-8.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-demotion-1.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-demotion-2.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-demotion-error-1.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-demotion.h
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-error-2.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-error-3.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-error-4.c
create mode 100644 gcc/testsuite/gcc.dg/asm-hard-reg-error-5.c
create mode 100644 gcc/testsuite/gcc.dg/pr87600-3.c
create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-1.c
create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-2.c
create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-3.c
create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-4.c
create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-5.c
create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-longdouble.h
--
2.45.2