After fixing PR 44588, I got [...@gnu-6 divb]$ cat umod-4.c int foo (unsigned char x, unsigned char y) { return (x % y) != 0; } [...@gnu-6 divb]$ /export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -Os -c -o umod-4.o umod-4.c [...@gnu-6 divb]$ cat umod-4.s .file "umod-4.c" .text .globl foo .type foo, @function foo: .LFB0: .cfi_startproc movzbl %dil, %eax divb %sil movzbl %ah, %eax testb %al, %al setne %al movzbl %al, %eax ret
We can generate testb %ah, %ah instead of movzbl %ah, %eax testb %al, %al The combine pass shows Trying 11 -> 13: Failed to match this instruction: (set (reg:CCZ 17 flags) (compare:CCZ (subreg:QI (lshiftrt:SI (subreg:SI (reg:HI 69) 0) (const_int 8 [0x8])) 0) (const_int 0 [0]))) with (insn 11 10 13 2 umod-4.c:4 (set (reg:QI 67) (subreg:QI (zero_extract:SI (reg:HI 69) (const_int 8 [0x8]) (const_int 8 [0x8])) 0)) 90 {*movqi_extzv_2_rex64} (expr_list:REG_DEAD (reg:HI 69) (expr_list:REG_EQUAL (umod:QI (reg/v:QI 61 [ x ]) (reg/v:QI 63 [ y ])) (nil)))) (insn 13 11 14 2 umod-4.c:4 (set (reg:CCZ 17 flags) (compare:CCZ (reg:QI 67) (const_int 0 [0]))) 0 {*cmpqi_ccno_1} (expr_list:REG_DEAD (reg:QI 67) (nil))) i386.md has (define_insn "*cmpqi_ext_2" [(set (reg FLAGS_REG) (compare (subreg:QI (zero_extract:SI (match_operand 0 "ext_register_operand" "Q") (const_int 8) (const_int 8)) 0) (match_operand:QI 1 "const0_operand" "")))] "ix86_match_ccmode (insn, CCNOmode)" "test{b}\t%h0, %h0" [(set_attr "type" "test") (set_attr "length_immediate" "0") (set_attr "mode" "QI")]) According to http://gcc.gnu.org/ml/gcc-patches/2010-06/msg02477.html (set (reg:CCZ 17 flags) (compare:CCZ (subreg:QI (lshiftrt:SI (subreg:SI (reg:HI 69) 0) (const_int 8 [0x8])) 0) (const_int 0 [0]))) is the standard form within combine.c. The questions are 1. Why doesn't combiner match QI cmp patterns with zero_extract? 2. Should i386.md provide QI cmp patterns with lshiftrt for combiner? 3. Does i386.md need QI cmp patterns with zero_extract if they aren't used by combiner? -- Summary: Combiner fails to match cmp patterns with upper 8bit register Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hjl dot tools at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44659