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.

Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
---
 gcc/config/i386/i386.md | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index a50475bdaf4..565c7d26b25 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -15378,6 +15378,38 @@ (define_insn_and_split "*one_cmplqi_ext<mode>_1"
   ""
   [(set_attr "type" "negnot")
    (set_attr "mode" "QI")])
+
+;; Alternative 1 is needed to work around LRA limitation, see PR82524.
+(define_insn_and_split "*one_cmplqi_ext<mode>_2"
+  [(set (zero_extract:SWI248
+         (match_operand 0 "int248_register_operand" "+Q,&Q")
+         (const_int 8)
+         (const_int 8))
+       (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
+   #"
+  "reload_completed
+   && !(rtx_equal_p (operands[0], operands[1]))"
+  [(set (zero_extract:SWI248
+         (match_dup 0) (const_int 8) (const_int 8))
+       (zero_extract:SWI248
+         (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))]
+  ""
+  [(set_attr "type" "negnot")
+   (set_attr "mode" "QI")])
 
 ;; Shift instructions
 
-- 
2.50.1

Reply via email to