Skip to content

Commit

Permalink
tree-affine.c (add_elt_to_tree): Avoid converting all pointer arithme…
Browse files Browse the repository at this point in the history
…tic to sizetype.

2013-09-02  Richard Biener  <[email protected]>

	* tree-affine.c (add_elt_to_tree): Avoid converting all pointer
	arithmetic to sizetype.

	* gcc.dg/tree-ssa/loop-4.c: Adjust scan looking for one memory
	reference.

From-SVN: r202165
  • Loading branch information
rguenth authored and Richard Biener committed Sep 2, 2013
1 parent 85ff4ec commit 78de233
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 20 deletions.
5 changes: 5 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2013-09-02 Richard Biener <[email protected]>

* tree-affine.c (add_elt_to_tree): Avoid converting all pointer
arithmetic to sizetype.

2013-09-02 Bin Cheng <[email protected]>

* tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
Expand Down
5 changes: 5 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2013-09-02 Richard Biener <[email protected]>

* gcc.dg/tree-ssa/loop-4.c: Adjust scan looking for one memory
reference.

2013-09-02 Bin Cheng <[email protected]>

* gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.
Expand Down
2 changes: 1 addition & 1 deletion gcc/testsuite/gcc.dg/tree-ssa/loop-4.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void xxx(void)

/* { dg-final { scan-tree-dump-times " \\* \[^\\n\\r\]*=" 0 "optimized" } } */
/* { dg-final { scan-tree-dump-times "\[^\\n\\r\]*= \\* " 0 "optimized" } } */
/* { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " MEM" 1 "optimized" } } */

/* And the original induction variable should be eliminated. */

Expand Down
50 changes: 31 additions & 19 deletions gcc/tree-affine.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,35 +377,46 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale,
type1 = sizetype;

scale = double_int_ext_for_comb (scale, comb);
elt = fold_convert (type1, elt);

if (scale.is_minus_one ()
&& POINTER_TYPE_P (TREE_TYPE (elt)))
{
elt = fold_build1 (NEGATE_EXPR, sizetype, convert_to_ptrofftype (elt));
scale = double_int_one;
}

if (scale.is_one ())
{
if (!expr)
return fold_convert (type, elt);

if (POINTER_TYPE_P (type))
return fold_build_pointer_plus (expr, elt);
return fold_build2 (PLUS_EXPR, type, expr, elt);
return elt;

if (POINTER_TYPE_P (TREE_TYPE (expr)))
return fold_build_pointer_plus (expr, convert_to_ptrofftype (elt));
if (POINTER_TYPE_P (TREE_TYPE (elt)))
return fold_build_pointer_plus (elt, convert_to_ptrofftype (expr));
return fold_build2 (PLUS_EXPR, type1,
fold_convert (type1, expr),
fold_convert (type1, elt));
}

if (scale.is_minus_one ())
{
if (!expr)
return fold_convert (type, fold_build1 (NEGATE_EXPR, type1, elt));

if (POINTER_TYPE_P (type))
{
elt = fold_build1 (NEGATE_EXPR, type1, elt);
return fold_build_pointer_plus (expr, elt);
}
return fold_build2 (MINUS_EXPR, type, expr, elt);
return fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt);

if (POINTER_TYPE_P (TREE_TYPE (expr)))
return fold_build_pointer_plus
(expr, convert_to_ptrofftype
(fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt)));
return fold_build2 (MINUS_EXPR, type1,
fold_convert (type1, expr),
fold_convert (type1, elt));
}

elt = fold_convert (type1, elt);
if (!expr)
return fold_convert (type,
fold_build2 (MULT_EXPR, type1, elt,
double_int_to_tree (type1, scale)));
return fold_build2 (MULT_EXPR, type1, elt,
double_int_to_tree (type1, scale));

if (scale.is_negative ())
{
Expand All @@ -417,13 +428,14 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale,

elt = fold_build2 (MULT_EXPR, type1, elt,
double_int_to_tree (type1, scale));
if (POINTER_TYPE_P (type))
if (POINTER_TYPE_P (TREE_TYPE (expr)))
{
if (code == MINUS_EXPR)
elt = fold_build1 (NEGATE_EXPR, type1, elt);
return fold_build_pointer_plus (expr, elt);
}
return fold_build2 (code, type, expr, elt);
return fold_build2 (code, type1,
fold_convert (type1, expr), elt);
}

/* Makes tree from the affine combination COMB. */
Expand Down

0 comments on commit 78de233

Please sign in to comment.