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.