1/* { dg-require-effective-target vect_int } */ 2 3#include <stdarg.h> 4#include "tree-vect.h" 5 6#define N 16 7#define DIFF 242 8 9typedef struct { 10 unsigned char a; 11 unsigned char b; 12 unsigned char c; 13 unsigned char d; 14} s; 15 16unsigned char ub[N*2] = {1,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,1,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45}; 17unsigned char uc[N] = {1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 18 19volatile int y = 0; 20 21void 22main1 (unsigned char x, unsigned char max_result, unsigned char min_result, s *arr) 23{ 24 int i; 25 unsigned char udiff = 2; 26 unsigned char umax = x; 27 unsigned char umin = x; 28 unsigned char ua1[N*2]; 29 s *pIn = arr; 30 s out[N]; 31 32 for (i = 0; i < N; i++) { 33 udiff += (unsigned char)(ub[i] - uc[i]); 34 35 ua1[2*i+1] = ub[2*i+1]; 36 ua1[2*i] = ub[2*i]; 37 38 out[i].d = pIn->d - 1; 39 out[i].b = pIn->b - 4; 40 out[i].c = pIn->c - 8; 41 out[i].a = pIn->a - 3; 42 43 pIn++; 44 } 45 46 for (i = 0; i < N; i++) { 47 if (ua1[2*i] != ub[2*i] 48 || ua1[2*i+1] != ub[2*i+1] 49 || out[i].a != arr[i].a - 3 50 || out[i].b != arr[i].b - 4 51 || out[i].c != arr[i].c - 8 52 || out[i].d != arr[i].d - 1) 53 abort(); 54 } 55 56 /* check results: */ 57 if (udiff != DIFF) 58 abort (); 59} 60 61int main (void) 62{ 63 int i; 64 s arr[N]; 65 66 for (i = 0; i < N; i++) 67 { 68 arr[i].a = i + 9; 69 arr[i].b = i * 2 + 10; 70 arr[i].c = 17; 71 arr[i].d = i+34; 72 if (y) /* Avoid vectorization. */ 73 abort (); 74 } 75 check_vect (); 76 77 main1 (100, 100, 1, arr); 78 main1 (0, 15, 0, arr); 79 return 0; 80} 81 82/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align && ilp32 } } } } */ 83/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" { xfail { vect_no_align && ilp32 } } } } */ 84/* { dg-final { cleanup-tree-dump "vect" } } */ 85