move a * (1 << b) -> a << b pattern from fold-const.c to match.pd

Richard Biener rguenther@suse.de
Thu Jul 9 10:02:00 GMT 2015


On Thu, 9 Jul 2015, Marek Polacek wrote:

> On Tue, Jul 07, 2015 at 07:47:50AM +0200, Marc Glisse wrote:
> > On Tue, 7 Jul 2015, Prathamesh Kulkarni wrote:
> > 
> > >+/* a * (1 << b) -> a << b */
> > >+(simplify
> > >+  (mult:c @a (lshift integer_onep @b))
> > >+  (if (!FLOAT_TYPE_P (type))
> > >+    (lshift @a @b)))
> 
> Just a nit: the last line is wrongly formatted.
> 
> > The test FLOAT_TYPE_P seems unnecessary, 'type' is (up to a useless
> > conversion) the result of a shift, so integer, fixed-point or vector. Its
> > lhs is integer_onep, which rules out fixed-point.
> 
> Right.
> 
> > (I think it is the first pattern using @letter and not @number)
> 
> Yea, I think we should be consistent and use @0 and @1 here.

I've added support for non-digit names to allow more descriptive
patterns.  Like when we have

/* Fold (X << C1) & C2 into (X << C1) & (C2 | ((1 << C1) - 1))
        (X >> C1) & C2 into (X >> C1) & (C2 | ~((type) -1 >> C1))
   if the new mask might be further optimized.  */
(for shift (lshift rshift)
 (simplify
  (bit_and (convert?@4 (shift@5 (convert1?@3 @0) INTEGER_CST@1)) 
INTEGER_CST@2)

using @andop2 instead of @2 and @shift instead of @5 (etc.) might
make the following code easier to follow.

That everything uses digits right now is historic mostly (and
my habit of using digits just because I got used to it).

But yes, with @a, @b vs. @0, @1 we should standardize on something
(digits).

Richard.



More information about the Gcc-patches mailing list