1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -mavx2 -ftree-vectorize -fvect-cost-model=unlimited -fdump-tree-slp-details -mprefer-vector-width=256" } */
       3  /* { dg-final { scan-tree-dump-times "basic block part vectorized using (?:32|64) byte vectors" 6 "slp2" } }*/
       4  /* { dg-final { scan-tree-dump-times {(?n)add new stmt:.*VEC_PERM_EXPR.*\{ 2, 3, 0, 1 \}} 4 "slp2" } }  */
       5  /* { dg-final { scan-tree-dump-times {(?n)add new stmt:.*VEC_PERM_EXPR.*\{ 6, 7, 4, 5, 2, 3, 0, 1 \}} 4 "slp2" } }  */
       6  /* { dg-final { scan-tree-dump-times {(?n)add new stmt:.*VEC_PERM_EXPR.*\{ 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1 \}} 2 "slp2" } }  */
       7  /* { dg-final { scan-tree-dump-times {(?n)add new stmt:.*VEC_PERM_EXPR.*\{ 30, 31, 28, 29, 26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1 \}} 2 "slp2" } }  */
       8  
       9  void
      10  __attribute__((noipa))
      11  foo_pd (_Complex double* a, _Complex double* __restrict b)
      12  {
      13    a[0] = b[3];
      14    a[1] = b[2];
      15    a[2] = b[1];
      16    a[3] = b[0];
      17  }
      18  
      19  void
      20  __attribute__((noipa))
      21  foo_ps (_Complex float* a, _Complex float* __restrict b)
      22  {
      23    a[0] = b[7];
      24    a[1] = b[6];
      25    a[2] = b[5];
      26    a[3] = b[4];
      27    a[4] = b[3];
      28    a[5] = b[2];
      29    a[6] = b[1];
      30    a[7] = b[0];
      31  }
      32  
      33  void
      34  __attribute__((noipa))
      35  foo_epi64 (_Complex long long* a, _Complex long long* __restrict b)
      36  {
      37    a[0] = b[3];
      38    a[1] = b[2];
      39    a[2] = b[1];
      40    a[3] = b[0];
      41  }
      42  
      43  void
      44  __attribute__((noipa))
      45  foo_epi32 (_Complex int* a, _Complex int* __restrict b)
      46  {
      47    a[0] = b[7];
      48    a[1] = b[6];
      49    a[2] = b[5];
      50    a[3] = b[4];
      51    a[4] = b[3];
      52    a[5] = b[2];
      53    a[6] = b[1];
      54    a[7] = b[0];
      55  }
      56  
      57  void
      58  __attribute__((noipa))
      59  foo_epi16 (_Complex short* a, _Complex short* __restrict b)
      60  {
      61    a[0] = b[15];
      62    a[1] = b[14];
      63    a[2] = b[13];
      64    a[3] = b[12];
      65    a[4] = b[11];
      66    a[5] = b[10];
      67    a[6] = b[9];
      68    a[7] = b[8];
      69    a[8] = b[7];
      70    a[9] = b[6];
      71    a[10] = b[5];
      72    a[11] = b[4];
      73    a[12] = b[3];
      74    a[13] = b[2];
      75    a[14] = b[1];
      76    a[15] = b[0];
      77  }
      78  
      79  void
      80  __attribute__((noipa))
      81  foo_epi8 (_Complex char* a, _Complex char* __restrict b)
      82  {
      83    a[0] = b[31];
      84    a[1] = b[30];
      85    a[2] = b[29];
      86    a[3] = b[28];
      87    a[4] = b[27];
      88    a[5] = b[26];
      89    a[6] = b[25];
      90    a[7] = b[24];
      91    a[8] = b[23];
      92    a[9] = b[22];
      93    a[10] = b[21];
      94    a[11] = b[20];
      95    a[12] = b[19];
      96    a[13] = b[18];
      97    a[14] = b[17];
      98    a[15] = b[16];
      99    a[16] = b[15];
     100    a[17] = b[14];
     101    a[18] = b[13];
     102    a[19] = b[12];
     103    a[20] = b[11];
     104    a[21] = b[10];
     105    a[22] = b[9];
     106    a[23] = b[8];
     107    a[24] = b[7];
     108    a[25] = b[6];
     109    a[26] = b[5];
     110    a[27] = b[4];
     111    a[28] = b[3];
     112    a[29] = b[2];
     113    a[30] = b[1];
     114    a[31] = b[0];
     115  }