Use rtx_mode_t instead of std::make_pair
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 18 Nov 2016 10:04:53 +0000 (10:04 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 18 Nov 2016 10:04:53 +0000 (10:04 +0000)
This change makes the code less sensitive to the exact type of the mode,
i.e. it forces a conversion where necessary.  This becomes important
when wrappers like scalar_int_mode and scalar_mode can also be used
instead of machine_mode.

Using rtx_mode_t also abstracts away the representation.  The fact that
it's a std::pair rather than a custom class isn't important to users of
the interface.

gcc/
2016-11-18  Richard Sandiford  <richard.sandiford@arm.com>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

* combine.c (try_combine): Use rtx_mode_t instead of std::make_pair.
* dwarf2out.c (mem_loc_descriptor, loc_descriptor): Likewise.
(add_const_value_attribute): Likewise.
* explow.c (plus_constant): Likewise.
* expmed.c (expand_mult, make_tree): Likewise.
* expr.c (convert_modes): Likewise.
* loop-doloop.c (doloop_optimize): Likewise.
* postreload.c (reload_cse_simplify_set): Likewise.
* simplify-rtx.c (simplify_const_unary_operation): Likewise.
(simplify_binary_operation_1, simplify_const_binary_operation):
(simplify_const_relational_operation, simplify_immed_subreg): Likewise.
* wide-int.h: Update documentation to recommend rtx_mode_t
instead of std::make_pair.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r242586

gcc/ChangeLog
gcc/combine.c
gcc/dwarf2out.c
gcc/explow.c
gcc/expmed.c
gcc/expr.c
gcc/loop-doloop.c
gcc/postreload.c
gcc/simplify-rtx.c
gcc/wide-int.h

index b4291641e67f89bf7d4864ab69de3fa10fde1c8f..a63c7952ce15407b947228398dfef6e6f2777cdf 100644 (file)
@@ -1,3 +1,21 @@
+2016-11-18  Richard Sandiford  <richard.sandiford@arm.com>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * combine.c (try_combine): Use rtx_mode_t instead of std::make_pair.
+       * dwarf2out.c (mem_loc_descriptor, loc_descriptor): Likewise.
+       (add_const_value_attribute): Likewise.
+       * explow.c (plus_constant): Likewise.
+       * expmed.c (expand_mult, make_tree): Likewise.
+       * expr.c (convert_modes): Likewise.
+       * loop-doloop.c (doloop_optimize): Likewise.
+       * postreload.c (reload_cse_simplify_set): Likewise.
+       * simplify-rtx.c (simplify_const_unary_operation): Likewise.
+       (simplify_binary_operation_1, simplify_const_binary_operation):
+       (simplify_const_relational_operation, simplify_immed_subreg): Likewise.
+       * wide-int.h: Update documentation to recommend rtx_mode_t
+       instead of std::make_pair.
+
 2016-11-18  Richard Sandiford  <richard.sandiford@arm.com>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 5f920c4a55e9413aa5fd46a2eeb891d5bbb809ca..93621bd02fbb61ac7634f82ccf28e20d331bd23b 100644 (file)
@@ -2870,8 +2870,8 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
          rtx outer = SET_SRC (temp_expr);
 
          wide_int o
-           = wi::insert (std::make_pair (outer, GET_MODE (SET_DEST (temp_expr))),
-                         std::make_pair (inner, GET_MODE (dest)),
+           = wi::insert (rtx_mode_t (outer, GET_MODE (SET_DEST (temp_expr))),
+                         rtx_mode_t (inner, GET_MODE (dest)),
                          offset, width);
 
          combine_merges++;
index a7344ca01363e594879297fb13f83fc328d93faf..e468a4c3299d34f4927896ad15d8cf97076076dc 100644 (file)
@@ -15127,7 +15127,7 @@ mem_loc_descriptor (rtx rtl, machine_mode mode,
          mem_loc_result->dw_loc_oprnd2.val_class
            = dw_val_class_wide_int;
          mem_loc_result->dw_loc_oprnd2.v.val_wide = ggc_alloc<wide_int> ();
-         *mem_loc_result->dw_loc_oprnd2.v.val_wide = std::make_pair (rtl, mode);
+         *mem_loc_result->dw_loc_oprnd2.v.val_wide = rtx_mode_t (rtl, mode);
        }
       break;
 
@@ -15670,7 +15670,7 @@ loc_descriptor (rtx rtl, machine_mode mode,
                                      GET_MODE_SIZE (mode), 0);
          loc_result->dw_loc_oprnd2.val_class = dw_val_class_wide_int;
          loc_result->dw_loc_oprnd2.v.val_wide = ggc_alloc<wide_int> ();
-         *loc_result->dw_loc_oprnd2.v.val_wide = std::make_pair (rtl, mode);
+         *loc_result->dw_loc_oprnd2.v.val_wide = rtx_mode_t (rtl, mode);
        }
       break;
 
@@ -15695,7 +15695,7 @@ loc_descriptor (rtx rtl, machine_mode mode,
              for (i = 0, p = array; i < length; i++, p += elt_size)
                {
                  rtx elt = CONST_VECTOR_ELT (rtl, i);
-                 insert_wide_int (std::make_pair (elt, imode), p, elt_size);
+                 insert_wide_int (rtx_mode_t (elt, imode), p, elt_size);
                }
              break;
 
@@ -18357,7 +18357,7 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
 
     case CONST_WIDE_INT:
       {
-       wide_int w1 = std::make_pair (rtl, MAX_MODE_INT);
+       wide_int w1 = rtx_mode_t (rtl, MAX_MODE_INT);
        unsigned int prec = MIN (wi::min_precision (w1, UNSIGNED),
                                 (unsigned int)CONST_WIDE_INT_NUNITS (rtl) * HOST_BITS_PER_WIDE_INT);
        wide_int w = wi::zext (w1, prec);
@@ -18404,7 +18404,7 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
            for (i = 0, p = array; i < length; i++, p += elt_size)
              {
                rtx elt = CONST_VECTOR_ELT (rtl, i);
-               insert_wide_int (std::make_pair (elt, imode), p, elt_size);
+               insert_wide_int (rtx_mode_t (elt, imode), p, elt_size);
              }
            break;
 
index b65eee6e9218aaec6e598e79ccc26e9797e2b847..75af333c1c318bcd17ef166d6de27263eafb83cc 100644 (file)
@@ -98,8 +98,7 @@ plus_constant (machine_mode mode, rtx x, HOST_WIDE_INT c,
   switch (code)
     {
     CASE_CONST_SCALAR_INT:
-      return immed_wide_int_const (wi::add (std::make_pair (x, mode), c),
-                                  mode);
+      return immed_wide_int_const (wi::add (rtx_mode_t (x, mode), c), mode);
     case MEM:
       /* If this is a reference to the constant pool, try replacing it with
         a reference to a new constant.  If the resulting address isn't
index 69109db0ebd447e5adb898491f24ab8206ce1982..a21a632ab189f9226879ccf3704401060e61df0e 100644 (file)
@@ -3276,7 +3276,7 @@ expand_mult (machine_mode mode, rtx op0, rtx op1, rtx target,
       else if (CONST_DOUBLE_AS_INT_P (scalar_op1))
 #endif
        {
-         int shift = wi::exact_log2 (std::make_pair (scalar_op1, mode));
+         int shift = wi::exact_log2 (rtx_mode_t (scalar_op1, mode));
          /* Perfect power of 2 (other than 1, which is handled above).  */
          if (shift > 0)
            return expand_shift (LSHIFT_EXPR, mode, op0,
@@ -5092,7 +5092,7 @@ make_tree (tree type, rtx x)
     {
     case CONST_INT:
     case CONST_WIDE_INT:
-      t = wide_int_to_tree (type, std::make_pair (x, TYPE_MODE (type)));
+      t = wide_int_to_tree (type, rtx_mode_t (x, TYPE_MODE (type)));
       return t;
 
     case CONST_DOUBLE:
index 985c2b3285f9289eeaac43293f85195b5f3d0d5b..a51c16478d3edc23daa98a751f848eb334d39d3b 100644 (file)
@@ -652,7 +652,7 @@ convert_modes (machine_mode mode, machine_mode oldmode, rtx x, int unsignedp)
         assume that all the bits are significant.  */
       if (GET_MODE_CLASS (oldmode) != MODE_INT)
        oldmode = MAX_MODE_INT;
-      wide_int w = wide_int::from (std::make_pair (x, oldmode),
+      wide_int w = wide_int::from (rtx_mode_t (x, oldmode),
                                   GET_MODE_PRECISION (mode),
                                   unsignedp ? UNSIGNED : SIGNED);
       return immed_wide_int_const (w, mode);
index a80551960148610eefe3b43002e5c1e69380ae06..1dff2ff3f88f2c9fbab8c94d3435f5da8f32f7ba 100644 (file)
@@ -662,7 +662,7 @@ doloop_optimize (struct loop *loop)
     }
 
   if (desc->const_iter)
-    iterations = widest_int::from (std::make_pair (desc->niter_expr, mode),
+    iterations = widest_int::from (rtx_mode_t (desc->niter_expr, mode),
                                   UNSIGNED);
   else
     iterations = 0;
index a11d2705dab147ff68d90f1d0a2502f3cbb3703e..fcb6bc4bd50d10500379b728797f9f2a0172fe83 100644 (file)
@@ -290,13 +290,13 @@ reload_cse_simplify_set (rtx set, rtx_insn *insn)
              switch (extend_op)
                {
                case ZERO_EXTEND:
-                 result = wide_int::from (std::make_pair (this_rtx,
-                                                          GET_MODE (src)),
+                 result = wide_int::from (rtx_mode_t (this_rtx,
+                                                      GET_MODE (src)),
                                           BITS_PER_WORD, UNSIGNED);
                  break;
                case SIGN_EXTEND:
-                 result = wide_int::from (std::make_pair (this_rtx,
-                                                          GET_MODE (src)),
+                 result = wide_int::from (rtx_mode_t (this_rtx,
+                                                      GET_MODE (src)),
                                           BITS_PER_WORD, SIGNED);
                  break;
                default:
index 11a2e0267c7d182f2d92ebc86befe6b70c606384..fde244302481ce2b71211d12717383f1ecfbf8d0 100644 (file)
@@ -1716,7 +1716,7 @@ simplify_const_unary_operation (enum rtx_code code, machine_mode mode,
          op_mode = MAX_MODE_INT;
        }
 
-      real_from_integer (&d, mode, std::make_pair (op, op_mode), SIGNED);
+      real_from_integer (&d, mode, rtx_mode_t (op, op_mode), SIGNED);
 
       /* Avoid the folding if flag_signaling_nans is on and
          operand is a signaling NaN.  */
@@ -1740,7 +1740,7 @@ simplify_const_unary_operation (enum rtx_code code, machine_mode mode,
          op_mode = MAX_MODE_INT;
        }
 
-      real_from_integer (&d, mode, std::make_pair (op, op_mode), UNSIGNED);
+      real_from_integer (&d, mode, rtx_mode_t (op, op_mode), UNSIGNED);
 
       /* Avoid the folding if flag_signaling_nans is on and
          operand is a signaling NaN.  */
@@ -1755,7 +1755,7 @@ simplify_const_unary_operation (enum rtx_code code, machine_mode mode,
     {
       wide_int result;
       machine_mode imode = op_mode == VOIDmode ? mode : op_mode;
-      rtx_mode_t op0 = std::make_pair (op, imode);
+      rtx_mode_t op0 = rtx_mode_t (op, imode);
       int int_value;
 
 #if TARGET_SUPPORTS_WIDE_INT == 0
@@ -2150,7 +2150,7 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
          else if (GET_CODE (lhs) == MULT
                   && CONST_SCALAR_INT_P (XEXP (lhs, 1)))
            {
-             coeff0 = std::make_pair (XEXP (lhs, 1), mode);
+             coeff0 = rtx_mode_t (XEXP (lhs, 1), mode);
              lhs = XEXP (lhs, 0);
            }
          else if (GET_CODE (lhs) == ASHIFT
@@ -2171,7 +2171,7 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
          else if (GET_CODE (rhs) == MULT
                   && CONST_INT_P (XEXP (rhs, 1)))
            {
-             coeff1 = std::make_pair (XEXP (rhs, 1), mode);
+             coeff1 = rtx_mode_t (XEXP (rhs, 1), mode);
              rhs = XEXP (rhs, 0);
            }
          else if (GET_CODE (rhs) == ASHIFT
@@ -2327,7 +2327,7 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
          else if (GET_CODE (lhs) == MULT
                   && CONST_SCALAR_INT_P (XEXP (lhs, 1)))
            {
-             coeff0 = std::make_pair (XEXP (lhs, 1), mode);
+             coeff0 = rtx_mode_t (XEXP (lhs, 1), mode);
              lhs = XEXP (lhs, 0);
            }
          else if (GET_CODE (lhs) == ASHIFT
@@ -2348,7 +2348,7 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
          else if (GET_CODE (rhs) == MULT
                   && CONST_INT_P (XEXP (rhs, 1)))
            {
-             negcoeff1 = wi::neg (std::make_pair (XEXP (rhs, 1), mode));
+             negcoeff1 = wi::neg (rtx_mode_t (XEXP (rhs, 1), mode));
              rhs = XEXP (rhs, 0);
            }
          else if (GET_CODE (rhs) == ASHIFT
@@ -2523,7 +2523,7 @@ simplify_binary_operation_1 (enum rtx_code code, machine_mode mode,
       /* Convert multiply by constant power of two into shift.  */
       if (CONST_SCALAR_INT_P (trueop1))
        {
-         val = wi::exact_log2 (std::make_pair (trueop1, mode));
+         val = wi::exact_log2 (rtx_mode_t (trueop1, mode));
          if (val >= 0)
            return simplify_gen_binary (ASHIFT, mode, op0, GEN_INT (val));
        }
@@ -4046,8 +4046,8 @@ simplify_const_binary_operation (enum rtx_code code, machine_mode mode,
     {
       wide_int result;
       bool overflow;
-      rtx_mode_t pop0 = std::make_pair (op0, mode);
-      rtx_mode_t pop1 = std::make_pair (op1, mode);
+      rtx_mode_t pop0 = rtx_mode_t (op0, mode);
+      rtx_mode_t pop1 = rtx_mode_t (op1, mode);
 
 #if TARGET_SUPPORTS_WIDE_INT == 0
       /* This assert keeps the simplification from producing a result
@@ -5081,8 +5081,8 @@ simplify_const_relational_operation (enum rtx_code code,
         largest int representable on the target is as good as
         infinite.  */
       machine_mode cmode = (mode == VOIDmode) ? MAX_MODE_INT : mode;
-      rtx_mode_t ptrueop0 = std::make_pair (trueop0, cmode);
-      rtx_mode_t ptrueop1 = std::make_pair (trueop1, cmode);
+      rtx_mode_t ptrueop0 = rtx_mode_t (trueop0, cmode);
+      rtx_mode_t ptrueop1 = rtx_mode_t (trueop1, cmode);
 
       if (wi::eq_p (ptrueop0, ptrueop1))
        return comparison_result (code, CMP_EQ);
@@ -5738,7 +5738,7 @@ simplify_immed_subreg (machine_mode outermode, rtx op,
 
        case CONST_WIDE_INT:
          {
-           rtx_mode_t val = std::make_pair (el, innermode);
+           rtx_mode_t val = rtx_mode_t (el, innermode);
            unsigned char extend = wi::sign_mask (val);
 
            for (i = 0; i < elem_bitsize; i += value_bit)
index f172faecf871d5d3364c4d4e993acce9240f98a4..72f74bed9ec01b3c79e9bb3c630d16ffb3a6b882 100644 (file)
@@ -158,10 +158,10 @@ along with GCC; see the file COPYING3.  If not see
    However, a little more syntax is required for rtl constants since
    they do not have an explicit precision.  To make an rtl into a
    wide_int, you have to pair it with a mode.  The canonical way to do
-   this is with std::make_pair as in:
+   this is with rtx_mode_t as in:
 
             rtx r = ...
-            wide_int x = std::make_pair (r, mode);
+            wide_int x = rtx_mode_t (r, mode);
 
    Similarly, a wide_int can only be constructed from a host value if
    the target precision is given explicitly, such as in: