Commit 75cf42cc by Richard Guenther Committed by Richard Biener

re PR middle-end/21082 (&a[b] - &a[c] is not folded to b - c)

2005-04-23  Richard Guenther  <rguenth@gcc.gnu.org>

	PR middle-end/21082
	* fold-const.c: Fold &a[i]-&a[j] to i-j.

	* g++.dg/tree-ssa/pr21082.C: New testcase.

From-SVN: r98636
parent be1b5cba
2005-04-23 Richard Guenther <rguenth@gcc.gnu.org>
PR middle-end/21082
* fold-const.c: Fold &a[i]-&a[j] to i-j.
2005-04-23 Zdenek Dvorak <dvorakz@suse.cz> 2005-04-23 Zdenek Dvorak <dvorakz@suse.cz>
* tree-ssa-loop-niter.c (tree_simplify_using_condition): Expand simple * tree-ssa-loop-niter.c (tree_simplify_using_condition): Expand simple
......
...@@ -7842,6 +7842,27 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) ...@@ -7842,6 +7842,27 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
return build_int_cst_type (type, diff); return build_int_cst_type (type, diff);
} }
/* Fold &a[i] - &a[j] to i-j. */
if (TREE_CODE (arg0) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
&& TREE_CODE (arg1) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (arg1, 0)) == ARRAY_REF)
{
tree aref0 = TREE_OPERAND (arg0, 0);
tree aref1 = TREE_OPERAND (arg1, 0);
if (operand_equal_p (TREE_OPERAND (aref0, 0),
TREE_OPERAND (aref1, 0), 0))
{
tree op0 = fold_convert (type, TREE_OPERAND (aref0, 1));
tree op1 = fold_convert (type, TREE_OPERAND (aref1, 1));
tree esz = array_ref_element_size (aref0);
tree diff = build2 (MINUS_EXPR, type, op0, op1);
return fold_build2 (MULT_EXPR, type, diff,
fold_convert (type, esz));
}
}
/* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step /* Try replacing &a[i1] - c * i2 with &a[i1 - i2], if c is step
of the array. Loop optimizer sometimes produce this type of of the array. Loop optimizer sometimes produce this type of
expressions. */ expressions. */
......
2005-04-23 Richard Guenther <rguenth@gcc.gnu.org>
PR middle-end/21082
* g++.dg/tree-ssa/pr21082.C: New testcase.
2005-04-23 Zdenek Dvorak <dvorakz@suse.cz> 2005-04-23 Zdenek Dvorak <dvorakz@suse.cz>
* gcc.dg/vect/vect-99.c: New test. * gcc.dg/vect/vect-99.c: New test.
......
/* { dg-do link } */
void link_error();
int a[4];
long b, c;
int main()
{
if (&a[b] - &a[c] != b - c)
link_error();
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