convert.c (convert_to_integer): Do not introduce useless conversions between integral types.

* convert.c (convert_to_integer): Do not introduce useless conversions
	between integral types.

From-SVN: r215843
This commit is contained in:
Eric Botcazou 2014-10-03 10:28:50 +00:00 committed by Eric Botcazou
parent 8684302d34
commit bcfee57870
2 changed files with 29 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2014-10-03 Eric Botcazou <ebotcazou@adacore.com>
* convert.c (convert_to_integer): Do not introduce useless conversions
between integral types.
2014-10-03 David Sherwood <david.sherwood@arm.com>
* ira-int.h (ira_allocno): Mark hard_regno as signed.

View File

@ -746,8 +746,9 @@ convert_to_integer (tree type, tree expr)
/* Can't do arithmetic in enumeral types
so use an integer type that will hold the values. */
if (TREE_CODE (typex) == ENUMERAL_TYPE)
typex = lang_hooks.types.type_for_size
(TYPE_PRECISION (typex), TYPE_UNSIGNED (typex));
typex
= lang_hooks.types.type_for_size (TYPE_PRECISION (typex),
TYPE_UNSIGNED (typex));
/* But now perhaps TYPEX is as wide as INPREC.
In that case, do nothing special here.
@ -788,9 +789,15 @@ convert_to_integer (tree type, tree expr)
&& (ex_form == PLUS_EXPR
|| ex_form == MINUS_EXPR
|| ex_form == MULT_EXPR)))
typex = unsigned_type_for (typex);
{
if (!TYPE_UNSIGNED (typex))
typex = unsigned_type_for (typex);
}
else
typex = signed_type_for (typex);
{
if (TYPE_UNSIGNED (typex))
typex = signed_type_for (typex);
}
return convert (type,
fold_build2 (ex_form, typex,
convert (typex, arg0),
@ -805,7 +812,19 @@ convert_to_integer (tree type, tree expr)
/* This is not correct for ABS_EXPR,
since we must test the sign before truncation. */
{
tree typex = unsigned_type_for (type);
/* Do the arithmetic in type TYPEX,
then convert result to TYPE. */
tree typex = type;
/* Can't do arithmetic in enumeral types
so use an integer type that will hold the values. */
if (TREE_CODE (typex) == ENUMERAL_TYPE)
typex
= lang_hooks.types.type_for_size (TYPE_PRECISION (typex),
TYPE_UNSIGNED (typex));
if (!TYPE_UNSIGNED (typex))
typex = unsigned_type_for (typex);
return convert (type,
fold_build1 (ex_form, typex,
convert (typex,