aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-05-22 20:55:29 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2017-05-22 20:55:29 +0200
commitd11c168a673e6a451bbaa7ccde2ed2229d123a94 (patch)
tree6d918c0e931b961e5663d3b16155ac38e6bfbe1c /gcc
parent655e52652b2af93ae6508dfc2026c6903bf391de (diff)
downloadgcc-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')
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-fold.c16
2 files changed, 13 insertions, 10 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 0318bcf..292762a 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,10 @@
+2017-05-22 Jakub Jelinek <jakub@redhat.com>
+
+ * 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.
+
2017-05-22 Nathan Sidwell <nathan@acm.org>
* c-decl.c (c_parse_final_cleanups): Drop TDI_tu handling.
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: