re PR middle-end/33290 (gcc.c-torture/execute/930921-1.c fails at -O1 and above now)
authorRichard Sandiford <richard@codesourcery.com>
Mon, 3 Sep 2007 15:35:52 +0000 (15:35 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 3 Sep 2007 15:35:52 +0000 (15:35 +0000)
gcc/
PR middle-end/33290
* optabs.c (avoid_expensive_constant): Canonicalize CONST_INTs
before forcing them into a register.

From-SVN: r128048

gcc/ChangeLog
gcc/optabs.c

index 9bdd53f6a0140500c0b619584571386f27aae738..3526e61feae74ee0861e32dd4cf93be6a19419d6 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-03  Richard Sandiford  <richard@codesourcery.com>
+
+       PR middle-end/33290
+       * optabs.c (avoid_expensive_constant): Canonicalize CONST_INTs
+       before forcing them into a register.
+
 2007-09-03  Richard Sandiford  <richard@codesourcery.com>
 
        * config/mips/mips.md (fetchop_bit): Use define_code_iterator
index fee7c5039cc8d10491dd8345dbcca82f9b9f6dec..8d0139e8fca98b6444b3f6bfb3c7476b810aa4f8 100644 (file)
@@ -1290,7 +1290,13 @@ avoid_expensive_constant (enum machine_mode mode, optab binoptab,
       && CONSTANT_P (x)
       && rtx_cost (x, binoptab->code) > COSTS_N_INSNS (1))
     {
-      if (GET_MODE (x) != VOIDmode)
+      if (GET_CODE (x) == CONST_INT)
+       {
+         HOST_WIDE_INT intval = trunc_int_for_mode (INTVAL (x), mode);
+         if (intval != INTVAL (x))
+           x = GEN_INT (intval);
+       }
+      else
        x = convert_modes (mode, VOIDmode, x, unsignedp);
       x = force_reg (mode, x);
     }