gcc/
authorolegendo <olegendo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Jan 2015 23:56:05 +0000 (23:56 +0000)
committerolegendo <olegendo@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Jan 2015 23:56:05 +0000 (23:56 +0000)
PR target/49263
* config/sh/sh.c (sh_split_treg_set_expr): Invoke emit_insn before
remove_insn.
* config/sh/sh.md (tstsi_t): Don't try to optimize constant with right
shifts if it already fits into K08.

gcc/testsuite/
PR target/49263
* gcc.target/sh/pr49263-4.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220144 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/config/sh/sh.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/pr49263-4.c [new file with mode: 0644]

index 8cf5d5b..e44eb73 100644 (file)
@@ -1,3 +1,11 @@
+2015-01-26  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/49263
+       * config/sh/sh.c (sh_split_treg_set_expr): Invoke emit_insn before
+       remove_insn.
+       * config/sh/sh.md (tstsi_t): Don't try to optimize constant with right
+       shifts if it already fits into K08.
+
 2015-01-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR ipa/64730
index 7d07634..a7427f5 100644 (file)
@@ -14466,6 +14466,8 @@ sh_split_treg_set_expr (rtx x, rtx_insn* curr_insn)
        fprintf (dump_file, "trailing nott insn %d\n", INSN_UID (nott_insn));
     }
 
+  emit_insn (insnlist.first);
+
   if (nott_insn != NULL && append_nott)
     {
       if (dump_file)
@@ -14475,8 +14477,6 @@ sh_split_treg_set_expr (rtx x, rtx_insn* curr_insn)
       append_nott = false;
     }
 
-  emit_insn (insnlist.first);
-
   if (append_nott)
     nott_insn = emit_insn (gen_nott (get_t_reg_rtx ()));
 
index 956d1ef..4a39e12 100644 (file)
      variant instead and load the constant into a reg.  For that we'd need
      to do some analysis.  */
 
-  if ((op1val & 0xFFFF) == 0
-      && CONST_OK_FOR_K08 (op1val >> 16) && optimize_size)
+  if (CONST_OK_FOR_K08 (op1val))
+    {
+      /* Do nothing.  */
+    }
+  else if ((op1val & 0xFFFF) == 0
+          && CONST_OK_FOR_K08 (op1val >> 16) && optimize_size)
     {
       /* Use a swap.w insn to do a shift + reg copy (to R0) in one insn.  */
       op1val = op1val >> 16;
index cf72ea9..c66df20 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-26  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/49263
+       * gcc.target/sh/pr49263-4.c: New.
+
 2015-01-26  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/62044
diff --git a/gcc/testsuite/gcc.target/sh/pr49263-4.c b/gcc/testsuite/gcc.target/sh/pr49263-4.c
new file mode 100644 (file)
index 0000000..cbba68b
--- /dev/null
@@ -0,0 +1,10 @@
+/* Verify that TST #imm, R0 instruction is generated if the constant
+   allows it when compiling for -Os.  */
+/* { dg-do compile }  */
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler-not "and" } } */
+/* { dg-final { scan-assembler-not "extu" } } */
+/* { dg-final { scan-assembler-not "exts" } } */
+/* { dg-final { scan-assembler-not "shlr" } } */
+
+#include "pr49263.c"