Commit a31498d2 by Richard Guenther Committed by Richard Biener

re PR middle-end/30951 (Does not fold x + CST == x and x + CST != x)

2007-02-24  Richard Guenther  <rguenther@suse.de>

	PR middle-end/30951
	* fold-const.c (fold_binary): Fold x +- CST op x for
	EQ_EXPR and NE_EXPR.

	* gcc.dg/pr30951.c: New testcase.

From-SVN: r122295
parent 1e6e2c30
2007-02-24 Richard Guenther <rguenther@suse.de>
PR middle-end/30951
* fold-const.c (fold_binary): Fold x +- CST op x for
EQ_EXPR and NE_EXPR.
2007-02-24 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa.md (muldi3): Force subregs to registers in 64-bit expander.
......
......@@ -11203,6 +11203,24 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
fold_convert (TREE_TYPE (arg0), arg1),
TREE_OPERAND (arg0, 1)));
/* Transform comparisons of the form X +- C CMP X. */
if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
&& operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
&& (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
|| POINTER_TYPE_P (TREE_TYPE (arg0))))
{
tree cst = TREE_OPERAND (arg0, 1);
if (code == EQ_EXPR
&& !integer_zerop (cst))
return omit_two_operands (type, boolean_false_node,
TREE_OPERAND (arg0, 0), arg1);
else
return omit_two_operands (type, boolean_true_node,
TREE_OPERAND (arg0, 0), arg1);
}
/* If we have X - Y == 0, we can convert that to X == Y and similarly
for !=. Don't do this for ordered comparisons due to overflow. */
if (TREE_CODE (arg0) == MINUS_EXPR
......
2007-02-24 Richard Guenther <rguenther@suse.de>
PR middle-end/30951
* gcc.dg/pr30951.c: New testcase.
2007-02-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/torture/builtin-modf-1.c: New test.
/* { dg-do link } */
extern void link_error (void);
void test (int x, unsigned int y)
{
if (x + 5 == x)
link_error ();
if (x == x + 10)
link_error ();
if (y + 5 == y)
link_error ();
if (y == y + 10)
link_error ();
if (x + 5 != x)
;
else
link_error ();
if (x != x + 10)
;
else
link_error ();
if (y + 5 != y)
;
else
link_error ();
if (y != y + 10)
;
else
link_error ();
}
int main()
{
return 0;
}
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