Dinar Temirbulatov <[email protected]> writes:
> @@ -14696,7 +14696,11 @@ mips_avoid_hazard (rtx after, rtx insn,
> clobber hi and lo. */
> if (*hilo_delay < 2 && reg_set_p (lo_reg, pattern))
> nops = 2 - *hilo_delay;
> - else if (*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
> + else if ((*delayed_reg != 0 && reg_referenced_p (*delayed_reg, pattern))
> + && !((GET_MODE (*delayed_reg) == DFmode && set_after != 0
> + && (set = single_set (insn)) != NULL_RTX && GET_MODE
> (SET_DEST(set)) == DFmode
> + && XINT((XEXP (pattern, 1)), 1) == UNSPEC_LOAD_HIGH
> + && XINT((XEXP (*set_after, 1)), 1) == UNSPEC_LOAD_LOW)))
This isn't safe because the patterns might not be UNSPECs (so XINT (...)
would be meaningless). It's better to check the insn code instead.
Something like:
else if (*delayed_reg != 0
&& reg_referenced_p (*delayed_reg, pattern)
&& !(recog_memoized (insn) == CODE_FOR_load_highdf
&& recog_memoized (*set_after) == CODE_FOR_load_lowdf))
(untested). Note that *set_after should always be nonnull if
*delayed_reg is.
Looks good otherwise.
Richard