gcc/

2011-10-30  Mikael Pettersson  <mikpe@it.uu.se>

	PR middle-end/50708
	* double-int.c (rshift_double): Avoid infinite recursion with
	lshift_double when negating count would overflow.

--- gcc-4.6.2/gcc/double-int.c.~1~	2010-11-30 17:36:19.000000000 +0100
+++ gcc-4.6.2/gcc/double-int.c	2011-10-30 17:31:30.000000000 +0100
@@ -264,8 +264,14 @@ rshift_double (unsigned HOST_WIDE_INT l1
 
   if (count < 0)
     {
-      lshift_double (l1, h1, -count, prec, lv, hv, arith);
-      return;
+      if (count == INTTYPE_MINIMUM (HOST_WIDE_INT))
+	/* Avoid infinite recursion with lshift_double.  */
+	count = 2 * HOST_BITS_PER_WIDE_INT;
+      else
+        {
+	  lshift_double (l1, h1, -count, prec, lv, hv, arith);
+	  return;
+	}
     }
 
   signmask = (arith
