From 6e814b8d35ad3c0ae7415acf0267c085744fd214 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Fri, 21 Mar 2003 18:03:02 +0000 Subject: [PATCH] combine.c (make_field_assignment): Remove unnecessary AND when storing into zero_extract. * combine.c (make_field_assignment): Remove unnecessary AND when storing into zero_extract. From-SVN: r64674 --- gcc/ChangeLog | 5 +++++ gcc/combine.c | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a65cf80aec..3daf2da32ca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-03-21 Kazu Hirata + + * combine.c (make_field_assignment): Remove unnecessary AND + when storing into zero_extract. + 2003-03-21 Zack Weinberg * aclocal.m4 (gcc_AC_EXAMINE_OBJECT, gcc_AC_C_FLOAT_FORMAT): Delete. diff --git a/gcc/combine.c b/gcc/combine.c index b8e91f54de1..bbbb16e92d9 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7923,6 +7923,17 @@ make_field_assignment (x) : ((unsigned HOST_WIDE_INT) 1 << len) - 1, dest, 0); + /* If SRC is masked by an AND that does not make a difference in + the value being stored, strip it. */ + if (GET_CODE (assign) == ZERO_EXTRACT + && GET_CODE (XEXP (assign, 1)) == CONST_INT + && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT + && GET_CODE (src) == AND + && GET_CODE (XEXP (src, 1)) == CONST_INT + && (INTVAL (XEXP (src, 1)) + == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1)) + src = XEXP (src, 0); + return gen_rtx_SET (VOIDmode, assign, src); } -- 2.30.2