Dinar Temirbulatov <dtemirbula...@gmail.com> 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

Reply via email to