Commit 29e810b9 by Richard Biener Committed by Richard Biener

tree-affine.c (add_elt_to_tree): Fix association issue...

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

	* tree-affine.c (add_elt_to_tree): Fix association issue,
	avoid useless converts and make sure to always return a
	properly typed result.

From-SVN: r202205
parent dbfc2894
2013-09-03 Richard Biener <rguenther@suse.de> 2013-09-03 Richard Biener <rguenther@suse.de>
* tree-affine.c (add_elt_to_tree): Fix association issue,
avoid useless converts and make sure to always return a
properly typed result.
2013-09-03 Richard Biener <rguenther@suse.de>
PR middle-end/57656 PR middle-end/57656
* fold-const.c (negate_expr_p): Fix division case. * fold-const.c (negate_expr_p): Fix division case.
(negate_expr): Likewise. (negate_expr): Likewise.
......
...@@ -381,36 +381,43 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale, ...@@ -381,36 +381,43 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale,
if (scale.is_minus_one () if (scale.is_minus_one ()
&& POINTER_TYPE_P (TREE_TYPE (elt))) && POINTER_TYPE_P (TREE_TYPE (elt)))
{ {
elt = fold_build1 (NEGATE_EXPR, sizetype, convert_to_ptrofftype (elt)); elt = convert_to_ptrofftype (elt);
elt = fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt);
scale = double_int_one; scale = double_int_one;
} }
if (scale.is_one ()) if (scale.is_one ())
{ {
if (!expr) if (!expr)
return elt; {
if (POINTER_TYPE_P (TREE_TYPE (elt)))
return elt;
else
return fold_convert (type1, elt);
}
if (POINTER_TYPE_P (TREE_TYPE (expr))) if (POINTER_TYPE_P (TREE_TYPE (expr)))
return fold_build_pointer_plus (expr, convert_to_ptrofftype (elt)); return fold_build_pointer_plus (expr, elt);
if (POINTER_TYPE_P (TREE_TYPE (elt))) if (POINTER_TYPE_P (TREE_TYPE (elt)))
return fold_build_pointer_plus (elt, convert_to_ptrofftype (expr)); return fold_build_pointer_plus (elt, expr);
return fold_build2 (PLUS_EXPR, type1, return fold_build2 (PLUS_EXPR, type1,
fold_convert (type1, expr), expr, fold_convert (type1, elt));
fold_convert (type1, elt));
} }
if (scale.is_minus_one ()) if (scale.is_minus_one ())
{ {
if (!expr) if (!expr)
return fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt); return fold_build1 (NEGATE_EXPR, type1,
fold_convert (type1, elt));
if (POINTER_TYPE_P (TREE_TYPE (expr))) if (POINTER_TYPE_P (TREE_TYPE (expr)))
return fold_build_pointer_plus {
(expr, convert_to_ptrofftype elt = convert_to_ptrofftype (elt);
(fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt))); elt = fold_build1 (NEGATE_EXPR, TREE_TYPE (elt), elt);
return fold_build_pointer_plus (expr, elt);
}
return fold_build2 (MINUS_EXPR, type1, return fold_build2 (MINUS_EXPR, type1,
fold_convert (type1, expr), expr, fold_convert (type1, elt));
fold_convert (type1, elt));
} }
elt = fold_convert (type1, elt); elt = fold_convert (type1, elt);
...@@ -434,8 +441,7 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale, ...@@ -434,8 +441,7 @@ add_elt_to_tree (tree expr, tree type, tree elt, double_int scale,
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, type1, return fold_build2 (code, type1, expr, elt);
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