/* PR rtl-optimization/51447 */ /* { dg-require-effective-target label_values } */ /* { dg-require-effective-target indirect_jumps } */ extern void abort (void); #ifdef __x86_64__ register void *ptr asm ("rbx"); #else void *ptr; #endif int main (void) { __label__ nonlocal_lab; #ifdef __x86_64__ void *save = ptr; #endif __attribute__((noinline, noclone)) void bar (void *func) { ptr = func; goto nonlocal_lab; } bar (&&nonlocal_lab); return 1; nonlocal_lab: if (ptr != &&nonlocal_lab) abort (); #ifdef __x86_64__ ptr = save; /* Restore the call-saved register. */ #endif return 0; }