Commit 8d62b411 by Andreas Schwab Committed by Andreas Schwab

expr.c (do_jump, [...]): When comparing complex prevent operands from being evaluated twice.

	* expr.c (do_jump, case EQ_EXPR, NE_EXPR): When comparing complex
	prevent operands from being evaluated twice.

From-SVN: r20440
parent b91feb18
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> Fri Jun 12 00:50:27 1998 Sergey Okhapkin <sos@prospect.com.ru>
* toplev.c (lang_options): Add -remap as a preprocessor option. * toplev.c (lang_options): Add -remap as a preprocessor option.
......
...@@ -10007,24 +10007,28 @@ do_jump (exp, if_false_label, if_true_label) ...@@ -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); do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label);
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT) || GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
do_jump {
(fold tree exp0 = save_expr (TREE_OPERAND (exp, 0));
(build (TRUTH_ANDIF_EXPR, TREE_TYPE (exp), tree exp1 = save_expr (TREE_OPERAND (exp, 1));
fold (build (EQ_EXPR, TREE_TYPE (exp), do_jump
fold (build1 (REALPART_EXPR, (fold
TREE_TYPE (inner_type), (build (TRUTH_ANDIF_EXPR, TREE_TYPE (exp),
TREE_OPERAND (exp, 0))), fold (build (EQ_EXPR, TREE_TYPE (exp),
fold (build1 (REALPART_EXPR, fold (build1 (REALPART_EXPR,
TREE_TYPE (inner_type), TREE_TYPE (inner_type),
TREE_OPERAND (exp, 1))))), exp0)),
fold (build (EQ_EXPR, TREE_TYPE (exp), fold (build1 (REALPART_EXPR,
fold (build1 (IMAGPART_EXPR, TREE_TYPE (inner_type),
TREE_TYPE (inner_type), exp1)))),
TREE_OPERAND (exp, 0))), fold (build (EQ_EXPR, TREE_TYPE (exp),
fold (build1 (IMAGPART_EXPR, fold (build1 (IMAGPART_EXPR,
TREE_TYPE (inner_type), TREE_TYPE (inner_type),
TREE_OPERAND (exp, 1))))))), exp0)),
if_false_label, if_true_label); 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 else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
&& !can_compare_p (TYPE_MODE (inner_type))) && !can_compare_p (TYPE_MODE (inner_type)))
do_jump_by_parts_equality (exp, if_false_label, if_true_label); 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) ...@@ -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); do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label);
else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_FLOAT
|| GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT) || GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_COMPLEX_INT)
do_jump {
(fold tree exp0 = save_expr (TREE_OPERAND (exp, 0));
(build (TRUTH_ORIF_EXPR, TREE_TYPE (exp), tree exp1 = save_expr (TREE_OPERAND (exp, 1));
fold (build (NE_EXPR, TREE_TYPE (exp), do_jump
fold (build1 (REALPART_EXPR, (fold
TREE_TYPE (inner_type), (build (TRUTH_ORIF_EXPR, TREE_TYPE (exp),
TREE_OPERAND (exp, 0))), fold (build (NE_EXPR, TREE_TYPE (exp),
fold (build1 (REALPART_EXPR, fold (build1 (REALPART_EXPR,
TREE_TYPE (inner_type), TREE_TYPE (inner_type),
TREE_OPERAND (exp, 1))))), exp0)),
fold (build (NE_EXPR, TREE_TYPE (exp), fold (build1 (REALPART_EXPR,
fold (build1 (IMAGPART_EXPR, TREE_TYPE (inner_type),
TREE_TYPE (inner_type), exp1)))),
TREE_OPERAND (exp, 0))), fold (build (NE_EXPR, TREE_TYPE (exp),
fold (build1 (IMAGPART_EXPR, fold (build1 (IMAGPART_EXPR,
TREE_TYPE (inner_type), TREE_TYPE (inner_type),
TREE_OPERAND (exp, 1))))))), exp0)),
if_false_label, if_true_label); 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 else if (GET_MODE_CLASS (TYPE_MODE (inner_type)) == MODE_INT
&& !can_compare_p (TYPE_MODE (inner_type))) && !can_compare_p (TYPE_MODE (inner_type)))
do_jump_by_parts_equality (exp, if_true_label, if_false_label); do_jump_by_parts_equality (exp, if_true_label, if_false_label);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment