aboutsummaryrefslogtreecommitdiff
path: root/gcc/sched-deps.c
diff options
context:
space:
mode:
authorCraig Blackmore <craig.blackmore@embecosm.com>2020-05-12 14:41:08 -0700
committerJim Wilson <jimw@sifive.com>2020-05-12 14:43:48 -0700
commitde6320a81695800de0f0f5fc3e4c6487a52cd430 (patch)
treef6767022ffcd8a6baaca7656b0bccbf8fc6f5735 /gcc/sched-deps.c
parent11dd3be56b83d11465ae5d6ecd0d8096531678e5 (diff)
downloadgcc-de6320a81695800de0f0f5fc3e4c6487a52cd430.zip
gcc-de6320a81695800de0f0f5fc3e4c6487a52cd430.tar.gz
gcc-de6320a81695800de0f0f5fc3e4c6487a52cd430.tar.bz2
RISC-V: Add shorten_memrefs pass.
gcc/ * config.gcc: Add riscv-shorten-memrefs.o to extra_objs for riscv. * config/riscv/riscv-passes.def: New file. * config/riscv/riscv-protos.h (make_pass_shorten_memrefs): Declare. * config/riscv/riscv-shorten-memrefs.c: New file. * config/riscv/riscv.c (tree-pass.h): New include. (riscv_compressed_reg_p): New Function (riscv_compressed_lw_offset_p): Likewise. (riscv_compressed_lw_address_p): Likewise. (riscv_shorten_lw_offset): Likewise. (riscv_legitimize_address): Attempt to convert base + large_offset to compressible new_base + small_offset. (riscv_address_cost): Make anticipated compressed load/stores cheaper for code size than uncompressed load/stores. (riscv_register_priority): Move compressed register check to riscv_compressed_reg_p. * config/riscv/riscv.h (C_S_BITS): Define. (CSW_MAX_OFFSET): Define. * config/riscv/riscv.opt (mshorten-memefs): New option. * config/riscv/t-riscv (riscv-shorten-memrefs.o): New rule. (PASSES_EXTRA): Add riscv-passes.def. * doc/invoke.texi: Document -mshorten-memrefs. * config/riscv/riscv.c (riscv_new_address_profitable_p): New function. (TARGET_NEW_ADDRESS_PROFITABLE_P): Define. * doc/tm.texi: Regenerate. * doc/tm.texi.in (TARGET_NEW_ADDRESS_PROFITABLE_P): New hook. * sched-deps.c (attempt_change): Use old address if it is cheaper than new address. * target.def (new_address_profitable_p): New hook. * targhooks.c (default_new_address_profitable_p): New function. * targhooks.h (default_new_address_profitable_p): Declare. gcc/testsuite/ * gcc.target/riscv/shorten-memrefs-1.c: New test. * gcc.target/riscv/shorten-memrefs-2.c: New test. * gcc.target/riscv/shorten-memrefs-3.c: New test. * gcc.target/riscv/shorten-memrefs-4.c: New test. * gcc.target/riscv/shorten-memrefs-5.c: New test. * gcc.target/riscv/shorten-memrefs-6.c: New test. * gcc.target/riscv/shorten-memrefs-7.c: New test.
Diffstat (limited to 'gcc/sched-deps.c')
-rw-r--r--gcc/sched-deps.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 331af5f..1bc7507 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -4694,6 +4694,9 @@ attempt_change (struct mem_inc_info *mii, rtx new_addr)
rtx mem = *mii->mem_loc;
rtx new_mem;
+ if (!targetm.new_address_profitable_p (mem, mii->mem_insn, new_addr))
+ return NULL_RTX;
+
/* Jump through a lot of hoops to keep the attributes up to date. We
do not want to call one of the change address variants that take
an offset even though we know the offset in many cases. These