combine.c (make_field_assignment): Remove unnecessary AND when storing into zero_extract.
authorKazu Hirata <kazu@cs.umass.edu>
Fri, 21 Mar 2003 18:03:02 +0000 (18:03 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Fri, 21 Mar 2003 18:03:02 +0000 (18:03 +0000)
* combine.c (make_field_assignment): Remove unnecessary AND
when storing into zero_extract.

From-SVN: r64674

gcc/ChangeLog
gcc/combine.c

index 2a65cf80aec068aff7679f8b0958bf731d3a9dac..3daf2da32ca5eaea796f036b3636f6b8e2555953 100644 (file)
@@ -1,3 +1,8 @@
+2003-03-21  Kazu Hirata  <kazu@cs.umass.edu>
+
+       * combine.c (make_field_assignment): Remove unnecessary AND
+       when storing into zero_extract.
+
 2003-03-21  Zack Weinberg  <zack@codesourcery.com>
 
        * aclocal.m4 (gcc_AC_EXAMINE_OBJECT, gcc_AC_C_FLOAT_FORMAT): Delete.
index b8e91f54de109bde81d3de601078fe5ca4491a70..bbbb16e92d96eb8fd5279e7f8be6631829198d5c 100644 (file)
@@ -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);
 }
 \f