optabs.c (expand_binop): Tighten conditions for doubleword expansions.
authorBernd Schmidt <bernds@codesourcery.com>
Fri, 8 Jul 2011 13:03:38 +0000 (13:03 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Fri, 8 Jul 2011 13:03:38 +0000 (13:03 +0000)
* optabs.c (expand_binop): Tighten conditions for doubleword
expansions.
(widen_bswap): Assert that mode bitsize and precision are the
same.
* stor-layout.c (get_best_mode): Skip modes that have lower
precision than bitsize.
* recog.c (simplify_while_replacing): Assert that bitsize and
precision are the same.

From-SVN: r176040

gcc/ChangeLog
gcc/optabs.c
gcc/recog.c
gcc/stor-layout.c

index 151211ba38168299967bb1f1d47afe367febb881..f1cabbbc3313ecc26b9a7e1ba344332c4d3bc9ee 100644 (file)
        * rtlanal.c (nonzero_bits1): Don't compare GET_MODE_SIZE against
        a bitsize.
 
+       * optabs.c (expand_binop): Tighten conditions for doubleword
+       expansions.
+       (widen_bswap): Assert that mode bitsize and precision are the
+       same.
+       * stor-layout.c (get_best_mode): Skip modes that have lower
+       precision than bitsize.
+       * recog.c (simplify_while_replacing): Assert that bitsize and
+       precision are the same.
+
 2011-07-08  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * Makefile.in (LIBGCOV): Remove.
index e1e172b5d0dc28d59dd418cb8474bd9df50e5434..915a45e2abbb082149c39edf4f5b1c3d40558d40 100644 (file)
@@ -1428,12 +1428,12 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
      takes operands of this mode and makes a wider mode.  */
 
   if (binoptab == smul_optab
-      && GET_MODE_WIDER_MODE (mode) != VOIDmode
+      && GET_MODE_2XWIDER_MODE (mode) != VOIDmode
       && (optab_handler ((unsignedp ? umul_widen_optab : smul_widen_optab),
-                        GET_MODE_WIDER_MODE (mode))
+                        GET_MODE_2XWIDER_MODE (mode))
          != CODE_FOR_nothing))
     {
-      temp = expand_binop (GET_MODE_WIDER_MODE (mode),
+      temp = expand_binop (GET_MODE_2XWIDER_MODE (mode),
                           unsignedp ? umul_widen_optab : smul_widen_optab,
                           op0, op1, NULL_RTX, unsignedp, OPTAB_DIRECT);
 
@@ -1575,6 +1575,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
       && mclass == MODE_INT
       && (CONST_INT_P (op1) || optimize_insn_for_speed_p ())
       && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
+      && GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode)
       && optab_handler (binoptab, word_mode) != CODE_FOR_nothing
       && optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing
       && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing)
@@ -1647,7 +1648,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
   if ((binoptab == rotl_optab || binoptab == rotr_optab)
       && mclass == MODE_INT
       && CONST_INT_P (op1)
-      && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
+      && GET_MODE_PRECISION (mode) == 2 * BITS_PER_WORD
       && optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing
       && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing)
     {
@@ -2463,6 +2464,8 @@ widen_bswap (enum machine_mode mode, rtx op0, rtx target)
   x = widen_operand (op0, wider_mode, mode, true, true);
   x = expand_unop (wider_mode, bswap_optab, x, NULL_RTX, true);
 
+  gcc_assert (GET_MODE_PRECISION (wider_mode) == GET_MODE_BITSIZE (wider_mode)
+             && GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode));
   if (x != 0)
     x = expand_shift (RSHIFT_EXPR, wider_mode, x,
                      GET_MODE_BITSIZE (wider_mode)
index 0c26c0d90f041ef1dd891b76d4da0cc5609b3d41..933168149a870302575b5e4926bbc16b5eef2439 100644 (file)
@@ -638,6 +638,8 @@ simplify_while_replacing (rtx *loc, rtx to, rtx object,
                  (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
                   offset);
 
+             gcc_assert (GET_MODE_PRECISION (wanted_mode)
+                         == GET_MODE_BITSIZE (wanted_mode));
              pos %= GET_MODE_BITSIZE (wanted_mode);
 
              newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);
index 06014407f6aedb30ee7283c0bce68be08dabb89c..76f27b2c93928eea5dbb9ad3598ab665dc9f4ec2 100644 (file)
@@ -2389,7 +2389,8 @@ get_best_mode (int bitsize, int bitpos, unsigned int align,
        mode = GET_MODE_WIDER_MODE (mode))
     {
       unit = GET_MODE_BITSIZE (mode);
-      if ((bitpos % unit) + bitsize <= unit)
+      if (unit == GET_MODE_PRECISION (mode)
+         && (bitpos % unit) + bitsize <= unit)
        break;
     }
 
@@ -2414,7 +2415,8 @@ get_best_mode (int bitsize, int bitpos, unsigned int align,
           tmode = GET_MODE_WIDER_MODE (tmode))
        {
          unit = GET_MODE_BITSIZE (tmode);
-         if (bitpos / unit == (bitpos + bitsize - 1) / unit
+         if (unit == GET_MODE_PRECISION (tmode)
+             && bitpos / unit == (bitpos + bitsize - 1) / unit
              && unit <= BITS_PER_WORD
              && unit <= MIN (align, BIGGEST_ALIGNMENT)
              && (largest_mode == VOIDmode