This merges a genmatch IL feature from the branch.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2014-11-14  Richard Biener  <rguent...@suse.de>

        * genmatch.c (add_operator): Allow CONSTRUCTOR.
        (dt_node::gen_kids): Handle CONSTRUCTOR not as GENERIC.
        (parser::parse_op): Allow to iterate over predicates.

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c      (revision 217504)
+++ gcc/genmatch.c      (working copy)
@@ -310,7 +310,9 @@ add_operator (enum tree_code code, const
       /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR.  */
       && strcmp (tcc, "tcc_reference") != 0
       /* To have INTEGER_CST and friends as "predicate operators".  */
-      && strcmp (tcc, "tcc_constant") != 0)
+      && strcmp (tcc, "tcc_constant") != 0
+      /* And allow CONSTRUCTOR for vector initializers.  */
+      && !(code == CONSTRUCTOR))
     return;
   operator_id *op = new operator_id (code, id, nargs, tcc);
   id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
@@ -2013,7 +2015,8 @@ dt_node::gen_kids (FILE *f, bool gimple)
          dt_operand *op = as_a<dt_operand *> (kids[i]);
          if (expr *e = dyn_cast <expr *> (op->op))
            {
-             if (e->ops.length () == 0)
+             if (e->ops.length () == 0
+                 && (!gimple || !(*e->operation == CONSTRUCTOR)))
                generic_exprs.safe_push (op);
              else if (e->operation->kind == id_base::FN)
                {
@@ -3026,6 +3029,14 @@ parser::parse_op ()
            {
              if (code->nargs != 0)
                fatal_at (token, "using an operator with operands as 
predicate");
+             /* Parse the zero-operand operator "predicates" as
+                expression.  */
+             op = new expr (opr);
+           }
+         else if (user_id *code = dyn_cast <user_id *> (opr))
+           {
+             if (code->nargs != 0)
+               fatal_at (token, "using an operator with operands as 
predicate");
              /* Parse the zero-operand operator "predicates" as
                 expression.  */
              op = new expr (opr);

Reply via email to