]>
Commit | Line | Data |
---|---|---|
037fe26e JJ |
1 | /* PR rtl-optimization/97459 */ |
2 | /* { dg-do run } */ | |
3 | /* { dg-options "-O2" } */ | |
4 | /* { dg-additional-options "-DEXPENSIVE" { target run_expensive_tests } } */ | |
5 | ||
6 | #ifdef __SIZEOF_INT128__ | |
7 | typedef __int128_t T; | |
8 | typedef __uint128_t U; | |
9 | #else | |
10 | typedef long long T; | |
11 | typedef unsigned long long U; | |
12 | #endif | |
13 | ||
14 | T __attribute__((noipa)) foo (T x, T n, T *r) { *r = x % n; return x / n; } | |
15 | #define C(n) T __attribute__((noipa)) foo##n (T x, T *r) { *r = x % (n - 10000); return x / (n - 10000); } | |
16 | ||
17 | #define C1(n) C(n##1) C(n##3) C(n##5) C(n##7) C(n##9) | |
18 | #define C2(n) C1(n##0) C1(n##1) C1(n##2) C1(n##3) C1(n##4) \ | |
19 | C1(n##5) C1(n##6) C1(n##7) C1(n##8) C1(n##9) | |
20 | #ifdef EXPENSIVE | |
21 | #define C3(n) C2(n##0) C2(n##1) C2(n##2) C2(n##3) C2(n##4) \ | |
22 | C2(n##5) C2(n##6) C2(n##7) C2(n##8) C2(n##9) | |
23 | #define C4(n) C3(n##0) C3(n##1) C3(n##2) C3(n##3) C3(n##4) \ | |
24 | C3(n##5) C3(n##6) C3(n##7) C3(n##8) C3(n##9) | |
25 | #else | |
26 | #define C3(n) C2(n##0) C2(n##4) C2(n##9) | |
27 | #define C4(n) C3(n##0) C3(n##3) C3(n##7) | |
28 | #endif | |
29 | #define TESTS C4(1) C1(10010) C1(10012) C1(16144) | |
30 | ||
31 | TESTS | |
32 | ||
33 | struct S { T x; T (*foo) (T, T *); }; | |
34 | ||
35 | #undef C | |
36 | #define C(n) { n - 10000, foo##n }, | |
37 | ||
38 | struct S tests[] = { | |
39 | TESTS | |
40 | { 0, 0 } | |
41 | }; | |
42 | ||
43 | int | |
44 | main () | |
45 | { | |
46 | int i, j, k; | |
47 | for (k = 0; tests[k].x; k++) | |
48 | for (i = 0; i < sizeof (T) * __CHAR_BIT__; i++) | |
49 | for (j = -5; j <= 5; j++) | |
50 | { | |
51 | U x = ((U) 1 << i) + j; | |
52 | T r1 = 0, r2 = 0; | |
53 | if (foo ((T) x, tests[k].x, &r1) != tests[k].foo ((T) x, &r2) | |
54 | || r1 != r2) | |
55 | __builtin_abort (); | |
56 | r1 = 0; r2 = 0; | |
57 | if (foo ((T) -x, tests[k].x, &r1) != tests[k].foo ((T) -x, &r2) | |
58 | || r1 != r2) | |
59 | __builtin_abort (); | |
60 | } | |
61 | return 0; | |
62 | } |