From f8d937be1333d515ab4d305c316709c95c5f16a5 Mon Sep 17 00:00:00 2001
From: wilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 14 Apr 2000 23:11:01 +0000
Subject: [PATCH] Fix ia64 gdb miscompilation reported by Kevin Buettner. 
 * combine.c (force_to_mode, case LSHIFTRT): Check that shift shift 	plus
 mask size is smaller or equal to the mode size.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33157 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog | 5 +++++
 gcc/combine.c | 7 +++++++
 2 files changed, 12 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 60fa2cc97981..ff72913193d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Fri Apr 14 16:09:02 2000  Jim Wilson  <wilson@cygnus.com>
+
+	* combine.c (force_to_mode, case LSHIFTRT): Check that shift shift
+	plus mask size is smaller or equal to the mode size.
+
 Fri Apr 14 18:07:30 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
 	* print-rtl.c (print_rtx, case NOTE): Don't blow up if NOTE_BASIC_BLOCK
diff --git a/gcc/combine.c b/gcc/combine.c
index 911ebbf8c9eb..4bcaf388115f 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -6935,10 +6935,17 @@ force_to_mode (x, mode, mask, reg, just_select)
 
       if (GET_CODE (x) == LSHIFTRT
 	  && GET_CODE (XEXP (x, 1)) == CONST_INT
+	  /* The shift puts one of the sign bit copies in the least significant
+	     bit.  */
 	  && ((INTVAL (XEXP (x, 1))
 	       + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
 	      >= GET_MODE_BITSIZE (GET_MODE (x)))
 	  && exact_log2 (mask + 1) >= 0
+	  /* Number of bits left after the shift must be more than the mask
+	     needs.  */
+	  && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
+	      <= GET_MODE_BITSIZE (GET_MODE (x)))
+	  /* Must be more sign bit copies than the mask needs.  */
 	  && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
 	      >= exact_log2 (mask + 1)))
 	x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
-- 
GitLab