On Mon, Mar 21, 2022 at 2:08 PM liuhongt via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Failed to match this instruction: > (set (reg/v:SI 88 [ z ]) > (if_then_else:SI (eq (zero_extract:SI (reg:SI 92) > (const_int 1 [0x1]) > (zero_extend:SI (subreg:QI (reg:SI 93) 0))) > (const_int 0 [0])) > (reg:SI 95) > (reg:SI 94))) > > but it's equal to > > (set (reg/v:SI 88 [ z ]) > (if_then_else:SI (ne (zero_extract:SI (reg:SI 92) > (const_int 1 [0x1]) > (zero_extend:SI (subreg:QI (reg:SI 93) 0))) > (const_int 0 [0])) > (reg:SI 94) > (reg:SI 95))) > > which is the exact existing splitter. > > The patch will fix below regressions: > > On x86-64, r12-7687 caused: > > FAIL: gcc.target/i386/bt-5.c scan-assembler-not sar[lq][ \t] > FAIL: gcc.target/i386/bt-5.c scan-assembler-times bt[lq][ \t] 7 > > Bootstrap and regtested on x86_64-pc-linux-gnu{-m32,} > Ok for trunk? > > gcc/ChangeLog: > > PR target/104982 > * config/i386/i386.md (*jcc_bt<mode>_mask): Extend the > following splitter to reversed condition.
OK. Thanks, Uros. > --- > gcc/config/i386/i386.md | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md > index 02f298c2846..c74edd1aaef 100644 > --- a/gcc/config/i386/i386.md > +++ b/gcc/config/i386/i386.md > @@ -14182,12 +14182,12 @@ (define_insn_and_split "*jcc_bt<mode>_mask" > (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_operator 5 "bt_comparison_operator" > + [(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 > @@ -14202,6 +14202,8 @@ (define_split > (match_dup 3) > (match_dup 4)))] > { > + if (GET_CODE (operands[5]) == EQ) > + std::swap (operands[3], operands[4]); > operands[2] = lowpart_subreg (SImode, operands[2], QImode); > }) > > -- > 2.18.1 >