https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102154
--- Comment #9 from Hongtao.liu <crazylht at gmail dot com> --- > > (define_insn "movsf_hardfloat" > [(set (match_operand:SF 0 "nonimmediate_operand" > "=!r, f, v, wa, m, wY, > Z, m, wa, !r, f, wa, > !r, *c*l, !r, *h") > (match_operand:SF 1 "input_operand" > "m, m, wY, Z, f, v, > wa, r, j, j, f, wa, > r, r, *h, 0"))] > "(register_operand (operands[0], SFmode) > || register_operand (operands[1], SFmode)) > && TARGET_HARD_FLOAT > && (TARGET_ALLOW_SF_SUBREG > || valid_sf_si_move (operands[0], operands[1], SFmode))" > > Oh, The pattern disllow sf subreg. Here TARGET_ALLOW_SF_SUBREG || valid_sf_si_move (operands[0], operands[1], SFmode) is false, others are true which means input_operand accept (subreg:SF (reg:DI 4))