https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120629

--- Comment #16 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Ok, self-contained testcase, this is miscompiled by stage1:
// PR middle-end/120629
// { dg-do run }
// { dg-options "-O2 -fprofile-generate -fno-exceptions -fno-rtti" }

__attribute__((noipa, noreturn, cold)) void
fancy_abort (const char *, int, const char *)
{
  __builtin_abort ();
}

struct lto_input_block
{
  const char *data;
  const void *file_data;
  unsigned int p;
  unsigned int len;
};
struct ipa_predicate
{
  __attribute__((noipa)) void stream_in (lto_input_block *);
  static const int max_clauses = 8;
  unsigned int m_clause[max_clauses + 1];
};
__attribute__((noipa)) unsigned long streamer_read_uhwi (struct lto_input_block
*)
{
  static int x = 8;
  return --x;
}

__attribute__((noipa)) void
ipa_predicate::stream_in (struct lto_input_block *ib)
{
  unsigned int clause;
  int k = 0;

  do
    {
      ((void)(!(k <= max_clauses) ? fancy_abort ("../../gcc/ipa-predicate.cc",
607, __FUNCTION__), 0 : 0));
      clause = m_clause[k++] = streamer_read_uhwi (ib);
    }
  while (clause);


  while (k <= max_clauses)
    m_clause[k++] = 0;
}

int
main ()
{
  struct S { ipa_predicate a; unsigned int b; } s = {};
  s.b = 0x1234;
  s.a.stream_in (nullptr);
  for (int i = 0; i < 9; ++i)
    if (s.a.m_clause[i] != (i == 8 ? 0 : 7 - i))
      __builtin_abort ();
  if (s.b != 0x1234)
    __builtin_abort ();
}

Reply via email to