aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-spills.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2016-08-02 16:07:36 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2016-08-02 16:07:36 +0000
commit8a8330b7ef5aad2860cc5533a140fc6e1fd3793b (patch)
tree7c2848d5a635da4f8a9ad968219e25a2afa416ff /gcc/lra-spills.c
parent354c5470d8fca735c82165530beae642ed78feb0 (diff)
downloadgcc-8a8330b7ef5aad2860cc5533a140fc6e1fd3793b.zip
gcc-8a8330b7ef5aad2860cc5533a140fc6e1fd3793b.tar.gz
gcc-8a8330b7ef5aad2860cc5533a140fc6e1fd3793b.tar.bz2
re PR rtl-optimization/69847 (Spec 2006 403.gcc slows down with -mlra vs. reload on PowerPC)
2016-08-02 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/69847 * lra-int.h (struct lra-reg): Use restore_rtx instead of restore_regno. (lra_rtx_hash): New. * lra.c (initialize_lra_reg_info_element): Use restore_rtx instead of restore_regno. (lra_rtx_hash): Rename and move lra-remat.c::rtx_hash. * lra-remat.c (rtx_hash): Rename and Move to lra.c. * lra-spills.c (lra_final_code_change): Don't delete insn when the next insn is USE with the same reg as the current insn source. * lra-constraints.c (curr_insn_transform): Use restore_rtx instead of restore_regno. (lra_constraints_init): Call initiate_invariants. (lra_constraints_finish): Call finish_invariants. (struct invariant, invariant_t, invariant_ptr_t): New. (const_invariant_ptr_t, invariants, invariants_pool): New. (invariant_table, invariant_hash, invariant_eq_p): New. (insert_invariant, initiate_invariants, finish_invariants): New. (clear_invariants, invalid_invariant_regs): New. (inherit_reload_reg, split_reg, fix_bb_live_info): Use restore_rtx instead of restore_regno. (invariant_p, process_invariant_for_inheritance): New. (inherit_in_ebb): Implement invariant inheritance. (lra_inheritance): Initialize and finalize invalid_invariant_regs. (remove_inheritance_pseudos): Implement undoing invariant inheritance. (undo_optional_reloads, lra_undo_inheritance): Use restore_rtx instead of restore_regno. * lra-assigns.c (regno_live_length): New. (reload_pseudo_compare_func): Use regno_live_length. (assign_by_spills): Use restore_rtx instead of restore_regno. (lra_assign): Ditto. Initiate regno_live_length. From-SVN: r238991
Diffstat (limited to 'gcc/lra-spills.c')
-rw-r--r--gcc/lra-spills.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c
index 7e5f637..1801b7b 100644
--- a/gcc/lra-spills.c
+++ b/gcc/lra-spills.c
@@ -693,7 +693,7 @@ lra_final_code_change (void)
{
int i, hard_regno;
basic_block bb;
- rtx_insn *insn, *curr;
+ rtx_insn *insn, *curr, *next_insn;
int max_regno = max_reg_num ();
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -727,7 +727,12 @@ lra_final_code_change (void)
if (NONJUMP_INSN_P (insn) && GET_CODE (pat) == SET
&& REG_P (SET_SRC (pat)) && REG_P (SET_DEST (pat))
&& REGNO (SET_SRC (pat)) == REGNO (SET_DEST (pat))
- && ! return_regno_p (REGNO (SET_SRC (pat))))
+ && (! return_regno_p (REGNO (SET_SRC (pat)))
+ || (next_insn = next_nondebug_insn (insn)) == NULL_RTX
+ || ! INSN_P (next_insn)
+ || GET_CODE (PATTERN (next_insn)) != USE
+ || ! REG_P (XEXP (PATTERN (next_insn), 0))
+ || REGNO (SET_SRC (pat)) != REGNO (XEXP (PATTERN (next_insn), 0))))
{
lra_invalidate_insn_data (insn);
delete_insn (insn);