aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-spills.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-10-25 21:06:38 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-10-25 21:06:38 +0000
commit01b1efaa1439e6cbf44566354dcce9a96d5c6f5e (patch)
tree2ee1cb8d7e34ed805e6e3c69b0f6076f88fa163a /gcc/lra-spills.c
parent3ff4317f1cfddf2e015db24a673e3ea5bf188920 (diff)
downloadgcc-01b1efaa1439e6cbf44566354dcce9a96d5c6f5e.zip
gcc-01b1efaa1439e6cbf44566354dcce9a96d5c6f5e.tar.gz
gcc-01b1efaa1439e6cbf44566354dcce9a96d5c6f5e.tar.bz2
2013-10-25 Vladimir Makarov <vmakarov@redhat.com>
* config/rs6000/rs6000-protos.h (rs6000_secondary_memory_needed_mode): New prototype. * config/rs6000/rs6000.c: Include ira.h. (TARGET_LRA_P): Redefine. (rs6000_legitimate_offset_address_p): Call legitimate_constant_pool_address_p in strict mode for LRA. (rs6000_legitimate_address_p): Ditto. (legitimate_lo_sum_address_p): Add code for LRA. Use lra_in_progress. (rs6000_emit_move): Add LRA version of code to generate load/store of SDmode values. (rs6000_secondary_memory_needed_mode): New. (rs6000_alloc_sdmode_stack_slot): Do nothing for LRA. (rs6000_secondary_reload_class): Return NO_REGS for LRA for constants, memory, and FP registers. (rs6000_lra_p): New. * config/rs6000/rs6000.h (SECONDARY_MEMORY_NEEDED_MODE): New macro. * config/rs6000/rs6000.opt (mlra): New option. * lra-spills.c (lra_final_code_change): Remove useless move insns. From-SVN: r204079
Diffstat (limited to 'gcc/lra-spills.c')
-rw-r--r--gcc/lra-spills.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c
index 7c0c630..73a90a8 100644
--- a/gcc/lra-spills.c
+++ b/gcc/lra-spills.c
@@ -625,7 +625,7 @@ lra_final_code_change (void)
{
int i, hard_regno;
basic_block bb;
- rtx insn, curr;
+ rtx insn, curr, set;
int max_regno = max_reg_num ();
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -661,5 +661,19 @@ lra_final_code_change (void)
}
if (insn_change_p)
lra_update_operator_dups (id);
+
+ if ((set = single_set (insn)) != NULL
+ && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))
+ && REGNO (SET_SRC (set)) == REGNO (SET_DEST (set)))
+ {
+ /* Remove an useless move insn. IRA can generate move
+ insns involving pseudos. It is better remove them
+ earlier to speed up compiler a bit. It is also
+ better to do it here as they might not pass final RTL
+ check in LRA, (e.g. insn moving a control register
+ into itself). */
+ lra_invalidate_insn_data (insn);
+ delete_insn (insn);
+ }
}
}