https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117344
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
The way cond_addvnx4si_2 is written currently is:
;; Predicated integer operations, merging with the first input.
(define_insn "*cond_<optab><mode>_2"
[(set (match_operand:SVE_I 0 "register_operand")
(unspec:SVE_I
[(match_operand:<VPRED> 1 "register_operand")
(SVE_INT_BINARY:SVE_I
(match_operand:SVE_I 2 "register_operand")
(match_operand:SVE_I 3 "register_operand"))
(match_dup 2)]
UNSPEC_SEL))]
"TARGET_SVE"
{@ [ cons: =0 , 1 , 2 , 3 ; attrs: movprfx ]
[ w , Upl , 0 , w ; * ] <sve_int_op>\t%0.<Vetype>,
%1/m, %0.<Vetype>, %3.<Vetype>
[ ?&w , Upl , w , w ; yes ] movprfx\t%0,
%2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
}
)
That is the move is before the instruction.
I wonder if we could use a clobber/match_scratch instead and then split after
reload. Maybe I am thinking too much into this.