void _ZN5small4KillEv(struct l_class_OC_small *llvm_cbe_this) {
  struct l_class_OC_small *llvm_cbe_this_2e_addr;
  struct l_class_OC_small *llvm_cbe_this1;
  void (**llvm_cbe_tmp__9)(struct l_class_OC_small *);
  void (*llvm_cbe_tmp__10)(struct l_class_OC_small *);
  *(&llvm_cbe_this_2e_addr) = llvm_cbe_this;
  llvm_cbe_this1 = *(&llvm_cbe_this_2e_addr);
  if ((llvm_cbe_this1 == ((struct l_class_OC_small *)0))) {
    goto llvm_cbe_delete_2e_end;
  } else {
    goto llvm_cbe_delete_2e_notnull;
  }
llvm_cbe_delete_2e_notnull:
  llvm_cbe_tmp__9 = *(((void (***)(struct l_class_OC_small *))llvm_cbe_this1));
  llvm_cbe_tmp__10 = *((&llvm_cbe_tmp__9[((signed long long)4ull)]));
  llvm_cbe_tmp__10(llvm_cbe_this1);
  return;
llvm_cbe_delete_2e_end:
  return;
}


x86 assembly (clang, -O0):
<_ZN5small4KillEv>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    112c <_ZN5small4KillEv+0x2c>
jmp    1157 <_ZN5small4KillEv+0x57>
jmp    1131 <_ZN5small4KillEv+0x31>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    0x20(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rdi
call   *%rax
jmp    115c <_ZN5small4KillEv+0x5c>
jmp    115c <_ZN5small4KillEv+0x5c>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_ZN5small4KillEv>:
test   %rdi,%rdi
je     110b <_ZN5small4KillEv+0xb>
mov    (%rdi),%rax
jmp    *0x20(%rax)
ret

LLVM IR (-O0):
%struct.l_class_OC_small = type opaque
define void @_ZN5small4KillEv(%struct.l_class_OC_small* %0) {
%2 = alloca %struct.l_class_OC_small*
%3 = alloca %struct.l_class_OC_small*
%4 = alloca %struct.l_class_OC_small*
%5 = alloca void (%struct.l_class_OC_small*)**
%6 = alloca void (%struct.l_class_OC_small*)*
store %struct.l_class_OC_small* %0, %struct.l_class_OC_small** %2
%7 = load %struct.l_class_OC_small*, %struct.l_class_OC_small** %2
store %struct.l_class_OC_small* %7, %struct.l_class_OC_small** %3
%8 = load %struct.l_class_OC_small*, %struct.l_class_OC_small** %3
store %struct.l_class_OC_small* %8, %struct.l_class_OC_small** %4
%9 = load %struct.l_class_OC_small*, %struct.l_class_OC_small** %4
%10 = icmp eq %struct.l_class_OC_small* %9, null
br i1 %10, label %11, label %12
11: ; preds = %1
br label %22
12: ; preds = %1
br label %13
13: ; preds = %12
%14 = load %struct.l_class_OC_small*, %struct.l_class_OC_small** %4
%15 = bitcast %struct.l_class_OC_small* %14 to void (%struct.l_class_OC_small*)***
%16 = load void (%struct.l_class_OC_small*)**, void (%struct.l_class_OC_small*)*** %15
store void (%struct.l_class_OC_small*)** %16, void (%struct.l_class_OC_small*)*** %5
%17 = load void (%struct.l_class_OC_small*)**, void (%struct.l_class_OC_small*)*** %5
%18 = getelementptr inbounds void (%struct.l_class_OC_small*)*, void (%struct.l_class_OC_small*)** %17, i64 4
%19 = load void (%struct.l_class_OC_small*)*, void (%struct.l_class_OC_small*)** %18
store void (%struct.l_class_OC_small*)* %19, void (%struct.l_class_OC_small*)** %6
%20 = load void (%struct.l_class_OC_small*)*, void (%struct.l_class_OC_small*)** %6
%21 = load %struct.l_class_OC_small*, %struct.l_class_OC_small** %4
br label %23
22: ; preds = %11
br label %23
23: ; preds = %22, %13
ret void
}

LLVM IR (-O2):
%struct.l_class_OC_small = type opaque
define void @_ZN5small4KillEv(%struct.l_class_OC_small* %0) {
%2 = icmp eq %struct.l_class_OC_small* %0, null
br i1 %2, label %8, label %3
3: ; preds = %1
%4 = bitcast %struct.l_class_OC_small* %0 to void (%struct.l_class_OC_small*)***
%5 = load void (%struct.l_class_OC_small*)**, void (%struct.l_class_OC_small*)*** %4
%6 = getelementptr inbounds void (%struct.l_class_OC_small*)*, void (%struct.l_class_OC_small*)** %5, i64 4
%7 = load void (%struct.l_class_OC_small*)*, void (%struct.l_class_OC_small*)** %6
tail call void %7(%struct.l_class_OC_small* %0)
br label %8
8: ; preds = %1, %3
ret void
}