[0/5] LoongArch: Better balance between relaxation and scheduling

Message ID 20231019140300.50323-1-xry111@xry111.site
Headers
Series LoongArch: Better balance between relaxation and scheduling |

Message

Xi Ruoyao Oct. 19, 2023, 2:02 p.m. UTC
  For relaxation we are now generating assembler macros for symbolic
addresses everywhere, but this is limiting scheduling and there are
known situations where the relaxation cannot improve the code.

1. When we are performing LTO during a final link and the linker plugin
is used, la.global won't be relaxed because they reference to an
external or preemptable symbol.
2. The linker currently do not relax la.tls.*.
3. For la.local + ld/st pairs, if the address is only used once,
emitting pcalau12i + ld/st is always not worse than relying on linker
relaxation.

Add -mexplicit-relocs=auto to allow the compiler to use explicit relocs
for these cases, but assembler macros for other cases.  Use it as the
default if the assembler supports both explicit relocs and relaxation.

LTO-bootstrapped and regtested on loongarch64-linux-gnu.  Ok for trunk?

Xi Ruoyao (5):
  LoongArch: Add enum-style -mexplicit-relocs= option
  LoongArch: Use explicit relocs for GOT access when
    -mexplicit-relocs=auto and LTO during a final link with linker
    plugin
  LoongArch: Use explicit relocs for TLS access with
    -mexplicit-relocs=auto
  LoongArch: Use explicit relocs for addresses only used for one load or
    store with -mexplicit-relocs=auto and -mcmodel={normal,medium}
  LoongArch: Document -mexplicit-relocs={auto,none,always}

 .../loongarch/genopts/loongarch-strings       |   6 +
 gcc/config/loongarch/genopts/loongarch.opt.in |  21 ++-
 gcc/config/loongarch/loongarch-def.h          |   6 +
 gcc/config/loongarch/loongarch-protos.h       |   1 +
 gcc/config/loongarch/loongarch-str.h          |   5 +
 gcc/config/loongarch/loongarch.cc             |  75 ++++++++--
 gcc/config/loongarch/loongarch.h              |   3 +
 gcc/config/loongarch/loongarch.md             | 128 +++++++++++++++++-
 gcc/config/loongarch/loongarch.opt            |  21 ++-
 gcc/config/loongarch/predicates.md            |  15 +-
 gcc/doc/invoke.texi                           |  37 +++--
 .../loongarch/explicit-relocs-auto-lto.c      |  26 ++++
 ...-relocs-auto-single-load-store-no-anchor.c |   6 +
 .../explicit-relocs-auto-single-load-store.c  |  14 ++
 .../explicit-relocs-auto-tls-ld-gd.c          |   9 ++
 .../explicit-relocs-auto-tls-le-ie.c          |   6 +
 16 files changed, 343 insertions(+), 36 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-lto.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-single-load-store-no-anchor.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-single-load-store.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-le-ie.c
  

Comments

Xi Ruoyao Oct. 23, 2023, 7:34 a.m. UTC | #1
Pushed r14-{4848..4852}.

On Thu, 2023-10-19 at 22:02 +0800, Xi Ruoyao wrote:
> For relaxation we are now generating assembler macros for symbolic
> addresses everywhere, but this is limiting scheduling and there are
> known situations where the relaxation cannot improve the code.
> 
> 1. When we are performing LTO during a final link and the linker plugin
> is used, la.global won't be relaxed because they reference to an
> external or preemptable symbol.
> 2. The linker currently do not relax la.tls.*.
> 3. For la.local + ld/st pairs, if the address is only used once,
> emitting pcalau12i + ld/st is always not worse than relying on linker
> relaxation.
> 
> Add -mexplicit-relocs=auto to allow the compiler to use explicit relocs
> for these cases, but assembler macros for other cases.  Use it as the
> default if the assembler supports both explicit relocs and relaxation.
> 
> LTO-bootstrapped and regtested on loongarch64-linux-gnu.  Ok for trunk?
> 
> Xi Ruoyao (5):
>   LoongArch: Add enum-style -mexplicit-relocs= option
>   LoongArch: Use explicit relocs for GOT access when
>     -mexplicit-relocs=auto and LTO during a final link with linker
>     plugin
>   LoongArch: Use explicit relocs for TLS access with
>     -mexplicit-relocs=auto
>   LoongArch: Use explicit relocs for addresses only used for one load or
>     store with -mexplicit-relocs=auto and -mcmodel={normal,medium}
>   LoongArch: Document -mexplicit-relocs={auto,none,always}
> 
>  .../loongarch/genopts/loongarch-strings       |   6 +
>  gcc/config/loongarch/genopts/loongarch.opt.in |  21 ++-
>  gcc/config/loongarch/loongarch-def.h          |   6 +
>  gcc/config/loongarch/loongarch-protos.h       |   1 +
>  gcc/config/loongarch/loongarch-str.h          |   5 +
>  gcc/config/loongarch/loongarch.cc             |  75 ++++++++--
>  gcc/config/loongarch/loongarch.h              |   3 +
>  gcc/config/loongarch/loongarch.md             | 128 +++++++++++++++++-
>  gcc/config/loongarch/loongarch.opt            |  21 ++-
>  gcc/config/loongarch/predicates.md            |  15 +-
>  gcc/doc/invoke.texi                           |  37 +++--
>  .../loongarch/explicit-relocs-auto-lto.c      |  26 ++++
>  ...-relocs-auto-single-load-store-no-anchor.c |   6 +
>  .../explicit-relocs-auto-single-load-store.c  |  14 ++
>  .../explicit-relocs-auto-tls-ld-gd.c          |   9 ++
>  .../explicit-relocs-auto-tls-le-ie.c          |   6 +
>  16 files changed, 343 insertions(+), 36 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-lto.c
>  create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-single-load-store-no-anchor.c
>  create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-single-load-store.c
>  create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c
>  create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-le-ie.c
>