/* { dg-do compile { target { powerpc*-*-* } } } */ /* { dg-options "-O2" } */ /* We have to lose the default pic codegen on Darwin. */ /* { dg-additional-options "-mdynamic-no-pic" { target powerpc*-*-darwin* } } */ /* ... and account for the out-of-line GPR restore. */ /* { dg-final { scan-assembler-times {\mb[ \t]*restGPR} 1 { target powerpc*-*-darwin* } } } */ /* { dg-final { scan-assembler-not {\mb[ \t]L} { target powerpc*-*-darwin* } } } */ /* { dg-final { scan-assembler-not {\mb\M} { target { ! powerpc*-*-darwin* } } } } */ /* Check that all computed gotos in this testcase end up unfactored completely. If some is not there will be a unconditional jump left; if all works fine, all are gone. */ typedef enum opcode { OP_A, OP_B, OP_END } opcode; typedef struct op { opcode opcode; int arg; } op; extern void do_stuff_b(int arg); extern void do_stuff_c(int arg); extern int someglobal; void eval(op *op) { static const void *dispatch_table[] = { &&CASE_OP_A, &&CASE_OP_B, &&CASE_OP_C, &&CASE_OP_END }; goto *dispatch_table[op->opcode]; CASE_OP_A: someglobal++; op++; goto *dispatch_table[op->opcode]; CASE_OP_B: do_stuff_b(op->arg); op++; goto *dispatch_table[op->opcode]; CASE_OP_C: do_stuff_c(op->arg); op++; goto *dispatch_table[op->opcode]; CASE_OP_END: return; }