https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63186
Bug ID: 63186 Summary: [4.9/5 Regression] Undefined .L* symbols because of fnsplit Product: gcc Version: 4.9.1 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org CC: hubicka at gcc dot gnu.org Starting with r202185 the following testcase is compiled with undefined .L* symbols at -O2: void *a; int b, c, d; void bar () { switch (c) { case 0: lab: __asm__ (""); return; default: break; } b = 0; d = 0; a = &&lab; } void foo () { bar (); } The problem is that find_split_points (visit_bb, something else?) doesn't consider GIMPLE_LABEL stmts with FORCED_LABEL. Either blocks with such labels should be immediately marked as inappropriate to stay in the caller part (i.e. non-fn.part.N), or we need to analyze whether nothing that would be moved to the fn.part.N function references labels that stay in fn. Perhaps the other direction can be a problem too. Honza, can you please have a look?