rtlanal.c (num_sign_bit_copies1): Improve cases of ANDing or IORing with a constant.
authorAdam Nemet <anemet@caviumnetworks.com>
Fri, 6 Jul 2007 00:20:46 +0000 (00:20 +0000)
committerAdam Nemet <nemet@gcc.gnu.org>
Fri, 6 Jul 2007 00:20:46 +0000 (00:20 +0000)
* rtlanal.c (num_sign_bit_copies1): Improve cases of ANDing or
IORing with a constant.

From-SVN: r126397

gcc/ChangeLog
gcc/rtlanal.c

index b6107178089bae65a26baecb7f74d6347fb9eaea..6c867ebb2656553882b09e7d615bc53af11f4242 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-05  Adam Nemet  <anemet@caviumnetworks.com>
+
+       * rtlanal.c (num_sign_bit_copies1): Improve cases of ANDing or
+       IORing with a constant.
+
 2007-07-05  Seongbae Park  <seongbae.park@gmail.com>
 
        PR rtl-optimization/32475
index 3cdb76a16bd40a2f082259bf84012098ea9de7cf..9535104e7079142c7c3a645c8ba73bd09c96ec2d 100644 (file)
@@ -4290,6 +4290,25 @@ num_sign_bit_copies1 (rtx x, enum machine_mode mode, rtx known_x,
                                         known_x, known_mode, known_ret);
       num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
                                         known_x, known_mode, known_ret);
+
+      /* If num1 is clearing some of the top bits then regardless of
+        the other term, we are guaranteed to have at least that many
+        high-order zero bits.  */
+      if (code == AND
+         && num1 > 1
+         && bitwidth <= HOST_BITS_PER_WIDE_INT
+         && GET_CODE (XEXP (x, 1)) == CONST_INT
+         && !(INTVAL (XEXP (x, 1)) & ((HOST_WIDE_INT) 1 << (bitwidth - 1))))
+       return num1;
+
+      /* Similarly for IOR when setting high-order bits.  */
+      if (code == IOR
+         && num1 > 1
+         && bitwidth <= HOST_BITS_PER_WIDE_INT
+         && GET_CODE (XEXP (x, 1)) == CONST_INT
+         && (INTVAL (XEXP (x, 1)) & ((HOST_WIDE_INT) 1 << (bitwidth - 1))))
+       return num1;
+
       return MIN (num0, num1);
 
     case PLUS:  case MINUS: