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	24f\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	0x12	# DW_CFA_def_cfa_sf\n\t"
        ".uleb128 0x7\n\t"
        ".sleb128 16\n\t"
        ".align 8\n"
        "9:\t"
        ".long	23f-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 12f-11f\n"
        "11:\t"
        ".byte	0x80	# DW_OP_breg16\n\t"
        ".sleb128 4b-1b\n"
        "12:\t"
        ".byte	0x40 + (2b-1b) # DW_CFA_advance_loc\n\t"
        ".byte	0x16	# DW_CFA_val_expression\n\t"
        ".uleb128 0x10\n\t"
        ".uleb128 14f-13f\n"
        "13:\t"
        ".byte	0x80	# DW_OP_breg16\n\t"
        ".sleb128 4b-2b\n"
        "14:\t"
        ".byte	0x40 + (3b-2b) # DW_CFA_advance_loc\n\t"
        ".byte	0x0e	# DW_CFA_def_cfa_offset\n\t"
        ".uleb128 0\n\t"
        ".byte	0x16	# DW_CFA_val_expression\n\t"
        ".uleb128 0x10\n\t"
        ".uleb128 16f-15f\n"
        "15:\t"
        ".byte	0x80	# DW_OP_breg16\n\t"
        ".sleb128 4b-3b\n"
        "16:\t"
        ".byte	0x40 + (4b-3b-1) # DW_CFA_advance_loc\n\t"
        ".byte	0x0e	# DW_CFA_def_cfa_offset\n\t"
        ".uleb128 128\n\t"
        ".byte	0x16	# DW_CFA_val_expression\n\t"
        ".uleb128 0x10\n\t"
        ".uleb128 20f-17f\n"
        "17:\t"
        ".byte	0x80	# DW_OP_breg16\n\t"
        ".sleb128 19f-18f\n\t"
        ".byte	0x0d	# DW_OP_const4s\n"
        "18:\t"
        ".4byte	4b-.\n\t"
        ".byte	0x1c	# DW_OP_minus\n\t"
        ".byte	0x0d	# DW_OP_const4s\n"
        "19:\t"
        ".4byte	24f-.\n\t"
        ".byte	0x22	# DW_OP_plus\n"
        "20:\t"
        ".byte	0x40 + (5b-4b+1) # DW_CFA_advance_loc\n\t"
        ".byte	0x13	# DW_CFA_def_cfa_offset_sf\n\t"
        ".sleb128 16\n\t"
        ".byte	0x16	# DW_CFA_val_expression\n\t"
        ".uleb128 0x10\n\t"
        ".uleb128 22f-21f\n"
        "21:\t"
        ".byte	0x80	# DW_OP_breg16\n\t"
        ".sleb128 4b-5b\n"
        "22:\t"
        ".align 8\n"
        "23:\t"
        ".previous\n"
        "24:"
        :
        : "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
}