This is a follow-up to https://gcc.gnu.org/pipermail/gcc-patches/2025-May/684181.html
I added the last missing pieces namely changelogs, and bootstrapped and regtested on aarch64-unknown-linux-gnu powerpc64le-unknown-linux-gnu s390x-ibm-linux-gnu x86_64-pc-linux-gnu Via cross compilers I verified the new tests for arm-linux-gnueabi i686-linux-gnueabi powerpc-linux-gnu riscv32-linux-gnu riscv64-linux-gnu Despite that I removed overloads for parse_{input,output}_constraint() by passing a null pointer explicitly. Furthermore, in case of register pairs, if two constraints of operands overlap, error out and report the overlapped register. For example, on aarch64 svuint32x2_t x, y; asm ("" : "={z5}" (x), "={z6}" (y)); previously I used the register as is of the first constraint in the error message which is imprecise/misleading. Now, I error out reporting multiple outputs to register z6/v6, i.e., the actual overlapped one, and not z5/v5 as previously. Although I found a lot of corner cases during development via -fdemote-register-asm I removed it from this patch series. I compiled and used the Linux kernel and glibc successfully with it for s390x. For x86_64, the Linux kernel compiles fine, too, except of one small manual change. For powerpc64le, I ran into an odd case compiling glibc which I would like to understand in more detail. Since register asm is not as strict as hard register constraints, for a full fledged implementation I need to consider more corner cases. Therefore, I would like to spend some more time on this before I push this new feature. In total no huge changes. Still ok for mainline? Stefan Schulze Frielinghaus (3): Hard register constraints Error handling for hard register constraints genoutput: Verify hard register constraints gcc/ada/gcc-interface/trans.cc | 9 +- gcc/analyzer/region-model-asm.cc | 7 +- gcc/c/c-typeck.cc | 6 +- gcc/cfgexpand.cc | 53 +--- gcc/config/cris/cris.cc | 6 +- gcc/config/i386/i386.cc | 6 + gcc/config/s390/s390.cc | 11 +- gcc/cp/semantics.cc | 6 +- gcc/d/toir.cc | 6 +- gcc/doc/extend.texi | 162 ++++++++++ gcc/doc/md.texi | 6 + gcc/function.cc | 116 ++++++++ gcc/genoutput.cc | 60 ++++ gcc/genpreds.cc | 4 +- gcc/gimple-walk.cc | 11 +- gcc/gimplify-me.cc | 5 +- gcc/gimplify.cc | 142 ++++++++- gcc/gimplify_reg_info.h | 182 ++++++++++++ gcc/ira.cc | 84 +++++- gcc/lra-constraints.cc | 13 + gcc/output.h | 2 + gcc/recog.cc | 11 +- gcc/stmt.cc | 277 +++++++++++++++++- 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/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 | 21 ++ gcc/testsuite/gcc.dg/asm-hard-reg-error-5.c | 13 + gcc/testsuite/gcc.dg/pr87600-2.c | 19 -- gcc/testsuite/gcc.dg/pr87600-3.c | 26 ++ .../gcc.target/aarch64/asm-hard-reg-1.c | 55 ++++ .../gcc.target/aarch64/asm-hard-reg-2.c | 17 ++ .../gcc.target/i386/asm-hard-reg-1.c | 80 +++++ .../gcc.target/i386/asm-hard-reg-2.c | 43 +++ .../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-6.c | 152 ++++++++++ .../gcc.target/s390/asm-hard-reg-7.c | 34 +++ .../gcc.target/s390/asm-hard-reg-longdouble.h | 18 ++ gcc/testsuite/lib/scanasm.exp | 4 + gcc/toplev.cc | 4 + gcc/tree-ssa-operands.cc | 4 +- gcc/tree-ssa-structalias.cc | 4 +- gcc/varasm.cc | 5 +- 56 files changed, 2283 insertions(+), 125 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-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/aarch64/asm-hard-reg-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/asm-hard-reg-2.c create mode 100644 gcc/testsuite/gcc.target/i386/asm-hard-reg-1.c create mode 100644 gcc/testsuite/gcc.target/i386/asm-hard-reg-2.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-6.c create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-7.c create mode 100644 gcc/testsuite/gcc.target/s390/asm-hard-reg-longdouble.h -- 2.49.0