Commit 78de2333 by Richard Biener Committed by Richard Biener

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

2013-09-02  Richard Biener  <rguenther@suse.de>

	* 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
parent 85ff4ec6
2013-09-02 Richard Biener <rguenther@suse.de>
* tree-affine.c (add_elt_to_tree): Avoid converting all pointer
arithmetic to sizetype.
2013-09-02 Bin Cheng <bin.cheng@arm.com> 2013-09-02 Bin Cheng <bin.cheng@arm.com>
* tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates): * tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
......
2013-09-02 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/loop-4.c: Adjust scan looking for one memory
reference.
2013-09-02 Bin Cheng <bin.cheng@arm.com> 2013-09-02 Bin Cheng <bin.cheng@arm.com>
* gcc.target/arm/ivopts-orig_biv-inc.c: New testcase. * gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.
......
...@@ -37,7 +37,7 @@ void xxx(void) ...@@ -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 "\[^\\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. */ /* And the original induction variable should be eliminated. */
......
...@@ -377,35 +377,46 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale, ...@@ -377,35 +377,46 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale,
type1 = sizetype; type1 = sizetype;
scale = double_int_ext_for_comb (scale, comb); 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 (scale.is_one ())
{ {
if (!expr) if (!expr)
return fold_convert (type, elt); return elt;
if (POINTER_TYPE_P (type)) if (POINTER_TYPE_P (TREE_TYPE (expr)))
return fold_build_pointer_plus (expr, elt); return fold_build_pointer_plus (expr, convert_to_ptrofftype (elt));
return fold_build2 (PLUS_EXPR, type, expr, 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 (scale.is_minus_one ())
{ {
if (!expr) if (!expr)
return fold_convert (type, fold_build1 (NEGATE_EXPR, type1, elt)); return fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt);
if (POINTER_TYPE_P (type)) if (POINTER_TYPE_P (TREE_TYPE (expr)))
{ return fold_build_pointer_plus
elt = fold_build1 (NEGATE_EXPR, type1, elt); (expr, convert_to_ptrofftype
return fold_build_pointer_plus (expr, elt); (fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt)));
} return fold_build2 (MINUS_EXPR, type1,
return fold_build2 (MINUS_EXPR, type, expr, elt); fold_convert (type1, expr),
fold_convert (type1, elt));
} }
elt = fold_convert (type1, elt);
if (!expr) if (!expr)
return fold_convert (type, return fold_build2 (MULT_EXPR, type1, elt,
fold_build2 (MULT_EXPR, type1, elt, double_int_to_tree (type1, scale));
double_int_to_tree (type1, scale)));
if (scale.is_negative ()) if (scale.is_negative ())
{ {
...@@ -417,13 +428,14 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale, ...@@ -417,13 +428,14 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale,
elt = fold_build2 (MULT_EXPR, type1, elt, elt = fold_build2 (MULT_EXPR, type1, elt,
double_int_to_tree (type1, scale)); double_int_to_tree (type1, scale));
if (POINTER_TYPE_P (type)) if (POINTER_TYPE_P (TREE_TYPE (expr)))
{ {
if (code == MINUS_EXPR) if (code == MINUS_EXPR)
elt = fold_build1 (NEGATE_EXPR, type1, elt); elt = fold_build1 (NEGATE_EXPR, type1, elt);
return fold_build_pointer_plus (expr, 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. */ /* Makes tree from the affine combination COMB. */
......
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