aboutsummaryrefslogtreecommitdiff
path: root/gcc/convert.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-10-03 10:28:50 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-10-03 10:28:50 +0000
commitbcfee578708645649a35bddad5ea48579275f6b5 (patch)
treec0f876e4d6ea20b37981e650091d325e3c79507f /gcc/convert.c
parent8684302d34b6e1a6244f07990d7304b919e2010d (diff)
downloadgcc-bcfee578708645649a35bddad5ea48579275f6b5.zip
gcc-bcfee578708645649a35bddad5ea48579275f6b5.tar.gz
gcc-bcfee578708645649a35bddad5ea48579275f6b5.tar.bz2
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
Diffstat (limited to 'gcc/convert.c')
-rw-r--r--gcc/convert.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/convert.c b/gcc/convert.c
index 3834351..9ef27f6 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -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,