From bcfee578708645649a35bddad5ea48579275f6b5 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 3 Oct 2014 10:28:50 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/convert.c | 29 ++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62903f44762..56add5bffc1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-10-03 Eric Botcazou + + * convert.c (convert_to_integer): Do not introduce useless conversions + between integral types. + 2014-10-03 David Sherwood * ira-int.h (ira_allocno): Mark hard_regno as signed. diff --git a/gcc/convert.c b/gcc/convert.c index 3834351aad5..9ef27f6347f 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, -- 2.30.2