Commit 6b074ef6 by Robert Kennedy Committed by Ian Lance Taylor

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
parent ee3202e1
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> 2007-01-10 Ian Lance Taylor <iant@google.com>
* tree-pretty-print.c (dump_generic_node): Print parentheses when * 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) ...@@ -8189,6 +8189,31 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
variable2); 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); tem = maybe_canonicalize_comparison (code, type, arg0, arg1);
if (tem) if (tem)
return tem; return tem;
......
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> 2007-01-09 Brooks Moses <brooks.moses@codesourcery.com>
* gfortran.dg/chkbits.f90: Added IBCLR tests; test calls * gfortran.dg/chkbits.f90: Added IBCLR tests; test calls
/* { 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" } } */
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