diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-10-03 10:28:50 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-10-03 10:28:50 +0000 |
commit | bcfee578708645649a35bddad5ea48579275f6b5 (patch) | |
tree | c0f876e4d6ea20b37981e650091d325e3c79507f /gcc/convert.c | |
parent | 8684302d34b6e1a6244f07990d7304b919e2010d (diff) | |
download | gcc-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.c | 29 |
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, |