(store_expr): Do conversion in two steps for promoted lhs.
authorRichard Kenner <kenner@gcc.gnu.org>
Wed, 1 Mar 1995 11:39:01 +0000 (06:39 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 1 Mar 1995 11:39:01 +0000 (06:39 -0500)
From-SVN: r9098

gcc/expr.c

index 7787593c5c5bc5a22f6049d4065bf53f2c7720c6..1ee04801e1abfc92ae2540f49b8da04270424cbd 100644 (file)
@@ -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);