re PR tree-optimization/26763 (wrong final value of induction variable calculated)

2006-04-05  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/26763
	* fold-const.c (fold_comparison): Move folding of
	PTR + CST CMP PTR + CST ...
	(fold_binary): ... here.  Fold only for EQ_EXPR and NE_EXPR.

	* gcc.dg/torture/pr26763-1.c: New testcase.
	* gcc.dg/torture/pr26763-2.c: Likewise.

From-SVN: r112697
This commit is contained in:
Richard Guenther 2006-04-05 08:16:38 +00:00 committed by Richard Biener
parent 80521187ef
commit 6eee989369
5 changed files with 77 additions and 27 deletions

View File

@ -1,3 +1,10 @@
2006-04-05 Richard Guenther <rguenther@suse.de>
PR tree-optimization/26763
* fold-const.c (fold_comparison): Move folding of
PTR + CST CMP PTR + CST ...
(fold_binary): ... here. Fold only for EQ_EXPR and NE_EXPR.
2006-04-05 Gerald Pfeifer <gerald@pfeifer.com>
* doc/install.texi (Prerequisites): Refine some wording on

View File

@ -7305,33 +7305,6 @@ fold_comparison (enum tree_code code, tree type, tree op0, tree op1)
if (tree_swap_operands_p (arg0, arg1, true))
return fold_build2 (swap_tree_comparison (code), type, op1, op0);
/* If this is a comparison of two exprs that look like an
ARRAY_REF of the same object, then we can fold this to a
comparison of the two offsets. */
{
tree base0, offset0, base1, offset1;
if (extract_array_ref (arg0, &base0, &offset0)
&& extract_array_ref (arg1, &base1, &offset1)
&& operand_equal_p (base0, base1, 0))
{
/* Handle no offsets on both sides specially. */
if (offset0 == NULL_TREE && offset1 == NULL_TREE)
return fold_build2 (code, type, integer_zero_node,
integer_zero_node);
if (!offset0 || !offset1
|| TREE_TYPE (offset0) == TREE_TYPE (offset1))
{
if (offset0 == NULL_TREE)
offset0 = build_int_cst (TREE_TYPE (offset1), 0);
if (offset1 == NULL_TREE)
offset1 = build_int_cst (TREE_TYPE (offset0), 0);
return fold_build2 (code, type, offset0, offset1);
}
}
}
/* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 +- C1. */
if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
&& (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
@ -10062,6 +10035,34 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
tem, build_int_cst (TREE_TYPE (tem), 0));
}
/* If this is a comparison of two exprs that look like an
ARRAY_REF of the same object, then we can fold this to a
comparison of the two offsets. This is only safe for
EQ_EXPR and NE_EXPR because of overflow issues. */
{
tree base0, offset0, base1, offset1;
if (extract_array_ref (arg0, &base0, &offset0)
&& extract_array_ref (arg1, &base1, &offset1)
&& operand_equal_p (base0, base1, 0))
{
/* Handle no offsets on both sides specially. */
if (offset0 == NULL_TREE && offset1 == NULL_TREE)
return fold_build2 (code, type, integer_zero_node,
integer_zero_node);
if (!offset0 || !offset1
|| TREE_TYPE (offset0) == TREE_TYPE (offset1))
{
if (offset0 == NULL_TREE)
offset0 = build_int_cst (TREE_TYPE (offset1), 0);
if (offset1 == NULL_TREE)
offset1 = build_int_cst (TREE_TYPE (offset0), 0);
return fold_build2 (code, type, offset0, offset1);
}
}
}
if (integer_zerop (arg1)
&& tree_expr_nonzero_p (arg0))
{

View File

@ -1,3 +1,9 @@
2006-04-05 Richard Guenther <rguenther@suse.de>
PR tree-optimization/26763
* gcc.dg/torture/pr26763-1.c: New testcase.
* gcc.dg/torture/pr26763-2.c: Likewise.
2006-04-04 Paul Thomas <pault@gcc.gnu.org>
PR fortran/23634

View File

@ -0,0 +1,18 @@
/* { dg-do run } */
extern void abort(void);
int try (int *a)
{
return a + -1 > a;
}
int main(void)
{
int bla[100];
if (try (bla + 50))
abort ();
return 0;
}

View File

@ -0,0 +1,18 @@
/* { dg-do run } */
extern void abort(void);
int try (char *a, int d)
{
return a + d > a;
}
int main(void)
{
char bla[100];
if (try (bla + 50, -1))
abort ();
return 0;
}