1/* { dg-require-effective-target vect_int } */ 2 3#include <stdarg.h> 4#include "tree-vect.h" 5 6#define N 64 7 8unsigned short in[N*8]; 9unsigned short in2[N*8]; 10volatile int y = 0; 11 12int 13main1 () 14{ 15 int i; 16 unsigned short out[N*8]; 17 unsigned short out2[N*8]; 18 19 for (i = 0; i < N*8; i++) 20 { 21 in[i] = in2[i] = i; 22 if (y) /* Avoid vectorization. */ 23 abort (); 24 } 25 26 /* SLP with unrolling by 8. */ 27 for (i = 0; i < N; i++) 28 { 29 out[i*3] = in[i*3] + 5; 30 out[i*3 + 1] = in[i*3 + 1] + 6; 31 out[i*3 + 2] = in[i*3 + 2] + 16; 32 33 out2[i*5] = in2[i*5] + 2; 34 out2[i*5 + 1] = in2[i*5 + 1] + 2; 35 out2[i*5 + 2] = in2[i*5 + 2] + 1; 36 out2[i*5 + 3] = in2[i*5 + 3] + 3; 37 out2[i*5 + 4] = in2[i*5 + 4] + 13; 38 } 39 40 /* check results: */ 41 for (i = 0; i < N; i++) 42 { 43 if (out[i*3] != in[i*3] + 5 44 || out[i*3 + 1] != in[i*3 + 1] + 6 45 || out[i*3 + 2] != in[i*3 + 2] + 16 46 || out2[i*5] != in2[i*5] + 2 47 || out2[i*5 + 1] != in2[i*5 + 1] + 2 48 || out2[i*5 + 2] != in2[i*5 + 2] + 1 49 || out2[i*5 + 3] != in2[i*5 + 3] + 3 50 || out2[i*5 + 4] != in2[i*5 + 4] + 13) 51 abort (); 52 } 53 54 return 0; 55} 56 57int main (void) 58{ 59 check_vect (); 60 61 main1 (); 62 63 return 0; 64} 65 66/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ 67/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" } } */ 68/* { dg-final { cleanup-tree-dump "vect" } } */ 69 70