Christian Bruel <christian.br...@st.com> writes:
> Index: gcc/config/sh/sh.md
> ===================================================================
> --- gcc/config/sh/sh.md       (revision 202699)
> +++ gcc/config/sh/sh.md       (working copy)
> @@ -6894,9 +6894,11 @@ label:
>  ;; reloading MAC subregs otherwise.  For that probably special patterns
>  ;; would be required.
>  (define_insn "*mov<mode>_reg_reg"
> -  [(set (match_operand:QIHI 0 "arith_reg_dest" "=r,m,*z")
> -     (match_operand:QIHI 1 "register_operand" "r,*z,m"))]
> -  "TARGET_SH1 && !t_reg_operand (operands[1], VOIDmode)"
> +  [(set (match_operand:QIHI 0 "general_movdst_operand" "=r,m,*z")
> +     (match_operand:QIHI 1 "general_movsrc_operand" "r,*z,m"))]
> +  "TARGET_SH1 && !t_reg_operand (operands[1], VOIDmode)
> +   && arith_reg_dest (operands[0], <MODE>mode)
> +   && register_operand (operands[1], <MODE>mode)"

This defeats the purpose of changing the predicates though.  The problem
with the original pattern was that you shouldn't have a situation where
the constraints allow a combination that recog wouldn't match to the
same define_insn.  Constraints must always match a subset of what
recog would match.

Sorry for just saying something's wrong without suggesting a fix,
but I don't know anything about the SH port.  In general though,
the "r<-r", "r<-m" and "m<-r" alternatives should be part of a single
define_insn, rather than split across several.  Which sounds like what
Oleg was suggesting about folding the r<-r alternatives back into the
main patterns.

Thanks,
Richard

Reply via email to