This fixes the issue that genmatch wraps captures in SAVE_TEMPS only for correctness reasons right now (for TREE_SIDE_EFFECTS captures) but not to avoid duplicating expensive computations.
The following fixes that. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk, testing on the branch right now. Richard. 2015-11-26 Richard Biener <rguent...@suse.de> * genmatch.c (dt_simplify::gen_1): For generic wrap all multi-result-use captures in a SAVE_EXPR. Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 230924) +++ gcc/genmatch.c (working copy) @@ -3112,16 +3111,10 @@ dt_simplify::gen_1 (FILE *f, int indent, { if (cinfo.info[i].same_as != (unsigned)i) continue; - if (!cinfo.info[i].force_no_side_effects_p - && cinfo.info[i].result_use_count > 1) - { - fprintf_indent (f, indent, - "if (TREE_SIDE_EFFECTS (captures[%d]))\n", - i); - fprintf_indent (f, indent, - " captures[%d] = save_expr (captures[%d]);\n", - i, i); - } + if (cinfo.info[i].result_use_count > 1) + fprintf_indent (f, indent, + "captures[%d] = save_expr (captures[%d]);\n", + i, i); } for (unsigned j = 0; j < e->ops.length (); ++j) {