unsigned *merge_and_stuff(unsigned *la, unsigned *lb) {
  unsigned *rv, **cdr;
  cdr = &rv;
  for (;;) {
    if (la == 0) {
      *cdr = lb;
      break;
    } else if (lb == 0) {
      *cdr = la;
      break;
    } else if ((((unsigned **)la)[0]) == lb) {
      (((unsigned **)la)[0]) = (((unsigned **)lb)[0]);
      lb = (((unsigned **)lb)[1]);
    } else if ((((unsigned **)lb)[0]) == la) {
      (((unsigned **)lb)[0]) = (((unsigned **)la)[0]);
      la = (((unsigned **)la)[1]);
    } else if (la > lb) {
      *cdr = la;
      cdr = &(((unsigned **)la)[1]);
      la = (((unsigned **)la)[1]);
    } else {
      *cdr = lb;
      cdr = &(((unsigned **)lb)[1]);
      lb = (((unsigned **)lb)[1]);
    }
  }
  return rv;
}


x86 assembly (clang, -O0):
<merge_and_stuff>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x8(%rbp)
jne    112f <merge_and_stuff+0x2f>
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    121c <merge_and_stuff+0x11c>
cmpq   $0x0,-0x10(%rbp)
jne    114a <merge_and_stuff+0x4a>
mov    -0x8(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    121c <merge_and_stuff+0x11c>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
cmp    -0x10(%rbp),%rax
jne    117a <merge_and_stuff+0x7a>
mov    -0x10(%rbp),%rax
mov    (%rax),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x10(%rbp)
jmp    120d <merge_and_stuff+0x10d>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
cmp    -0x8(%rbp),%rax
jne    11aa <merge_and_stuff+0xaa>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x8(%rbp)
jmp    1208 <merge_and_stuff+0x108>
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
jbe    11e0 <merge_and_stuff+0xe0>
mov    -0x8(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x8(%rbp)
jmp    1203 <merge_and_stuff+0x103>
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x10(%rbp)
jmp    1208 <merge_and_stuff+0x108>
jmp    120d <merge_and_stuff+0x10d>
jmp    1212 <merge_and_stuff+0x112>
jmp    1217 <merge_and_stuff+0x117>
jmp    1114 <merge_and_stuff+0x14>
mov    -0x18(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge_and_stuff>:
lea    -0x8(%rsp),%rax
jmp    1117 <merge_and_stuff+0x17>
nopw   0x0(%rax,%rax,1)
mov    %rdx,(%rdi)
mov    0x8(%rsi),%rsi
test   %rdi,%rdi
je     116c <merge_and_stuff+0x6c>
test   %rsi,%rsi
je     1169 <merge_and_stuff+0x69>
mov    (%rdi),%rcx
mov    (%rsi),%rdx
cmp    %rsi,%rcx
je     1110 <merge_and_stuff+0x10>
cmp    %rdi,%rdx
je     1150 <merge_and_stuff+0x50>
cmp    %rsi,%rdi
jbe    1159 <merge_and_stuff+0x59>
mov    %rdi,(%rax)
mov    %rdi,%rax
mov    0x8(%rdi),%rdi
add    $0x8,%rax
jmp    1117 <merge_and_stuff+0x17>
cs nopw 0x0(%rax,%rax,1)
mov    %rcx,(%rsi)
mov    0x8(%rdi),%rdi
jmp    1117 <merge_and_stuff+0x17>
mov    %rsi,(%rax)
mov    %rsi,%rax
mov    0x8(%rsi),%rsi
add    $0x8,%rax
jmp    1117 <merge_and_stuff+0x17>
mov    %rdi,%rsi
mov    %rsi,(%rax)
mov    -0x8(%rsp),%rax
ret

LLVM IR (-O0):
define i32* @merge_and_stuff(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32**
store i32* %0, i32** %3
store i32* %1, i32** %4
store i32** %5, i32*** %6
br label %7
7: ; preds = %85, %2
%8 = load i32*, i32** %3
%9 = icmp eq i32* %8, null
br i1 %9, label %10, label %13
10: ; preds = %7
%11 = load i32*, i32** %4
%12 = load i32**, i32*** %6
store i32* %11, i32** %12
br label %86
13: ; preds = %7
%14 = load i32*, i32** %4
%15 = icmp eq i32* %14, null
br i1 %15, label %16, label %19
16: ; preds = %13
%17 = load i32*, i32** %3
%18 = load i32**, i32*** %6
store i32* %17, i32** %18
br label %86
19: ; preds = %13
%20 = load i32*, i32** %3
%21 = bitcast i32* %20 to i32**
%22 = getelementptr inbounds i32*, i32** %21, i64 0
%23 = load i32*, i32** %22
%24 = load i32*, i32** %4
%25 = icmp eq i32* %23, %24
br i1 %25, label %26, label %38
26: ; preds = %19
%27 = load i32*, i32** %4
%28 = bitcast i32* %27 to i32**
%29 = getelementptr inbounds i32*, i32** %28, i64 0
%30 = load i32*, i32** %29
%31 = load i32*, i32** %3
%32 = bitcast i32* %31 to i32**
%33 = getelementptr inbounds i32*, i32** %32, i64 0
store i32* %30, i32** %33
%34 = load i32*, i32** %4
%35 = bitcast i32* %34 to i32**
%36 = getelementptr inbounds i32*, i32** %35, i64 1
%37 = load i32*, i32** %36
store i32* %37, i32** %4
br label %83
38: ; preds = %19
%39 = load i32*, i32** %4
%40 = bitcast i32* %39 to i32**
%41 = getelementptr inbounds i32*, i32** %40, i64 0
%42 = load i32*, i32** %41
%43 = load i32*, i32** %3
%44 = icmp eq i32* %42, %43
br i1 %44, label %45, label %57
45: ; preds = %38
%46 = load i32*, i32** %3
%47 = bitcast i32* %46 to i32**
%48 = getelementptr inbounds i32*, i32** %47, i64 0
%49 = load i32*, i32** %48
%50 = load i32*, i32** %4
%51 = bitcast i32* %50 to i32**
%52 = getelementptr inbounds i32*, i32** %51, i64 0
store i32* %49, i32** %52
%53 = load i32*, i32** %3
%54 = bitcast i32* %53 to i32**
%55 = getelementptr inbounds i32*, i32** %54, i64 1
%56 = load i32*, i32** %55
store i32* %56, i32** %3
br label %82
57: ; preds = %38
%58 = load i32*, i32** %3
%59 = load i32*, i32** %4
%60 = icmp ugt i32* %58, %59
br i1 %60, label %61, label %71
61: ; preds = %57
%62 = load i32*, i32** %3
%63 = load i32**, i32*** %6
store i32* %62, i32** %63
%64 = load i32*, i32** %3
%65 = bitcast i32* %64 to i32**
%66 = getelementptr inbounds i32*, i32** %65, i64 1
store i32** %66, i32*** %6
%67 = load i32*, i32** %3
%68 = bitcast i32* %67 to i32**
%69 = getelementptr inbounds i32*, i32** %68, i64 1
%70 = load i32*, i32** %69
store i32* %70, i32** %3
br label %81
71: ; preds = %57
%72 = load i32*, i32** %4
%73 = load i32**, i32*** %6
store i32* %72, i32** %73
%74 = load i32*, i32** %4
%75 = bitcast i32* %74 to i32**
%76 = getelementptr inbounds i32*, i32** %75, i64 1
store i32** %76, i32*** %6
%77 = load i32*, i32** %4
%78 = bitcast i32* %77 to i32**
%79 = getelementptr inbounds i32*, i32** %78, i64 1
%80 = load i32*, i32** %79
store i32* %80, i32** %4
br label %81
81: ; preds = %71, %61
br label %82
82: ; preds = %81, %45
br label %83
83: ; preds = %82, %26
br label %84
84: ; preds = %83
br label %85
85: ; preds = %84
br label %7
86: ; preds = %16, %10
%87 = load i32*, i32** %5
ret i32* %87
}

LLVM IR (-O2):
define i32* @merge_and_stuff(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = bitcast i32** %3 to i8*
%5 = icmp eq i32* %0, null
br i1 %5, label %42, label %6
6: ; preds = %2, %37
%7 = phi i32** [ %40, %37 ], [ %3, %2 ]
%8 = phi i32* [ %39, %37 ], [ %1, %2 ]
%9 = phi i32* [ %38, %37 ], [ %0, %2 ]
%10 = icmp eq i32* %8, null
br i1 %10, label %42, label %11
11: ; preds = %6
%12 = bitcast i32* %9 to i32**
%13 = load i32*, i32** %12
%14 = icmp eq i32* %13, %8
%15 = bitcast i32* %8 to i32**
%16 = load i32*, i32** %15
br i1 %14, label %17, label %21
17: ; preds = %11
store i32* %16, i32** %12
%18 = getelementptr inbounds i32, i32* %8, i64 2
%19 = bitcast i32* %18 to i32**
%20 = load i32*, i32** %19
br label %37
21: ; preds = %11
%22 = icmp eq i32* %16, %9
br i1 %22, label %23, label %27
23: ; preds = %21
store i32* %13, i32** %15
%24 = getelementptr inbounds i32, i32* %9, i64 2
%25 = bitcast i32* %24 to i32**
%26 = load i32*, i32** %25
br label %37
27: ; preds = %21
%28 = icmp ugt i32* %9, %8
br i1 %28, label %29, label %33
29: ; preds = %27
store i32* %9, i32** %7
%30 = getelementptr inbounds i32, i32* %9, i64 2
%31 = bitcast i32* %30 to i32**
%32 = load i32*, i32** %31
br label %37
33: ; preds = %27
store i32* %8, i32** %7
%34 = getelementptr inbounds i32, i32* %8, i64 2
%35 = bitcast i32* %34 to i32**
%36 = load i32*, i32** %35
br label %37
37: ; preds = %23, %33, %29, %17
%38 = phi i32* [ %9, %17 ], [ %26, %23 ], [ %32, %29 ], [ %9, %33 ]
%39 = phi i32* [ %20, %17 ], [ %8, %23 ], [ %8, %29 ], [ %36, %33 ]
%40 = phi i32** [ %7, %17 ], [ %7, %23 ], [ %31, %29 ], [ %35, %33 ]
%41 = icmp eq i32* %38, null
br i1 %41, label %42, label %6
42: ; preds = %37, %6, %2
%43 = phi i32** [ %3, %2 ], [ %7, %6 ], [ %40, %37 ]
%44 = phi i32* [ %1, %2 ], [ %9, %6 ], [ %39, %37 ]
store i32* %44, i32** %43
%45 = load i32*, i32** %3
ret i32* %45
}