aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-05-16 16:16:12 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-05-16 16:16:12 -0400
commit930b4e398ec14f8ea10acb0451655802ed4bb134 (patch)
tree2668177355b043cb8a05b31d99702e6891b60930 /gcc
parent9c4dcbc7d34f79065433f49e4dc0649dab00d676 (diff)
downloadgcc-930b4e398ec14f8ea10acb0451655802ed4bb134.zip
gcc-930b4e398ec14f8ea10acb0451655802ed4bb134.tar.gz
gcc-930b4e398ec14f8ea10acb0451655802ed4bb134.tar.bz2
(convert_move): When {zero,sign}_extending, allow a wider intermediate
than to_mode if truncation is a no-op. From-SVN: r7306
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expr.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 38789ff..f6317ee 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -1043,8 +1043,10 @@ convert_move (to, from, unsignedp)
/* Search for a mode to convert via. */
for (intermediate = from_mode; intermediate != VOIDmode;
intermediate = GET_MODE_WIDER_MODE (intermediate))
- if ((can_extend_p (to_mode, intermediate, unsignedp)
- != CODE_FOR_nothing)
+ if (((can_extend_p (to_mode, intermediate, unsignedp)
+ != CODE_FOR_nothing)
+ || (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (intermediate)
+ && TRULY_NOOP_TRUNCATION (to_mode, intermediate)))
&& (can_extend_p (intermediate, from_mode, unsignedp)
!= CODE_FOR_nothing))
{