58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
/* PR rtl-optimization/97459 */
|
|
/* { dg-do run } */
|
|
/* { dg-options "-O2" } */
|
|
/* { dg-additional-options "-DEXPENSIVE" { target run_expensive_tests } } */
|
|
|
|
#ifdef __SIZEOF_INT128__
|
|
typedef __int128_t T;
|
|
typedef __uint128_t U;
|
|
#else
|
|
typedef long long T;
|
|
typedef unsigned long long U;
|
|
#endif
|
|
|
|
T __attribute__((noipa)) foo (T x, T n) { return x % n; }
|
|
#define C(n) T __attribute__((noipa)) foo##n (T x) { return x % (n - 10000); }
|
|
|
|
#define C1(n) C(n##1) C(n##3) C(n##5) C(n##7) C(n##9)
|
|
#define C2(n) C1(n##0) C1(n##1) C1(n##2) C1(n##3) C1(n##4) \
|
|
C1(n##5) C1(n##6) C1(n##7) C1(n##8) C1(n##9)
|
|
#ifdef EXPENSIVE
|
|
#define C3(n) C2(n##0) C2(n##1) C2(n##2) C2(n##3) C2(n##4) \
|
|
C2(n##5) C2(n##6) C2(n##7) C2(n##8) C2(n##9)
|
|
#define C4(n) C3(n##0) C3(n##1) C3(n##2) C3(n##3) C3(n##4) \
|
|
C3(n##5) C3(n##6) C3(n##7) C3(n##8) C3(n##9)
|
|
#else
|
|
#define C3(n) C2(n##0) C2(n##4) C2(n##9)
|
|
#define C4(n) C3(n##0) C3(n##3) C3(n##7)
|
|
#endif
|
|
#define TESTS C4(1) C1(10010) C1(10012) C1(16144)
|
|
|
|
TESTS
|
|
|
|
struct S { T x; T (*foo) (T); };
|
|
|
|
#undef C
|
|
#define C(n) { n - 10000, foo##n },
|
|
|
|
struct S tests[] = {
|
|
TESTS
|
|
{ 0, 0 }
|
|
};
|
|
|
|
int
|
|
main ()
|
|
{
|
|
int i, j, k;
|
|
for (k = 0; tests[k].x; k++)
|
|
for (i = 0; i < sizeof (T) * __CHAR_BIT__; i++)
|
|
for (j = -5; j <= 5; j++)
|
|
{
|
|
U x = ((U) 1 << i) + j;
|
|
if (foo ((T) x, tests[k].x) != tests[k].foo ((T) x)
|
|
|| foo ((T) -x, tests[k].x) != tests[k].foo ((T) -x))
|
|
__builtin_abort ();
|
|
}
|
|
return 0;
|
|
}
|