void __attribute__((no)) foo(int x) {
  char buf[256];
  __asm("testl	%0, %0\n\t"
        "jnz	1f\n\t"
        ".subsection 1\n\t"
        ".type	_L_mutex_lock_%=, @function\n"
        "_L_mutex_lock_%=:\n"
        "1:\t"
        "leaq	%1, %%rdi\n"
        "2:\t"
        "subq	$128, %%rsp\n"
        "3:\t"
        "call	bar\n"
        "4:\t"
        "addq	$128, %%rsp\n"
        "5:\t"
        "jmp	21f\n"
        "6:\t"
        ".size _L_mutex_lock_%=, .-_L_mutex_lock_%=\n\t"
        ".previous\n\t"
        ".section	.eh_frame,\"a\",@progbits\n"
        "7:\t"
        ".long	9f-8f	# Length of Common Information Entry\n"
        "8:\t"
        ".long	0x0	# CIE Identifier Tag\n\t"
        ".byte	0x1	# CIE Version\n\t"
        ".ascii \"zR\\0\"	# CIE Augmentation\n\t"
        ".uleb128 0x1	# CIE Code Alignment Factor\n\t"
        ".sleb128 -8	# CIE Data Alignment Factor\n\t"
        ".byte	0x10	# CIE RA Column\n\t"
        ".uleb128 0x1	# Augmentation size\n\t"
        ".byte	0x1b	# FDE Encoding (pcrel sdata4)\n\t"
        ".byte	0xc	# DW_CFA_def_cfa\n\t"
        ".uleb128 0x7\n\t"
        ".uleb128 0x0\n\t"
        ".align 8\n"
        "9:\t"
        ".long	20f-10f	# FDE Length\n"
        "10:\t"
        ".long	10b-7b	# FDE CIE offset\n\t"
        ".long	1b-.	# FDE initial location\n\t"
        ".long	6b-1b	# FDE address range\n\t"
        ".uleb128 0x0	# Augmentation size\n\t"
        ".byte	0x16	# DW_CFA_val_expression\n\t"
        ".uleb128 0x10\n\t"
        ".uleb128 19f-11f\n"
        "11:\t"
        ".byte	0x80	# DW_OP_breg16\n\t"
        ".sleb128 0\n"
        "12:\t"
        ".byte	0x12	# DW_OP_dup\n\t"
        ".byte	0x94	# DW_OP_deref_size\n\t"
        ".byte	1\n\t"
        ".byte	0x12	# DW_OP_dup\n\t"
        ".byte	0x08	# DW_OP_const1u\n\t"
        ".byte	0x48\n\t"
        ".byte	0x2e	# DW_OP_ne\n\t"
        ".byte	0x28	# DW_OP_bra\n\t"
        ".2byte	16f-13f\n"
        "13:\t"
        ".byte	0x13	# DW_OP_drop\n\t"
        ".byte	0x23	# DW_OP_plus_uconst\n\t"
        ".uleb128 1\n\t"
        ".byte	0x12	# DW_OP_dup\n\t"
        ".byte	0x94	# DW_OP_deref_size\n\t"
        ".byte	1\n\t"
        ".byte	0x08	# DW_OP_const1u\n\t"
        ".byte	0x81\n\t"
        ".byte	0x2e	# DW_OP_ne\n\t"
        ".byte	0x28	# DW_OP_bra\n\t"
        ".2byte	15f-14f\n"
        "14:\t"
        ".byte	0x23	# DW_OP_plus_uconst\n\t"
        ".uleb128 3b-2b-1\n\t"
        ".byte	0x2f	# DW_OP_skip\n\t"
        ".2byte	12b-15f\n"
        "15:\t"
        ".byte	0x23	# DW_OP_plus_uconst\n\t"
        ".uleb128 2b-1b-1\n\t"
        ".byte	0x2f	# DW_OP_skip\n\t"
        ".2byte	12b-16f\n"
        "16:\t"
        ".byte	0x08	# DW_OP_const1u\n\t"
        ".byte	0xe8\n\t"
        ".byte	0x2e	# DW_OP_ne\n\t"
        ".byte	0x28	# DW_OP_bra\n\t"
        ".2byte	18f-17f\n"
        "17:\t"
        ".byte	0x23	# DW_OP_plus_uconst\n\t"
        ".uleb128 4b-3b\n\t"
        ".byte	0x2f	# DW_OP_skip\n\t"
        ".2byte	12b-18f\n"
        "18:\t"
        ".byte	0x23	# DW_OP_plus_uconst\n\t"
        ".uleb128 1\n\t"
        ".byte	0x12	# DW_OP_dup\n\t"
        ".byte	0x94	# DW_OP_deref_size\n\t"
        ".byte	4\n\t"
        ".byte	0x08	# DW_OP_const1u\n\t"
        ".byte	72 - (6b-5b) * 8 # (6b-5b) == 5 ? 32 : 56\n\t"
        ".byte	0x24	# DW_OP_shl\n\t"
        ".byte	0x08	# DW_OP_const1u\n\t"
        ".byte	72 - (6b-5b) * 8 # (6b-5b) == 5 ? 32 : 56\n\t"
        ".byte	0x26	# DW_OP_shra\n\t"
        ".byte	0x22	# DW_OP_plus\n\t"
        ".byte	0x23	# DW_OP_plus_uconst\n\t"
        ".uleb128 6b-5b-1\n"
        "19:\t"
        ".byte	0x40 + (3b-1b) # DW_CFA_advance_loc\n\t"
        ".byte	0xe	# DW_CFA_def_cfa_offset\n\t"
        ".uleb128 128\n\t"
        ".byte	0x40 + (5b-3b) # DW_CFA_advance_loc\n\t"
        ".byte	0xe	# DW_CFA_def_cfa_offset\n\t"
        ".uleb128 0\n\t"
        ".align 8\n"
        "20:\t"
        ".previous\n"
        "21:"
        :
        : "r"(x), "m"(x), "r"(buf)
        : "memory", "rax", "rdx", "rcx", "rsi", "rdi", "r8", "r9", "r10",
          "r11");
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
push   %r14
push   %rbx
sub    $0x90,%rsp
mov    %edi,-0x14(%rbp)
mov    -0x14(%rbp),%ebx
lea    -0x120(%rbp),%r14
test   %ebx,%ebx
jne    113f <_L_mutex_lock_0>
add    $0x90,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
push   %rbp
push   %rbx
sub    $0x98,%rsp
mov    %edi,%ebp
mov    %edi,-0x74(%rsp)
lea    -0x70(%rsp),%rbx
test   %ebp,%ebp
jne    1132 <_L_mutex_lock_0>
add    $0x98,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @foo(i32 %0) {
%2 = alloca i32
%3 = alloca [256 x i8]
store i32 %0, i32* %2
%4 = load i32, i32* %2
%5 = getelementptr inbounds [256 x i8], [256 x i8]* %3, i64 0, i64 0
ret void
}

LLVM IR (-O2):
define void @foo(i32 %0) {
%2 = alloca i32
%3 = alloca [256 x i8]
store i32 %0, i32* %2
%4 = getelementptr inbounds [256 x i8], [256 x i8]* %3, i64 0, i64 0
ret void
}