Bootstrapped on x86_64-unknown-linux-gnu, applied. Richard.
2014-09-26 Richard Biener <rguent...@suse.de> * genmatch.c (struct dt_node): Merge gen_gimple and gen_generic into gen, merge gen_gimple_kids and gen_generic_kids into gen_kids. (struct dt_operand): Likewise. Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 215600) +++ gcc/genmatch.c (working copy) @@ -927,11 +927,9 @@ struct dt_node dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0); dt_node *append_simplify (simplify *, unsigned, dt_operand **); - virtual void gen_gimple (FILE *) {} - virtual void gen_generic (FILE *) {} + virtual void gen (FILE *, bool) {} - void gen_gimple_kids (FILE *); - void gen_generic_kids (FILE *); + void gen_kids (FILE *, bool); }; struct dt_operand : public dt_node @@ -946,8 +944,7 @@ struct dt_operand : public dt_node : dt_node (type), op (op_), match_dop (match_dop_), parent (parent_), pos (pos_) {} - virtual void gen_gimple (FILE *); - virtual void gen_generic (FILE *); + void gen (FILE *, bool); unsigned gen_predicate (FILE *, const char *, bool); unsigned gen_match_op (FILE *, const char *); @@ -969,8 +966,6 @@ struct dt_simplify : public dt_node indexes (indexes_) {} void gen (FILE *f, bool); - virtual void gen_gimple (FILE *f) { gen (f, true); } - virtual void gen_generic (FILE *f) { gen (f, false); } }; template<> @@ -1589,14 +1584,16 @@ dt_operand::gen_generic_expr (FILE *f, c } void -dt_node::gen_gimple_kids (FILE *f) +dt_node::gen_kids (FILE *f, bool gimple) { auto_vec<dt_operand *> gimple_exprs; auto_vec<dt_operand *> generic_exprs; auto_vec<dt_operand *> fns; + auto_vec<dt_operand *> generic_fns; auto_vec<dt_operand *> preds; auto_vec<dt_node *> others; dt_node *true_operand = NULL; + for (unsigned i = 0; i < kids.length (); ++i) { if (kids[i]->type == dt_node::DT_OPERAND) @@ -1607,11 +1604,21 @@ dt_node::gen_gimple_kids (FILE *f) if (e->ops.length () == 0) generic_exprs.safe_push (op); else if (e->operation->kind == id_base::FN) - fns.safe_push (op); + { + if (gimple) + fns.safe_push (op); + else + generic_fns.safe_push (op); + } else if (e->operation->kind == id_base::PREDICATE) preds.safe_push (op); else - gimple_exprs.safe_push (op); + { + if (gimple) + gimple_exprs.safe_push (op); + else + generic_exprs.safe_push (op); + } } else if (op->op->type == operand::OP_PREDICATE) others.safe_push (kids[i]); @@ -1633,13 +1640,16 @@ dt_node::gen_gimple_kids (FILE *f) unsigned exprs_len = gimple_exprs.length (); unsigned gexprs_len = generic_exprs.length (); unsigned fns_len = fns.length (); + unsigned gfns_len = generic_fns.length (); - if (exprs_len || fns_len || gexprs_len) + if (exprs_len || fns_len || gexprs_len || gfns_len) { if (exprs_len) gimple_exprs[0]->get_name (kid_opname); else if (fns_len) fns[0]->get_name (kid_opname); + else if (gfns_len) + generic_fns[0]->get_name (kid_opname); else generic_exprs[0]->get_name (kid_opname); @@ -1667,7 +1677,7 @@ dt_node::gen_gimple_kids (FILE *f) else fprintf (f, "case %s:\n", op->id); fprintf (f, "{\n"); - gimple_exprs[i]->gen_gimple (f); + gimple_exprs[i]->gen (f, true); fprintf (f, "break;\n" "}\n"); } @@ -1691,7 +1701,7 @@ dt_node::gen_gimple_kids (FILE *f) expr *e = as_a <expr *>(fns[i]->op); fprintf (f, "case %s:\n" "{\n", e->operation->id); - fns[i]->gen_gimple (f); + fns[i]->gen (f, true); fprintf (f, "break;\n" "}\n"); } @@ -1708,16 +1718,44 @@ dt_node::gen_gimple_kids (FILE *f) for (unsigned i = 0; i < generic_exprs.length (); ++i) { expr *e = as_a <expr *>(generic_exprs[i]->op); - fprintf (f, "case %s:\n" - "{\n", e->operation->id); - - generic_exprs[i]->gen_gimple (f); + id_base *op = e->operation; + /* ??? CONVERT */ + fprintf (f, "case %s:\n", op->id); + fprintf (f, "{\n"); + generic_exprs[i]->gen (f, gimple); fprintf (f, "break;\n" "}\n"); } + if (gfns_len) + { + fprintf (f, "case CALL_EXPR:\n" + "{\n" + "tree fndecl = get_callee_fndecl (%s);\n" + "if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)\n" + "switch (DECL_FUNCTION_CODE (fndecl))\n" + "{\n", kid_opname); + + for (unsigned j = 0; j < generic_fns.length (); ++j) + { + expr *e = as_a <expr *>(generic_fns[j]->op); + gcc_assert (e->operation->kind == id_base::FN); + + fprintf (f, "case %s:\n" + "{\n", e->operation->id); + generic_fns[j]->gen (f, false); + fprintf (f, "break;\n" + "}\n"); + } + + fprintf (f, "default:;\n" + "}\n" + "break;\n" + "}\n"); + } + /* Close switch (TREE_CODE ()). */ - if (exprs_len || fns_len || gexprs_len) + if (exprs_len || fns_len || gexprs_len || gfns_len) fprintf (f, "default:;\n" "}\n"); @@ -1727,8 +1765,10 @@ dt_node::gen_gimple_kids (FILE *f) predicate_id *p = as_a <predicate_id *> (e->operation); preds[i]->get_name (kid_opname); fprintf (f, "tree %s_pops[%d];\n", kid_opname, p->nargs); - fprintf (f, "if (gimple_%s (%s, %s_pops, valueize))\n", p->id, - kid_opname, kid_opname); + fprintf (f, "if (%s_%s (%s, %s_pops%s))\n", + gimple ? "gimple" : "tree", + p->id, kid_opname, kid_opname, + gimple ? ", valueize" : ""); fprintf (f, "{\n"); for (int j = 0; j < p->nargs; ++j) { @@ -1736,19 +1776,19 @@ dt_node::gen_gimple_kids (FILE *f) preds[i]->gen_opname (child_opname, j); fprintf (f, "tree %s = %s_pops[%d];\n", child_opname, kid_opname, j); } - preds[i]->gen_gimple_kids (f); + preds[i]->gen_kids (f, gimple); fprintf (f, "}\n"); } for (unsigned i = 0; i < others.length (); ++i) - others[i]->gen_gimple (f); + others[i]->gen (f, gimple); if (true_operand) - true_operand->gen_gimple (f); + true_operand->gen (f, gimple); } void -dt_operand::gen_gimple (FILE *f) +dt_operand::gen (FILE *f, bool gimple) { char opname[20]; get_name (opname); @@ -1759,11 +1799,14 @@ dt_operand::gen_gimple (FILE *f) switch (op->type) { case operand::OP_PREDICATE: - n_braces = gen_predicate (f, opname, true); + n_braces = gen_predicate (f, opname, gimple); break; case operand::OP_EXPR: - n_braces = gen_gimple_expr (f); + if (gimple) + n_braces = gen_gimple_expr (f); + else + n_braces = gen_generic_expr (f, opname); break; default: @@ -1776,171 +1819,12 @@ dt_operand::gen_gimple (FILE *f) else gcc_unreachable (); - gen_gimple_kids (f); + gen_kids (f, gimple); for (unsigned i = 0; i < n_braces; ++i) fprintf (f, "}\n"); } - -void -dt_operand::gen_generic (FILE *f) -{ - char opname[20]; - get_name (opname); - - unsigned n_braces = 0; - - if (type == DT_OPERAND) - switch (op->type) - { - case operand::OP_PREDICATE: - n_braces = gen_predicate (f, opname, false); - break; - - case operand::OP_EXPR: - n_braces = gen_generic_expr (f, opname); - break; - - default: - gcc_unreachable (); - } - else if (type == DT_TRUE) - ; - else if (type == DT_MATCH) - n_braces = gen_match_op (f, opname); - else - gcc_unreachable (); - - unsigned i; - - gen_generic_kids (f); - - for (i = 0; i < n_braces; ++i) - fprintf (f, "}\n"); -} - -void -dt_node::gen_generic_kids (FILE *f) -{ - auto_vec<dt_operand *> generic_exprs; - auto_vec<dt_operand *> fns; - auto_vec<dt_operand *> preds; - - bool any = false; - for (unsigned j = 0; j < kids.length (); ++j) - { - dt_node *node = kids[j]; - if (node->type == DT_OPERAND) - { - dt_operand *kid = static_cast<dt_operand *>(node); - if (kid->op->type == operand::OP_EXPR) - { - expr *e = as_a <expr *> (kid->op); - if (e->operation->kind == id_base::CODE) - { - generic_exprs.safe_push (kid); - any = true; - } - else if (e->operation->kind == id_base::FN) - { - fns.safe_push (kid); - any = true; - } - else if (e->operation->kind == id_base::PREDICATE) - preds.safe_push (kid); - else - gcc_unreachable (); - } - } - } - - if (any) - { - char opname[20]; - static_cast <dt_operand *>(kids[0])->get_name (opname); - fprintf (f, "switch (TREE_CODE (%s))\n" - "{\n", opname); - for (unsigned j = 0; j < generic_exprs.length (); ++j) - { - dt_operand *kid = generic_exprs[j]; - expr *e = as_a <expr *>(kid->op); - gcc_assert (e->operation->kind == id_base::CODE); - - /* ??? CONVERT */ - fprintf (f, "case %s:\n" - "{\n", e->operation->id); - kid->gen_generic (f); - fprintf (f, "break;\n" - "}\n"); - } - - bool first = true; - for (unsigned j = 0; j < fns.length (); ++j) - { - dt_operand *kid = fns[j]; - expr *e = as_a <expr *>(kid->op); - gcc_assert (e->operation->kind == id_base::FN); - - if (first) - fprintf (f, "case CALL_EXPR:\n" - "{\n" - "tree fndecl = get_callee_fndecl (%s);\n" - "if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)\n" - "switch (DECL_FUNCTION_CODE (fndecl))\n" - "{\n", opname); - first = false; - - fprintf (f, "case %s:\n" - "{\n", e->operation->id); - kid->gen_generic (f); - fprintf (f, "break;\n" - "}\n"); - } - if (!first) - fprintf (f, "default:;\n" - "}\n" - "break;\n" - "}\n"); - /* Close switch of TREE_CODE. */ - fprintf (f, "default:;\n" - "}\n"); - } - - for (unsigned i = 0; i < preds.length (); ++i) - { - expr *e = as_a <expr *> (preds[i]->op); - predicate_id *p = as_a <predicate_id *> (e->operation); - char kid_opname[128]; - preds[i]->get_name (kid_opname); - fprintf (f, "tree %s_pops[%d];\n", kid_opname, p->nargs); - fprintf (f, "if (tree_%s (%s, %s_pops))\n", p->id, - kid_opname, kid_opname); - fprintf (f, "{\n"); - for (int j = 0; j < p->nargs; ++j) - { - char child_opname[20]; - preds[i]->gen_opname (child_opname, j); - fprintf (f, "tree %s = %s_pops[%d];\n", child_opname, kid_opname, j); - } - preds[i]->gen_generic_kids (f); - fprintf (f, "}\n"); - } - - for (unsigned j = 0; j < kids.length (); ++j) - { - dt_node *node = kids[j]; - if (node->type == DT_OPERAND) - { - dt_operand *kid = static_cast<dt_operand *>(node); - if (kid->op->type == operand::OP_EXPR) - continue; - } - - node->gen_generic (f); - } -} - /* Generate code for the '(if ...)', '(with ..)' and actual transform step of a '(simplify ...)' or '(match ...)'. This handles everything that is not part of the decision tree (simplify->match). */ @@ -2145,7 +2029,7 @@ decision_tree::gen_gimple (FILE *f) is_a <fn_id *> (e->operation) ? "-" : "", e->operation->id); fprintf (f, "{\n"); - dop->gen_gimple_kids (f); + dop->gen_kids (f, true); fprintf (f, "break;\n"); fprintf (f, "}\n"); } @@ -2205,7 +2089,7 @@ decision_tree::gen_generic (FILE *f) else fprintf (f, "case %s:\n", e->operation->id); fprintf (f, "{\n"); - dop->gen_generic_kids (f); + dop->gen_kids (f, false); fprintf (f, "break;\n" "}\n"); } @@ -2231,14 +2115,8 @@ write_predicate (FILE *f, predicate_id * fprintf (f, "tree type = TREE_TYPE (t);\n"); if (!gimple) - { - fprintf (f, "if (TREE_SIDE_EFFECTS (t)) return false;\n"); - dt.root->gen_generic_kids (f); - } - else - { - dt.root->gen_gimple_kids (f); - } + fprintf (f, "if (TREE_SIDE_EFFECTS (t)) return false;\n"); + dt.root->gen_kids (f, gimple); fprintf (f, "return false;\n" "}\n");