Pip Cet writes:
> 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))] get_cc_reg_clobber_rtx also looks at the insn itself (i.e. whatever the erstwhile NOTICE_UPDATE_CC hook did), so if the cc attribute is LDI, and operands[1] is const0_rtx, it would return cc_reg_rtx as the clobber reg. AFAICT, some passes after reload verify if operands match constraints, and that would work in this case - I'm not sure if the pattern you mentioned could show up, outside of wrong splitters/peepholes in the md file. Another approach would be to conservatively use a 'c' constraint and clobber REG_CC for all reg-reg moves. Regards Senthil