Optimize pcrel access of globals
authorAaron Sawdey <acsawdey@linux.ibm.com>
Wed, 7 Oct 2020 23:27:45 +0000 (18:27 -0500)
committerAaron Sawdey <acsawdey@linux.ibm.com>
Fri, 26 Feb 2021 03:27:14 +0000 (21:27 -0600)
commitb8d85f569a6dd44cb9561c95e5f628bd6cd531a5
tree328c0460daf20e0f73d88fc7e96cf2b6099b527b
parent9967bbfceddce755b18bdbecc6d0c56e994a05cc
Optimize pcrel access of globals

This patch implements a RTL pass that looks for pc-relative loads of the
address of an external variable using the PCREL_GOT relocation and a
single load or store that uses that external address.

Produced by a cast of thousands:
 * Michael Meissner
 * Peter Bergner
 * Bill Schmidt
 * Alan Modra
 * Segher Boessenkool
 * Aaron Sawdey

gcc/ChangeLog:

* config.gcc: Add rs6000-pcrel-opt.o.
* config/rs6000/rs6000-pcrel-opt.c: New file.
* config/rs6000/pcrel-opt.md: New file.
* config/rs6000/predicates.md: Add d_form_memory predicate.
* config/rs6000/rs6000-cpus.def: Add OPTION_MASK_PCREL_OPT.
* config/rs6000/rs6000-passes.def: Add pass_pcrel_opt.
* config/rs6000/rs6000-protos.h: Add reg_to_non_prefixed(),
pcrel_opt_valid_mem_p(), output_pcrel_opt_reloc(),
and make_pass_pcrel_opt().
* config/rs6000/rs6000.c (reg_to_non_prefixed): Make global.
(rs6000_option_override_internal): Add pcrel-opt.
(rs6000_delegitimize_address): Support pcrel-opt.
(rs6000_opt_masks): Add pcrel-opt.
(pcrel_opt_valid_mem_p): New function.
(reg_to_non_prefixed): Make global.
(rs6000_asm_output_opcode): Reset prepend_p_to_next_insn.
(output_pcrel_opt_reloc): New function.
* config/rs6000/rs6000.md (loads_extern_addr): New attr.
(pcrel_extern_addr): Set loads_extern_addr.
Add include for pcrel-opt.md.
* config/rs6000/rs6000.opt: Add -mpcrel-opt.
* config/rs6000/t-rs6000: Add rules for pcrel-opt.c and
pcrel-opt.md.

gcc/testsuite/ChangeLog:

* gcc.target/powerpc/pcrel-opt-inc-di.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-df.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-di.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-hi.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-qi.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-sf.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-si.c: New test.
* gcc.target/powerpc/pcrel-opt-ld-vector.c: New test.
* gcc.target/powerpc/pcrel-opt-st-df.c: New test.
* gcc.target/powerpc/pcrel-opt-st-di.c: New test.
* gcc.target/powerpc/pcrel-opt-st-hi.c: New test.
* gcc.target/powerpc/pcrel-opt-st-qi.c: New test.
* gcc.target/powerpc/pcrel-opt-st-sf.c: New test.
* gcc.target/powerpc/pcrel-opt-st-si.c: New test.
* gcc.target/powerpc/pcrel-opt-st-vector.c: New test.
26 files changed:
gcc/config.gcc
gcc/config/rs6000/pcrel-opt.md [new file with mode: 0644]
gcc/config/rs6000/predicates.md
gcc/config/rs6000/rs6000-cpus.def
gcc/config/rs6000/rs6000-passes.def
gcc/config/rs6000/rs6000-pcrel-opt.c [new file with mode: 0644]
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md
gcc/config/rs6000/rs6000.opt
gcc/config/rs6000/t-rs6000
gcc/testsuite/gcc.target/powerpc/pcrel-opt-inc-di.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-df.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-di.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-hi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-qi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-sf.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-si.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-ld-vector.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-df.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-di.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-hi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-qi.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-sf.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-si.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pcrel-opt-st-vector.c [new file with mode: 0644]