diff options
author | Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> | 1998-06-12 01:26:05 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@gcc.gnu.org> | 1998-06-12 01:26:05 +0000 |
commit | 8d62b411cf5f8c9225388d466934878fc2c8e379 (patch) | |
tree | efa1becff2dee8ed7616a79c5cb11b2fe8ddad5d /gcc/expr.c | |
parent | b91feb181159a1c381fed21e3ef691436fe26a04 (diff) | |
download | gcc-8d62b411cf5f8c9225388d466934878fc2c8e379.zip gcc-8d62b411cf5f8c9225388d466934878fc2c8e379.tar.gz gcc-8d62b411cf5f8c9225388d466934878fc2c8e379.tar.bz2 |
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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 80 |
1 files changed, 44 insertions, 36 deletions
@@ -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); |