| /* PR target/20322 */ |
| |
| extern void abort (void); |
| |
| typedef unsigned long T; |
| typedef struct |
| { |
| T a, b; |
| unsigned char c, d; |
| } S; |
| |
| #define M (sizeof (T) * 4) |
| |
| S __attribute__((noinline)) |
| foo (T x, T y) |
| { |
| S e; |
| T f[2], g; |
| |
| e.b = (x & (~(T) 0 >> M)) * (y & (~(T) 0 >> M)); |
| e.a = (x >> M) * (y >> M); |
| |
| f[0] = (x & (~(T) 0 >> M)) * (y >> M); |
| f[1] = (x >> M) * (y & (~(T) 0 >> M)); |
| |
| g = e.b; |
| e.b += (f[0] & (~(T) 0 >> M)) << M; |
| if (e.b < g) |
| e.a++; |
| |
| g = e.b; |
| e.b += (f[1] & (~(T) 0 >> M)) << M; |
| if (e.b < g) |
| e.a++; |
| |
| e.a += (f[0] >> M); |
| e.a += (f[1] >> M); |
| e.c = 1; |
| e.d = 0; |
| |
| return e; |
| } |
| |
| int |
| main (void) |
| { |
| T x = 1UL << (M * 2 - 1); |
| S y = foo (1, x); |
| if (y.a || y.b != x || y.c != 1 || y.d) |
| abort (); |
| return 0; |
| } |