/* PR target/82524 */ struct S { unsigned char b, g, r, a; }; union U { struct S c; unsigned v; }; static inline unsigned char foo (unsigned char a, unsigned char b) { return ((a + 1) * b) >> 8; } __attribute__((noinline, noclone)) unsigned bar (union U *x, union U *y) { union U z; unsigned char v = x->c.a; unsigned char w = foo (y->c.a, 255 - v); z.c.r = foo (x->c.r, v) + foo (y->c.r, w); z.c.g = foo (x->c.g, v) + foo (y->c.g, w); z.c.b = foo (x->c.b, v) + foo (y->c.b, w); z.c.a = 0; return z.v; } int main () { union U a, b, c; if ((unsigned char) ~0 != 255 || sizeof (unsigned) != 4) return 0; a.c = (struct S) { 255, 255, 255, 0 }; b.c = (struct S) { 255, 255, 255, 255 }; c.v = bar (&a, &b); if (c.c.b != 255 || c.c.g != 255 || c.c.r != 255 || c.c.a != 0) __builtin_abort (); return 0; }