1/* { dg-require-effective-target vect_int } */ 2 3#include <stdarg.h> 4#include "tree-vect.h" 5 6#define N 64 7 8int ia[N + 1]; 9int ib[N + 1]; 10 11/* Vectorizable. Dependence distance -1. */ 12__attribute__((noinline)) void 13f1 (void) 14{ 15 int i; 16 for (i = 0; i < N; i++) 17 { 18 ia[i + 1] = 1; 19 ib[i] = ia[i]; 20 } 21} 22 23/* Not vectorizable due to data dependence: dependence distance 1. */ 24__attribute__((noinline)) void 25f2 (void) 26{ 27 int i; 28 for (i = 0; i < N; i++) 29 { 30 ia[i] = 1; 31 ib[i] = ia[i + 1]; 32 } 33} 34 35/* Not vectorizable due to data dependence: dependence distance 1. */ 36__attribute__((noinline)) void 37f3 (void) 38{ 39 int i; 40 for (i = N - 1; i >= 0; i--) 41 { 42 ia[i + 1] = 1; 43 ib[i] = ia[i]; 44 } 45} 46 47/* Vectorizable. Dependence distance -1. */ 48__attribute__((noinline)) void 49f4 (void) 50{ 51 int i; 52 for (i = N - 1; i >= 0; i--) 53 { 54 ia[i] = 1; 55 ib[i] = ia[i + 1]; 56 } 57} 58 59/* Vectorizable. Dependence distance -1. */ 60__attribute__((noinline)) void 61f5 (void) 62{ 63 int i; 64 for (i = 0; i < N; i++) 65 { 66 ia[i + 1] = 1; 67 ia[i] = 2; 68 } 69} 70 71/* Not vectorizable due to data dependence: dependence distance 1. */ 72__attribute__((noinline)) void 73f6 (void) 74{ 75 int i; 76 for (i = 0; i < N; i++) 77 { 78 ia[i] = 1; 79 ia[i + 1] = 2; 80 } 81} 82 83/* Not vectorizable due to data dependence: dependence distance 1. */ 84__attribute__((noinline)) void 85f7 (void) 86{ 87 int i; 88 for (i = N - 1; i >= 0; i--) 89 { 90 ia[i + 1] = 1; 91 ia[i] = 2; 92 } 93} 94 95/* Vectorizable. Dependence distance -1. */ 96__attribute__((noinline)) void 97f8 (void) 98{ 99 int i; 100 for (i = N - 1; i >= 0; i--) 101 { 102 ia[i] = 1; 103 ia[i + 1] = 2; 104 } 105} 106 107__attribute__ ((noinline)) int 108main1 (void) 109{ 110 int i, j; 111 112 for (j = 0; j < 8; j++) 113 { 114 for (i = 0; i <= N; i++) 115 { 116 ia[i] = i + 3; 117 ib[i] = i + N + 3; 118 asm (""); 119 } 120 121 switch (j) 122 { 123 case 0: f1 (); break; 124 case 1: f2 (); break; 125 case 2: f3 (); break; 126 case 3: f4 (); break; 127 case 4: f5 (); break; 128 case 5: f6 (); break; 129 case 6: f7 (); break; 130 case 7: f8 (); break; 131 } 132 133 for (i = 0; i <= N; i++) 134 { 135 int ea = i + 3; 136 int eb = i + N + 3; 137 switch (j) 138 { 139 case 0: 140 if (i) ea = 1; 141 if (i == 0) eb = 3; 142 else if (i != N) eb = 1; 143 break; 144 case 1: 145 if (i != N) ea = 1; 146 if (i != N) eb = i + 4; 147 break; 148 case 2: 149 if (i) ea = 1; 150 if (i != N) eb = i + 3; 151 break; 152 case 3: 153 if (i != N) ea = 1; 154 if (i < N - 1) eb = 1; 155 else if (i == N - 1) eb = 67; 156 break; 157 case 4: 158 ea = 1 + (i != N); 159 break; 160 case 5: 161 ea = 2 - (i != N); 162 break; 163 case 6: 164 ea = 1 + (i == 0); 165 break; 166 case 7: 167 ea = 2 - (i == 0); 168 break; 169 } 170 if (ia[i] != ea || ib[i] != eb) 171 abort (); 172 } 173 } 174 175 return 0; 176} 177 178int main () 179{ 180 check_vect (); 181 182 return main1 (); 183} 184 185/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */ 186/* { dg-final { scan-tree-dump-times "dependence distance negative" 4 "vect" } } */ 187/* { dg-final { cleanup-tree-dump "vect" } } */ 188