On 09/15/2017 09:55 AM, Marc Glisse wrote: > On Fri, 15 Sep 2017, Jeff Law wrote: > >> 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. > > The question is whether, having computed c=a/b, it is cheaper to test > a<b or c!=0. I think it is usually the second one, but not for all types > on all targets. Although since you mention VRP, it is easier to do > further optimizations using the information a<b. The c != 0 is easier to test.
WRT VRP we're working to solve that problem. The framework Andrew's built allows us to see the c != 0 test and easily derive a < b or a >= b for the two sides of the branch. It falls out quite naturally, so I wouldn't let which is easier for VRP to use play a significant role here. >>> - 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. > > VECTOR_TYPE_P (type) || !VECTOR_TYPE_P (TREE_TYPE (@0)) > > should be enough to avoid the problematic case, the transformation can > still be nice for vectors. Seems reasonable to me. Richi, further comments? Prathamesh, I think you've got a few things to address, but hopefully nothing terribly complex. jeff-0 >