re PR target/51244 ([SH] Inefficient conditional branch and code around T bit)
authorOleg Endo <olegendo@gcc.gnu.org>
Tue, 27 Sep 2016 12:50:27 +0000 (12:50 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Tue, 27 Sep 2016 12:50:27 +0000 (12:50 +0000)
gcc/
PR target/51244
* config/sh/sh.c (sh_rtx_costs): Fix return value of SET of movt and
movrt patterns.  Match them before anything else in the SET case.

From-SVN: r240533

gcc/ChangeLog
gcc/config/sh/sh.c

index d0ebc8e53edd616fd6108a1ad2eff1ec111bf190..0255b93f26d3749d3600ce6b418589aed2e9cef8 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-27  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/51244
+       * config/sh/sh.c (sh_rtx_costs): Fix return value of SET of movt and
+       movrt patterns.  Match them before anything else in the SET case.
+
 2016-09-27  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/7970
index bfa248d56df1dfb4a3e836db47282efc880f91b5..e5b8088c3efcc94a53e910b8ffa3996a578db2cc 100644 (file)
@@ -3199,6 +3199,12 @@ sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code,
         vector-move, so we have to provide the correct cost in the number
         of move insns to load/store the reg of the mode in question.  */
     case SET:
+      if (sh_movt_set_dest (x) != NULL || sh_movrt_set_dest (x) != NULL)
+       {
+         *total = COSTS_N_INSNS (1);
+         return true;
+       }
+
       if (register_operand (SET_DEST (x), VOIDmode)
            && (register_operand (SET_SRC (x), VOIDmode)
                || satisfies_constraint_Z (SET_SRC (x))))
@@ -3208,10 +3214,6 @@ sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code,
                                  / mov_insn_size (mode, TARGET_SH2A));
          return true;
         }
-
-      if (sh_movt_set_dest (x) != NULL || sh_movrt_set_dest (x) != NULL)
-       return COSTS_N_INSNS (1);
-
       return false;
 
     /* The cost of a mem access is mainly the cost of the address mode.  */