On Fri, May 13, 2016 at 3:36 PM, Marc Glisse <marc.gli...@inria.fr> wrote: > On Fri, 13 May 2016, Mikhail Maltsev wrote: > >>> I don't know if we might want some :c / single_use restrictions, maybe on >>> the >>> outer convert and the rshift/rotate. >>> >> I don't think :c can be used here. > > > Oups, typo for :s. > >> As for :s, I added it, as you suggested. > > > :s will be ignored when there is no conversion, but I think that's good > enough for now.
Yeah. Doing :s twice as done in the patch works though. >> Also, I tried to add some more test cases for rotate with conversions, but >> unfortunately GCC does not recognize rotate pattern, when narrowing >> conversions >> are present. > > > It is usually easier to split your expression into several assignments. > Untested: > > int f(long long a, unsigned long n){ > long long b = ~a; > unsigned long c = b; > unsigned long d = ROLL (c, n); > int e = d; > return ~e; > } > > this way the rotate pattern is detected early (generic) with no extra > operations to confuse the compiler, while your new transformation will > happen in gimple (most likely the first forwprop pass). > > The patch looks good to me, now wait for Richard's comments. Are you sure narrowing conversions are valid for rotates? (char)short_var <<r 8 == (char)short_var but short_var << r8 is its upper byte. so at least for the conversion inside the rotate (and shift as well) only nop-conversions look valid to me. Thanks, Richard. > -- > Marc Glisse