PR bootstrap/39454
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Mar 2009 08:10:55 +0000 (08:10 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Mar 2009 08:10:55 +0000 (08:10 +0000)
* cse.c (fold_rtx): Don't modify original const_arg1 when
canonicalizing SHIFT_COUNT_TRUNCATED shift count, do it on a
separate variable instead.
* rtlanal.c (nonzero_bits1) <case ASHIFTRT>: Don't assume anything
from out of range shift counts.
(num_sign_bit_copies1) <case ASHIFTRT, case ASHIFT>: Similarly.

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

gcc/ChangeLog
gcc/cse.c
gcc/rtlanal.c

index 000add7..5cd91bd 100644 (file)
@@ -1,6 +1,15 @@
+2009-03-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR bootstrap/39454
+       * cse.c (fold_rtx): Don't modify original const_arg1 when
+       canonicalizing SHIFT_COUNT_TRUNCATED shift count, do it on a
+       separate variable instead.
+       * rtlanal.c (nonzero_bits1) <case ASHIFTRT>: Don't assume anything
+       from out of range shift counts.
+       (num_sign_bit_copies1) <case ASHIFTRT, case ASHIFT>: Similarly.
+
 2008-03-13  Catherine Moore  <clm@codesourcery.com>
 
-       gcc/
        *  gcc/config/i386/x-mingw32 (host-mingw32.o): Replace
        diagnostic.h with $(DIAGNOSTIC_H).
 
index bab0908..04f52fb 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -3464,6 +3464,7 @@ fold_rtx (rtx x, rtx insn)
              int is_shift
                = (code == ASHIFT || code == ASHIFTRT || code == LSHIFTRT);
              rtx y, inner_const, new_const;
+             rtx canon_const_arg1 = const_arg1;
              enum rtx_code associate_code;
 
              if (is_shift
@@ -3471,8 +3472,9 @@ fold_rtx (rtx x, rtx insn)
                      || INTVAL (const_arg1) < 0))
                {
                  if (SHIFT_COUNT_TRUNCATED)
-                   const_arg1 = GEN_INT (INTVAL (const_arg1)
-                                         & (GET_MODE_BITSIZE (mode) - 1));
+                   canon_const_arg1 = GEN_INT (INTVAL (const_arg1)
+                                               & (GET_MODE_BITSIZE (mode)
+                                                  - 1));
                  else
                    break;
                }
@@ -3531,7 +3533,8 @@ fold_rtx (rtx x, rtx insn)
              associate_code = (is_shift || code == MINUS ? PLUS : code);
 
              new_const = simplify_binary_operation (associate_code, mode,
-                                                    const_arg1, inner_const);
+                                                    canon_const_arg1,
+                                                    inner_const);
 
              if (new_const == 0)
                break;
index 26f69b0..b35d774 100644 (file)
@@ -4061,7 +4061,8 @@ nonzero_bits1 (const_rtx x, enum machine_mode mode, const_rtx known_x,
         low-order bits by left shifts.  */
       if (GET_CODE (XEXP (x, 1)) == CONST_INT
          && INTVAL (XEXP (x, 1)) >= 0
-         && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
+         && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
+         && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (GET_MODE (x)))
        {
          enum machine_mode inner_mode = GET_MODE (x);
          unsigned int width = GET_MODE_BITSIZE (inner_mode);
@@ -4542,7 +4543,8 @@ num_sign_bit_copies1 (const_rtx x, enum machine_mode mode, const_rtx known_x,
       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
                                         known_x, known_mode, known_ret);
       if (GET_CODE (XEXP (x, 1)) == CONST_INT
-         && INTVAL (XEXP (x, 1)) > 0)
+         && INTVAL (XEXP (x, 1)) > 0
+         && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (GET_MODE (x)))
        num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1)));
 
       return num0;
@@ -4551,7 +4553,8 @@ num_sign_bit_copies1 (const_rtx x, enum machine_mode mode, const_rtx known_x,
       /* Left shifts destroy copies.  */
       if (GET_CODE (XEXP (x, 1)) != CONST_INT
          || INTVAL (XEXP (x, 1)) < 0
-         || INTVAL (XEXP (x, 1)) >= (int) bitwidth)
+         || INTVAL (XEXP (x, 1)) >= (int) bitwidth
+         || INTVAL (XEXP (x, 1)) >= GET_MODE_BITSIZE (GET_MODE (x)))
        return 1;
 
       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,