Hi Uros,

Thanks for noting the duplicated "preferred_for_speed" attr issue. Below
patch is bootstrapped and regtested under x86_64-pc-linux-gnu{-m32,}.

Ok for trunk?

Several QImode integer patterns has two separate attr "preferred_for_speed"
set, one gating the NDD memory-form alternatives with
TARGET_ENABLE_NDD_MEM, and the existing one is for !TARGET_PARTIAL_REG_STALL.
The later one will make genattrtab regenerate the cond based on
!PARTIAL_REG_STALL only and override the TARGET_ENABLE_NDD_MEM one, so the NDD
memory alternatives were always preferred for speed regardless of the
X86_TUNE_ENABLE_NDD_MEM enabled or disabled.

Combine both conditions into a single preferred_for_speed cond per
pattern. For *ashlqi3_1 alternative 5 belongs to both sets, so it is
gated on TARGET_ENABLE_NDD_MEM && !TARGET_PARTIAL_REG_STALL.

gcc/ChangeLog:

        * config/i386/i386.md (*addqi_1<nf_name>): Merge the two
        preferred_for_speed attributes into one.
        (*andqi_1<nf_name>): Likewise.
        (*andqi_2_maybe_si): Likewise.
        (*<code>qi_1<nf_name>): Likewise.
        (*notxorqi_1): Likewise.
        (*one_cmplqi2_1): Likewise.
        (*ashlqi3_1<nf_name>): Likewise.

gcc/testsuite/ChangeLog:

        * gcc.target/i386/apx-ndd-mem-tune.c: New test.
---
 gcc/config/i386/i386.md                       | 65 +++++++++----------
 .../gcc.target/i386/apx-ndd-mem-tune.c        | 53 +++++++++++++++
 2 files changed, 82 insertions(+), 36 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/apx-ndd-mem-tune.c

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index f762b2ccea2..dc27bcf7e8d 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -7139,10 +7139,6 @@ (define_insn "*addqi_1<nf_name>"
     }
 }
   [(set_attr "isa" "*,*,*,*,*,*,apx_ndd,apx_ndd,apx_ndd")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "7,8")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set (attr "type")
      (cond [(eq_attr "alternative" "5")
               (const_string "lea")
@@ -7158,9 +7154,12 @@ (define_insn "*addqi_1<nf_name>"
    (set_attr "has_nf" "1")
    (set_attr "mode" "QI,QI,QI,SI,SI,SI,QI,QI,QI")
    ;; Potential partial reg stall on alternatives 3 and 4.
+   ;; NDD memory form (alternatives 7,8) is gated by TARGET_ENABLE_NDD_MEM.
    (set (attr "preferred_for_speed")
      (cond [(eq_attr "alternative" "3,4")
-             (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
+             (symbol_ref "!TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "7,8")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
           (symbol_ref "true")))])
 
 ;; Alternative 1 is needed to work around LRA limitation, see PR82524.
@@ -13577,10 +13576,6 @@ (define_insn "*andqi_1<nf_name>"
    #"
   [(set_attr "type" "alu,alu,alu,alu,alu,alu,msklog")
    (set_attr "isa" "*,*,*,apx_ndd,apx_ndd,apx_ndd,*")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "4,5")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set_attr "has_nf" "1")
    (set (attr "mode")
        (cond [(eq_attr "alternative" "2")
@@ -13591,9 +13586,12 @@ (define_insn "*andqi_1<nf_name>"
               ]
               (const_string "QI")))
    ;; Potential partial reg stall on alternative 2.
+   ;; NDD memory form (alternatives 4,5) is gated by TARGET_ENABLE_NDD_MEM.
    (set (attr "preferred_for_speed")
      (cond [(eq_attr "alternative" "2")
-             (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
+             (symbol_ref "!TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "4,5")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
           (symbol_ref "true")))])
 
 ;; Alternative 1 is needed to work around LRA limitation, see PR82524.
@@ -13841,10 +13839,6 @@ (define_insn "*andqi_2_maybe_si"
 }
   [(set_attr "type" "alu")
    (set_attr "isa" "*,*,*,apx_ndd,apx_ndd,apx_ndd")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "4,5")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set (attr "mode")
      (cond [(eq_attr "alternative" "3,4,5")
              (const_string "QI")
@@ -13857,9 +13851,12 @@ (define_insn "*andqi_2_maybe_si"
           ]
           (const_string "QI")))
    ;; Potential partial reg stall on alternative 2.
+   ;; NDD memory form (alternatives 4,5) is gated by TARGET_ENABLE_NDD_MEM.
    (set (attr "preferred_for_speed")
      (cond [(eq_attr "alternative" "2")
-             (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
+             (symbol_ref "!TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "4,5")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
           (symbol_ref "true")))])
 
 (define_insn "*and<mode>_2"
@@ -14679,10 +14676,6 @@ (define_insn "*<code>qi_1<nf_name>"
    <nf_prefix><logic>{b}\t{%2, %1, %0|%0, %1, %2}
    #"
   [(set_attr "isa" "*,*,*,apx_ndd,apx_ndd,apx_ndd,avx512f")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "4,5")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set_attr "type" "alu,alu,alu,alu,alu,alu,msklog")
    (set_attr "has_nf" "1")
    (set (attr "mode")
@@ -14694,9 +14687,12 @@ (define_insn "*<code>qi_1<nf_name>"
               ]
               (const_string "QI")))
    ;; Potential partial reg stall on alternative 2.
+   ;; NDD memory form (alternatives 4,5) is gated by TARGET_ENABLE_NDD_MEM.
    (set (attr "preferred_for_speed")
      (cond [(eq_attr "alternative" "2")
-             (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
+             (symbol_ref "!TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "4,5")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
           (symbol_ref "true")))])
 
 (define_insn_and_split "*notxorqi_1"
@@ -14722,10 +14718,6 @@ (define_insn_and_split "*notxorqi_1"
     }
 }
   [(set_attr "isa" "*,*,*,apx_ndd,apx_ndd,apx_ndd,avx512f")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "4,5")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set_attr "type" "alu,alu,alu,alu,alu,alu,msklog")
    (set (attr "mode")
        (cond [(eq_attr "alternative" "2")
@@ -14736,9 +14728,12 @@ (define_insn_and_split "*notxorqi_1"
               ]
               (const_string "QI")))
    ;; Potential partial reg stall on alternative 2.
+   ;; NDD memory form (alternatives 4,5) is gated by TARGET_ENABLE_NDD_MEM.
    (set (attr "preferred_for_speed")
      (cond [(eq_attr "alternative" "2")
-             (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
+             (symbol_ref "!TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "4,5")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
           (symbol_ref "true")))])
 
 ;; convert (sign_extend:WIDE (any_logic:NARROW (memory, immediate)))
@@ -16047,10 +16042,6 @@ (define_insn "*one_cmplqi2_1"
    not{b}\t{%1, %0|%0, %1}
    #"
   [(set_attr "isa" "*,*,apx_ndd,apx_ndd,avx512f")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "3")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set_attr "type" "negnot,negnot,negnot,negnot,msklog")
    (set (attr "mode")
        (cond [(eq_attr "alternative" "1")
@@ -16061,9 +16052,12 @@ (define_insn "*one_cmplqi2_1"
               ]
               (const_string "QI")))
    ;; Potential partial reg stall on alternative 1.
+   ;; NDD memory form (alternative 3) is gated by TARGET_ENABLE_NDD_MEM.
    (set (attr "preferred_for_speed")
      (cond [(eq_attr "alternative" "1")
-             (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
+             (symbol_ref "!TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "3")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
           (symbol_ref "true")))])
 
 ;; Alternative 1 is needed to work around LRA limitation, see PR82524.
@@ -17214,10 +17208,6 @@ (define_insn "*ashlqi3_1<nf_name>"
     }
 }
   [(set_attr "isa" "*,*,*,avx512dq,apx_ndd,apx_ndd")
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "5")
-             (symbol_ref "TARGET_ENABLE_NDD_MEM")]
-          (symbol_ref "true")))
    (set (attr "type")
      (cond [(eq_attr "alternative" "2")
              (const_string "lea")
@@ -17240,9 +17230,12 @@ (define_insn "*ashlqi3_1<nf_name>"
        (const_string "*")))
    (set_attr "has_nf" "1")
    (set_attr "mode" "QI,SI,SI,QI,QI,QI")
-   ;; Potential partial reg stall on alternative 1.
+   ;; NDD memory form (alternative 5) is gated by TARGET_ENABLE_NDD_MEM.
+   ;; Potential partial reg stall on alternatives 1, 4 and 5.
    (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "1,4,5")
+     (cond [(eq_attr "alternative" "5")
+             (symbol_ref "TARGET_ENABLE_NDD_MEM && !TARGET_PARTIAL_REG_STALL")
+           (eq_attr "alternative" "1,4")
              (symbol_ref "!TARGET_PARTIAL_REG_STALL")]
           (symbol_ref "true")))])
 
diff --git a/gcc/testsuite/gcc.target/i386/apx-ndd-mem-tune.c 
b/gcc/testsuite/gcc.target/i386/apx-ndd-mem-tune.c
new file mode 100644
index 00000000000..5726390be89
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/apx-ndd-mem-tune.c
@@ -0,0 +1,53 @@
+/* Verify that the memory form of NDD instructions is guarded by the
+   X86_TUNE_ENABLE_NDD_MEM tune properly. The duplicated preferred_for_speed
+   attr will be true when partial_reg_stall enabled for qi patterns, and
+   override the ENABLE_NDD_MEM set at first, so there should be only one attr
+   remaining by combining the two conditions together. */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-mapxf -march=x86-64 -O2 -mtune-ctrl=partial_reg_stall" } */
+
+unsigned char gc;
+
+unsigned char
+add_qi (unsigned char *p, unsigned char b)
+{
+  unsigned char r = *p + b;
+  gc = r;
+  return r;
+}
+
+unsigned char
+and_qi (unsigned char *p, unsigned char b)
+{
+  unsigned char r = *p & b;
+  gc = r;
+  return r;
+}
+
+unsigned char
+xor_qi (unsigned char *p, unsigned char b)
+{
+  unsigned char r = *p ^ b;
+  gc = r;
+  return r;
+}
+
+unsigned char
+not_qi (unsigned char *p)
+{
+  unsigned char r = ~*p;
+  gc = r;
+  return r;
+}
+
+unsigned char
+shl_qi (unsigned char *p, unsigned char c)
+{
+  unsigned char r = (unsigned char) (*p << c);
+  gc = r;
+  return r;
+}
+
+/* None of the QImode ops above should use the NDD memory-source form
+   when partial_reg_stall && !enable_ndd_mem.  */
+/* { dg-final { scan-assembler-not {b[ \t]+%[a-z0-9]+, \(%[a-z0-9]+\),} } } */
-- 
2.31.1

Reply via email to