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