diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-05-22 20:55:29 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-05-22 20:55:29 +0200 |
commit | d11c168a673e6a451bbaa7ccde2ed2229d123a94 (patch) | |
tree | 6d918c0e931b961e5663d3b16155ac38e6bfbe1c /gcc/c/c-fold.c | |
parent | 655e52652b2af93ae6508dfc2026c6903bf391de (diff) | |
download | gcc-d11c168a673e6a451bbaa7ccde2ed2229d123a94.zip gcc-d11c168a673e6a451bbaa7ccde2ed2229d123a94.tar.gz gcc-d11c168a673e6a451bbaa7ccde2ed2229d123a94.tar.bz2 |
c-fold.c (c_fully_fold_internal): Save the c_fully_fold_internal result for SAVE_EXPR operand and set...
* c-fold.c (c_fully_fold_internal): Save the c_fully_fold_internal
result for SAVE_EXPR operand and set SAVE_EXPR_FOLDED_P even if
it returned invariant. Call tree_invariant_p unconditionally
afterwards to decide whether to return expr or op0.
From-SVN: r248347
Diffstat (limited to 'gcc/c/c-fold.c')
-rw-r--r-- | gcc/c/c-fold.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/gcc/c/c-fold.c b/gcc/c/c-fold.c index 1baee44..2601224 100644 --- a/gcc/c/c-fold.c +++ b/gcc/c/c-fold.c @@ -566,21 +566,17 @@ c_fully_fold_internal (tree expr, bool in_init, bool *maybe_const_operands, case SAVE_EXPR: /* Make sure to fold the contents of a SAVE_EXPR exactly once. */ + op0 = TREE_OPERAND (expr, 0); 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; - } + TREE_OPERAND (expr, 0) = op0; + SAVE_EXPR_FOLDED_P (expr) = true; } + /* Return the SAVE_EXPR operand if it is invariant. */ + if (tree_invariant_p (op0)) + ret = op0; goto out; default: |