[v3,0/4] Hard Register Constraints

Message ID 20241025095720.2990683-1-stefansf@gcc.gnu.org
Headers
Series Hard Register Constraints |

Message

Stefan Schulze Frielinghaus Oct. 25, 2024, 9:57 a.m. UTC
  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
  

Comments

Stefan Schulze Frielinghaus Nov. 29, 2024, 9:15 a.m. UTC | #1
Ping.

On Fri, Oct 25, 2024 at 11:57:16AM +0200, Stefan Schulze Frielinghaus wrote:
> 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
>
  
Stefan Schulze Frielinghaus Jan. 8, 2025, 12:54 p.m. UTC | #2
Hi Vladimir,

Would you be willing to have a look at the LRA part?  This basically
only involves patch number 1, i.e.,
https://gcc.gnu.org/pipermail/gcc-patches/2024-October/666455.html
Would be great to get some feedback whether the current approach is
feasible or whether I should drop this patch.  Of course, if anyone else
wants to join in I would be happy, too ;-)

Cheers,
Stefan

On Fri, Nov 29, 2024 at 10:15:45AM +0100, Stefan Schulze Frielinghaus wrote:
> Ping.
> 
> On Fri, Oct 25, 2024 at 11:57:16AM +0200, Stefan Schulze Frielinghaus wrote:
> > 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
> >