expr.c (do_jump, [...]): When comparing complex prevent operands from being evaluated...
authorAndreas Schwab <schwab@issan.informatik.uni-dortmund.de>
Fri, 12 Jun 1998 01:26:05 +0000 (01:26 +0000)
committerAndreas Schwab <schwab@gcc.gnu.org>
Fri, 12 Jun 1998 01:26:05 +0000 (01:26 +0000)
* expr.c (do_jump, case EQ_EXPR, NE_EXPR): When comparing complex
prevent operands from being evaluated twice.

From-SVN: r20440

gcc/ChangeLog
gcc/expr.c

index 6c32d284edb07b18ae505cdf65f37dfcaa2c38a2..96dc22cbc95b22ec836aa0af98101db49edced95 100644 (file)
@@ -1,3 +1,8 @@
+Fri Jun 12 10:23:36 1998  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+       * expr.c (do_jump, case EQ_EXPR, NE_EXPR): When comparing complex
+       prevent operands from being evaluated twice.
+
 Fri Jun 12 00:50:27 1998  Sergey Okhapkin <sos@prospect.com.ru>
 
        * toplev.c (lang_options): Add -remap as a preprocessor option.
index 06d9a4c818d64cb22cb4e6e4952d7cd114717be3..657737f63e0dfa39dad5cc55eb37ed5083ea5e03 100644 (file)
@@ -10007,24 +10007,28 @@ do_jump (exp, if_false_label, if_true_label)
          do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
        else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
                 || GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
-         do_jump
-           (fold
-            (build (TRUTH_ANDIF_EXPR, TREE_TYPE (exp),
-                    fold (build (EQ_EXPR, TREE_TYPE (exp),
-                                 fold (build1 (REALPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 0))),
-                                 fold (build1 (REALPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 1))))),
-                    fold (build (EQ_EXPR, TREE_TYPE (exp),
-                                 fold (build1 (IMAGPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 0))),
-                                 fold (build1 (IMAGPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 1))))))),
-            if_false_label, if_true_label);
+         {
+           tree exp0 = save_expr (TREE_OPERAND (exp, 0));
+           tree exp1 = save_expr (TREE_OPERAND (exp, 1));
+           do_jump
+             (fold
+              (build (TRUTH_ANDIF_EXPR, TREE_TYPE (exp),
+                      fold (build (EQ_EXPR, TREE_TYPE (exp),
+                                   fold (build1 (REALPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp0)),
+                                   fold (build1 (REALPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp1)))),
+                      fold (build (EQ_EXPR, TREE_TYPE (exp),
+                                   fold (build1 (IMAGPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp0)),
+                                   fold (build1 (IMAGPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp1)))))),
+              if_false_label, if_true_label);
+         }
        else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
                 && !can_compare_p (TYPE_MODE (inner_type)))
          do_jump_by_parts_equality (exp, if_false_label, if_true_label);
@@ -10041,24 +10045,28 @@ do_jump (exp, if_false_label, if_true_label)
          do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
        else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
                 || GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
-         do_jump
-           (fold
-            (build (TRUTH_ORIF_EXPR, TREE_TYPE (exp),
-                    fold (build (NE_EXPR, TREE_TYPE (exp),
-                                 fold (build1 (REALPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 0))),
-                                 fold (build1 (REALPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 1))))),
-                    fold (build (NE_EXPR, TREE_TYPE (exp),
-                                 fold (build1 (IMAGPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 0))),
-                                 fold (build1 (IMAGPART_EXPR,
-                                               TREE_TYPE (inner_type),
-                                               TREE_OPERAND (exp, 1))))))),
-            if_false_label, if_true_label);
+         {
+           tree exp0 = save_expr (TREE_OPERAND (exp, 0));
+           tree exp1 = save_expr (TREE_OPERAND (exp, 1));
+           do_jump
+             (fold
+              (build (TRUTH_ORIF_EXPR, TREE_TYPE (exp),
+                      fold (build (NE_EXPR, TREE_TYPE (exp),
+                                   fold (build1 (REALPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp0)),
+                                   fold (build1 (REALPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp1)))),
+                      fold (build (NE_EXPR, TREE_TYPE (exp),
+                                   fold (build1 (IMAGPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp0)),
+                                   fold (build1 (IMAGPART_EXPR,
+                                                 TREE_TYPE (inner_type),
+                                                 exp1)))))),
+              if_false_label, if_true_label);
+         }
        else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
                 && !can_compare_p (TYPE_MODE (inner_type)))
          do_jump_by_parts_equality (exp, if_true_label, if_false_label);