Commit f05ef422 by Richard Henderson

tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): Don't fold fp plus with minus.

        * tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): Don't fold
        fp plus with minus.

From-SVN: r84061
parent fa978426
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dom2" } */
float foo(float x)
{
x += 1;
x -= 1;
return x;
}
/* We should *not* fold the arithmetic. */
/* { dg-final { scan-tree-dump-times "0.0" 0 "dom2"} } */
...@@ -1945,6 +1945,25 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data, ...@@ -1945,6 +1945,25 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
tree type = TREE_TYPE (TREE_OPERAND (stmt, 0)); tree type = TREE_TYPE (TREE_OPERAND (stmt, 0));
tree t; tree t;
/* If we care about correct floating point results, then
don't fold x + c1 - c2. Note that we need to take both
the codes and the signs to figure this out. */
if (FLOAT_TYPE_P (type)
&& !flag_unsafe_math_optimizations
&& (rhs_def_code == PLUS_EXPR
|| rhs_def_code == MINUS_EXPR))
{
bool neg = false;
neg ^= (rhs_code == MINUS_EXPR);
neg ^= (rhs_def_code == MINUS_EXPR);
neg ^= real_isneg (TREE_REAL_CST_PTR (outer_const));
neg ^= real_isneg (TREE_REAL_CST_PTR (def_stmt_op1));
if (neg)
goto dont_fold_assoc;
}
/* Ho hum. So fold will only operate on the outermost /* Ho hum. So fold will only operate on the outermost
thingy that we give it, so we have to build the new thingy that we give it, so we have to build the new
expression in two pieces. This requires that we handle expression in two pieces. This requires that we handle
...@@ -1979,6 +1998,7 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data, ...@@ -1979,6 +1998,7 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
} }
} }
} }
dont_fold_assoc:;
} }
/* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
......
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