It no longer works in the face of (with { .... } which would need to pass down all named temporaries. Instead we can simply inline all C exprs now that we pass 'output' to all gen_transform calls.
Boostrap pending on x86_64-unknown-linux-gnu. Richard. 2014-09-24 Richard Biener <rguent...@suse.de> * genmatch.c (c_expr::output_code): Remove and inline into ... (c_expr::gen_transform): ... here. (outline_c_exprs): Remove. (main): Do not call outline_c_exprs. Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 215551) +++ gcc/genmatch.c (working copy) @@ -355,7 +355,6 @@ struct c_expr : public operand vec<id_tab> ids; virtual void gen_transform (FILE *f, const char *, bool, int, const char *, dt_operand **); - void output_code (FILE *f, bool); }; struct capture : public operand @@ -1051,9 +1050,17 @@ expr::gen_transform (FILE *f, const char fprintf (f, "}\n"); } +/* Generate code for a c_expr which is either the expression inside + an if statement or a sequence of statements which computes a + result to be stored to DEST. */ + void -c_expr::output_code (FILE *f, bool for_fn) +c_expr::gen_transform (FILE *f, const char *dest, + bool, int, const char *, dt_operand **) { + if (dest && nr_stmts == 1) + fprintf (f, "%s = ", dest); + unsigned stmt_nr = 1; for (unsigned i = 0; i < code.length (); ++i) { @@ -1100,35 +1107,14 @@ c_expr::output_code (FILE *f, bool for_f if (token->type == CPP_SEMICOLON) { stmt_nr++; - if (for_fn && stmt_nr == nr_stmts) - fputs ("\n return ", f); + if (dest && stmt_nr == nr_stmts) + fprintf (f, "\n %s = ", dest); else fputc ('\n', f); } } } - -void -c_expr::gen_transform (FILE *f, const char *dest, bool, int, const char *, dt_operand **) -{ - /* If this expression has an outlined function variant, call it. */ - if (fname) - { - fprintf (f, "%s = %s (type, captures);\n", dest, fname); - return; - } - - /* All multi-stmt expressions should have been outlined. Expressions - with nr_stmts == 0 are used for if-expressions. */ - gcc_assert (nr_stmts <= 1); - - if (nr_stmts == 1) - fprintf (f, "%s = ", dest); - - output_code (f, false); -} - void capture::gen_transform (FILE *f, const char *dest, bool gimple, int depth, const char *in_type, dt_operand **indexes) { @@ -2172,40 +2158,6 @@ write_predicate (FILE *f, predicate_id * static void -outline_c_exprs (FILE *f, struct operand *op) -{ - if (op->type == operand::OP_C_EXPR) - { - c_expr *e = static_cast <c_expr *>(op); - static unsigned fnnr = 1; - if (e->nr_stmts > 1 - && !e->fname) - { - e->fname = (char *)xmalloc (sizeof ("cexprfn") + 4); - sprintf (e->fname, "cexprfn%d", fnnr); - fprintf (f, "\nstatic tree\ncexprfn%d (tree type, tree *captures)\n", - fnnr); - fprintf (f, "{\n"); - e->output_code (f, true); - fprintf (f, "}\n"); - fnnr++; - } - } - else if (op->type == operand::OP_CAPTURE) - { - capture *c = static_cast <capture *>(op); - if (c->what) - outline_c_exprs (f, c->what); - } - else if (op->type == operand::OP_EXPR) - { - expr *e = static_cast <expr *>(op); - for (unsigned i = 0; i < e->ops.length (); ++i) - outline_c_exprs (f, e->ops[i]); - } -} - -static void write_header (FILE *f, const char *head) { fprintf (f, "/* Generated automatically by the program `genmatch' from\n"); @@ -3001,10 +2953,6 @@ add_operator (CONVERT2, "CONVERT2", "tcc if (verbose) dt.print (stderr); - /* Outline complex C expressions to helper functions. */ - for (unsigned i = 0; i < out_simplifiers.length (); ++i) - outline_c_exprs (stdout, out_simplifiers[i]->result); - if (gimple) dt.gen_gimple (stdout); else