diff options
Diffstat (limited to 'SingleSource/Regression/C/gcc-c-torture/execute/pr61375.c')
-rw-r--r-- | SingleSource/Regression/C/gcc-c-torture/execute/pr61375.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/pr61375.c b/SingleSource/Regression/C/gcc-c-torture/execute/pr61375.c new file mode 100644 index 00000000..325f3409 --- /dev/null +++ b/SingleSource/Regression/C/gcc-c-torture/execute/pr61375.c @@ -0,0 +1,35 @@ +#ifdef __UINT64_TYPE__ +typedef __UINT64_TYPE__ uint64_t; +#else +typedef unsigned long long uint64_t; +#endif + +#ifndef __SIZEOF_INT128__ +#define __int128 long long +#endif + +/* Some version of bswap optimization would ICE when analyzing a mask constant + too big for an uint64_t variable (PR210931). */ + +__attribute__ ((noinline, noclone)) uint64_t +uint128_central_bitsi_ior (unsigned __int128 in1, uint64_t in2) +{ + __int128 mask = (__int128)0xffff << 56; + return ((in1 & mask) >> 56) | in2; +} + +int +main(int argc, char **argv) +{ + __int128 in = 1; +#ifdef __SIZEOF_INT128__ + in <<= 64; +#endif + if (sizeof (uint64_t) * __CHAR_BIT__ != 64) + return 0; + if (sizeof (unsigned __int128) * __CHAR_BIT__ != 128) + return 0; + if (uint128_central_bitsi_ior (in, 2) != 0x102) + __builtin_abort (); + return 0; +} |