modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/builtin-prefetch-4.c (about) 1 /* Test that __builtin_prefetch does no harm. 2 3 Check that the expression containing the address to prefetch is 4 evaluated if it has side effects, even if the target does not support 5 data prefetch. Check changes to pointers and to array indices that are 6 either global variables or arguments. */ 7 8 #define ARRSIZE 100 9 10 int arr[ARRSIZE]; 11 int *ptr = &arr[20]; 12 int arrindex = 4; 13 14 /* Check that assignment within a prefetch argument is evaluated. */ 15 16 int 17 assign_arg_ptr (int *p) 18 { 19 int *q; 20 __builtin_prefetch ((q = p), 0, 0); 21 return q == p; 22 } 23 24 int 25 assign_glob_ptr (void) 26 { 27 int *q; 28 __builtin_prefetch ((q = ptr), 0, 0); 29 return q == ptr; 30 } 31 32 int 33 assign_arg_idx (int *p, int i) 34 { 35 int j; 36 __builtin_prefetch (&p[j = i], 0, 0); 37 return j == i; 38 } 39 40 int 41 assign_glob_idx (void) 42 { 43 int j; 44 __builtin_prefetch (&ptr[j = arrindex], 0, 0); 45 return j == arrindex; 46 } 47 48 /* Check that pre/post increment/decrement within a prefetch argument are 49 evaluated. */ 50 51 int 52 preinc_arg_ptr (int *p) 53 { 54 int *q; 55 q = p + 1; 56 __builtin_prefetch (++p, 0, 0); 57 return p == q; 58 } 59 60 int 61 preinc_glob_ptr (void) 62 { 63 int *q; 64 q = ptr + 1; 65 __builtin_prefetch (++ptr, 0, 0); 66 return ptr == q; 67 } 68 69 int 70 postinc_arg_ptr (int *p) 71 { 72 int *q; 73 q = p + 1; 74 __builtin_prefetch (p++, 0, 0); 75 return p == q; 76 } 77 78 int 79 postinc_glob_ptr (void) 80 { 81 int *q; 82 q = ptr + 1; 83 __builtin_prefetch (ptr++, 0, 0); 84 return ptr == q; 85 } 86 87 int 88 predec_arg_ptr (int *p) 89 { 90 int *q; 91 q = p - 1; 92 __builtin_prefetch (--p, 0, 0); 93 return p == q; 94 } 95 96 int 97 predec_glob_ptr (void) 98 { 99 int *q; 100 q = ptr - 1; 101 __builtin_prefetch (--ptr, 0, 0); 102 return ptr == q; 103 } 104 105 int 106 postdec_arg_ptr (int *p) 107 { 108 int *q; 109 q = p - 1; 110 __builtin_prefetch (p--, 0, 0); 111 return p == q; 112 } 113 114 int 115 postdec_glob_ptr (void) 116 { 117 int *q; 118 q = ptr - 1; 119 __builtin_prefetch (ptr--, 0, 0); 120 return ptr == q; 121 } 122 123 int 124 preinc_arg_idx (int *p, int i) 125 { 126 int j = i + 1; 127 __builtin_prefetch (&p[++i], 0, 0); 128 return i == j; 129 } 130 131 132 int 133 preinc_glob_idx (void) 134 { 135 int j = arrindex + 1; 136 __builtin_prefetch (&ptr[++arrindex], 0, 0); 137 return arrindex == j; 138 } 139 140 int 141 postinc_arg_idx (int *p, int i) 142 { 143 int j = i + 1; 144 __builtin_prefetch (&p[i++], 0, 0); 145 return i == j; 146 } 147 148 int 149 postinc_glob_idx (void) 150 { 151 int j = arrindex + 1; 152 __builtin_prefetch (&ptr[arrindex++], 0, 0); 153 return arrindex == j; 154 } 155 156 int 157 predec_arg_idx (int *p, int i) 158 { 159 int j = i - 1; 160 __builtin_prefetch (&p[--i], 0, 0); 161 return i == j; 162 } 163 164 int 165 predec_glob_idx (void) 166 { 167 int j = arrindex - 1; 168 __builtin_prefetch (&ptr[--arrindex], 0, 0); 169 return arrindex == j; 170 } 171 172 int 173 postdec_arg_idx (int *p, int i) 174 { 175 int j = i - 1; 176 __builtin_prefetch (&p[i--], 0, 0); 177 return i == j; 178 } 179 180 int 181 postdec_glob_idx (void) 182 { 183 int j = arrindex - 1; 184 __builtin_prefetch (&ptr[arrindex--], 0, 0); 185 return arrindex == j; 186 } 187 188 /* Check that function calls within the first prefetch argument are 189 evaluated. */ 190 191 int getptrcnt = 0; 192 193 int * 194 getptr (int *p) 195 { 196 getptrcnt++; 197 return p + 1; 198 } 199 200 int 201 funccall_arg_ptr (int *p) 202 { 203 __builtin_prefetch (getptr (p), 0, 0); 204 return getptrcnt == 1; 205 } 206 207 int getintcnt = 0; 208 209 int 210 getint (int i) 211 { 212 getintcnt++; 213 return i + 1; 214 } 215 216 int 217 funccall_arg_idx (int *p, int i) 218 { 219 __builtin_prefetch (&p[getint (i)], 0, 0); 220 return getintcnt == 1; 221 } 222 223 int 224 main () 225 { 226 if (!assign_arg_ptr (ptr)) 227 abort (); 228 if (!assign_glob_ptr ()) 229 abort (); 230 if (!assign_arg_idx (ptr, 4)) 231 abort (); 232 if (!assign_glob_idx ()) 233 abort (); 234 if (!preinc_arg_ptr (ptr)) 235 abort (); 236 if (!preinc_glob_ptr ()) 237 abort (); 238 if (!postinc_arg_ptr (ptr)) 239 abort (); 240 if (!postinc_glob_ptr ()) 241 abort (); 242 if (!predec_arg_ptr (ptr)) 243 abort (); 244 if (!predec_glob_ptr ()) 245 abort (); 246 if (!postdec_arg_ptr (ptr)) 247 abort (); 248 if (!postdec_glob_ptr ()) 249 abort (); 250 if (!preinc_arg_idx (ptr, 3)) 251 abort (); 252 if (!preinc_glob_idx ()) 253 abort (); 254 if (!postinc_arg_idx (ptr, 3)) 255 abort (); 256 if (!postinc_glob_idx ()) 257 abort (); 258 if (!predec_arg_idx (ptr, 3)) 259 abort (); 260 if (!predec_glob_idx ()) 261 abort (); 262 if (!postdec_arg_idx (ptr, 3)) 263 abort (); 264 if (!postdec_glob_idx ()) 265 abort (); 266 if (!funccall_arg_ptr (ptr)) 267 abort (); 268 if (!funccall_arg_idx (ptr, 3)) 269 abort (); 270 exit (0); 271 }