On Thu, May 9, 2019 at 6:00 PM Jeff Law <l...@redhat.com> wrote: > > On 5/9/19 5:52 AM, Robin Dapp wrote: > > Hi, > > > > while trying to improve s390 code generation for rotate and shift I > > noticed superfluous subregs for shift count operands. In our backend we > > already have quite cumbersome patterns that would need to be duplicated > > (or complicated further by more subst patterns) in order to get rid of > > the subregs. > > > > I had already finished all the patterns when I realized that > > SHIFT_COUNT_TRUNCATED and the target hook shift_truncation_mask already > > exist and could do what is needed without extra patterns. Just defining > > shift_truncation_mask was not enough though as most of the additional > > insns get introduced by combine. > > > > Event SHIFT_COUNT_TRUNCATED is no perfect match to what our hardware > > does because we always only consider the last 6 bits of a shift operand.> > > Despite all the warnings in the other backends, most notably > > SHIFT_COUNT_TRUNCATED being "discouraged" as mentioned in riscv.h, I > > wrote the attached tentative patch. It's a little ad-hoc, uses the > > SHIFT_COUNT_TRUNCATED paths only if shift_truncation_mask () != 0 and, > > instead of truncating via & (GET_MODE_BITSIZE (mode) - 1), it applies > > the mask returned by shift_truncation_mask. Doing so, usage of both > > "methods" actually reduces to a single way. > THe main reason it's discouraged is because some targets have insns > where the count would be truncated and others where it would not. So > for example normal shifts might truncate, but vector shifts might or > (mips) or shifts might truncate but bit tests do not (x86). > > I don't know enough about the s390 architecture to know if there's any > corner cases. You'd have to look at ever pattern in your machine > description with a shift and verify that it's going to DTRT if the count > hasn't been truncated. > > > It would really help if you could provide testcases which show the > suboptimal code and any analysis you've done.
The main reason I dislike SHIFT_COUNT_TRUNCATED is that it changes the meaning of the IL. We generally want these kind of things to be explicit. Richard. > > Jeff