https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60406
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> --- Alternatively, since __go_set_defer_retaddr always returns 0, we can prevent split of the label by enclosing it in asm volatiles: extern int foo (void *); extern void bar (void); int test_1 (void) { __label__ bla1; if (foo (&&bla1)) goto bla1; asm volatile (""); bar (); bla1: asm volatile (""); return 0; } test_1: subl $28, %esp movl $.L2, (%esp) call foo testl %eax, %eax jne .L2 call bar .L2: xorl %eax, %eax addl $28, %esp ret 'goto label' can also be substituted with 'asm goto ("" :::: label)', but I don't think this is necessary in the above case.