Make more use of GET_MODE_UNIT_SIZE
authorRichard Sandiford <richard.sandiford@linaro.org>
Fri, 13 Oct 2017 09:41:39 +0000 (09:41 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 13 Oct 2017 09:41:39 +0000 (09:41 +0000)
This patch uses GET_MODE_UNIT_SIZE instead of GET_MODE_SIZE in
cases where, for compound modes, the mode of the scalar elements
is what matters.  E.g. the choice between truncation and extension
is really based on the modes of the consistuent scalars rather
than the mode as a whole.

None of the existing code was wrong.  The patch simply makes
things easier when converting to variable-sized modes.

2017-10-13  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* optabs.c (add_equal_note): Use GET_MODE_UNIT_SIZE.
(widened_mode): Likewise.
(expand_unop): Likewise.
* ree.c (transform_ifelse): Likewise.
(merge_def_and_ext): Likewise.
(combine_reaching_defs): Likewise.
* simplify-rtx.c (simplify_unary_operation_1): Likewise.

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

gcc/ChangeLog
gcc/optabs.c
gcc/ree.c
gcc/simplify-rtx.c

index bdb6bccdb5c35ceed70294145c3901b83e351a81..8add08c4b23aa83329008f3dfe64fefd8150cd3e 100644 (file)
@@ -1,3 +1,15 @@
+2017-10-13  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * optabs.c (add_equal_note): Use GET_MODE_UNIT_SIZE.
+       (widened_mode): Likewise.
+       (expand_unop): Likewise.
+       * ree.c (transform_ifelse): Likewise.
+       (merge_def_and_ext): Likewise.
+       (combine_reaching_defs): Likewise.
+       * simplify-rtx.c (simplify_unary_operation_1): Likewise.
+
 2017-10-13  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 67dfa58ff462b9393bc5d049c526b5f930dd7e25..75e320022cb681767298e3970053d17a4bc49a74 100644 (file)
@@ -138,8 +138,8 @@ add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op
        if (GET_MODE (op0) != VOIDmode && GET_MODE (target) != GET_MODE (op0))
          {
            note = gen_rtx_fmt_e (code, GET_MODE (op0), copy_rtx (op0));
-           if (GET_MODE_SIZE (GET_MODE (op0))
-               > GET_MODE_SIZE (GET_MODE (target)))
+           if (GET_MODE_UNIT_SIZE (GET_MODE (op0))
+               > GET_MODE_UNIT_SIZE (GET_MODE (target)))
              note = simplify_gen_unary (TRUNCATE, GET_MODE (target),
                                         note, GET_MODE (op0));
            else
@@ -173,12 +173,12 @@ widened_mode (machine_mode to_mode, rtx op0, rtx op1)
 
   if (m0 == VOIDmode && m1 == VOIDmode)
     return to_mode;
-  else if (m0 == VOIDmode || GET_MODE_SIZE (m0) < GET_MODE_SIZE (m1))
+  else if (m0 == VOIDmode || GET_MODE_UNIT_SIZE (m0) < GET_MODE_UNIT_SIZE (m1))
     result = m1;
   else
     result = m0;
 
-  if (GET_MODE_SIZE (result) > GET_MODE_SIZE (to_mode))
+  if (GET_MODE_UNIT_SIZE (result) > GET_MODE_UNIT_SIZE (to_mode))
     return to_mode;
 
   return result;
@@ -2977,9 +2977,9 @@ expand_unop (machine_mode mode, optab unoptab, rtx op0, rtx target,
       else
        {
          eq_value = gen_rtx_fmt_e (optab_to_code (unoptab), mode, op0);
-         if (GET_MODE_SIZE (outmode) < GET_MODE_SIZE (mode))
+         if (GET_MODE_UNIT_SIZE (outmode) < GET_MODE_UNIT_SIZE (mode))
            eq_value = simplify_gen_unary (TRUNCATE, outmode, eq_value, mode);
-         else if (GET_MODE_SIZE (outmode) > GET_MODE_SIZE (mode))
+         else if (GET_MODE_UNIT_SIZE (outmode) > GET_MODE_UNIT_SIZE (mode))
            eq_value = simplify_gen_unary (ZERO_EXTEND,
                                           outmode, eq_value, mode);
        }
index 19225d5833b9ad2941322babc7db3319282d12db..8915cbe0d6fdbfcb99a288bad69fea52f6aedcda 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -428,7 +428,8 @@ transform_ifelse (ext_cand *cand, rtx_insn *def_insn)
   srcreg2 = XEXP (SET_SRC (set_insn), 2);
   /* If the conditional move already has the right or wider mode,
      there is nothing to do.  */
-  if (GET_MODE_SIZE (GET_MODE (dstreg)) >= GET_MODE_SIZE (cand->mode))
+  if (GET_MODE_UNIT_SIZE (GET_MODE (dstreg))
+      >= GET_MODE_UNIT_SIZE (cand->mode))
     return true;
 
   map_srcreg = gen_rtx_REG (cand->mode, REGNO (srcreg));
@@ -718,8 +719,8 @@ merge_def_and_ext (ext_cand *cand, rtx_insn *def_insn, ext_state *state)
              && state->modified[INSN_UID (def_insn)].mode
                 == ext_src_mode)))
     {
-      if (GET_MODE_SIZE (GET_MODE (SET_DEST (*sub_rtx)))
-         >= GET_MODE_SIZE (cand->mode))
+      if (GET_MODE_UNIT_SIZE (GET_MODE (SET_DEST (*sub_rtx)))
+         >= GET_MODE_UNIT_SIZE (cand->mode))
        return true;
       /* If def_insn is already scheduled to be deleted, don't attempt
         to modify it.  */
@@ -926,7 +927,8 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
          || (set = single_set (cand->insn)) == NULL_RTX)
        return false;
       mode = GET_MODE (SET_DEST (set));
-      gcc_assert (GET_MODE_SIZE (mode) >= GET_MODE_SIZE (cand->mode));
+      gcc_assert (GET_MODE_UNIT_SIZE (mode)
+                 >= GET_MODE_UNIT_SIZE (cand->mode));
       cand->mode = mode;
     }
 
index 3b6cf6fa850711956fcdef1a2274e95a7e5e4a36..c4d6ce7586cef4ffc712e6ad3f2e5c13fb00b9de 100644 (file)
@@ -1272,10 +1272,9 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op)
       if ((GET_CODE (op) == FLOAT_TRUNCATE
           && flag_unsafe_math_optimizations)
          || GET_CODE (op) == FLOAT_EXTEND)
-       return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (op,
-                                                           0)))
-                                  > GET_MODE_SIZE (mode)
-                                  ? FLOAT_TRUNCATE : FLOAT_EXTEND,
+       return simplify_gen_unary (GET_MODE_UNIT_SIZE (GET_MODE (XEXP (op, 0)))
+                                  > GET_MODE_UNIT_SIZE (mode)
+                                  ? FLOAT_TRUNCATE : FLOAT_EXTEND,
                                   mode,
                                   XEXP (op, 0), mode);