On Sat, Dec 07, 2024 at 08:49:20AM +0100, Georg-Johann Lay wrote:
> Is there a PR for this feature? (Just to make sure that I don't
> miss progress on this I could CC to the PR).
No. However, I can CC you in case of further patch revisions.
Cheers,
Stefan
>
> Johann
>
> Am 10.09.24 um 16:20 schrieb Stefan Schulze Frielinghaus:
> > This series introduces hard register constraints. The first patch
> > enables hard register constraints for asm statements and for
> > machine descriptions. The subsequent patch adds some basic error
> > handling for asm statements. The third patch adds some verification of
> > register names used in machine description. The fourth and last patch
> > adds the feature of rewriting local register asm into hard register
> > constraints.
> >
> > This series was bootstrapped and regtested on s390. Furthermore, the
> > new dg-compile tests were verified via cross compilers for the enabled
> > targets. There is still some fallout if -fdemote-register-asm is used
> > since a couple of features are missing as e.g. erroring out during
> > gimplification if the clobber set of registers intersects with
> > input/output registers.
> >
> > As a larger test vehicle I've compiled and regtested glibc on s390 using
> > -fdemote-register-asm without any fallout. On x86_64 this fails due to
> > the limitation that fixed registers are currently not supported for hard
> > register constraints (see commit message of the first patch). This is
> > also the reason why I'm posting this series already since I was hoping
> > to get some feedback about this limitation.
> >
> > Furthermore, I've compiled the Linux kernel on s390 and x86_64 with
> > -fdemote-register-asm. Interestingly, the Linux kernel for x86_64 makes
> > use of the following asm statement:
> >
> > #define call_on_stack(stack, func, asm_call, argconstr...) \
> > { \
> > register void *tos asm("r11"); \
> > \
> > tos = ((void *)(stack)); \
> > \
> > asm_inline volatile( \
> > "movq %%rsp, (%[tos]) \n" \
> > "movq %[tos], %%rsp \n" \
> > \
> > asm_call \
> > \
> > "popq %%rsp \n" \
> > \
> > : "+r" (tos), ASM_CALL_CONSTRAINT \
> > : [__func] "i" (func), [tos] "r" (tos) argconstr \
> > : "cc", "rax", "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", \
> > "memory" \
> > ); \
> > }
> >
> > Note the output
> > "+r" (tos)
> > and the input
> > [tos] "r" (tos)
> > Currently I error out for this since I consider this as two inputs using
> > the same hard register. One time an implicit input via '+' and a second
> > time via the explicit input. Thus, actually I would expect a '='
> > instead of a '+' for the output constraint since the input is explicitly
> > mentioned, or remove the input entirely and just use the inoutput
> > [tos] "+r" (tos)
> > If you consider this valid asm I would have to adjust the error
> > handling. Either way, this is just about error handling and doesn't
> > really affect code generation.
> >
> > 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/function.cc | 116 ++++++++
> > gcc/genoutput.cc | 60 ++++
> > gcc/genpreds.cc | 4 +-
> > gcc/gimplify.cc | 151 +++++++++-
> > gcc/gimplify_reg_info.h | 130 +++++++++
> > gcc/ira.cc | 79 +++++-
> > gcc/lra-constraints.cc | 13 +
> > gcc/output.h | 2 +
> > gcc/recog.cc | 11 +-
> > gcc/stmt.cc | 268 +++++++++++++++++-
> > 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/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 | 20 ++
> > gcc/testsuite/gcc.dg/asm-hard-reg-error-3.c | 21 ++
> > gcc/testsuite/gcc.dg/pr87600-2.c | 30 +-
> > gcc/testsuite/gcc.dg/pr87600-3.c | 35 +++
> > gcc/testsuite/gcc.dg/pr87600-3.s | 0
> > .../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/testsuite/lib/scanasm.exp | 4 +
> > gcc/toplev.cc | 4 +
> > 35 files changed, 1656 insertions(+), 87 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.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/pr87600-3.c
> > create mode 100644 gcc/testsuite/gcc.dg/pr87600-3.s
> > 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
> >