http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49263
Kazumoto Kojima <kkojima at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target| |sh*-*-*
--- Comment #2 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-06-12
23:11:19 UTC ---
It looks that playing with the internal behavior of the combine
pass is a bit fragile. Perhaps an alternative way is to define
a peephole for tst #imm8,r0, something like:
;; A peephole for the TST immediate instruction.
(define_peephole2
[(set (match_operand:SI 2 "arith_reg_operand" "r")
(and:SI (match_operand:SI 0 "arith_reg_operand" "z")
(match_operand:SI 1 "const_int_operand" "i")))
(set (reg:SI T_REG) (eq:SI (match_dup 2) (const_int 0)))]
"TARGET_SH1
&& peep2_reg_dead_p (2, operands[2])
&& (satisfies_constraint_I08 (operands[1])
|| satisfies_constraint_K08 (operands[1]))"
[(set (reg:SI T_REG)
(eq:SI (and:SI (match_dup 0) (match_dup 1)) (const_int 0)))]
"
{
operands[1] = GEN_INT (INTVAL (operands[1]) & 0xff);
}")
which will work at -O2 or -fpeephole2, though there are pros
and cons of peephole approach.