combine.c (simplify_shift_const): Even if we're sign-extracting...
authorAlexandre Oliva <aoliva@redhat.com>
Wed, 3 Jan 2001 06:47:28 +0000 (06:47 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 3 Jan 2001 06:47:28 +0000 (06:47 +0000)
* combine.c (simplify_shift_const): Even if we're sign-extracting,
don't discard an ASHIFTRT if we're shifting in a wider mode.

From-SVN: r38648

gcc/ChangeLog
gcc/combine.c

index cfd6bddc024cce28ccc41ab9718735b07654eeb4..6f16cc21b2cad39df540e36daf6089f1c3d40b6f 100644 (file)
@@ -1,3 +1,8 @@
+2001-01-03  Alexandre Oliva  <aoliva@redhat.com>
+
+       * combine.c (simplify_shift_const): Even if we're sign-extracting,
+       don't discard an ASHIFTRT if we're shifting in a wider mode.
+
 2000-01-02  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * toplev.c (rest_of_compilation): Don't print basic block information
index e8a478f501a3248edafb671286199af662f772ca..23a31eda05dcb94e7af7c17c6c4c62a012a55d06 100644 (file)
@@ -1,6 +1,6 @@
 /* Optimize by combining instructions for GNU compiler.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -9130,9 +9130,14 @@ simplify_shift_const (x, code, result_mode, varop, input_count)
          break;
 
        case ASHIFTRT:
-         /* If we are extracting just the sign bit of an arithmetic right
-            shift, that shift is not needed.  */
-         if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1)
+         /* If we are extracting just the sign bit of an arithmetic
+            right shift, that shift is not needed.  However, the sign
+            bit of a wider mode may be different from what would be
+            interpreted as the sign bit in a narrower mode, so, if
+            the result is narrower, don't discard the shift.  */
+         if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
+             && (GET_MODE_BITSIZE (result_mode)
+                 >= GET_MODE_BITSIZE (GET_MODE (varop))))
            {
              varop = XEXP (varop, 0);
              continue;