/* { dg-do run } */ /* { dg-options "-O2" } */ int printf (const char *, ...); int a, b = 1, d; union U1 { unsigned int f0; int f1; }; union U2 { int f2; int f3; } c; int fn1 (int p) { int t = p && a || p && a && p; return t ? t : a; } unsigned fn2 (union U1 p1, union U2 p2) { if (p1.f1 <= 0) { for (; p2.f2;) c.f2 = 0; p2.f2 = fn1 (d); } return p2.f3; } int g = 0; int foo () { if (b) { union U1 f = { 0xFFFFFFFFU }; fn2 (f, c); } g = 1; return 0; } int main () { foo (); if (g == 0) __builtin_abort (); return 0; }