From 22761ec3b9b4688e515019b6b97025fda5be6a44 Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Fri, 6 Jul 2007 00:20:46 +0000 Subject: [PATCH] rtlanal.c (num_sign_bit_copies1): Improve cases of ANDing or IORing with a constant. * rtlanal.c (num_sign_bit_copies1): Improve cases of ANDing or IORing with a constant. From-SVN: r126397 --- gcc/ChangeLog | 5 +++++ gcc/rtlanal.c | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b6107178089..6c867ebb265 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-07-05 Adam Nemet + + * rtlanal.c (num_sign_bit_copies1): Improve cases of ANDing or + IORing with a constant. + 2007-07-05 Seongbae Park PR rtl-optimization/32475 diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 3cdb76a16bd..9535104e707 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -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: -- 2.30.2