re PR tree-optimization/14303 ([tree-ssa] gcc.c-torture/execute/20020720-1.c is not fully folded)
2005-02-13 James A. Morrison <phython@gcc.gnu.org> PR tree-optimization/14303 PR tree-optimization/15784 * fold-const.c (fold): Fold ABS_EXPR<x> >= 0 to true, when possible. Fold ABS_EXPR<x> < 0 to false. Fold ABS_EXPR<x> == 0 to x == 0 and ABS_EXPR<x> != 0 to x != 0. From-SVN: r94977
This commit is contained in:
parent
ea24f64b78
commit
60a8fb5ea9
2 changed files with 31 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
|||
2005-02-13 James A. Morrison <phython@gcc.gnu.org>
|
||||
|
||||
PR tree-optimization/14303
|
||||
PR tree-optimization/15784
|
||||
* fold-const.c (fold): Fold ABS_EXPR<x> >= 0 to true, when possible.
|
||||
Fold ABS_EXPR<x> < 0 to false. Fold ABS_EXPR<x> == 0 to x == 0 and
|
||||
ABS_EXPR<x> != 0 to x != 0.
|
||||
|
||||
2005-02-12 Kazu Hirata <kazu@cs.umass.edu>
|
||||
|
||||
* c-tree.h, combine.c, expmed.c, flow.c, libgcc2.c,
|
||||
|
|
|
@ -8973,6 +8973,29 @@ fold (tree expr)
|
|||
build2 (LE_EXPR, type,
|
||||
TREE_OPERAND (arg0, 0), arg1)));
|
||||
|
||||
/* Convert ABS_EXPR<x> >= 0 to true. */
|
||||
else if (code == GE_EXPR
|
||||
&& tree_expr_nonnegative_p (arg0)
|
||||
&& ! TREE_SIDE_EFFECTS (arg0)
|
||||
&& (integer_zerop (arg1)
|
||||
|| (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
|
||||
&& real_zerop (arg1))))
|
||||
return constant_boolean_node (true, type);
|
||||
|
||||
/* Convert ABS_EXPR<x> < 0 to false. */
|
||||
else if (code == LT_EXPR
|
||||
&& tree_expr_nonnegative_p (arg0)
|
||||
&& ! TREE_SIDE_EFFECTS (arg0)
|
||||
&& (integer_zerop (arg1) || real_zerop (arg1)))
|
||||
return constant_boolean_node (false, type);
|
||||
|
||||
/* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0. */
|
||||
else if ((code == EQ_EXPR || code == NE_EXPR)
|
||||
&& TREE_CODE (arg0) == ABS_EXPR
|
||||
&& ! TREE_SIDE_EFFECTS (arg0)
|
||||
&& (integer_zerop (arg1) || real_zerop (arg1)))
|
||||
return fold (build2 (code, type, TREE_OPERAND (arg0, 0), arg1));
|
||||
|
||||
/* If this is an EQ or NE comparison with zero and ARG0 is
|
||||
(1 << foo) & bar, convert it to (bar >> foo) & 1. Both require
|
||||
two operations, but the latter can be done in one less insn
|
||||
|
|
Loading…
Add table
Reference in a new issue