Check subrange liveness at rematerialization
[llvm-project.git] / libcxx / src / hash.cpp
blobb8e921ad067056cd12a59c07bb3daa507f8e03a2
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include "__hash_table"
10 #include "algorithm"
11 #include "stdexcept"
12 #include "type_traits"
14 #ifdef __clang__
15 #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
16 #endif
18 _LIBCPP_BEGIN_NAMESPACE_STD
20 namespace {
22 // handle all next_prime(i) for i in [1, 210), special case 0
23 const unsigned small_primes[] =
30 11,
31 13,
32 17,
33 19,
34 23,
35 29,
36 31,
37 37,
38 41,
39 43,
40 47,
41 53,
42 59,
43 61,
44 67,
45 71,
46 73,
47 79,
48 83,
49 89,
50 97,
51 101,
52 103,
53 107,
54 109,
55 113,
56 127,
57 131,
58 137,
59 139,
60 149,
61 151,
62 157,
63 163,
64 167,
65 173,
66 179,
67 181,
68 191,
69 193,
70 197,
71 199,
72 211
75 // potential primes = 210*k + indices[i], k >= 1
76 // these numbers are not divisible by 2, 3, 5 or 7
77 // (or any integer 2 <= j <= 10 for that matter).
78 const unsigned indices[] =
81 11,
82 13,
83 17,
84 19,
85 23,
86 29,
87 31,
88 37,
89 41,
90 43,
91 47,
92 53,
93 59,
94 61,
95 67,
96 71,
97 73,
98 79,
99 83,
102 101,
103 103,
104 107,
105 109,
106 113,
107 121,
108 127,
109 131,
110 137,
111 139,
112 143,
113 149,
114 151,
115 157,
116 163,
117 167,
118 169,
119 173,
120 179,
121 181,
122 187,
123 191,
124 193,
125 197,
126 199,
132 // Returns: If n == 0, returns 0. Else returns the lowest prime number that
133 // is greater than or equal to n.
135 // The algorithm creates a list of small primes, plus an open-ended list of
136 // potential primes. All prime numbers are potential prime numbers. However
137 // some potential prime numbers are not prime. In an ideal world, all potential
138 // prime numbers would be prime. Candidate prime numbers are chosen as the next
139 // highest potential prime. Then this number is tested for prime by dividing it
140 // by all potential prime numbers less than the sqrt of the candidate.
142 // This implementation defines potential primes as those numbers not divisible
143 // by 2, 3, 5, and 7. Other (common) implementations define potential primes
144 // as those not divisible by 2. A few other implementations define potential
145 // primes as those not divisible by 2 or 3. By raising the number of small
146 // primes which the potential prime is not divisible by, the set of potential
147 // primes more closely approximates the set of prime numbers. And thus there
148 // are fewer potential primes to search, and fewer potential primes to divide
149 // against.
151 template <size_t _Sz = sizeof(size_t)>
152 inline _LIBCPP_INLINE_VISIBILITY
153 typename enable_if<_Sz == 4, void>::type
154 __check_for_overflow(size_t N)
156 if (N > 0xFFFFFFFB)
157 __throw_overflow_error("__next_prime overflow");
160 template <size_t _Sz = sizeof(size_t)>
161 inline _LIBCPP_INLINE_VISIBILITY
162 typename enable_if<_Sz == 8, void>::type
163 __check_for_overflow(size_t N)
165 if (N > 0xFFFFFFFFFFFFFFC5ull)
166 __throw_overflow_error("__next_prime overflow");
169 size_t
170 __next_prime(size_t n)
172 const size_t L = 210;
173 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
174 // If n is small enough, search in small_primes
175 if (n <= small_primes[N-1])
176 return *std::lower_bound(small_primes, small_primes + N, n);
177 // Else n > largest small_primes
178 // Check for overflow
179 __check_for_overflow(n);
180 // Start searching list of potential primes: L * k0 + indices[in]
181 const size_t M = sizeof(indices) / sizeof(indices[0]);
182 // Select first potential prime >= n
183 // Known a-priori n >= L
184 size_t k0 = n / L;
185 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
186 - indices);
187 n = L * k0 + indices[in];
188 while (true)
190 // Divide n by all primes or potential primes (i) until:
191 // 1. The division is even, so try next potential prime.
192 // 2. The i > sqrt(n), in which case n is prime.
193 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
194 // so don't test those (j == 5 -> divide by 11 first). And the
195 // potential primes start with 211, so don't test against the last
196 // small prime.
197 for (size_t j = 5; j < N - 1; ++j)
199 const std::size_t p = small_primes[j];
200 const std::size_t q = n / p;
201 if (q < p)
202 return n;
203 if (n == q * p)
204 goto next;
206 // n wasn't divisible by small primes, try potential primes
208 size_t i = 211;
209 while (true)
211 std::size_t q = n / i;
212 if (q < i)
213 return n;
214 if (n == q * i)
215 break;
217 i += 10;
218 q = n / i;
219 if (q < i)
220 return n;
221 if (n == q * i)
222 break;
224 i += 2;
225 q = n / i;
226 if (q < i)
227 return n;
228 if (n == q * i)
229 break;
231 i += 4;
232 q = n / i;
233 if (q < i)
234 return n;
235 if (n == q * i)
236 break;
238 i += 2;
239 q = n / i;
240 if (q < i)
241 return n;
242 if (n == q * i)
243 break;
245 i += 4;
246 q = n / i;
247 if (q < i)
248 return n;
249 if (n == q * i)
250 break;
252 i += 6;
253 q = n / i;
254 if (q < i)
255 return n;
256 if (n == q * i)
257 break;
259 i += 2;
260 q = n / i;
261 if (q < i)
262 return n;
263 if (n == q * i)
264 break;
266 i += 6;
267 q = n / i;
268 if (q < i)
269 return n;
270 if (n == q * i)
271 break;
273 i += 4;
274 q = n / i;
275 if (q < i)
276 return n;
277 if (n == q * i)
278 break;
280 i += 2;
281 q = n / i;
282 if (q < i)
283 return n;
284 if (n == q * i)
285 break;
287 i += 4;
288 q = n / i;
289 if (q < i)
290 return n;
291 if (n == q * i)
292 break;
294 i += 6;
295 q = n / i;
296 if (q < i)
297 return n;
298 if (n == q * i)
299 break;
301 i += 6;
302 q = n / i;
303 if (q < i)
304 return n;
305 if (n == q * i)
306 break;
308 i += 2;
309 q = n / i;
310 if (q < i)
311 return n;
312 if (n == q * i)
313 break;
315 i += 6;
316 q = n / i;
317 if (q < i)
318 return n;
319 if (n == q * i)
320 break;
322 i += 4;
323 q = n / i;
324 if (q < i)
325 return n;
326 if (n == q * i)
327 break;
329 i += 2;
330 q = n / i;
331 if (q < i)
332 return n;
333 if (n == q * i)
334 break;
336 i += 6;
337 q = n / i;
338 if (q < i)
339 return n;
340 if (n == q * i)
341 break;
343 i += 4;
344 q = n / i;
345 if (q < i)
346 return n;
347 if (n == q * i)
348 break;
350 i += 6;
351 q = n / i;
352 if (q < i)
353 return n;
354 if (n == q * i)
355 break;
357 i += 8;
358 q = n / i;
359 if (q < i)
360 return n;
361 if (n == q * i)
362 break;
364 i += 4;
365 q = n / i;
366 if (q < i)
367 return n;
368 if (n == q * i)
369 break;
371 i += 2;
372 q = n / i;
373 if (q < i)
374 return n;
375 if (n == q * i)
376 break;
378 i += 4;
379 q = n / i;
380 if (q < i)
381 return n;
382 if (n == q * i)
383 break;
385 i += 2;
386 q = n / i;
387 if (q < i)
388 return n;
389 if (n == q * i)
390 break;
392 i += 4;
393 q = n / i;
394 if (q < i)
395 return n;
396 if (n == q * i)
397 break;
399 i += 8;
400 q = n / i;
401 if (q < i)
402 return n;
403 if (n == q * i)
404 break;
406 i += 6;
407 q = n / i;
408 if (q < i)
409 return n;
410 if (n == q * i)
411 break;
413 i += 4;
414 q = n / i;
415 if (q < i)
416 return n;
417 if (n == q * i)
418 break;
420 i += 6;
421 q = n / i;
422 if (q < i)
423 return n;
424 if (n == q * i)
425 break;
427 i += 2;
428 q = n / i;
429 if (q < i)
430 return n;
431 if (n == q * i)
432 break;
434 i += 4;
435 q = n / i;
436 if (q < i)
437 return n;
438 if (n == q * i)
439 break;
441 i += 6;
442 q = n / i;
443 if (q < i)
444 return n;
445 if (n == q * i)
446 break;
448 i += 2;
449 q = n / i;
450 if (q < i)
451 return n;
452 if (n == q * i)
453 break;
455 i += 6;
456 q = n / i;
457 if (q < i)
458 return n;
459 if (n == q * i)
460 break;
462 i += 6;
463 q = n / i;
464 if (q < i)
465 return n;
466 if (n == q * i)
467 break;
469 i += 4;
470 q = n / i;
471 if (q < i)
472 return n;
473 if (n == q * i)
474 break;
476 i += 2;
477 q = n / i;
478 if (q < i)
479 return n;
480 if (n == q * i)
481 break;
483 i += 4;
484 q = n / i;
485 if (q < i)
486 return n;
487 if (n == q * i)
488 break;
490 i += 6;
491 q = n / i;
492 if (q < i)
493 return n;
494 if (n == q * i)
495 break;
497 i += 2;
498 q = n / i;
499 if (q < i)
500 return n;
501 if (n == q * i)
502 break;
504 i += 6;
505 q = n / i;
506 if (q < i)
507 return n;
508 if (n == q * i)
509 break;
511 i += 4;
512 q = n / i;
513 if (q < i)
514 return n;
515 if (n == q * i)
516 break;
518 i += 2;
519 q = n / i;
520 if (q < i)
521 return n;
522 if (n == q * i)
523 break;
525 i += 4;
526 q = n / i;
527 if (q < i)
528 return n;
529 if (n == q * i)
530 break;
532 i += 2;
533 q = n / i;
534 if (q < i)
535 return n;
536 if (n == q * i)
537 break;
539 i += 10;
540 q = n / i;
541 if (q < i)
542 return n;
543 if (n == q * i)
544 break;
546 // This will loop i to the next "plane" of potential primes
547 i += 2;
550 next:
551 // n is not prime. Increment n to next potential prime.
552 if (++in == M)
554 ++k0;
555 in = 0;
557 n = L * k0 + indices[in];
561 _LIBCPP_END_NAMESPACE_STD