(do_store_flag): Ensure we don't get confused when emit_store_flag
authorRichard Kenner <kenner@gcc.gnu.org>
Wed, 21 Oct 1992 11:33:55 +0000 (07:33 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 21 Oct 1992 11:33:55 +0000 (07:33 -0400)
fails and an operand has a QUEUED.

From-SVN: r2540

gcc/expr.c

index 632c3505b7549ce89f7f257aca83ce29bdd53c49..1641a9c30455235f71122b247850f8bcc7600346 100644 (file)
@@ -7160,8 +7160,14 @@ do_store_flag (exp, target, mode, only_cheap)
   if (target == 0)
     target = gen_reg_rtx (mode);
 
-  result = emit_store_flag (target, code, op0, op1, operand_mode,
-                           unsignedp, 1);
+  /* Pass copies of OP0 and OP1 in case they contain a QUEUED.  This is safe
+     because, if the emit_store_flag does anything it will succeed and
+     OP0 and OP1 will not be used subsequently.  */
+
+  result = emit_store_flag (target, code,
+                           queued_subexp_p (op0) ? copy_rtx (op0) : op0,
+                           queued_subexp_p (op1) ? copy_rtx (op1) : op1,
+                           operand_mode, unsignedp, 1);
 
   if (result)
     {