* combine.c (simplify_and_const_int): Make sure to apply mask
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Mar 2002 23:33:52 +0000 (23:33 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 28 Mar 2002 23:33:52 +0000 (23:33 +0000)
when force_to_mode returns a constant integer.  PR3311.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51532 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/combine.c

index 5a8d6fc..a804219 100644 (file)
@@ -1,3 +1,8 @@
+Thu Mar 28 16:35:31 2002  Jeffrey A Law  (law@redhat.com)
+
+       * combine.c (simplify_and_const_int): Make sure to apply mask
+       when force_to_mode returns a constant integer.  PR3311.
+
 2002-03-28  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * pa-linux.h (LOCAL_LABEL_PREFIX): Define.
index 0a61187..adb034d 100644 (file)
@@ -7838,14 +7838,23 @@ simplify_and_const_int (x, mode, varop, constop)
   int i;
 
   /* Simplify VAROP knowing that we will be only looking at some of the
-     bits in it.  */
+     bits in it.
+
+     Note by passing in CONSTOP, we guarantee that the bits not set in
+     CONSTOP are not significant and will never be examined.  We must
+     ensure that is the case by explicitly masking out those bits
+     before returning.  */
   varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
 
-  /* If VAROP is a CLOBBER, we will fail so return it; if it is a
-     CONST_INT, we are done.  */
-  if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT)
+  /* If VAROP is a CLOBBER, we will fail so return it.  */
+  if (GET_CODE (varop) == CLOBBER)
     return varop;
 
+  /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
+     to VAROP and return the new constant.  */
+  if (GET_CODE (varop) == CONST_INT)
+    return GEN_INT (trunc_int_for_mode (INTVAL (varop) & constop, mode));
+
   /* See what bits may be nonzero in VAROP.  Unlike the general case of
      a call to nonzero_bits, here we don't care about bits outside
      MODE.  */