mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 08:50:26 +08:00
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:
parent
80521187ef
commit
6eee989369
@ -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
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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
|
||||
|
18
gcc/testsuite/gcc.dg/torture/pr26763-1.c
Normal file
18
gcc/testsuite/gcc.dg/torture/pr26763-1.c
Normal 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;
|
||||
}
|
18
gcc/testsuite/gcc.dg/torture/pr26763-2.c
Normal file
18
gcc/testsuite/gcc.dg/torture/pr26763-2.c
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user