On Sat, Aug 15, 2020 at 12:30 AM Segher Boessenkool <seg...@kernel.crashing.org> wrote: > On Fri, Aug 14, 2020 at 05:47:02PM +0000, Pip Cet wrote: > > On Fri, Aug 14, 2020 at 4:24 PM Segher Boessenkool > > <seg...@kernel.crashing.org> wrote: > > > If you want to say some alternative does not clobber anything, just use > > > the constraint "X" for that alternative. > > > > Just to clarify, such clobbers would still show up in RTL, right? > > Yes, as > > (clobber (scratch:CC)) > > (or whatever the mode is). No register will be allocated to it. You > can do a define_split splitting it into the form without clobber, if > you want? (You can "split" to just one insn fine.) It's neatest when > written as a define_insn_and_split.
That does sound like a neat solution for leaving the current patterns largely intact, thanks! I'll try both variants, both and without the define_split. > > What I'm currently doing is this: > > > > (define_split > > [(set (match_operand 0 "nonimmediate_operand") > > (match_operand 1 "nox_general_operand"))] > > "reload_completed && mov_clobbers_cc (insn, operands)" > > [(parallel [(set (match_dup 0) (match_dup 1)) > > (clobber (reg:CC REG_CC))])]) > > > > which, if I understand correctly, introduces the parallel-clobber > > expression only when necessary, at the same time as post-reload > > splitters introduce REG_CC references. Is that correct? > > Yes. And this will work correctly if somehow you ensure that REG_CC > isn't live anywhere you introduce such a clobber. IIUC, the idea is that references to REG_CC, except for clobbers, are only introduced in the post-reload split pass, so it cannot be live before our define_split runs. Does that make sense?