https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104982
--- Comment #2 from Hongtao.liu <crazylht at gmail dot com> ---
334Failed to match this instruction:
335(set (reg/v:SI 88 [ z ])
336 (if_then_else:SI (eq (zero_extract:SI (reg:SI 92)
337 (const_int 1 [0x1])
338 (zero_extend:SI (subreg:QI (reg:SI 93) 0)))
339 (const_int 0 [0]))
340 (reg:SI 95)
341 (reg:SI 94)))
342Failed to match this instruction:
343(set (reg/v:SI 88 [ z ])
344 (if_then_else:SI (eq (zero_extract:SI (reg:SI 92)
345 (const_int 1 [0x1])
346 (and:SI (reg:SI 93)
347 (const_int 255 [0xff])))
348 (const_int 0 [0]))
349 (reg:SI 95)
350 (reg:SI 94)))
And original splitter is
+;; Help combine recognize bt followed by cmov
+(define_split
+ [(set (match_operand:SWI248 0 "register_operand")
+ (if_then_else:SWI248
+ (ne
+ (zero_extract:SWI48
+ (match_operand:SWI48 1 "register_operand")
+ (const_int 1)
+ (zero_extend:SI (match_operand:QI 2 "register_operand")))
+ (const_int 0))
+ (match_operand:SWI248 3 "nonimmediate_operand")
+ (match_operand:SWI248 4 "nonimmediate_operand")))]
+ "TARGET_USE_BT && TARGET_CMOVE
+ && !(MEM_P (operands[3]) && MEM_P (operands[4]))
+ && ix86_pre_reload_split ()"
+ [(set (reg:CCC FLAGS_REG)
+ (compare:CCC
+ (zero_extract:SWI48 (match_dup 1) (const_int 1) (match_dup 2))
+ (const_int 0)))
+ (set (match_dup 0)
+ (if_then_else:SWI248 (eq (reg:CCC FLAGS_REG) (const_int 0))
+ (match_dup 3)
+ (match_dup 4)))]
+{
+ operands[2] = lowpart_subreg (SImode, operands[2], QImode);
+})