https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127645
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
#include <stdint.h>
union u0 {
uint8_t f1;
_Bool f2;
};
uint32_t g1;
void *g13;
union u0 g18;
_Bool f9_ld7;
static int
test1 ()
{
_Bool c12;
uint64_t v15 = 0;
c12 = g1;
lbl_f9_b62:
if (c12) f9_ld7 = *(_Bool *)g13;
g18.f1 = 45;
c12 = v15;
g18 = c12 ? g18 : (union u0){ .f2 = 1 };
if (g18.f1 == 45) return 0;
v15 = 102276357045975979;
goto lbl_f9_b62;
}
__attribute__((noinline))
static int
test2 (void *p, int cond)
{
*(uint8_t *)p = 45;
if (cond)
*(_Bool *)p = 1;
return *(uint8_t *)p == 45;
}
union U {
unsigned char a;
_Bool b;
};
union U gu;
__attribute__((noinline))
static int
test3 (int c)
{
gu.a = 45;
if (c)
gu.b = 1;
return gu.a == 45;
}
int
main ()
{
if (test1 () != 0)
__builtin_abort ();
uint8_t x;
if (!test2 (&x, 0))
__builtin_abort ();
if (!test3 (0))
__builtin_abort ();
return 0;
}