On Tue, Jul 15, 2014 at 6:28 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Tue, Jul 15, 2014 at 2:47 PM, Prathamesh Kulkarni > <bilbotheelffri...@gmail.com> wrote: >> On Tue, Jul 15, 2014 at 2:07 PM, Richard Biener >> <richard.guent...@gmail.com> wrote: >>> On Mon, Jul 14, 2014 at 10:52 PM, Prathamesh Kulkarni >>> <bilbotheelffri...@gmail.com> wrote: >>>> On Mon, Jul 14, 2014 at 6:35 PM, Richard Biener >>>> <richard.guent...@gmail.com> wrote: >>>>> On Mon, Jul 14, 2014 at 12:07 PM, Prathamesh Kulkarni >>>>> <bilbotheelffri...@gmail.com> wrote: >>>>>> I was wondering if it was a good idea to implement >>>>>> predicate on expressions ? >>>>>> >>>>>> Sth like: >>>>>> (match_and_simplify >>>>>> (op (op2:predicate @0)) >>>>>> transform) >>>>>> >>>>>> instead of: >>>>>> (match_and_simplify >>>>>> (op (op2@1 @0)) >>>>>> if (predicate (@1)) >>>>>> transform) >>>>>> >>>>>> When predicate is simple as just being a macro/function, >>>>>> we could use this style and when the predicate is more complex >>>>>> resort to using if-expr (or write the predicate as macro in >>>>>> gimple-match-head.c >>>>>> and use the macro in pattern instead ...) >>>>>> >>>>>> Example: >>>>>> we could rewrite the pattern >>>>>> (match_and_simplify >>>>>> (plus:c @0 (negate @1)) >>>>>> if (!TYPE_SATURATING (type)) >>>>>> (minus @0 @1)) >>>>>> >>>>>> to >>>>>> >>>>>> (match_and_simplify >>>>>> (plus:c:NOT_TYPE_SATURATING_P @0 (negate @1)) >>>>>> (minus @0 @1)) >>>>>> >>>>>> with NOT_TYPE_SATURATING_P predicate defined >>>>>> appropriately in gimple-match-head.c >>>>>> >>>>>> However I am not entirely sure if adding predicates on expressions >>>>>> would be very useful.... >>>>> >>>>> Well. I think there are two aspects to this. First is pattern >>>>> readability where I think that the if-expr form is more readable. >>>>> Second is the ability to do less work in the code generated >>>>> from the decision tree. >>>>> >>>>> For example most of the patterns from associate_plusminus >>>>> still miss the !TYPE_SATURATING && !FLOAT_TYPE_P && >>>>> !FIXED_POINT_TYPE_P if-expr. That is, we'd have >>>>> >>>>> /* (A +- B) - A -> +-B. */ >>>>> (match_and_simplify >>>>> (minus (plus @0 @1) @0) >>>>> if (!TYPE_SATURATING (type) >>>>> && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)) >>>>> @1) >>>>> (match_and_simplify >>>>> (minus (minus @0 @1) @0) >>>>> if (!TYPE_SATURATING (type) >>>>> && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)) >>>>> (negate @1)) >>>>> /* (A +- B) -+ B -> A. */ >>>>> (match_and_simplify >>>>> (minus (plus @0 @1) @1) >>>>> if (!TYPE_SATURATING (type) >>>>> && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)) >>>>> @0) >>>>> (match_and_simplify >>>>> (plus:c (minus @0 @1) @1) >>>>> if (!TYPE_SATURATING (type) >>>>> && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)) >>>>> @0) >>>>> >>>>> with code-generation checking the if-expr after matching. And >>>>> with using expression predicates we'd be able to check the >>>>> predicate when matching the outermost 'minus' and "CSE" >>>>> the predicate check for the first three patterns. Runtime-wise >>>>> it depends on whether there is a point to back-track to. >>>>> >>>>> I would say it's more interesting to support >>>>> >>>>> if (!TYPE_SATURATING (type) && !FLOAT_TYPE_P (type) && >>>>> !FiXED_POINT_TYPE_P (type)) >>>>> (match_and_simplify ....) >>>>> (match_and_simplify ....) >>>>> .... >>>>> >>>>> and treat this if-expression like a predicate on the outermost >>>>> expression. That's getting both benefits >>>>> (bah, the free-form if-expr makes it ugly, what do we use as >>>>> grouping syntax? I guess wrapping the whole thing in ()s, >>>>> similar to (for ...)). >>>> Um, I was wondering instead of defining new syntax >>>> if it would be better to make genmatch detect common if-expr >>>> and hoist them ? I suppose we could compare if-expr's lexicographically ? >>>> >>>> However I guess having some syntax to group common if-expr patterns >>>> explicitly would >>>> avoid the need for writing the if-expr in each pattern. >>> >>> Yeah, the main motiviation is to make the patterns itself easier to read >>> and group them by boiler-plate if-exprs. >>> >>>> For now should we go with free-form if ? >>> >>> I'd say >>> >>> (if (!TYPE_SATURATING (type) ....) >>> <patterns...> >>> ) >>> >>> thus wrap the if inside ()s. Otherwise there would be no way to >>> "end" an if. >> maybe use braces ? >> if (c_expr) >> { >> patterns >> } >> but (if ...) is better. >>> >>>> If desired, we could change syntax later to >>>> something else (only parsing code need change, the rest would be in place). >>>> If we change the syntax for outer-if, for consistency should we also >>>> change syntax of inner if ? >>> >>> Probably yes, let's wrap the inner if inside ()s as well. >> Okay. >>> >>> Code-generation-wise we should record a vector of if-exprs and thus >>> evaluate the outer ifs at the same place we evaluate inner if-exprs. >> Um, I don't get this. >> say we have the following pattern: >> (if cond >> (match_and_simplify >> match1 >> transform1) >> >> (match_and_simplify >> match2 >> transform2)) >> >> The generated code would be the following ? >> if (cond) >> { >> match1 >> transform1 >> >> match2 >> transform2 >> } >> >> Currently we do: >> match1 >> if (cond) >> transform1 >> >> match2 >> if (cond) >> transform2 > > I was thinking about > > (if cond1 > (match_and_simplify > match1 > if cond2 > transform1) > (match_and_simplify > match2 > if cond3 > transform2)) > > where we should generate > > match1 > if (cond1 && cond2) > transform1 > > match2 > if (cond1 && cond3) > transform2 > > and eventually even allow nested outer ifs (why not) > > (if (FLOAT_TYPE_P (type)) > (if (...) > (match... > ) > (match ...) > ) > > like some of the simplifications are grouped in fold-const.c. Easiest > would be to make the simplifier if-expr a vector of if-expr, replicating > the currently active outer if conditions. Okay thanks, I get it now. I will get started with implementing outer-if
Thanks and Regards, Prathamesh > > Richard. > >> Thanks and Regards, >> Prathamesh >>> >>> Thanks, >>> Richard. >>> >>>> Thanks and Regards, >>>> Prathamesh >>>>> >>>>> Richard. >>>>> >>>>>> Thanks and Regards, >>>>>> Prathamesh