On Fri, Jun 6, 2025 at 3:43 PM Jakub Jelinek <ja...@redhat.com> wrote: > > Hi! > > The just posted second PR120434 patch causes > +FAIL: gcc.target/i386/pr78103-3.c scan-assembler \\\\m(leaq|addq|incq)\\\\M > +FAIL: gcc.target/i386/pr78103-3.c scan-assembler-not \\\\mmovl\\\\M+ > +FAIL: gcc.target/i386/pr78103-3.c scan-assembler-not \\\\msubq\\\\M > +FAIL: gcc.target/i386/pr78103-3.c scan-assembler-not \\\\mxor[lq]\\\\M > While the patch generally improves code generation by often using > ZERO_EXTEND instead of SIGN_EXTEND, where the former is often for free > on x86_64 while the latter requires an extra instruction or larger > instruction than one with just zero extend, the PR78103 combine patterns > and splitters were written only with SIGN_EXTEND in mind. As CLZ is UB > on 0 and otherwise returns just [0,63] and is xored with 63, ZERO_EXTEND > does the same thing there as SIGN_EXTEND. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2025-06-06 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/120434 > * config/i386/i386.md (*bsr_rex64_2): Rename to ... > (*bsr_rex64<u>_2): ... this. Use any_extend instead of sign_extend. > (*bsr_2): Rename to ... > (*bsr<u>_2): ... this. Use any_extend instead of sign_extend. > (bsr splitters after those): Use any_extend instead of sign_extend.
OK. Thanks, Uros. > --- gcc/config/i386/i386.md.jj 2025-06-04 19:37:23.798424056 +0200 > +++ gcc/config/i386/i386.md 2025-06-06 10:56:04.006224677 +0200 > @@ -21512,11 +21512,12 @@ > (set_attr "mode" "SI")]) > > ; As bsr is undefined behavior on zero and for other input > -; values it is in range 0 to 63, we can optimize away sign-extends. > -(define_insn_and_split "*bsr_rex64_2" > +; values it is in range 0 to 63, we can optimize away sign-extends > +; or zero-extends. > +(define_insn_and_split "*bsr_rex64<u>_2" > [(set (match_operand:DI 0 "register_operand") > (xor:DI > - (sign_extend:DI > + (any_extend:DI > (minus:SI > (const_int 63) > (subreg:SI (clz:DI (match_operand:DI 1 "nonimmediate_operand")) > @@ -21538,9 +21539,9 @@ > operands[3] = lowpart_subreg (SImode, operands[2], DImode); > }) > > -(define_insn_and_split "*bsr_2" > +(define_insn_and_split "*bsr<u>_2" > [(set (match_operand:DI 0 "register_operand") > - (sign_extend:DI > + (any_extend:DI > (xor:SI > (minus:SI > (const_int 31) > @@ -21617,7 +21618,7 @@ > (minus:DI > (match_operand:DI 2 "const_int_operand") > (xor:DI > - (sign_extend:DI > + (any_extend:DI > (minus:SI (const_int 63) > (subreg:SI > (clz:DI (match_operand:DI 1 "nonimmediate_operand")) > @@ -21647,7 +21648,7 @@ > [(set (match_operand:DI 0 "register_operand") > (minus:DI > (match_operand:DI 2 "const_int_operand") > - (sign_extend:DI > + (any_extend:DI > (xor:SI > (minus:SI (const_int 31) > (clz:SI (match_operand:SI 1 "nonimmediate_operand"))) > > > Jakub >