On Thu, 24 Apr 2014, Jeff Law wrote:

> On 02/28/14 08:21, Kai Tietz wrote:
> > Hmm,  this all reminds me about the approach Andrew Pinski and I came
> > up with two years ago.  All in all I think it might be worth to
> > express folding-patterns in a more abstract way.  So the md-like Lisp
> > syntax for this seems to be just stringent.  We make use of such a
> > script-language already for machine-description.
> > 
> > Nevertheless I doubt that we really want to have same facility for
> > fold-const and gimple.  Instead I got the impression that we would
> > prefer to have all folding-optimizations instead in Middle-end
> > (GIMPLE).  We need folding in front-end (AST) mostly for determination
> > of constant-expression detection. Otherwise we want to keep maximum of
> > original AST to have best results for debugging (and even to think
> > about having alternative FE on our middle/backend) and code-analyzers.
> This is the core of what I want to see happening.  I'm open to whatever
> methods we use to take us in that direction.
> 
> The way I tend to think leads me to a "hmm, fold-const.c does X, move it to
> gimple" and iterate approach.  But again, that's just the way I tend to look
> at problems.
> 
> If we can describe significant hunks of folding using a pattern selection
> language and generate code to recognize and transform the IL, then that seems
> good to me  as long as we keep the goal of moving most folding out of the
> front-ends.
> 
> So if Richi and GSOC students want to experiment in this space, possibly
> baking off with other approaches that delay folding, that's fine with me.

Btw, while there is the possibility to generate GENERIC foldings from
the meta-description for each and every pattern and use that from fold
it is not necessary to do that.

Note that the work also includes adding API that gets rid of most
(if not all) [fold_]buildN and force_gimple_operand_* calls from
GIMPLE passes (thus, not building GENERIC - just for the ability
to fold it - and then gimplifying it).  Instead of

 tree x = fold_build2 (PLUS_EXPR, type, y, build_int_cst (type, 1));
 tree ex = fold_build2 (EQ_EXPR, boolean_type_node, x, y);
 ex = force_gimple_operand (ex, &stmts, true, NULL_TREE);

you do

 tree x = gimple_build (&stmts, PLUS_EXPR, type, y, build_int_cst (type, 1));
 tree ex = gimple_build (&stmts, EQ_EXPR, boolean_type_node, x, y);

where the implementation on the branch (obviously) relies on the
patterns to simplify the built expressions.

This should also help Andrew with his GIMPLE type re-org as it frees
him from touching fold ... (well, if all code is properly converted).

It of course remains to be seen if we can reasonably translate the
main part of the foldings passes rely on to the pattern representation.
Nothing prevents us from providing a "tail" of manually written
simplifications of course, used by the same API, but I'd like to
avoid that.

I hope that for 4.10 we get up to the point of using the machinery
for a gimple-combine pass (currently tree forwprop) and stop adding
simplifications to forwprop and instead extend the pattern description.
I also hope to convert most passes over to gimple_build (requires
mostly simple arithmetic simplification and simplification of
conditionals).

Comments on the actual code are always welcome - we'll do
all the GSOC project discussions on implementation details in
public to invite others to comment.

Richard.

Reply via email to