1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512fp16 -mavx512vl -fdump-tree-slp-details -ftree-vectorize -fvect-cost-model=unlimited -mprefer-vector-width=256" } */
       3  /* { dg-require-effective-target avx512fp16 } */
       4  /* { dg-final { scan-tree-dump-times "basic block part vectorized using (?:32|64) byte vectors" 1 "slp2" } }*/
       5  /* { dg-final { scan-tree-dump-times {(?n)add new stmt:.*MEM <vector\(16\) _Float16>} 1 "slp2" } } */
       6  
       7  #include <string.h>
       8  
       9  static void do_test (void);
      10  #define DO_TEST do_test
      11  #define AVX512FP16
      12  #include "avx512-check.h"
      13  
      14  void
      15  __attribute__((noipa))
      16  foo_ph (_Complex _Float16* a,
      17  	_Complex _Float16 b1, _Complex _Float16 b2,
      18  	_Complex _Float16 b3, _Complex _Float16 b4,
      19  	_Complex _Float16 b5, _Complex _Float16 b6,
      20  	_Complex _Float16 b7,_Complex _Float16 b8)
      21  {
      22    a[0] = b1;
      23    a[1] = b2;
      24    a[2] = b3;
      25    a[3] = b4;
      26    a[4] = b5;
      27    a[5] = b6;
      28    a[6] = b7;
      29    a[7] = b8;
      30  }
      31  
      32  void
      33  do_test (void)
      34  {
      35  
      36    _Complex _Float16* ph_src = (_Complex _Float16*) malloc (32);
      37    _Complex _Float16* ph_dst = (_Complex _Float16*) malloc (32);
      38  
      39    char* p = (char* ) malloc (32);
      40  
      41    __builtin_memset (ph_dst, 0, 32);
      42  
      43    for (int i = 0; i != 32; i++)
      44      p[i] = i;
      45  
      46    __builtin_memcpy (ph_src, p, 32);
      47  
      48    foo_ph (ph_dst, ph_src[0], ph_src[1], ph_src[2], ph_src[3],
      49  	  ph_src[4], ph_src[5], ph_src[6], ph_src[7]);
      50  
      51    if (__builtin_memcmp (ph_dst, ph_src, 32) != 0)
      52      __builtin_abort ();
      53    return;
      54  }