mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 18:05:19 +08:00
fold-const.c (fold_comparison): Fold comparisons like (x * 1000 < 0) to (x < 0).
./: * fold-const.c (fold_comparison): Fold comparisons like (x * 1000 < 0) to (x < 0). testsuite/: * gcc.dg/fold-compare-2.c: New test case for fold_comparison. From-SVN: r120649
This commit is contained in:
parent
ee3202e149
commit
6b074ef6a0
@ -1,3 +1,8 @@
|
||||
2007-01-10 Robert Kennedy <jimbob@google.com>
|
||||
|
||||
* fold-const.c (fold_comparison): Fold comparisons like (x *
|
||||
1000 < 0) to (x < 0).
|
||||
|
||||
2007-01-10 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* tree-pretty-print.c (dump_generic_node): Print parentheses when
|
||||
|
@ -8189,6 +8189,31 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
|
||||
variable2);
|
||||
}
|
||||
|
||||
/* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the
|
||||
signed arithmetic case. That form is created by the compiler
|
||||
often enough for folding it to be of value. One example is in
|
||||
computing loop trip counts after Operator Strength Reduction. */
|
||||
if (!(flag_wrapv || flag_trapv)
|
||||
&& !TYPE_UNSIGNED (TREE_TYPE (arg0))
|
||||
&& TREE_CODE (arg0) == MULT_EXPR
|
||||
&& (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
|
||||
&& !TREE_OVERFLOW (TREE_OPERAND (arg0, 1)))
|
||||
&& integer_zerop (arg1))
|
||||
{
|
||||
tree const1 = TREE_OPERAND (arg0, 1);
|
||||
tree const2 = arg1; /* zero */
|
||||
tree variable1 = TREE_OPERAND (arg0, 0);
|
||||
enum tree_code cmp_code = code;
|
||||
|
||||
gcc_assert (!integer_zerop (const1));
|
||||
|
||||
/* If const1 is negative we swap the sense of the comparison. */
|
||||
if (tree_int_cst_sgn (const1) < 0)
|
||||
cmp_code = swap_tree_comparison (cmp_code);
|
||||
|
||||
return fold_build2 (cmp_code, type, variable1, const2);
|
||||
}
|
||||
|
||||
tem = maybe_canonicalize_comparison (code, type, arg0, arg1);
|
||||
if (tem)
|
||||
return tem;
|
||||
|
@ -1,3 +1,7 @@
|
||||
2007-01-10 Robert Kennedy <jimbob@google.com>
|
||||
|
||||
* gcc.dg/fold-compare-2.c: New test case for fold_comparison.
|
||||
|
||||
2007-01-09 Brooks Moses <brooks.moses@codesourcery.com>
|
||||
|
||||
* gfortran.dg/chkbits.f90: Added IBCLR tests; test calls
|
||||
|
18
gcc/testsuite/gcc.dg/fold-compare-2.c
Normal file
18
gcc/testsuite/gcc.dg/fold-compare-2.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-vrp" } */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
int a;
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
if (a * 1000 < 0)
|
||||
abort ();
|
||||
if (a * -43 > 0)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "vrp1" } } */
|
Loading…
Reference in New Issue
Block a user