https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108070
Bug ID: 108070 Summary: failure to combine range test to bit test Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- (insn 8 7 11 2 (parallel [ (set (reg:QI 89) (and:QI (reg:QI 90 [ *info_6(D) ]) (const_int 3 [0x3]))) (clobber (reg:CC 17 flags)) ]) "/home/rguenther/src/trunk/gcc/testsuite/c-c++-common/fold-masked-cmp-1.c":37:7 554 {*andqi_1} (expr_list:REG_DEAD (reg:QI 90 [ *info_6(D) ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) (insn 11 8 12 2 (set (reg:CC 17 flags) (compare:CC (reg:QI 89) (const_int 1 [0x1]))) "/home/rguenther/src/trunk/gcc/testsuite/c-c++-common/fold-masked-cmp-1.c":37:6 9 {*cmpqi_1} (expr_list:REG_DEAD (reg:QI 89) (nil))) (jump_insn 12 11 13 2 (set (pc) (if_then_else (gtu (reg:CC 17 flags) (const_int 0 [0])) (label_ref 15) (pc))) "/home/rguenther/src/trunk/gcc/testsuite/c-c++-common/fold-masked-cmp-1.c":37:6 974 {*jcc} (expr_list:REG_DEAD (reg:CC 17 flags) (int_list:REG_BR_PROB 633507684 (nil))) -> 15) here insns 8, 11 and 12 should be combined to (insn 7 6 8 2 (parallel [ (set (reg:QI 88) (and:QI (reg:QI 89 [ *info_7(D) ]) (const_int 2 [0x2]))) (clobber (reg:CC 17 flags)) ]) "/home/rguenther/src/gcc-12-branch/gcc/testsuite/c-c++-common/fold-masked-cmp-1.c":37:7 534 {*andqi_1} (expr_list:REG_DEAD (reg:QI 89 [ *info_7(D) ]) (expr_list:REG_UNUSED (reg:CC 17 flags) (nil)))) (insn 8 7 9 2 (set (reg:CCZ 17 flags) (compare:CCZ (reg:QI 88) (const_int 0 [0]))) "/home/rguenther/src/gcc-12-branch/gcc/testsuite/c-c++-common/fold-masked-cmp-1.c":37:6 5 {*cmpqi_ccno_1} (expr_list:REG_DEAD (reg:QI 88) (nil))) the jump also needs altering here. This is required to avoid regressing code like c-c++-common/fold-masked-cmp-1.c when applying https://gcc.gnu.org/pipermail/gcc-patches/2022-December/608153.html where we no longer fold ;; Function test_exe (null) ;; enabled by -tree-original { if (info->type <= 1) to ;; Function test_exe (null) ;; enabled by -tree-original { if ((BIT_FIELD_REF <*info, 8, 0> & 2) == 0) note that applying this folding on GIMPLE produces a more costly operation (we need an extra BIT_AND_EXPR here). On x86_64 the folded code produces testb $2, (%rdi) jne .L8 while the unfolded has movzbl (%rdi), %eax andl $3, %eax cmpb $1, %al ja .L5 as CC modes are involved I'm not sure if combine is the correct vehicle to perform this. IIRC arm folks wanted to add some bit-test-and-branch patterns (that doesn't seem to be applied yet) which could make it possible to optimize this during RTL expansion itself.