From: Richard Kenner Date: Wed, 1 Mar 1995 11:39:01 +0000 (-0500) Subject: (store_expr): Do conversion in two steps for promoted lhs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f635a84d96e160cf99e6e310e9caf6de0b889986;p=gcc.git (store_expr): Do conversion in two steps for promoted lhs. From-SVN: r9098 --- diff --git a/gcc/expr.c b/gcc/expr.c index 7787593c5c5..1ee04801e1a 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -2743,11 +2743,23 @@ store_expr (exp, target, want_value) expression. */ { /* If we don't want a value, we can do the conversion inside EXP, - which will often result in some optimizations. */ + which will often result in some optimizations. Do the conversion + in two steps: first change the signedness, if needed, then + the extend. */ if (! want_value) - exp = convert (type_for_mode (GET_MODE (SUBREG_REG (target)), - SUBREG_PROMOTED_UNSIGNED_P (target)), - exp); + { + if (TREE_UNSIGNED (TREE_TYPE (exp)) + != SUBREG_PROMOTED_UNSIGNED_P (target)) + exp + = convert + (signed_or_unsigned_type (SUBREG_PROMOTED_UNSIGNED_P (target), + TREE_TYPE (exp)), + exp); + + exp = convert (type_for_mode (GET_MODE (SUBREG_REG (target)), + SUBREG_PROMOTED_UNSIGNED_P (target)), + exp); + } temp = expand_expr (exp, NULL_RTX, VOIDmode, 0);