Hi!

These insns don't really need AVX512BW in any way themselves, only their
masked variants might need it for reloading of the mask register, but that
should be covered in builtins.def, doesn't need duplication in sse.md.
For non-masked it causes ICEs, because the builtins properly aren't guarded
with AVX512BW, but the insns incorrectly require that.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2017-12-28  Jakub Jelinek  <ja...@redhat.com>

        PR target/83604
        * config/i386/sse.md (VI248_VLBW): Rename to ...
        (VI248_AVX512VL): ... this.  Don't guard V32HI with TARGET_AVX512BW.
        (vpshrd_<mode><mask_name>, vpshld_<mode><mask_name>,
        vpshrdv_<mode>, vpshrdv_<mode>_mask, vpshrdv_<mode>_maskz,
        vpshrdv_<mode>_maskz_1, vpshldv_<mode>, vpshldv_<mode>_mask,
        vpshldv_<mode>_maskz, vpshldv_<mode>_maskz_1): Use VI248_AVX512VL
        mode iterator instead of VI248_VLBW.

        * gcc.target/i386/pr83604.c: New test.

--- gcc/config/i386/sse.md.jj   2017-12-27 19:19:58.081660733 +0100
+++ gcc/config/i386/sse.md      2017-12-27 18:43:32.200347561 +0100
@@ -448,8 +448,8 @@ (define_mode_iterator VI124_AVX2
 (define_mode_iterator VI2_AVX2_AVX512BW
   [(V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX2") V8HI])
 
-(define_mode_iterator VI248_VLBW
-  [(V32HI "TARGET_AVX512BW") V16SI V8DI
+(define_mode_iterator VI248_AVX512VL
+  [V32HI V16SI V8DI
    (V16HI "TARGET_AVX512VL") (V8SI "TARGET_AVX512VL")
    (V4DI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")
    (V4SI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
@@ -20134,10 +20134,10 @@ (define_insn "vgf2p8mulb_<mode><mask_nam
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "vpshrd_<mode><mask_name>"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (unspec:VI248_VLBW
-         [(match_operand:VI248_VLBW 1 "register_operand" "v")
-          (match_operand:VI248_VLBW 2 "nonimmediate_operand" "vm")
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (unspec:VI248_AVX512VL
+         [(match_operand:VI248_AVX512VL 1 "register_operand" "v")
+          (match_operand:VI248_AVX512VL 2 "nonimmediate_operand" "vm")
           (match_operand:SI 3 "const_0_to_255_operand" "n")]
          UNSPEC_VPSHRD))]
   "TARGET_AVX512VBMI2"
@@ -20145,10 +20145,10 @@ (define_insn "vpshrd_<mode><mask_name>"
    [(set_attr ("prefix") ("evex"))])
 
 (define_insn "vpshld_<mode><mask_name>"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (unspec:VI248_VLBW
-         [(match_operand:VI248_VLBW 1 "register_operand" "v")
-          (match_operand:VI248_VLBW 2 "nonimmediate_operand" "vm")
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (unspec:VI248_AVX512VL
+         [(match_operand:VI248_AVX512VL 1 "register_operand" "v")
+          (match_operand:VI248_AVX512VL 2 "nonimmediate_operand" "vm")
           (match_operand:SI 3 "const_0_to_255_operand" "n")]
          UNSPEC_VPSHLD))]
   "TARGET_AVX512VBMI2"
@@ -20156,11 +20156,11 @@ (define_insn "vpshld_<mode><mask_name>"
    [(set_attr ("prefix") ("evex"))])
 
 (define_insn "vpshrdv_<mode>"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (unspec:VI248_VLBW
-         [(match_operand:VI248_VLBW 1 "register_operand" "0")
-          (match_operand:VI248_VLBW 2 "register_operand" "v")
-          (match_operand:VI248_VLBW 3 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (unspec:VI248_AVX512VL
+         [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
+          (match_operand:VI248_AVX512VL 2 "register_operand" "v")
+          (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
          UNSPEC_VPSHRDV))]
   "TARGET_AVX512VBMI2"
   "vpshrdv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3 }"
@@ -20168,12 +20168,12 @@ (define_insn "vpshrdv_<mode>"
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "vpshrdv_<mode>_mask"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (vec_merge:VI248_VLBW
-         (unspec:VI248_VLBW
-           [(match_operand:VI248_VLBW 1 "register_operand" "0")
-            (match_operand:VI248_VLBW 2 "register_operand" "v")
-            (match_operand:VI248_VLBW 3 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (vec_merge:VI248_AVX512VL
+         (unspec:VI248_AVX512VL
+           [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
+            (match_operand:VI248_AVX512VL 2 "register_operand" "v")
+            (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
            UNSPEC_VPSHRDV)
          (match_dup 1)
          (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
@@ -20183,10 +20183,10 @@ (define_insn "vpshrdv_<mode>_mask"
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_expand "vpshrdv_<mode>_maskz"
-  [(match_operand:VI248_VLBW 0 "register_operand")
-   (match_operand:VI248_VLBW 1 "register_operand")
-   (match_operand:VI248_VLBW 2 "register_operand")
-   (match_operand:VI248_VLBW 3 "nonimmediate_operand")
+  [(match_operand:VI248_AVX512VL 0 "register_operand")
+   (match_operand:VI248_AVX512VL 1 "register_operand")
+   (match_operand:VI248_AVX512VL 2 "register_operand")
+   (match_operand:VI248_AVX512VL 3 "nonimmediate_operand")
    (match_operand:<avx512fmaskmode> 4 "register_operand")]
   "TARGET_AVX512VBMI2"
 {
@@ -20198,14 +20198,14 @@ (define_expand "vpshrdv_<mode>_maskz"
 })
 
 (define_insn "vpshrdv_<mode>_maskz_1"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (vec_merge:VI248_VLBW
-         (unspec:VI248_VLBW
-           [(match_operand:VI248_VLBW 1 "register_operand" "0")
-            (match_operand:VI248_VLBW 2 "register_operand" "v")
-            (match_operand:VI248_VLBW 3 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (vec_merge:VI248_AVX512VL
+         (unspec:VI248_AVX512VL
+           [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
+            (match_operand:VI248_AVX512VL 2 "register_operand" "v")
+            (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
            UNSPEC_VPSHRDV)
-         (match_operand:VI248_VLBW 4 "const0_operand" "C")
+         (match_operand:VI248_AVX512VL 4 "const0_operand" "C")
          (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
   "TARGET_AVX512VBMI2"
   "vpshrdv<ssemodesuffix>\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
@@ -20213,11 +20213,11 @@ (define_insn "vpshrdv_<mode>_maskz_1"
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "vpshldv_<mode>"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (unspec:VI248_VLBW
-         [(match_operand:VI248_VLBW 1 "register_operand" "0")
-          (match_operand:VI248_VLBW 2 "register_operand" "v")
-          (match_operand:VI248_VLBW 3 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (unspec:VI248_AVX512VL
+         [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
+          (match_operand:VI248_AVX512VL 2 "register_operand" "v")
+          (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
          UNSPEC_VPSHLDV))]
   "TARGET_AVX512VBMI2"
   "vpshldv<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3 }"
@@ -20225,12 +20225,12 @@ (define_insn "vpshldv_<mode>"
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "vpshldv_<mode>_mask"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (vec_merge:VI248_VLBW
-         (unspec:VI248_VLBW
-           [(match_operand:VI248_VLBW 1 "register_operand" "0")
-            (match_operand:VI248_VLBW 2 "register_operand" "v")
-            (match_operand:VI248_VLBW 3 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (vec_merge:VI248_AVX512VL
+         (unspec:VI248_AVX512VL
+           [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
+            (match_operand:VI248_AVX512VL 2 "register_operand" "v")
+            (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
            UNSPEC_VPSHLDV)
          (match_dup 1)
          (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
@@ -20240,10 +20240,10 @@ (define_insn "vpshldv_<mode>_mask"
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_expand "vpshldv_<mode>_maskz"
-  [(match_operand:VI248_VLBW 0 "register_operand")
-   (match_operand:VI248_VLBW 1 "register_operand")
-   (match_operand:VI248_VLBW 2 "register_operand")
-   (match_operand:VI248_VLBW 3 "nonimmediate_operand")
+  [(match_operand:VI248_AVX512VL 0 "register_operand")
+   (match_operand:VI248_AVX512VL 1 "register_operand")
+   (match_operand:VI248_AVX512VL 2 "register_operand")
+   (match_operand:VI248_AVX512VL 3 "nonimmediate_operand")
    (match_operand:<avx512fmaskmode> 4 "register_operand")]
   "TARGET_AVX512VBMI2"
 {
@@ -20255,14 +20255,14 @@ (define_expand "vpshldv_<mode>_maskz"
 })
 
 (define_insn "vpshldv_<mode>_maskz_1"
-  [(set (match_operand:VI248_VLBW 0 "register_operand" "=v")
-       (vec_merge:VI248_VLBW
-         (unspec:VI248_VLBW
-           [(match_operand:VI248_VLBW 1 "register_operand" "0")
-            (match_operand:VI248_VLBW 2 "register_operand" "v")
-            (match_operand:VI248_VLBW 3 "nonimmediate_operand" "vm")]
+  [(set (match_operand:VI248_AVX512VL 0 "register_operand" "=v")
+       (vec_merge:VI248_AVX512VL
+         (unspec:VI248_AVX512VL
+           [(match_operand:VI248_AVX512VL 1 "register_operand" "0")
+            (match_operand:VI248_AVX512VL 2 "register_operand" "v")
+            (match_operand:VI248_AVX512VL 3 "nonimmediate_operand" "vm")]
            UNSPEC_VPSHLDV)
-         (match_operand:VI248_VLBW 4 "const0_operand" "C")
+         (match_operand:VI248_AVX512VL 4 "const0_operand" "C")
          (match_operand:<avx512fmaskmode> 5 "register_operand" "Yk")))]
   "TARGET_AVX512VBMI2"
   "vpshldv<ssemodesuffix>\t{%3, %2, %0%{%5%}%{z%}|%0%{%5%}%{z%}, %2, %3 }"
--- gcc/testsuite/gcc.target/i386/pr83604.c.jj  2017-12-27 19:33:19.835077783 
+0100
+++ gcc/testsuite/gcc.target/i386/pr83604.c     2017-12-27 19:32:37.661052000 
+0100
@@ -0,0 +1,11 @@
+/* PR target/83604 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mno-avx" } */
+
+typedef short V __attribute__((__vector_size__(64)));
+
+__attribute__((target ("avx512vbmi2"))) V
+foo (V x, V y, V z)
+{
+  return __builtin_ia32_vpshrdv_v32hi (x, y, z);
+}

        Jakub

Reply via email to