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