From 4e7e89e8c9acdbffa6546d5e6056c7b81238c88f Mon Sep 17 00:00:00 2001
From: Oleg Endo <olegendo@gcc.gnu.org>
Date: Tue, 27 Sep 2016 12:50:27 +0000
Subject: [PATCH] re PR target/51244 ([SH] Inefficient conditional branch and
 code around T bit)

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      |  6 ++++++
 gcc/config/sh/sh.c | 10 ++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d0ebc8e53edd..0255b93f26d3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index bfa248d56df1..e5b8088c3efc 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -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.  */
-- 
GitLab