From f635a84d96e160cf99e6e310e9caf6de0b889986 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Wed, 1 Mar 1995 06:39:01 -0500 Subject: [PATCH] (store_expr): Do conversion in two steps for promoted lhs. From-SVN: r9098 --- gcc/expr.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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); -- 2.30.2