From 2854ce58fb3c31916a27ba7ec6f9a477877aeae0 Mon Sep 17 00:00:00 2001
From: bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 24 Jan 2006 14:29:25 +0000
Subject: [PATCH] 2006-01-23  Paolo Bonzini  <bonzini@gnu.org>

        PR rtl-optimization/25890
        PR rtl-optimization/25905
        * combine.c (expand_compound_operation, expand_field_assignment):
        Fail if the bitfield's final position is out of bounds.



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

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 74eba5267d83..d5046c4c801c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-23  Paolo Bonzini  <bonzini@gnu.org>
+
+        PR rtl-optimization/25890
+        PR rtl-optimization/25905
+        * combine.c (expand_compound_operation, expand_field_assignment):
+        Fail if the bitfield's final position is out of bounds.
+
 2006-01-24  Ian Lance Taylor  <ian@airs.com>
 
 	PR middle-end/25930
diff --git a/gcc/combine.c b/gcc/combine.c
index 55f5723a3d7b..0ec45808a8a3 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -5640,8 +5640,9 @@ expand_compound_operation (rtx x)
       len = INTVAL (XEXP (x, 1));
       pos = INTVAL (XEXP (x, 2));
 
-      /* This should stay within the object being extracted, fail.  */
-      gcc_assert (len + pos <= GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))));
+      /* This should stay within the object being extracted, fail otherwise.  */
+      if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
+	return x;
 
       if (BITS_BIG_ENDIAN)
 	pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
@@ -5800,9 +5801,9 @@ expand_field_assignment (rtx x)
 	  pos = XEXP (SET_DEST (x), 2);
 
 	  /* A constant position should stay within the width of INNER.  */
-	  if (GET_CODE (pos) == CONST_INT)
-	    gcc_assert (INTVAL (pos) + len
-			<= GET_MODE_BITSIZE (GET_MODE (inner)));
+	  if (GET_CODE (pos) == CONST_INT
+	      && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
+	    break;
 
 	  if (BITS_BIG_ENDIAN)
 	    {
-- 
GitLab