Hi,

Some scan-assembler-times tests fail with -mlra for
gcc.target/sh/pr49263-2.c and gcc.target/sh/pr64345-2.c.
A reduced test case

int foo (int x) { return (x & 255) == 0;}

gives a code like

        mov     r4,r0
        tst     #255,r0
        rts
        movt    r0

with -mno-lra and

        mov.w   .L2,r1
        tst     r1,r4
        rts
        movt    r0
        .align 1
.L2:
        .short  255

with -mlra.  These tst instructions come from tstsi_t insn:

 (define_insn_and_split "tstsi_t"
   [(set (reg:SI T_REG)
        (eq:SI (and:SI (match_operand:SI 0 "arith_reg_operand" "%z,r")
                       (match_operand:SI 1 "arith_or_int_operand" "K08,r"))
               (const_int 0)))]

It looks that LRA somtimes prefers r/r alternative to z/K08.
The attached patch tunes it with disparaging r/r slightly.  Tested
on sh4-unknown-linux-gnu with no new failures for -mlra/-mno-lra.
There are no visible changes over generated objects with -mno-lra
in CSiBE.  Committed on trunk.

Regards,
        kaz
--
2015-06-10  Kaz Kojima  <kkoj...@gcc.gnu.org>

        * config/sh/sh.md (tstsi_t): Add '?' modifier to 'r' alternative
        of the second operand.

diff --git a/config/sh/sh.md b/config/sh/sh.md
index 33241a8..e88d249 100644
--- a/config/sh/sh.md
+++ b/config/sh/sh.md
@@ -616,7 +616,7 @@
 (define_insn_and_split "tstsi_t"
   [(set (reg:SI T_REG)
        (eq:SI (and:SI (match_operand:SI 0 "arith_reg_operand" "%z,r")
-                      (match_operand:SI 1 "arith_or_int_operand" "K08,r"))
+                      (match_operand:SI 1 "arith_or_int_operand" "K08,?r"))
               (const_int 0)))]
   "TARGET_SH1
    && (can_create_pseudo_p () || arith_reg_operand (operands[1], SImode)

Reply via email to