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.

Reply via email to