diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2011-10-23 15:57:09 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2011-10-23 15:57:09 +0000 |
commit | 4db183a2d5c98d60144b88dcf402f06fc2103200 (patch) | |
tree | e71fcaef7ab6dc1b0e93c1f57a474e7fe80156e3 /gcc/tree-ssa-dom.c | |
parent | d621a5fb6d9bd91e30e96ba9ee60ac8ec1350ee1 (diff) | |
download | gcc-4db183a2d5c98d60144b88dcf402f06fc2103200.zip gcc-4db183a2d5c98d60144b88dcf402f06fc2103200.tar.gz gcc-4db183a2d5c98d60144b88dcf402f06fc2103200.tar.bz2 |
re PR tree-optimization/44683 (Optimization bug with copysign builtin)
* fold-const.c (invert_tree_comparison): Always invert EQ_EXPR/NE_EXPR.
PR tree-optimization/44683
* tree-ssa-dom.c (record_edge_info): Record simple equivalences only if
we can be sure that there are no signed zeros involved.
From-SVN: r180340
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 8bfc91a..949acf1 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1610,12 +1610,15 @@ record_edge_info (basic_block bb) { tree cond = build2 (code, boolean_type_node, op0, op1); tree inverted = invert_truthvalue_loc (loc, cond); + bool can_infer_simple_equiv + = !(HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op0))) + && real_zerop (op0)); struct edge_info *edge_info; edge_info = allocate_edge_info (true_edge); record_conditions (edge_info, cond, inverted); - if (code == EQ_EXPR) + if (can_infer_simple_equiv && code == EQ_EXPR) { edge_info->lhs = op1; edge_info->rhs = op0; @@ -1624,7 +1627,7 @@ record_edge_info (basic_block bb) edge_info = allocate_edge_info (false_edge); record_conditions (edge_info, inverted, cond); - if (TREE_CODE (inverted) == EQ_EXPR) + if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR) { edge_info->lhs = op1; edge_info->rhs = op0; @@ -1632,17 +1635,20 @@ record_edge_info (basic_block bb) } else if (TREE_CODE (op0) == SSA_NAME - && (is_gimple_min_invariant (op1) - || TREE_CODE (op1) == SSA_NAME)) + && (TREE_CODE (op1) == SSA_NAME + || is_gimple_min_invariant (op1))) { tree cond = build2 (code, boolean_type_node, op0, op1); tree inverted = invert_truthvalue_loc (loc, cond); + bool can_infer_simple_equiv + = !(HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op1))) + && (TREE_CODE (op1) == SSA_NAME || real_zerop (op1))); struct edge_info *edge_info; edge_info = allocate_edge_info (true_edge); record_conditions (edge_info, cond, inverted); - if (code == EQ_EXPR) + if (can_infer_simple_equiv && code == EQ_EXPR) { edge_info->lhs = op0; edge_info->rhs = op1; @@ -1651,7 +1657,7 @@ record_edge_info (basic_block bb) edge_info = allocate_edge_info (false_edge); record_conditions (edge_info, inverted, cond); - if (TREE_CODE (inverted) == EQ_EXPR) + if (can_infer_simple_equiv && TREE_CODE (inverted) == EQ_EXPR) { edge_info->lhs = op0; edge_info->rhs = op1; |