On Tue, Jun 8, 2021 at 2:27 PM Segher Boessenkool <seg...@kernel.crashing.org> wrote: > > On Tue, Jun 08, 2021 at 09:05:57AM +0200, Richard Biener wrote: > > On Tue, Jun 8, 2021 at 12:05 AM Segher Boessenkool > > <seg...@kernel.crashing.org> wrote: > > > > > > In theory we could have a split condition not inclusive of the insn > > > condition in the past. That never was a good idea, the code does not do > > > what a non-suspicious reader would think it does. But it leads to more > > > serious problems together with iterators: if the split condition (as > > > written) does not start with "&&", you do not get the insn condition > > > included in the split condition, and that holds for the part of the insn > > > condition that was generated by the iterator as well! > > > > > > This patch simply always joins the two conditions (after the iterators > > > have done their work) to get the effective split condition. > > > > > > I tested this on all Linux targets, building the Linux kernel for each, > > > and it does not change generated code for any of them, so I think we do > > > not have much breakage to fear. But it is possible for other targets of > > > course, and for floating point or vector code, etc. > > > > > > Is this okay for trunk? > > > > Even if it looks uglier I would prefer to enforce a leading "&& " on the > > split condition. That keeps the semantic of the define_insn_and_split > > the same on trunk and branches and thus maintaining things easier. > > I suppose once branches without such enforcement go out of > > maintainance we can mass-strip the "&& "s. > > This still allows a leading &&, but it doesn't enforce it. Since we > have survived for years and years without enforcing this I don't foresee > any big problems. There should not be many backports able to trigger > this either. > > > I guess a mass-change to add "&& "s at this point is smaller than > > a corresponding change to drop them (IMHO leaving both after this > > change would be confusing). > > I also managed to build with nds32 now (it is one of those targets that > likes to ICE with a Linux defconfig), and it *does* show differences. > > Looking at the machine description there are many patterns that have > !TARGET_BIG_ENDIAN in the insn condition but not in the split condition. > That is exactly the kind of situation that is almost certainly an error > (or "not by design", or "very bad design", take your pick). The config > I build is LE so none of these insns match, but apparently the split > condition *does* trigger for some insns matched by *other* patterns. > > There also is "sms1", which has insn condition > "NDS32_EXT_DSP_P () > && (!reload_completed > || !nds32_need_split_sms_p (operands[3], operands[4], > operands[5], operands[6]))" > but split condition > "NDS32_EXT_DSP_P () > && !reload_completed > && nds32_need_split_sms_p (operands[3], operands[4], > operands[5], operands[6])" > Luckily we never trigger that. > > So yeah, patch withdrawn. This on one hand is proof we do want to make > such a change, but on the other hand shows it needs more preparatory > steps.
I wonder if it makes sense to provide ports a means to opt-in into the strict "&& " requirement and thus we can gradually fix them. Probably requires some t-$target make fragment editing plus passing an extra arg to gen* based on that. That way maintainers can gradually fix their ports and make sure they won't regress again. Richard. > > Segher