long mp_add(unsigned short *rop, unsigned short *op1, unsigned short *op2,
            unsigned long len1, unsigned long len2) {
  unsigned long value;
  unsigned short carry;
  long size;
  if (len1 < len2) {
    unsigned short *top = op1;
    unsigned long tlen = len1;
    op1 = op2;
    len1 = len2;
    op2 = top;
    len2 = tlen;
  };
  value = (unsigned long)op1[0] + op2[0];
  rop[0] = value;
  carry = value >> 16;
  for (size = 1; size < len2; size++) {
    value = (unsigned long)op1[size] + op2[size] + carry;
    rop[size] = value;
    carry = value >> 16;
  }
  if (rop != op1) {
    for (; size < len1; size++) {
      value = (unsigned long)op1[size] + carry;
      rop[size] = value;
      carry = value >> 16;
    }
  } else {
    for (; carry && size < len1; size++) {
      value = (unsigned long)op1[size] + carry;
      rop[size] = value;
      carry = value >> 16;
    }
    size = len1;
  }
  if (carry)
    rop[size++] = carry;
  return (size);
}


x86 assembly (clang, -O0):
<mp_add>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    1156 <mp_add+0x56>
mov    -0x10(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movzwl (%rax),%eax
mov    -0x18(%rbp),%rcx
movzwl (%rcx),%ecx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %cx,(%rax)
mov    -0x30(%rbp),%rax
shr    $0x10,%rax
mov    %ax,-0x32(%rbp)
movq   $0x1,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    11f1 <mp_add+0xf1>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
mov    -0x18(%rbp),%rcx
mov    -0x40(%rbp),%rdx
movzwl (%rcx,%rdx,2),%ecx
add    %rcx,%rax
movzwl -0x32(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x30(%rbp),%rax
shr    $0x10,%rax
mov    %ax,-0x32(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    118d <mp_add+0x8d>
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     125e <mp_add+0x15e>
jmp    1204 <mp_add+0x104>
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    1259 <mp_add+0x159>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
movzwl -0x32(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x30(%rbp),%rax
shr    $0x10,%rax
mov    %ax,-0x32(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1204 <mp_add+0x104>
jmp    12e2 <mp_add+0x1e2>
jmp    1263 <mp_add+0x163>
movzwl -0x32(%rbp),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x51(%rbp)
je     1283 <mp_add+0x183>
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
setb   %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    1293 <mp_add+0x193>
jmp    12da <mp_add+0x1da>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
movzwl -0x32(%rbp),%ecx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x30(%rbp),%rax
shr    $0x10,%rax
mov    %ax,-0x32(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1263 <mp_add+0x163>
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpw   $0x0,-0x32(%rbp)
je     1308 <mp_add+0x208>
mov    -0x32(%rbp),%dx
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dx,(%rax,%rcx,2)
mov    -0x40(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mp_add>:
cmp    %r8,%rcx
jae    110d <mp_add+0xd>
mov    %r8,%rax
mov    %rsi,%r8
jmp    1119 <mp_add+0x19>
mov    %rcx,%rax
mov    %r8,%rcx
mov    %rdx,%r8
mov    %rsi,%rdx
push   %rbx
movzwl (%rdx),%r9d
movzwl (%r8),%esi
add    %r9,%rsi
mov    %si,(%rdi)
shr    $0x10,%rsi
cmp    $0x2,%rcx
jb     1144 <mp_add+0x44>
lea    -0x1(%rcx),%r10
cmp    $0x2,%rcx
jne    114b <mp_add+0x4b>
mov    $0x1,%r9d
jmp    11a7 <mp_add+0xa7>
mov    $0x1,%ecx
jmp    11c9 <mp_add+0xc9>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
neg    %r11
mov    $0x1,%r9d
nopl   0x0(%rax,%rax,1)
movzwl (%rdx,%r9,2),%ebx
add    %rsi,%rbx
movzwl (%r8,%r9,2),%esi
add    %rbx,%rsi
mov    %si,(%rdi,%r9,2)
shr    $0x10,%rsi
movzwl 0x2(%rdx,%r9,2),%ebx
add    %rsi,%rbx
movzwl 0x2(%r8,%r9,2),%esi
add    %rbx,%rsi
mov    %si,0x2(%rdi,%r9,2)
shr    $0x10,%rsi
lea    (%r11,%r9,1),%rbx
add    $0x2,%rbx
add    $0x2,%r9
cmp    $0x1,%rbx
jne    1160 <mp_add+0x60>
test   $0x1,%r10b
je     11c9 <mp_add+0xc9>
movzwl (%rdx,%r9,2),%ebx
add    %rbx,%rsi
movzwl (%r8,%r9,2),%ebx
add    %rsi,%rbx
mov    %bx,(%rdi,%r9,2)
shr    $0x10,%rbx
mov    %rbx,%rsi
cmp    %rdi,%rdx
je     122f <mp_add+0x12f>
cmp    %rcx,%rax
jbe    126e <mp_add+0x16e>
mov    %eax,%ebx
sub    %ecx,%ebx
lea    0x1(%rcx),%r8
test   $0x1,%bl
je     11f9 <mp_add+0xf9>
movzwl (%rdx,%rcx,2),%ebx
movzwl %si,%esi
add    %rbx,%rsi
mov    %si,(%rdi,%rcx,2)
shr    $0x10,%rsi
mov    %r8,%rcx
cmp    %r8,%rax
je     1271 <mp_add+0x171>
xchg   %ax,%ax
movzwl (%rdx,%rcx,2),%r8d
movzwl %si,%ebx
add    %r8,%rbx
mov    %bx,(%rdi,%rcx,2)
shr    $0x10,%rbx
movzwl 0x2(%rdx,%rcx,2),%esi
add    %rbx,%rsi
mov    %si,0x2(%rdi,%rcx,2)
shr    $0x10,%rsi
add    $0x2,%rcx
cmp    %rcx,%rax
jne    1200 <mp_add+0x100>
jmp    1271 <mp_add+0x171>
test   %si,%si
je     1271 <mp_add+0x171>
cmp    %rcx,%rax
jbe    1271 <mp_add+0x171>
add    $0x1,%rcx
nopl   (%rax)
movzwl -0x2(%rdi,%rcx,2),%edx
movzwl %si,%ebx
add    %rdx,%rbx
mov    %bx,-0x2(%rdi,%rcx,2)
mov    %rbx,%rsi
shr    $0x10,%rsi
cmp    $0x10000,%rbx
jb     1271 <mp_add+0x171>
lea    0x1(%rcx),%rdx
cmp    %rax,%rcx
mov    %rdx,%rcx
jb     1240 <mp_add+0x140>
jmp    1271 <mp_add+0x171>
mov    %rcx,%rax
test   %si,%si
je     1280 <mp_add+0x180>
movw   $0x1,(%rdi,%rax,2)
add    $0x1,%rax
pop    %rbx
ret

LLVM IR (-O0):
define i64 @mp_add(i16* %0, i16* %1, i16* %2, i64 %3, i64 %4) {
%6 = alloca i16*
%7 = alloca i16*
%8 = alloca i16*
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i16
%13 = alloca i64
%14 = alloca i16*
%15 = alloca i64
store i16* %0, i16** %6
store i16* %1, i16** %7
store i16* %2, i16** %8
store i64 %3, i64* %9
store i64 %4, i64* %10
%16 = load i64, i64* %9
%17 = load i64, i64* %10
%18 = icmp ult i64 %16, %17
br i1 %18, label %19, label %26
19: ; preds = %5
%20 = load i16*, i16** %7
store i16* %20, i16** %14
%21 = load i64, i64* %9
store i64 %21, i64* %15
%22 = load i16*, i16** %8
store i16* %22, i16** %7
%23 = load i64, i64* %10
store i64 %23, i64* %9
%24 = load i16*, i16** %14
store i16* %24, i16** %8
%25 = load i64, i64* %15
store i64 %25, i64* %10
br label %26
26: ; preds = %19, %5
%27 = load i16*, i16** %7
%28 = getelementptr inbounds i16, i16* %27, i64 0
%29 = load i16, i16* %28
%30 = zext i16 %29 to i64
%31 = load i16*, i16** %8
%32 = getelementptr inbounds i16, i16* %31, i64 0
%33 = load i16, i16* %32
%34 = zext i16 %33 to i64
%35 = add i64 %30, %34
store i64 %35, i64* %11
%36 = load i64, i64* %11
%37 = trunc i64 %36 to i16
%38 = load i16*, i16** %6
%39 = getelementptr inbounds i16, i16* %38, i64 0
store i16 %37, i16* %39
%40 = load i64, i64* %11
%41 = lshr i64 %40, 16
%42 = trunc i64 %41 to i16
store i16 %42, i16* %12
store i64 1, i64* %13
br label %43
43: ; preds = %70, %26
%44 = load i64, i64* %13
%45 = load i64, i64* %10
%46 = icmp ult i64 %44, %45
br i1 %46, label %47, label %73
47: ; preds = %43
%48 = load i16*, i16** %7
%49 = load i64, i64* %13
%50 = getelementptr inbounds i16, i16* %48, i64 %49
%51 = load i16, i16* %50
%52 = zext i16 %51 to i64
%53 = load i16*, i16** %8
%54 = load i64, i64* %13
%55 = getelementptr inbounds i16, i16* %53, i64 %54
%56 = load i16, i16* %55
%57 = zext i16 %56 to i64
%58 = add i64 %52, %57
%59 = load i16, i16* %12
%60 = zext i16 %59 to i64
%61 = add i64 %58, %60
store i64 %61, i64* %11
%62 = load i64, i64* %11
%63 = trunc i64 %62 to i16
%64 = load i16*, i16** %6
%65 = load i64, i64* %13
%66 = getelementptr inbounds i16, i16* %64, i64 %65
store i16 %63, i16* %66
%67 = load i64, i64* %11
%68 = lshr i64 %67, 16
%69 = trunc i64 %68 to i16
store i16 %69, i16* %12
br label %70
70: ; preds = %47
%71 = load i64, i64* %13
%72 = add nsw i64 %71, 1
store i64 %72, i64* %13
br label %43
73: ; preds = %43
%74 = load i16*, i16** %6
%75 = load i16*, i16** %7
%76 = icmp ne i16* %74, %75
br i1 %76, label %77, label %103
77: ; preds = %73
br label %78
78: ; preds = %99, %77
%79 = load i64, i64* %13
%80 = load i64, i64* %9
%81 = icmp ult i64 %79, %80
br i1 %81, label %82, label %102
82: ; preds = %78
%83 = load i16*, i16** %7
%84 = load i64, i64* %13
%85 = getelementptr inbounds i16, i16* %83, i64 %84
%86 = load i16, i16* %85
%87 = zext i16 %86 to i64
%88 = load i16, i16* %12
%89 = zext i16 %88 to i64
%90 = add i64 %87, %89
store i64 %90, i64* %11
%91 = load i64, i64* %11
%92 = trunc i64 %91 to i16
%93 = load i16*, i16** %6
%94 = load i64, i64* %13
%95 = getelementptr inbounds i16, i16* %93, i64 %94
store i16 %92, i16* %95
%96 = load i64, i64* %11
%97 = lshr i64 %96, 16
%98 = trunc i64 %97 to i16
store i16 %98, i16* %12
br label %99
99: ; preds = %82
%100 = load i64, i64* %13
%101 = add nsw i64 %100, 1
store i64 %101, i64* %13
br label %78
102: ; preds = %78
br label %136
103: ; preds = %73
br label %104
104: ; preds = %131, %103
%105 = load i16, i16* %12
%106 = zext i16 %105 to i32
%107 = icmp ne i32 %106, 0
br i1 %107, label %108, label %112
108: ; preds = %104
%109 = load i64, i64* %13
%110 = load i64, i64* %9
%111 = icmp ult i64 %109, %110
br label %112
112: ; preds = %108, %104
%113 = phi i1 [ false, %104 ], [ %111, %108 ]
br i1 %113, label %114, label %134
114: ; preds = %112
%115 = load i16*, i16** %7
%116 = load i64, i64* %13
%117 = getelementptr inbounds i16, i16* %115, i64 %116
%118 = load i16, i16* %117
%119 = zext i16 %118 to i64
%120 = load i16, i16* %12
%121 = zext i16 %120 to i64
%122 = add i64 %119, %121
store i64 %122, i64* %11
%123 = load i64, i64* %11
%124 = trunc i64 %123 to i16
%125 = load i16*, i16** %6
%126 = load i64, i64* %13
%127 = getelementptr inbounds i16, i16* %125, i64 %126
store i16 %124, i16* %127
%128 = load i64, i64* %11
%129 = lshr i64 %128, 16
%130 = trunc i64 %129 to i16
store i16 %130, i16* %12
br label %131
131: ; preds = %114
%132 = load i64, i64* %13
%133 = add nsw i64 %132, 1
store i64 %133, i64* %13
br label %104
134: ; preds = %112
%135 = load i64, i64* %9
store i64 %135, i64* %13
br label %136
136: ; preds = %134, %102
%137 = load i16, i16* %12
%138 = icmp ne i16 %137, 0
br i1 %138, label %139, label %145
139: ; preds = %136
%140 = load i16, i16* %12
%141 = load i16*, i16** %6
%142 = load i64, i64* %13
%143 = add nsw i64 %142, 1
store i64 %143, i64* %13
%144 = getelementptr inbounds i16, i16* %141, i64 %142
store i16 %140, i16* %144
br label %145
145: ; preds = %139, %136
%146 = load i64, i64* %13
ret i64 %146
}

LLVM IR (-O2):
define i64 @mp_add(i16* writeonly %0, i16* %1, i16* %2, i64 %3, i64 %4) {
%6 = icmp ult i64 %3, %4
br i1 %6, label %7, label %8
7: ; preds = %5
br label %8
8: ; preds = %7, %5
%9 = phi i64 [ %4, %7 ], [ %3, %5 ]
%10 = phi i64 [ %3, %7 ], [ %4, %5 ]
%11 = phi i16* [ %1, %7 ], [ %2, %5 ]
%12 = phi i16* [ %2, %7 ], [ %1, %5 ]
%13 = load i16, i16* %12
%14 = zext i16 %13 to i64
%15 = load i16, i16* %11
%16 = zext i16 %15 to i64
%17 = add nuw nsw i64 %16, %14
%18 = trunc i64 %17 to i16
store i16 %18, i16* %0
%19 = lshr i64 %17, 16
%20 = icmp ugt i64 %10, 1
br i1 %20, label %21, label %74
21: ; preds = %8
%22 = add i64 %10, -1
%23 = and i64 %22, 1
%24 = icmp eq i64 %10, 2
br i1 %24, label %57, label %25
25: ; preds = %21
%26 = and i64 %22, -2
br label %27
27: ; preds = %27, %25
%28 = phi i64 [ %19, %25 ], [ %54, %27 ]
%29 = phi i64 [ 1, %25 ], [ %53, %27 ]
%30 = phi i64 [ 0, %25 ], [ %55, %27 ]
%31 = getelementptr inbounds i16, i16* %12, i64 %29
%32 = load i16, i16* %31
%33 = zext i16 %32 to i64
%34 = getelementptr inbounds i16, i16* %11, i64 %29
%35 = load i16, i16* %34
%36 = zext i16 %35 to i64
%37 = add nuw nsw i64 %28, %33
%38 = add nuw nsw i64 %37, %36
%39 = trunc i64 %38 to i16
%40 = getelementptr inbounds i16, i16* %0, i64 %29
store i16 %39, i16* %40
%41 = add nuw nsw i64 %29, 1
%42 = lshr i64 %38, 16
%43 = getelementptr inbounds i16, i16* %12, i64 %41
%44 = load i16, i16* %43
%45 = zext i16 %44 to i64
%46 = getelementptr inbounds i16, i16* %11, i64 %41
%47 = load i16, i16* %46
%48 = zext i16 %47 to i64
%49 = add nuw nsw i64 %42, %45
%50 = add nuw nsw i64 %49, %48
%51 = trunc i64 %50 to i16
%52 = getelementptr inbounds i16, i16* %0, i64 %41
store i16 %51, i16* %52
%53 = add nuw nsw i64 %29, 2
%54 = lshr i64 %50, 16
%55 = add i64 %30, 2
%56 = icmp eq i64 %55, %26
br i1 %56, label %57, label %27
57: ; preds = %27, %21
%58 = phi i64 [ undef, %21 ], [ %54, %27 ]
%59 = phi i64 [ %19, %21 ], [ %54, %27 ]
%60 = phi i64 [ 1, %21 ], [ %53, %27 ]
%61 = icmp eq i64 %23, 0
br i1 %61, label %74, label %62
62: ; preds = %57
%63 = getelementptr inbounds i16, i16* %12, i64 %60
%64 = load i16, i16* %63
%65 = zext i16 %64 to i64
%66 = getelementptr inbounds i16, i16* %11, i64 %60
%67 = load i16, i16* %66
%68 = zext i16 %67 to i64
%69 = add nuw nsw i64 %59, %65
%70 = add nuw nsw i64 %69, %68
%71 = trunc i64 %70 to i16
%72 = getelementptr inbounds i16, i16* %0, i64 %60
store i16 %71, i16* %72
%73 = lshr i64 %70, 16
br label %74
74: ; preds = %62, %57, %8
%75 = phi i64 [ %19, %8 ], [ %58, %57 ], [ %73, %62 ]
%76 = phi i64 [ 1, %8 ], [ %10, %57 ], [ %10, %62 ]
%77 = trunc i64 %75 to i16
%78 = icmp eq i16* %12, %0
br i1 %78, label %101, label %79
79: ; preds = %74
%80 = icmp ugt i64 %9, %76
br i1 %80, label %81, label %145
81: ; preds = %79
%82 = sub i64 %9, %76
%83 = add i64 %76, 1
%84 = and i64 %82, 1
%85 = icmp eq i64 %84, 0
br i1 %85, label %96, label %86
86: ; preds = %81
%87 = getelementptr inbounds i16, i16* %12, i64 %76
%88 = load i16, i16* %87
%89 = zext i16 %88 to i64
%90 = and i64 %75, 65535
%91 = add nuw nsw i64 %90, %89
%92 = trunc i64 %91 to i16
%93 = getelementptr inbounds i16, i16* %0, i64 %76
store i16 %92, i16* %93
%94 = lshr i64 %91, 16
%95 = add nuw nsw i64 %76, 1
br label %96
96: ; preds = %86, %81
%97 = phi i64 [ undef, %81 ], [ %94, %86 ]
%98 = phi i64 [ %76, %81 ], [ %95, %86 ]
%99 = phi i64 [ %75, %81 ], [ %94, %86 ]
%100 = icmp eq i64 %9, %83
br i1 %100, label %142, label %105
101: ; preds = %74
%102 = icmp ne i16 %77, 0
%103 = icmp ugt i64 %9, %76
%104 = and i1 %102, %103
br i1 %104, label %126, label %145
105: ; preds = %96, %105
%106 = phi i64 [ %124, %105 ], [ %98, %96 ]
%107 = phi i64 [ %123, %105 ], [ %99, %96 ]
%108 = getelementptr inbounds i16, i16* %12, i64 %106
%109 = load i16, i16* %108
%110 = zext i16 %109 to i64
%111 = and i64 %107, 65535
%112 = add nuw nsw i64 %111, %110
%113 = trunc i64 %112 to i16
%114 = getelementptr inbounds i16, i16* %0, i64 %106
store i16 %113, i16* %114
%115 = lshr i64 %112, 16
%116 = add nuw nsw i64 %106, 1
%117 = getelementptr inbounds i16, i16* %12, i64 %116
%118 = load i16, i16* %117
%119 = zext i16 %118 to i64
%120 = add nuw nsw i64 %115, %119
%121 = trunc i64 %120 to i16
%122 = getelementptr inbounds i16, i16* %0, i64 %116
store i16 %121, i16* %122
%123 = lshr i64 %120, 16
%124 = add nuw nsw i64 %106, 2
%125 = icmp eq i64 %124, %9
br i1 %125, label %142, label %105
126: ; preds = %101, %126
%127 = phi i64 [ %136, %126 ], [ %76, %101 ]
%128 = phi i64 [ %135, %126 ], [ %75, %101 ]
%129 = getelementptr inbounds i16, i16* %0, i64 %127
%130 = load i16, i16* %129
%131 = zext i16 %130 to i64
%132 = and i64 %128, 65535
%133 = add nuw nsw i64 %132, %131
%134 = trunc i64 %133 to i16
store i16 %134, i16* %129
%135 = lshr i64 %133, 16
%136 = add nuw nsw i64 %127, 1
%137 = icmp ugt i64 %133, 65535
%138 = icmp ult i64 %136, %9
%139 = select i1 %137, i1 %138, i1 false
br i1 %139, label %126, label %140
140: ; preds = %126
%141 = trunc i64 %135 to i16
br label %145
142: ; preds = %105, %96
%143 = phi i64 [ %97, %96 ], [ %123, %105 ]
%144 = trunc i64 %143 to i16
br label %145
145: ; preds = %79, %142, %101, %140
%146 = phi i16 [ %141, %140 ], [ %77, %101 ], [ %144, %142 ], [ %77, %79 ]
%147 = phi i64 [ %9, %140 ], [ %9, %101 ], [ %9, %142 ], [ %76, %79 ]
%148 = icmp eq i16 %146, 0
br i1 %148, label %152, label %149
149: ; preds = %145
%150 = add nsw i64 %147, 1
%151 = getelementptr inbounds i16, i16* %0, i64 %147
store i16 1, i16* %151
br label %152
152: ; preds = %149, %145
%153 = phi i64 [ %150, %149 ], [ %147, %145 ]
ret i64 %153
}