+2019-09-30 Richard Sandiford <richard.sandiford@arm.com>
+
+ * postreload.c (reload_combine_recognize_pattern): Use crtl->abi
+ when deciding whether a register is free for use after RA.
+ (reload_combine): Remove unnecessary use of fixed_reg_set.
+ (reload_cse_move2add): Use insn_callee_abi to get the ABI of the
+ call insn target. Use reg_mode when testing whether a register
+ is no longer available.
+
2019-09-30 Richard Sandiford <richard.sandiford@arm.com>
* target.def (return_call_with_max_clobbers): Delete.
if (TEST_HARD_REG_BIT (reg_class_contents[INDEX_REG_CLASS], i)
&& reg_state[i].use_index == RELOAD_COMBINE_MAX_USES
&& reg_state[i].store_ruid <= reg_state[regno].use_ruid
- && (call_used_or_fixed_reg_p (i) || df_regs_ever_live_p (i))
+ && (crtl->abi->clobbers_full_reg_p (i)
+ || df_regs_ever_live_p (i))
&& (!frame_pointer_needed || i != HARD_FRAME_POINTER_REGNUM)
&& !fixed_regs[i] && !global_regs[i]
&& hard_regno_nregs (i, GET_MODE (reg)) == 1
{
rtx link;
HARD_REG_SET used_regs = insn_callee_abi (insn).full_reg_clobbers ();
- /* ??? This preserves traditional behavior; it might not be
- needed. */
- used_regs |= fixed_reg_set;
for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
if (TEST_HARD_REG_BIT (used_regs, r))
unknown values. */
if (CALL_P (insn))
{
+ function_abi callee_abi = insn_callee_abi (insn);
for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
- {
- if (call_used_or_fixed_reg_p (i))
- /* Reset the information about this register. */
- reg_mode[i] = VOIDmode;
- }
+ if (reg_mode[i] != VOIDmode
+ && reg_mode[i] != BLKmode
+ && callee_abi.clobbers_reg_p (reg_mode[i], i))
+ /* Reset the information about this register. */
+ reg_mode[i] = VOIDmode;
}
}
return changed;