On Mon, Aug 17, 2020 at 7:31 AM Senthil Kumar Selvaraj <senthil.theco...@gmail.com> wrote: > > (define_split > > [(parallel [(set (match_operand:ALL1 0 "nonimmediate_operand") > > (match_operand:ALL1 1 "nox_general_operand")) > > (clobber (reg:CC REG_CC))])] > > "reload_completed && REG_P (operands[0]) && REG_P (operands[1])" > > [(parallel [(set (match_dup 0) > > (match_dup 1)) > > (clobber (scratch:CC))])]) > > > > and so on, for all four constraint alternatives that don't actually > > clobber REG_CC (and also for a fifth which only rarely clobbers > > REG_CC). That's duplicated code, of course. > > The (setattr "cc" ...) that is currently present for all > patterns accounts for the constraint alternatives,so using > get_attr_cc to split to a (clobber) of either cc_reg_rtx or a > gen_rtx_SCRATCH (CCmode) appears to work.
Thanks! Using an insn attribute is actually what I ended up doing (https://github.com/pipcet/gcc/commit/d4509afae9238e0ade4d3e1e97dd8577dae96115) :-) It's still confusing, IMHO, that insn attributes (but not the get_attr_alternative attribute which is mentioned in the documentation) are available when which_alternative is not. > (define_insn "*mov<mode>_insn" > [(set (match_operand:ALL1 0 "nonimmediate_operand" "=r ,d ,Qm ,r > ,q,r,*r") > (match_operand:ALL1 1 "nox_general_operand" "r Y00,n Ynn,r > Y00,Qm,r,q,i")) > (clobber (match_scratch:CC 2 "=X ,X ,c ,c > ,X,X,c"))] Hmm. Technically, of course, clearing register 0 (a special case of the first alternative) would clobber the flags, but as it happens, the rewrite above produces the right clobber expression which is simply accepted by the "X"... I'm not sure whether anything else is trying to recognize such insns, but as it stands that define_insn would recognize the incorrect insn: [(set (reg:QI 0) (const_int 0)) (clobber (scratch:CC))]