(fold_rtx): Correct check for associating shifts and ending up with a shift count...
authorRichard Stallman <rms@gnu.org>
Fri, 28 May 1993 22:40:33 +0000 (22:40 +0000)
committerRichard Stallman <rms@gnu.org>
Fri, 28 May 1993 22:40:33 +0000 (22:40 +0000)
(fold_rtx): Correct check for associating shifts and
ending up with a shift count too large; convert to the
largest valid for ASHIFTRT and don't fold all others.

From-SVN: r4585

gcc/cse.c

index 3d2702fbbe3c3ccc093d3acaead7038a3b5d9261..8ae97142760576a03a8046fd7f9428bc0fbe306f 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5283,13 +5283,21 @@ fold_rtx (x, insn)
                break;
 
              /* If we are associating shift operations, don't let this
-                produce a shift of larger than the object.  This could
-                occur when we following a sign-extend by a right shift on
-                a machine that does a sign-extend as a pair of shifts.  */
+                produce a shift of the size of the object or larger.
+                This could occur when we follow a sign-extend by a right
+                shift on a machine that does a sign-extend as a pair
+                of shifts.  */
 
              if (is_shift && GET_CODE (new_const) == CONST_INT
-                 && INTVAL (new_const) > GET_MODE_BITSIZE (mode))
-               break;
+                 && INTVAL (new_const) >= GET_MODE_BITSIZE (mode))
+               {
+                 /* As an exception, we can turn an ASHIFTRT of this
+                    form into a shift of the number of bits - 1.  */
+                 if (code == ASHIFTRT)
+                   new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1);
+                 else
+                   break;
+               }
 
              y = copy_rtx (XEXP (y, 0));