https://gcc.gnu.org/g:73a167cfa225d5ee7092d41596b9fea1719898ff

commit r15-764-g73a167cfa225d5ee7092d41596b9fea1719898ff
Author: Haochen Jiang <haochen.ji...@intel.com>
Date:   Tue May 21 14:10:43 2024 +0800

    i386: Disable ix86_expand_vecop_qihi2 when !TARGET_AVX512BW
    
    Since vpermq is really slow, we should avoid using it for permutation
    when vpmovwb is not available (needs AVX512BW) for ix86_expand_vecop_qihi2
    and fall back to ix86_expand_vecop_qihi.
    
    gcc/ChangeLog:
    
            PR target/115069
            * config/i386/i386-expand.cc (ix86_expand_vecop_qihi2):
            Do not enable the optimization when AVX512BW is not enabled.
    
    gcc/testsuite/ChangeLog:
    
            PR target/115069
            * gcc.target/i386/pr115069.c: New.

Diff:
---
 gcc/config/i386/i386-expand.cc           | 7 +++++++
 gcc/testsuite/gcc.target/i386/pr115069.c | 9 +++++++++
 2 files changed, 16 insertions(+)

diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 7142c0a9d77..ec402a78a09 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -24188,6 +24188,13 @@ ix86_expand_vecop_qihi2 (enum rtx_code code, rtx dest, 
rtx op1, rtx op2)
   bool op2vec = GET_MODE_CLASS (GET_MODE (op2)) == MODE_VECTOR_INT;
   bool uns_p = code != ASHIFTRT;
 
+  /* Without VPMOVWB (provided by AVX512BW ISA), the expansion uses the
+     generic permutation to merge the data back into the right place.  This
+     permutation results in VPERMQ, which is slow, so better fall back to
+     ix86_expand_vecop_qihi.  */
+  if (!TARGET_AVX512BW)
+    return false;
+
   if ((qimode == V16QImode && !TARGET_AVX2)
       || (qimode == V32QImode && (!TARGET_AVX512BW || !TARGET_EVEX512))
       /* There are no V64HImode instructions.  */
diff --git a/gcc/testsuite/gcc.target/i386/pr115069.c 
b/gcc/testsuite/gcc.target/i386/pr115069.c
new file mode 100644
index 00000000000..50a3e033079
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr115069.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx2" } */
+/* { dg-final { scan-assembler-not "vpermq" } } */
+
+typedef char v16qi __attribute__((vector_size(16)));
+
+v16qi foo (v16qi a, v16qi b) {
+    return a * b;
+}

Reply via email to