This is a separate issue which really shouldn't have anything to do with this, but is there a specific reason why:
void good1(int x, int y) { _Bool pf; asm("cmpl %2,%1" : "=@ccp" (pf) : "r" (x), "g" (y)); if (pf) beta(); } ... ends up generating a jump to a jump? 0000000000000000 <good1>: 0: 39 f7 cmp %esi,%edi 2: 7a 0c jp 10 <good1+0x10> 4: f3 c3 repz retq 6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) d: 00 00 00 10: e9 00 00 00 00 jmpq 15 <good1+0x15> 11: R_X86_64_PC32 beta-0x4 15: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 1c: 00 00 00 00