On Mon, Aug 4, 2025 at 8:50 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > Uros Bizjak <ubiz...@gmail.com> writes: > > On Sat, Aug 2, 2025 at 8:56 PM H.J. Lu <hjl.to...@gmail.com> wrote: > >> > >> On Fri, Aug 1, 2025 at 10:32 PM Uros Bizjak <ubiz...@gmail.com> wrote: > >> > > >> > On Sat, Aug 2, 2025 at 3:22 AM H.J. Lu <hjl.to...@gmail.com> wrote: > >> > > > >> > > After > >> > > > >> > > commit 965564eafb721f8000013a3112f1bba8d8fae32b > >> > > Author: Richard Sandiford <richard.sandif...@arm.com> > >> > > Date: Tue Jul 29 15:58:34 2025 +0100 > >> > > > >> > > simplify-rtx: Simplify subregs of logic ops > >> > > > >> > > combine generates > >> > > > >> > > (set (zero_extract:SI (reg/v:SI 101 [ a ]) > >> > > (const_int 8 [0x8]) > >> > > (const_int 8 [0x8])) > >> > > (not:SI (sign_extract:SI (reg:SI 107 [ b ]) > >> > > (const_int 8 [0x8]) > >> > > (const_int 8 [0x8])))) > >> > > > >> > > instead of > >> > > > >> > > (set (zero_extract:SI (reg/v:SI 101 [ a ]) > >> > > (const_int 8 [0x8]) > >> > > (const_int 8 [0x8])) > >> > > (subreg:SI (not:QI (subreg:QI (sign_extract:SI (reg:SI 107 [ b ]) > >> > > (const_int 8 [0x8]) > >> > > (const_int 8 [0x8])) 0)) 0)) > >> > > > >> > > Add *one_cmplqi_ext<mode>_2 to support the new pattern. > >> > > > >> > > PR target/121306 > >> > > * config/i386/i386.md (*one_cmplqi_ext<mode>_2): New. > >> > > >> > Why not just change the old pattern? I'd expect that the old form is > >> > now obsolete. > >> > > >> > >> *one_cmplqi_ext<mode>_1 is still needed. Otherwise combine will > >> fail to match this instruction: > >> > >> (set (zero_extract:SI (reg/v:SI 102 [ a ]) > >> (const_int 8 [0x8]) > >> (const_int 8 [0x8])) > >> (subreg:SI (not:QI (subreg:QI (reg:SI 105 [ _2 ]) 0)) 0)) > > > > Do you perhaps have a testcase that still shows this combination? > > Perhaps the author of the simplification (CC'd) would be interested in > > this missing case. > > > > I was under the impression that the new simplification should always > > trigger, there is no point in having it if the backend still has to > > provide simplified and non-simplified patterns. > > > > There are also other similar logic patterns in i386.md that would have > > to be amended. > > Sorry, I hadn't realised that there were still unfixed regressions > from that patch. I suppose if we wanted to avoid two patterns here, > we'd need to extend the pre-existing word_mode folds to support > subword modes too (for !WORD_REGISTER_OPERATIONS). The attached > untested patch does that, but I expect it would have similar > knock-on effects. I'll give it a spin overnight on x86 anyway > just to see what happens.
Yes, it fixes: FAIL: gcc.target/i386/pr82524.c scan-assembler-not mov[sz]bl FAIL: gcc.target/i386/pr82524.c scan-assembler [ \t]notb together with the enclosed patch. Thanks. > Richard > > diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc > index c723a07f06b..0374fec1d9c 100644 > --- a/gcc/simplify-rtx.cc > +++ b/gcc/simplify-rtx.cc > @@ -8333,27 +8333,33 @@ simplify_context::simplify_subreg (machine_mode > outermode, rtx op, > return XEXP (XEXP (op, 0), 0); > } > > - /* Attempt to simplify WORD_MODE SUBREGs of bitwise expressions. */ > - if (outermode == word_mode > - && (GET_CODE (op) == IOR || GET_CODE (op) == XOR || GET_CODE (op) == > AND) > - && SCALAR_INT_MODE_P (innermode)) > - { > - rtx op0 = simplify_subreg (outermode, XEXP (op, 0), innermode, byte); > - rtx op1 = simplify_subreg (outermode, XEXP (op, 1), innermode, byte); > - if (op0 && op1) > - return simplify_gen_binary (GET_CODE (op), outermode, op0, op1); > - } > - > - /* Attempt to simplify WORD_MODE SUBREGs of unary bitwise expression. */ > - if (outermode == word_mode && GET_CODE (op) == NOT > - && SCALAR_INT_MODE_P (innermode)) > + /* Attempt to simplify WORD_MODE and sub-WORD_MODE SUBREGs of bitwise > + expressions. */ > + scalar_int_mode int_outermode; > + if (is_a<scalar_int_mode> (outermode, &int_outermode) > + && (WORD_REGISTER_OPERATIONS > + ? int_outermode == word_mode > + : GET_MODE_PRECISION (int_outermode) <= BITS_PER_WORD) > + && SCALAR_INT_MODE_P (innermode) > + && (GET_CODE (op) == IOR > + || GET_CODE (op) == XOR > + || GET_CODE (op) == AND > + || GET_CODE (op) == NOT)) > { > rtx op0 = simplify_subreg (outermode, XEXP (op, 0), innermode, byte); > if (op0) > - return simplify_gen_unary (GET_CODE (op), outermode, op0, outermode); > + { > + if (GET_CODE (op) == NOT) > + return simplify_gen_unary (GET_CODE (op), outermode, > + op0, outermode); > + > + rtx op1 = simplify_subreg (outermode, XEXP (op, 1), innermode, > byte); > + if (op1) > + return simplify_gen_binary (GET_CODE (op), outermode, op0, op1); > + } > } > > - scalar_int_mode int_outermode, int_innermode; > + scalar_int_mode int_innermode; > if (is_a <scalar_int_mode> (outermode, &int_outermode) > && is_a <scalar_int_mode> (innermode, &int_innermode) > && known_eq (byte, subreg_lowpart_offset (int_outermode, > int_innermode))) > -- > 2.43.0 > -- H.J.
From 4700d846269e5bf16e7ee0491860efba949f3a8a Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.to...@gmail.com> Date: Fri, 1 Aug 2025 08:34:49 -0700 Subject: [PATCH] x86: Update *one_cmplqi_ext<mode>_1 After commit 965564eafb721f8000013a3112f1bba8d8fae32b Author: Richard Sandiford <richard.sandif...@arm.com> Date: Tue Jul 29 15:58:34 2025 +0100 simplify-rtx: Simplify subregs of logic ops combine generates (set (zero_extract:SI (reg/v:SI 101 [ a ]) (const_int 8 [0x8]) (const_int 8 [0x8])) (not:SI (sign_extract:SI (reg:SI 107 [ b ]) (const_int 8 [0x8]) (const_int 8 [0x8])))) instead of (set (zero_extract:SI (reg/v:SI 101 [ a ]) (const_int 8 [0x8]) (const_int 8 [0x8])) (subreg:SI (not:QI (subreg:QI (sign_extract:SI (reg:SI 107 [ b ]) (const_int 8 [0x8]) (const_int 8 [0x8])) 0)) 0)) Update *one_cmplqi_ext<mode>_1 to support the new pattern. PR target/121306 * config/i386/i386.md (*one_cmplqi_ext<mode>_1): Updated to support the new pattern. Signed-off-by: H.J. Lu <hjl.to...@gmail.com> --- gcc/config/i386/i386.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index a50475bdaf4..d97a4bcaf12 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15351,13 +15351,11 @@ (define_insn_and_split "*one_cmplqi_ext<mode>_1" (match_operand 0 "int248_register_operand" "+Q,&Q") (const_int 8) (const_int 8)) - (subreg:SWI248 - (not:QI - (subreg:QI - (match_operator:SWI248 2 "extract_operator" - [(match_operand 1 "int248_register_operand" "0,!Q") - (const_int 8) - (const_int 8)]) 0)) 0))] + (not:SWI248 + (match_operator:SWI248 2 "extract_operator" + [(match_operand 1 "int248_register_operand" "0,!Q") + (const_int 8) + (const_int 8)])))] "" "@ not{b}\t%h0 @@ -15370,11 +15368,11 @@ (define_insn_and_split "*one_cmplqi_ext<mode>_1" (match_dup 1) (const_int 8) (const_int 8))) (set (zero_extract:SWI248 (match_dup 0) (const_int 8) (const_int 8)) - (subreg:SWI248 - (not:QI - (subreg:QI - (match_op_dup 2 - [(match_dup 0) (const_int 8) (const_int 8)]) 0)) 0))] + (not:SWI248 + (match_op_dup 2 + [(match_dup 0) + (const_int 8) + (const_int 8)])))] "" [(set_attr "type" "negnot") (set_attr "mode" "QI")]) -- 2.50.1