On Wed, May 7, 2014 at 3:36 PM, Prathamesh Kulkarni
<bilbotheelffri...@gmail.com> wrote:
> Hi,
>     I have few questions regarding genmatch:
>
> a) When simplification fails, we continue pattern matching with the next 
> pattern
> in the order they appear in match.pd. Is that necessary ?
> Could we not simply return false from gimple_match_and_simplify if
> simplification fails ?

No, as there may be another matching pattern given that the matching
is determined by also looking at predicates which you cannot evaluate
at the time you build the decision tree.

> b) How do we handle manual pattern matching ? I mean
> custom c-code written in match operand (Would manual matching be required?).
> I believe the decision tree cannot be used for these match operands.
> Either we could generate pattern matching code for these patterns
> before the decision tree or after it.

They would be handled after the patterns.  Don't worry about them
right now (I'd add them to gimple-match-head.c for example).

> c) There's a possibility of matching multiple patterns:
> Contrived example:
> Consider following match operands:
> (minus (bit_not @0))
> and the same pattern written as c-code.
> In this case, which pattern do we choose to match ?
> (Unfortunately, I haven't been able to think of a real example,
> in which we would have multiple patterns matched).

The pattern from match.pd.  But as said above - don't worry about
patterns written as c-code for the moment.

> d) Should type of ifexpr be c_expr * instead of operand * in struct
> simplify since we only allow c-code in ifexpr ?

Yeah.  Though the current form maybe a bit limited, so in the end
we may want to support a more "complex" prepare/conditional
step in C code, like

(match_and_simplify
   (bit_and @0 INTEGER_CST@1)
   if (POINTER_TYPE_P (TREE_TYPE (@0)) && tree_fits_uhwi_p (@1))
     {
          unsigned HOST_WIDE_INT modulus, residue;
          unsigned HOST_WIDE_INT low = tree_to_uhwi (@1);

          modulus = get_pointer_modulus_and_residue (@0, &residue,
                                                     integer_onep (@1));

          /* This works because modulus is a power of 2.  If this weren't the
             case, we'd have to replace it by its greatest power-of-2
             divisor: modulus & -modulus.  */
          if (low < modulus)
            @@0 = build_int_cst (TREE_TYPE (@0), residue & low);
          else
             MATCH_FAIL;
     }
   @@0)

copied from fold-const.c case

      /* If arg0 is derived from the address of an object or function, we may
         be able to fold this expression using the object or function's
         alignment.  */

where we would want to allow arbitrary code executed at the
if-expr evaluation time which also can compute an output
(I just used double-@@ to denote outputs for example) to
use in the replacement pattern.  The obvious

   { build_int_cst (TREE_TYPE (@0), residue & low); }

use in the replacement pattern doesn't work because it uses
the temporaries that are no longer in scope, and repeating the
work done in the if-expr wouldn't be good either.

The above may be not the best example motivating the extension
though.  Also note the awkward use of "MATCH_FAIL" to signal
the if should make the pattern fail to match.

I suppose we should delay doing this kind of extension until we
really need it though.  The RTL patterns have similar ability
though.

> e) Should we allow an optional name for pattern in match_and_simplify ?
> The name can be used as label in generated gimple_match_and_simplify
> instead of L<number>.

Probably good for debugging indeed.  Or we can use the line-number in
the pattern description file.

> f) Lower-case operator names: Currently we accept operator name for lowercase,
> uppercase and uppercase_EXPR. This is handled with
> e_operation::e_operation. If we are to settle on lower-case names,
> should we remove uppercase conversion and _EXPR code in e_operation ?
> This causes problems since add_operator() only adds stringified tree
> codes, which are uppercase appended with _EXPR.
> As a quick-fix, is it fine to convert stringified tree-codes to lower-case 
> names
> (remove _EXPR and lowercase the remaining characters) ?

We should in the end only accept one form.  It's ok to leave the code
as-is if you are not in a need to refactor it or apply whatever fix to
convert the uppercase tree-codes to an appropriate form at registration time.

Richard.

Reply via email to