1 /* { dg-require-effective-target vect_double } */ 2 3 #include "tree-vect.h" 4 5 extern long int lrint (double); 6 extern void abort (void); 7 long int a[64]; 8 double b[64]; 9 10 __attribute__((noinline, noclone)) void f1(int n)11f1 (int n) 12 { 13 int i; 14 for (i = 0; i < n; i++) 15 { 16 a[4 * i + 0] = lrint (b[4 * i + 0]) + 1; 17 a[4 * i + 1] = lrint (b[4 * i + 1]) + 2; 18 a[4 * i + 2] = lrint (b[4 * i + 2]) + 3; 19 a[4 * i + 3] = lrint (b[4 * i + 3]) + 4; 20 } 21 } 22 23 __attribute__((noinline, noclone)) void f2(int n)24f2 (int n) 25 { 26 int i; 27 for (i = 0; i < 2 * n; i++) 28 { 29 a[2 * i + 0] = lrint (b[2 * i + 0]) + 1; 30 a[2 * i + 1] = lrint (b[2 * i + 1]) + 2; 31 } 32 } 33 34 __attribute__((noinline, noclone)) void f3(void)35f3 (void) 36 { 37 int i; 38 for (i = 0; i < 64; i++) 39 a[i] = lrint (b[i]) + 1; 40 } 41 42 __attribute__((noinline, noclone)) void f4(int n)43f4 (int n) 44 { 45 int i; 46 for (i = 0; i < n; i++) 47 { 48 a[4 * i + 0] = lrint (b[4 * i + 0]); 49 a[4 * i + 1] = lrint (b[4 * i + 1]); 50 a[4 * i + 2] = lrint (b[4 * i + 2]); 51 a[4 * i + 3] = lrint (b[4 * i + 3]); 52 } 53 } 54 55 __attribute__((noinline, noclone)) void f5(int n)56f5 (int n) 57 { 58 int i; 59 for (i = 0; i < 2 * n; i++) 60 { 61 a[2 * i + 0] = lrint (b[2 * i + 0]); 62 a[2 * i + 1] = lrint (b[2 * i + 1]); 63 } 64 } 65 66 __attribute__((noinline, noclone)) void f6(void)67f6 (void) 68 { 69 int i; 70 for (i = 0; i < 64; i++) 71 a[i] = lrint (b[i]); 72 } 73 74 __attribute__((noinline, noclone)) int main1()75main1 () 76 { 77 int i; 78 79 for (i = 0; i < 64; i++) 80 { 81 asm (""); 82 b[i] = ((i & 1) ? -4 * i : 4 * i) + 0.25; 83 } 84 f1 (16); 85 for (i = 0; i < 64; i++) 86 if (a[i] != ((i & 1) ? -4 * i : 4 * i) + 1 + (i & 3)) 87 abort (); 88 else 89 a[i] = 131.25; 90 f2 (16); 91 for (i = 0; i < 64; i++) 92 if (a[i] != ((i & 1) ? -4 * i : 4 * i) + 1 + (i & 1)) 93 abort (); 94 else 95 a[i] = 131.25; 96 f3 (); 97 for (i = 0; i < 64; i++) 98 if (a[i] != ((i & 1) ? -4 * i : 4 * i) + 1) 99 abort (); 100 else 101 a[i] = 131.25; 102 f4 (16); 103 for (i = 0; i < 64; i++) 104 if (a[i] != ((i & 1) ? -4 * i : 4 * i)) 105 abort (); 106 else 107 a[i] = 131.25; 108 f5 (16); 109 for (i = 0; i < 64; i++) 110 if (a[i] != ((i & 1) ? -4 * i : 4 * i)) 111 abort (); 112 else 113 a[i] = 131.25; 114 f6 (); 115 for (i = 0; i < 64; i++) 116 if (a[i] != ((i & 1) ? -4 * i : 4 * i)) 117 abort (); 118 return 0; 119 } 120 121 int main()122main () 123 { 124 check_vect (); 125 return main1 (); 126 } 127 128 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 6 "vect" { target vect_call_lrint } } } */ 129 /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 4 "vect" { target vect_call_lrint } } } */ 130