This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, middle-end] Improve num_sign_bit_copies when ANDing with a const
- From: Adam Nemet <anemet at caviumnetworks dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 25 Jun 2007 21:13:51 -0700
- Subject: [PATCH, middle-end] Improve num_sign_bit_copies when ANDing with a const
For AND and IOR, num_sign_bit_copies returns the minimum number of
sign-bit copies of its operands. We can do better when these are used
to clear or set high order bits.
Tested on mipsisa64-elf, boostrapped and tested on x86_64-linux.
OK after the lockdown?
Adam
* rtlanal.c (num_sign_bit_copies1) <AND, IOR>: Improve cases
of ANDing or IORing with a constant.
Index: rtlanal.c
===================================================================
--- rtlanal.c (revision 125932)
+++ rtlanal.c (working copy)
@@ -4290,6 +4290,25 @@ num_sign_bit_copies1 (rtx x, enum machin
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: