// A contrived example to test the double jump removal peephole. extern "C" unsigned long bar(unsigned long count) { return count + 1; } unsigned long foo(unsigned long count) { asm( " cmpq $1,%0\n" " je .L7\n" " incq %0\n" " jmp .L1\n" ".L1: jmp .L2\n" ".L2: incq %0\n" " cmpq $2,%0\n" " jne .L3\n" " jmp .L4\n" ".L3: jmp .L5\n" ".L5: incq %0\n" ".L4: movq %0,%%rdi\n" " pop %%rbp\n" " jmp .L6\n" ".L7: pop %%rbp\n" " incq %0\n" " jmp .L6\n" ".L6: jmp bar\n" : : "m"(count) ); return count; } int main(int argc, const char* argv[]) { return foo(38); }