On Fri, May 12, 2017 at 09:48:28PM +0200, Jakub Jelinek wrote: > On Fri, May 12, 2017 at 09:37:27PM +0200, Marek Polacek wrote: > > @@ -565,6 +564,25 @@ c_fully_fold_internal (tree expr, bool in_init, bool > > *maybe_const_operands, > > appropriate in any particular case. */ > > gcc_unreachable (); > > > > + case SAVE_EXPR: > > + /* Make sure to fold the contents of a SAVE_EXPR exactly once. */ > > + if (!SAVE_EXPR_FOLDED_P (expr)) > > + { > > + op0 = TREE_OPERAND (expr, 0); > > + op0 = c_fully_fold_internal (op0, in_init, maybe_const_operands, > > + maybe_const_itself, for_int_const); > > + /* Don't wrap the folded tree in a SAVE_EXPR if we don't > > + have to. */ > > + if (tree_invariant_p (op0)) > > + ret = op0; > > + else > > + { > > + TREE_OPERAND (expr, 0) = op0; > > + SAVE_EXPR_FOLDED_P (expr) = true; > > + } > > + } > > Wouldn't it be better to guard with if (!SAVE_EXPR_FOLDED_P (expr)) > only c_fully_fold_internal recursion on the operand > and then use if (tree_invariant_p (op0)) unconditionally? I don't see why that would be better. It would mean calling tree_invariant_p on even folded SAVE_EXPRs, and I can't see when it could be true in that case?
> > @@ -113,6 +113,10 @@ along with GCC; see the file COPYING3. If not see > > subexpression meaning it is not a constant expression. */ > > #define CONSTRUCTOR_NON_CONST(EXPR) TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK > > (EXPR)) > > > > +/* For a SAVE_EXPR, nonzero if the contents of the SAVE_EXPR have already > > + been folded. */ > > s/contents/operand/;s/have/has/ ? Ok, if you prefer ;). > Otherwise I'm all for this, but would like to give you and Joseph as C FE > maintainers the last word on this. Thanks, Marek