| /* { dg-require-effective-target indirect_jumps } */ | |
| /* { dg-require-effective-target label_values } */ | |
| static volatile int v = 0; | |
| static | |
| void benchmark(long runs) { | |
| void* labels[] = { | |
| &&l0, &&l1, &&l2 | |
| }; | |
| for(unsigned int mask = 0x1F; mask > 0; mask >>= 1) { | |
| unsigned lfsr = 0xACE1u; | |
| long n = 10000000; | |
| while(n > 0) { | |
| l2: v; | |
| l1: v; | |
| goto *labels[lfsr & mask]; | |
| l0: n--; | |
| } | |
| } | |
| } | |
| int f(void) { | |
| benchmark(10000000); | |
| } |