| 1 | // A contrived example to test the double jump removal peephole. |
| 2 | |
| 3 | extern "C" unsigned long bar(unsigned long count) { |
| 4 | return count + 1; |
| 5 | } |
| 6 | |
| 7 | unsigned long foo(unsigned long count) { |
| 8 | asm( |
| 9 | " cmpq $1,%0\n" |
| 10 | " je .L7\n" |
| 11 | " incq %0\n" |
| 12 | " jmp .L1\n" |
| 13 | ".L1: jmp .L2\n" |
| 14 | ".L2: incq %0\n" |
| 15 | " cmpq $2,%0\n" |
| 16 | " jne .L3\n" |
| 17 | " jmp .L4\n" |
| 18 | ".L3: jmp .L5\n" |
| 19 | ".L5: incq %0\n" |
| 20 | ".L4: movq %0,%%rdi\n" |
| 21 | " pop %%rbp\n" |
| 22 | " jmp .L6\n" |
| 23 | ".L7: pop %%rbp\n" |
| 24 | " incq %0\n" |
| 25 | " jmp .L6\n" |
| 26 | ".L6: jmp bar\n" |
| 27 | : |
| 28 | : "m" (count) |
| 29 | ); |
| 30 | return count; |
| 31 | } |
| 32 | |
| 33 | int main(int argc, const char* argv[]) { |
| 34 | return foo(count: 38); |
| 35 | } |
| 36 | |