Hi,
Prathamesh Kulkarni <[email protected]> skribis:
> Example:
> /* x & 0 -> 0 */
> (match_and_simplify
> (bit_and @0 @1)
> if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && (@1 == integer_zero_node))
> { integer_zero_node; })
>
> /* x & -1 -> x */
> (match_and_simplify
> (bit_and @0 @1)
> if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
> && (@1 == integer_minus_one_node)
> @0)
(Apologies if this has already been discussed/decided before.)
With my Scheme background, two things come to mind:
1. Wouldn’t it be nicer to have a single language, rather than
intermingle C expressions in the middle of the s-expression
language?
2. Wouldn’t it be useful to allow multiple clauses in a single
‘match’?
Here’s a hypothetical simplification pass one could write:
;; Match tree node ‘exp’ against a series of patterns, and return
;; a (possibly identical) tree node.
(match exp
((bitwise-and first second)
(if (and (integral-type? (tree-type first))
(eq? integer-zero-node second))
integer-zero-node ; simplify to zero
exp)) ; return ‘exp’ unchanged
((bitwise-and first second)
(if (and (integral-type? (tree-type first))
(eq? integer-minus-one-node second))
first
exp))
(else ; no simplification pattern matched
exp))
The language for expression rewriting (the ‘if’ expressions above) could
consist of very few constructs directly translatable to C + tree.
As an example, Guile’s compiler simplification passes look very much
like this [0], built around a generic pattern matcher [1]. Pattern
matching in MELT should also be a good source of inspiration, obviously [2].
Thanks,
Ludo’.
[0]
http://git.savannah.gnu.org/cgit/guile.git/tree/module/language/tree-il/peval.scm#n1082
[1] http://www.gnu.org/software/guile/manual/html_node/Pattern-Matching.html
[2] http://gcc-melt.org/tutomeltimplem.html