mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 17:11:20 +08:00
re PR rtl-optimization/90257 (8% degradation on cpu2006 403.gcc starting with r270484)
PR rtl-optimization/90257 * cfgrtl.c (flow_active_insn_p): Return true for USE of a function return value. Revert the revert: 2019-04-21 H.J. Lu <hongjiu.lu@intel.com> PR target/90178 Revert: 2018-11-21 Uros Bizjak <ubizjak@gmail.com> Revert the revert: 2013-10-26 Vladimir Makarov <vmakarov@redhat.com> Revert: 2013-10-25 Vladimir Makarov <vmakarov@redhat.com> * lra-spills.c (lra_final_code_change): Remove useless move insns. From-SVN: r270653
This commit is contained in:
parent
4e29671cb2
commit
1008df90cc
@ -1,3 +1,24 @@
|
||||
2019-04-29 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/90257
|
||||
* cfgrtl.c (flow_active_insn_p): Return true for USE of a function
|
||||
return value.
|
||||
|
||||
Revert the revert:
|
||||
2019-04-21 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/90178
|
||||
Revert:
|
||||
2018-11-21 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
Revert the revert:
|
||||
2013-10-26 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
Revert:
|
||||
2013-10-25 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
* lra-spills.c (lra_final_code_change): Remove useless move insns.
|
||||
|
||||
2019-04-29 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* tree-ssa.c (insert_debug_temp_for_var_def): For {CLOBBER}
|
||||
|
10
gcc/cfgrtl.c
10
gcc/cfgrtl.c
@ -543,7 +543,7 @@ update_bb_for_insn (basic_block bb)
|
||||
}
|
||||
|
||||
|
||||
/* Like active_insn_p, except keep the return value clobber around
|
||||
/* Like active_insn_p, except keep the return value use or clobber around
|
||||
even after reload. */
|
||||
|
||||
static bool
|
||||
@ -556,8 +556,12 @@ flow_active_insn_p (const rtx_insn *insn)
|
||||
programs that fail to return a value. Its effect is to
|
||||
keep the return value from being live across the entire
|
||||
function. If we allow it to be skipped, we introduce the
|
||||
possibility for register lifetime confusion. */
|
||||
if (GET_CODE (PATTERN (insn)) == CLOBBER
|
||||
possibility for register lifetime confusion.
|
||||
Similarly, keep a USE of the function return value, otherwise
|
||||
the USE is dropped and we could fail to thread jump if USE
|
||||
appears on some paths and not on others, see PR90257. */
|
||||
if ((GET_CODE (PATTERN (insn)) == CLOBBER
|
||||
|| GET_CODE (PATTERN (insn)) == USE)
|
||||
&& REG_P (XEXP (PATTERN (insn), 0))
|
||||
&& REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
|
||||
return true;
|
||||
|
@ -740,6 +740,7 @@ lra_final_code_change (void)
|
||||
int i, hard_regno;
|
||||
basic_block bb;
|
||||
rtx_insn *insn, *curr;
|
||||
rtx set;
|
||||
int max_regno = max_reg_num ();
|
||||
|
||||
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
|
||||
@ -818,5 +819,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user