expr.c (expand_expr_real_1): Add back code that was not dead.
authorPaolo Bonzini <bonzini@gnu.org>
Tue, 10 Aug 2004 08:38:29 +0000 (08:38 +0000)
committerPaolo Bonzini <bonzini@gcc.gnu.org>
Tue, 10 Aug 2004 08:38:29 +0000 (08:38 +0000)
2004-08-09  Paolo Bonzini  <bonzini@gnu.org>

* expr.c (expand_expr_real_1): Add back code that was not dead.

From-SVN: r85742

gcc/ChangeLog
gcc/expr.c

index 6eb4be82d907f3ad99e07535d1c854e9ca425be5..87045e6484c7fcd6a6fce702a38c4c5cb621d867 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-09  Paolo Bonzini  <bonzini@gnu.org>
+
+       * expr.c (expand_expr_real_1): Add back code that was not dead.
+
 2004-08-09  Andrew Pinski  <apinski@apple.com>
 
        * c-common.c (c_common_get_alias_set): Set the aliasing set of the type
index 7334c59ca39a75e172d7578668bffa4aa53fb7cc..607115b01b691d70613ab3fbeb574c4cf9e95ab8 100644 (file)
@@ -7778,6 +7778,32 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          return temp;
        }
 
+      /* If no set-flag instruction, must generate a conditional store
+        into a temporary variable.  Drop through and handle this
+        like && and ||.  */
+
+      if (! ignore
+         && (target == 0
+             || modifier == EXPAND_STACK_PARM
+             || ! safe_from_p (target, exp, 1)
+             /* Make sure we don't have a hard reg (such as function's return
+                value) live across basic blocks, if not optimizing.  */
+             || (!optimize && REG_P (target)
+                 && REGNO (target) < FIRST_PSEUDO_REGISTER)))
+       target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
+
+      if (target)
+       emit_move_insn (target, const0_rtx);
+
+      op1 = gen_label_rtx ();
+      jumpifnot (exp, op1);
+
+      if (target)
+       emit_move_insn (target, const1_rtx);
+
+      emit_label (op1);
+      return ignore ? const0_rtx : target;
+
     case TRUTH_NOT_EXPR:
       if (modifier == EXPAND_STACK_PARM)
        target = 0;