]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.c (fold_binary_op_with_conditional_arg): Only build a COMPOUND_EXPR if...
authorEric Botcazou <ebotcazou@act-europe.fr>
Fri, 23 Jan 2004 16:52:07 +0000 (17:52 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 23 Jan 2004 16:52:07 +0000 (16:52 +0000)
* fold-const.c (fold_binary_op_with_conditional_arg): Only
build a COMPOUND_EXPR if 'arg' is really a SAVE_EXPR.

Co-Authored-By: Olivier Hainque <hainque@act-europe.fr>
From-SVN: r76434

gcc/ChangeLog
gcc/fold-const.c

index 5679eb4a534024b2e751917776cb1c77617e7001..20e4249986d2f0299020e34fabca11f13feda2b0 100644 (file)
@@ -1,3 +1,9 @@
+2004-01-23  Eric Botcazou  <ebotcazou@act-europe.fr>
+            Olivier Hainque  <hainque@act-europe.fr>
+
+       * fold-const.c (fold_binary_op_with_conditional_arg): Only
+       build a COMPOUND_EXPR if 'arg' is really a SAVE_EXPR.
+
 2004-01-23  Daniel Jacobowitz  <drow@mvista.com>
 
        * config/arm/arm.c (arm_legitimate_address_p): Don't check the mode
index d29b86e067ed2c58350996f483b9b91f49369c24..de72a76f1ff6a6307eb429ef1bf12ca742e5b88b 100644 (file)
@@ -4749,7 +4749,7 @@ fold_binary_op_with_conditional_arg (enum tree_code code, tree type,
        {
          arg = save_expr (arg);
          lhs = rhs = 0;
-         save = 1;
+         save = saved_expr_p (arg);
        }
     }
 
@@ -4760,6 +4760,12 @@ fold_binary_op_with_conditional_arg (enum tree_code code, tree type,
 
   test = fold (build (COND_EXPR, type, test, lhs, rhs));
 
+  /* If ARG involves a SAVE_EXPR, we need to ensure it is evaluated
+     ahead of the COND_EXPR we made.  Otherwise we would have it only
+     evaluated in one branch, with the other branch using the result
+     but missing the evaluation code.  Beware that the save_expr call
+     above might not return a SAVE_EXPR, so testing the TREE_CODE
+     of ARG is not enough to decide here.  */
   if (save)
     return build (COMPOUND_EXPR, type,
                  convert (void_type_node, arg),