https://gcc.gnu.org/g:5ca44dfb1389f4c6198283683547143e217f65ab

commit r16-2194-g5ca44dfb1389f4c6198283683547143e217f65ab
Author: Hu, Lin1 <lin1...@intel.com>
Date:   Tue Apr 8 15:43:59 2025 +0800

    i386: Add a new peeophole2 for PR91384 under APX_F
    
    gcc/ChangeLog:
    
            PR target/91384
            * config/i386/i386.md: Add new peeophole2 for optimize *negsi_1
            followed by *cmpsi_ccno_1 with APX_F.
    
    gcc/testsuite/ChangeLog:
    
            PR target/91384
            * gcc.target/i386/pr91384-1.c: New test.

Diff:
---
 gcc/config/i386/i386.md                   | 11 +++++++++++
 gcc/testsuite/gcc.target/i386/pr91384-1.c | 20 ++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 5825acabb946..83c438b129c9 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -14769,6 +14769,17 @@
                   (compare:CCZ (neg:SWI (match_dup 0)) (const_int 0)))
              (set (match_dup 0) (neg:SWI (match_dup 0)))])])
 
+;; Optimize *negsi_1 followed by *cmpsi_ccno_1 (PR target/91384) with APX_F
+(define_peephole2
+  [(parallel [(set (match_operand:SWI 0 "general_reg_operand")
+                  (neg:SWI (match_operand:SWI 1 "general_reg_operand")))
+             (clobber (reg:CC FLAGS_REG))])
+   (set (reg:CCZ FLAGS_REG) (compare:CCZ (match_dup 1) (const_int 0)))]
+  "TARGET_APX_NDD"
+  [(parallel [(set (reg:CCZ FLAGS_REG)
+                  (compare:CCZ (neg:SWI (match_dup 1)) (const_int 0)))
+             (set (match_dup 0) (neg:SWI (match_dup 1)))])])
+
 ;; Special expand pattern to handle integer mode abs
 
 (define_expand "abs<mode>2"
diff --git a/gcc/testsuite/gcc.target/i386/pr91384-1.c 
b/gcc/testsuite/gcc.target/i386/pr91384-1.c
new file mode 100644
index 000000000000..4f8823d6da2a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr91384-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mapxf" } */
+
+void foo (void);
+void bar (void);
+
+int
+test (int a)
+{
+  int r;
+
+  if (r = -a)
+    foo ();
+  else
+    bar ();
+
+  return r;
+}
+
+/* { dg-final { scan-assembler-not "testl" } } */

Reply via email to