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 -- 2.42.0