1 /* { dg-options "-O3 -mavx2 -fdump-tree-vect-details" } */ 2 /* { dg-require-effective-target avx2 } */ 3 4 #include "avx2-check.h" 5 #define N 32 6 int *p1, *p2, *p3; 7 int c[N]; 8 int p1ref[N], p2ref[N]; 9 foo(int n)10__attribute__((noinline, noclone)) void foo (int n) 11 { 12 int i; 13 for (i=0; i<n; i++) 14 if (c[i]) 15 { 16 p1[i] += 1; 17 p2[i] = p3[i] +2; 18 } 19 } 20 init()21void init () 22 { 23 p1ref[0]=1; p2ref[0]=2; 24 p1ref[1]=3; p2ref[1]=5; 25 p1ref[2]=5; p2ref[2]=8; 26 p1ref[3]=7; p2ref[3]=11; 27 p1ref[4]=9; p2ref[4]=14; 28 p1ref[5]=11; p2ref[5]=17; 29 p1ref[6]=13; p2ref[6]=20; 30 p1ref[7]=15; p2ref[7]=23; 31 p1ref[8]=16; p2ref[8]=8; 32 p1ref[9]=18; p2ref[9]=9; 33 p1ref[10]=20; p2ref[10]=10; 34 p1ref[11]=22; p2ref[11]=11; 35 p1ref[12]=24; p2ref[12]=12; 36 p1ref[13]=26; p2ref[13]=13; 37 p1ref[14]=28; p2ref[14]=14; 38 p1ref[15]=30; p2ref[15]=15; 39 p1ref[16]=33; p2ref[16]=50; 40 p1ref[17]=35; p2ref[17]=53; 41 p1ref[18]=37; p2ref[18]=56; 42 p1ref[19]=39; p2ref[19]=59; 43 p1ref[20]=41; p2ref[20]=62; 44 p1ref[21]=43; p2ref[21]=65; 45 p1ref[22]=45; p2ref[22]=68; 46 p1ref[23]=47; p2ref[23]=71; 47 p1ref[24]=48; p2ref[24]=24; 48 p1ref[25]=50; p2ref[25]=25; 49 p1ref[26]=52; p2ref[26]=26; 50 p1ref[27]=54; p2ref[27]=27; 51 p1ref[28]=56; p2ref[28]=28; 52 p1ref[29]=58; p2ref[29]=29; 53 p1ref[30]=60; p2ref[30]=30; 54 p1ref[31]=62; p2ref[31]=31; 55 } 56 57 static void avx2_test(void)58avx2_test (void) 59 { 60 int * P = malloc (N * 3 * sizeof (int)); 61 int i; 62 63 p1 = &P[0]; 64 p2 = &P[N]; 65 p3 = &P[2 * N]; 66 for (i=0; i<N; i++) { 67 p1[i] = i + i; 68 p3[i] = i * 3; 69 p2[i] = i; 70 c[i] = (i >> 3) & 1? 0: 1; 71 } 72 init (); 73 foo (N); 74 for (i=0; i<N;i++) 75 if (p1[i] != p1ref[i] || p2[i] != p2ref[i]) 76 abort (); 77 } 78 79 /* { dg-final { scan-tree-dump-times "Move stmt to created bb" 6 "vect" } } */ 80