aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2001-01-03 06:47:28 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2001-01-03 06:47:28 +0000
commit8f8d8d6e320ab3397382c296a5eb42258261acaf (patch)
tree157df1eceb81850325d76e07e3aa784b3de13715 /gcc/combine.c
parent232a132fd6cf2bdcc637c241d37ae9f3a763861f (diff)
downloadgcc-8f8d8d6e320ab3397382c296a5eb42258261acaf.zip
gcc-8f8d8d6e320ab3397382c296a5eb42258261acaf.tar.gz
gcc-8f8d8d6e320ab3397382c296a5eb42258261acaf.tar.bz2
combine.c (simplify_shift_const): Even if we're sign-extracting...
* 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
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index e8a478f..23a31ed 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -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;