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;
}

Reply via email to