On 09/15/2017 07:09 AM, Marc Glisse wrote: > On Fri, 15 Sep 2017, Prathamesh Kulkarni wrote: > > +/* (X / Y) == 0 -> X < Y if X, Y are unsigned. */ > +(simplify > + (eq (trunc_div @0 @1) integer_zerop) > + (if (TYPE_UNSIGNED (TREE_TYPE(@0)) && TYPE_UNSIGNED (TREE_TYPE (@1))) > + (lt @0 @1))) > + > +/* (X / Y) != 0 -> X >= Y, if X, Y are unsigned. */ > +(simplify > + (ne (trunc_div @0 @1) integer_zerop) > + (if (TYPE_UNSIGNED (TREE_TYPE(@0)) && TYPE_UNSIGNED (TREE_TYPE (@1))) > + (ge @0 @1))) > + > > Hello, > > you can merge the 2 transforms using "for". Also, no need to test the > type of @1 since you are already testing @0. Right.
> > - do we want a single_use restriction on the result of the division? I think so. If x/y is a common subexpression, then ideally we'd compute it once. > - do we also want to handle (x>>4)==0? I think so, but that can be a follow-up IMHO. > - do we also want a special case when X is 1 that produces Y==1, as > asked in a recent PR? Seems like a reasonable follow-up as well. The other follow-up to consider is detecting these cases in VRP to produce suitable ASSERT_EXPRs and ranges. > - once in a while, someone mentions that eq, on vectors, can either do > elementwise comparison and return a vector, or return a single boolean, > which would fail here. However, I don't remember ever seeing an example. We could always restrict to the integral types. Probably wise to explicitly do that anyway. jeff