simplify-rtx.c (simplify_binary_operation_1): Canonicalize truncated shift counts.
authorRichard Sandiford <rsandifo@nildram.co.uk>
Sun, 7 Oct 2007 18:40:02 +0000 (18:40 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 7 Oct 2007 18:40:02 +0000 (18:40 +0000)
gcc/
* simplify-rtx.c (simplify_binary_operation_1): Canonicalize
truncated shift counts.

From-SVN: r129072

gcc/ChangeLog
gcc/simplify-rtx.c

index db4a7d011a9534f52a6ad5339f0e00b59be6efed..7562e40d616de917862def85e7199d07a30b4e71 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-07  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       * simplify-rtx.c (simplify_binary_operation_1): Canonicalize
+       truncated shift counts.
+
 2007-10-07  Kazu Hirata  <kazu@codesourcery.com>
 
        * config/m68k/m68k.c, config/m68k/m68k.md: Use the assembly
index 8e02612f481b9f41eebf7e5b8eb07a25d09e7bff..0371339d5405ceebf2cf77c0ae07124a4bed6e32 100644 (file)
@@ -2562,6 +2562,13 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
          && (unsigned HOST_WIDE_INT) INTVAL (trueop0) == GET_MODE_MASK (mode)
          && ! side_effects_p (op1))
        return op0;
+    canonicalize_shift:
+      if (SHIFT_COUNT_TRUNCATED && GET_CODE (op1) == CONST_INT)
+       {
+         val = INTVAL (op1) & (GET_MODE_BITSIZE (mode) - 1);
+         if (val != INTVAL (op1))
+           return simplify_gen_binary (code, mode, op0, GEN_INT (val));
+       }
       break;
 
     case ASHIFT:
@@ -2571,7 +2578,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
        return op0;
       if (trueop0 == CONST0_RTX (mode) && ! side_effects_p (op1))
        return op0;
-      break;
+      goto canonicalize_shift;
 
     case LSHIFTRT:
       if (trueop1 == CONST0_RTX (mode))
@@ -2593,7 +2600,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
            return simplify_gen_relational (EQ, mode, imode,
                                            XEXP (op0, 0), const0_rtx);
        }
-      break;
+      goto canonicalize_shift;
 
     case SMIN:
       if (width <= HOST_BITS_PER_WIDE_INT