1/* { dg-require-effective-target vect_int } */ 2 3#include <stdarg.h> 4#include "tree-vect.h" 5 6#define N 96 7 8unsigned short in[N*8]; 9volatile int y = 0; 10 11int 12main1 () 13{ 14 int i; 15 unsigned short out[N*8]; 16 17 for (i = 0; i < N*8; i++) 18 { 19 in[i] = i&63; 20 if (y) /* Avoid vectorization. */ 21 abort (); 22 } 23 24 for (i = 0; i < N; i++) 25 { 26 out[i*8] = in[i*8]; 27 out[i*8 + 1] = in[i*8 + 1]; 28 out[i*8 + 2] = in[i*8 + 2]; 29 out[i*8 + 3] = in[i*8 + 3]; 30 out[i*8 + 4] = in[i*8 + 4]; 31 out[i*8 + 5] = in[i*8 + 5]; 32 out[i*8 + 6] = in[i*8 + 6]; 33 out[i*8 + 7] = in[i*8 + 7]; 34 } 35 36 /* check results: */ 37 for (i = 0; i < N; i++) 38 { 39 if (out[i*8] != in[i*8] 40 || out[i*8 + 1] != in[i*8 + 1] 41 || out[i*8 + 2] != in[i*8 + 2] 42 || out[i*8 + 3] != in[i*8 + 3] 43 || out[i*8 + 4] != in[i*8 + 4] 44 || out[i*8 + 5] != in[i*8 + 5] 45 || out[i*8 + 6] != in[i*8 + 6] 46 || out[i*8 + 7] != in[i*8 + 7]) 47 abort (); 48 } 49 50 for (i = 0; i < N*2; i++) 51 { 52 out[i*4] = in[i*4]; 53 out[i*4 + 1] = in[i*4 + 1]; 54 out[i*4 + 2] = in[i*4 + 2]; 55 out[i*4 + 3] = in[i*4 + 3]; 56 } 57 58 /* check results: */ 59 for (i = 0; i < N*2; i++) 60 { 61 if (out[i*4] != in[i*4] 62 || out[i*4 + 1] != in[i*4 + 1] 63 || out[i*4 + 2] != in[i*4 + 2] 64 || out[i*4 + 3] != in[i*4 + 3]) 65 abort (); 66 } 67 68 for (i = 0; i < N/2; i++) 69 { 70 out[i*16] = in[i*16]; 71 out[i*16 + 1] = in[i*16 + 1]; 72 out[i*16 + 2] = in[i*16 + 2]; 73 out[i*16 + 3] = in[i*16 + 3]; 74 out[i*16 + 4] = in[i*16 + 4]; 75 out[i*16 + 5] = in[i*16 + 5]; 76 out[i*16 + 6] = in[i*16 + 6]; 77 out[i*16 + 7] = in[i*16 + 7]; 78 out[i*16 + 8] = in[i*16 + 8]; 79 out[i*16 + 9] = in[i*16 + 9]; 80 out[i*16 + 10] = in[i*16 + 10]; 81 out[i*16 + 11] = in[i*16 + 11]; 82 out[i*16 + 12] = in[i*16 + 12]; 83 out[i*16 + 13] = in[i*16 + 13]; 84 out[i*16 + 14] = in[i*16 + 14]; 85 out[i*16 + 15] = in[i*16 + 15]; 86 } 87 88 /* check results: */ 89 for (i = 0; i < N/2; i++) 90 { 91 if (out[i*16] != in[i*16] 92 || out[i*16 + 1] != in[i*16 + 1] 93 || out[i*16 + 2] != in[i*16 + 2] 94 || out[i*16 + 3] != in[i*16 + 3] 95 || out[i*16 + 4] != in[i*16 + 4] 96 || out[i*16 + 5] != in[i*16 + 5] 97 || out[i*16 + 6] != in[i*16 + 6] 98 || out[i*16 + 7] != in[i*16 + 7] 99 || out[i*16 + 8] != in[i*16 + 8] 100 || out[i*16 + 9] != in[i*16 + 9] 101 || out[i*16 + 10] != in[i*16 + 10] 102 || out[i*16 + 11] != in[i*16 + 11] 103 || out[i*16 + 12] != in[i*16 + 12] 104 || out[i*16 + 13] != in[i*16 + 13] 105 || out[i*16 + 14] != in[i*16 + 14] 106 || out[i*16 + 15] != in[i*16 + 15]) 107 abort (); 108 } 109 110 /* SLP with unrolling by 8. */ 111 for (i = 0; i < N/4; i++) 112 { 113 out[i*9] = in[i*9]; 114 out[i*9 + 1] = in[i*9 + 1]; 115 out[i*9 + 2] = in[i*9 + 2]; 116 out[i*9 + 3] = in[i*9 + 3]; 117 out[i*9 + 4] = in[i*9 + 4]; 118 out[i*9 + 5] = in[i*9 + 5]; 119 out[i*9 + 6] = in[i*9 + 6]; 120 out[i*9 + 7] = in[i*9 + 7]; 121 out[i*9 + 8] = in[i*9 + 8]; 122 } 123 124 /* check results: */ 125 for (i = 0; i < N/4; i++) 126 { 127 if (out[i*9] != in[i*9] 128 || out[i*9 + 1] != in[i*9 + 1] 129 || out[i*9 + 2] != in[i*9 + 2] 130 || out[i*9 + 3] != in[i*9 + 3] 131 || out[i*9 + 4] != in[i*9 + 4] 132 || out[i*9 + 5] != in[i*9 + 5] 133 || out[i*9 + 6] != in[i*9 + 6] 134 || out[i*9 + 7] != in[i*9 + 7] 135 || out[i*9 + 8] != in[i*9 + 8]) 136 abort (); 137 } 138 139 140 return 0; 141} 142 143int main (void) 144{ 145 check_vect (); 146 147 main1 (); 148 149 return 0; 150} 151 152/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */ 153/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "vect" } } */ 154/* { dg-final { cleanup-tree-dump "vect" } } */ 155 156