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 = op1[0] + op2[0];
  rop[0] = value;
  carry = value >> 16;
  for (size = 1; size < len2; size++) {
    value = op1[size] + op2[size] + carry;
    rop[size] = value;
    carry = value >> 16;
  }
  if (rop != op1) {
    for (; size < len1; size++) {
      value = op1[size] + carry;
      rop[size] = value;
      carry = value >> 16;
    }
  } else {
    for (; carry && size < len1; size++) {
      value = 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    %ecx,%eax
cltq
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    11f2 <mp_add+0xf2>
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    %ecx,%eax
movzwl -0x32(%rbp),%ecx
add    %ecx,%eax
cltq
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    118e <mp_add+0x8e>
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     1260 <mp_add+0x160>
jmp    1205 <mp_add+0x105>
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    125b <mp_add+0x15b>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
movzwl -0x32(%rbp),%ecx
add    %ecx,%eax
cltq
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    1205 <mp_add+0x105>
jmp    12e5 <mp_add+0x1e5>
jmp    1265 <mp_add+0x165>
movzwl -0x32(%rbp),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x51(%rbp)
je     1285 <mp_add+0x185>
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
setb   %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    1295 <mp_add+0x195>
jmp    12dd <mp_add+0x1dd>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
movzwl -0x32(%rbp),%ecx
add    %ecx,%eax
cltq
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    1265 <mp_add+0x165>
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpw   $0x0,-0x32(%rbp)
je     130b <mp_add+0x20b>
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   %r14
push   %rbx
movzwl (%rdx),%esi
movzwl (%r8),%r9d
add    %rsi,%r9
mov    %r9w,(%rdi)
shr    $0x10,%r9
cmp    $0x2,%rcx
jb     1145 <mp_add+0x45>
lea    -0x1(%rcx),%r10
cmp    $0x2,%rcx
jne    114c <mp_add+0x4c>
mov    $0x1,%esi
jmp    11a6 <mp_add+0xa6>
mov    $0x1,%ecx
jmp    11c6 <mp_add+0xc6>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
neg    %r11
mov    $0x1,%esi
nopl   0x0(%rax,%rax,1)
movzwl (%rdx,%rsi,2),%r14d
add    %r9,%r14
movzwl (%r8,%rsi,2),%ebx
add    %r14,%rbx
mov    %bx,(%rdi,%rsi,2)
shr    $0x10,%rbx
movzwl 0x2(%rdx,%rsi,2),%r14d
add    %rbx,%r14
movzwl 0x2(%r8,%rsi,2),%r9d
add    %r14,%r9
mov    %r9w,0x2(%rdi,%rsi,2)
shr    $0x10,%r9
lea    (%r11,%rsi,1),%rbx
add    $0x2,%rbx
add    $0x2,%rsi
cmp    $0x1,%rbx
jne    1160 <mp_add+0x60>
test   $0x1,%r10b
je     11c6 <mp_add+0xc6>
movzwl (%rdx,%rsi,2),%ebx
add    %rbx,%r9
movzwl (%r8,%rsi,2),%ebx
add    %r9,%rbx
mov    %bx,(%rdi,%rsi,2)
shr    $0x10,%rbx
mov    %rbx,%r9
cmp    %rdi,%rdx
je     1231 <mp_add+0x131>
cmp    %rcx,%rax
jbe    126a <mp_add+0x16a>
mov    %eax,%ebx
sub    %ecx,%ebx
lea    0x1(%rcx),%rsi
test   $0x1,%bl
je     11f8 <mp_add+0xf8>
movzwl (%rdx,%rcx,2),%ebx
movzwl %r9w,%r9d
add    %rbx,%r9
mov    %r9w,(%rdi,%rcx,2)
shr    $0x10,%r9
mov    %rsi,%rcx
cmp    %rsi,%rax
je     126d <mp_add+0x16d>
nopl   (%rax)
movzwl (%rdx,%rcx,2),%esi
movzwl %r9w,%ebx
add    %rsi,%rbx
mov    %bx,(%rdi,%rcx,2)
shr    $0x10,%rbx
movzwl 0x2(%rdx,%rcx,2),%r9d
add    %rbx,%r9
mov    %r9w,0x2(%rdi,%rcx,2)
shr    $0x10,%r9
add    $0x2,%rcx
cmp    %rcx,%rax
jne    1200 <mp_add+0x100>
jmp    126d <mp_add+0x16d>
test   %r9w,%r9w
je     126d <mp_add+0x16d>
cmp    %rcx,%rax
jbe    126d <mp_add+0x16d>
add    $0x1,%rcx
movzwl -0x2(%rdi,%rcx,2),%edx
lea    0x1(%rdx),%r9
mov    %r9w,-0x2(%rdi,%rcx,2)
cmp    $0xffff,%rdx
jne    1264 <mp_add+0x164>
lea    0x1(%rcx),%rdx
cmp    %rax,%rcx
mov    %rdx,%rcx
jb     1240 <mp_add+0x140>
shr    $0x10,%r9
jmp    126d <mp_add+0x16d>
mov    %rcx,%rax
test   %r9w,%r9w
je     127d <mp_add+0x17d>
movw   $0x1,(%rdi,%rax,2)
add    $0x1,%rax
pop    %rbx
pop    %r14
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 i32
%31 = load i16*, i16** %8
%32 = getelementptr inbounds i16, i16* %31, i64 0
%33 = load i16, i16* %32
%34 = zext i16 %33 to i32
%35 = add nsw i32 %30, %34
%36 = sext i32 %35 to i64
store i64 %36, i64* %11
%37 = load i64, i64* %11
%38 = trunc i64 %37 to i16
%39 = load i16*, i16** %6
%40 = getelementptr inbounds i16, i16* %39, i64 0
store i16 %38, i16* %40
%41 = load i64, i64* %11
%42 = lshr i64 %41, 16
%43 = trunc i64 %42 to i16
store i16 %43, i16* %12
store i64 1, i64* %13
br label %44
44: ; preds = %72, %26
%45 = load i64, i64* %13
%46 = load i64, i64* %10
%47 = icmp ult i64 %45, %46
br i1 %47, label %48, label %75
48: ; preds = %44
%49 = load i16*, i16** %7
%50 = load i64, i64* %13
%51 = getelementptr inbounds i16, i16* %49, i64 %50
%52 = load i16, i16* %51
%53 = zext i16 %52 to i32
%54 = load i16*, i16** %8
%55 = load i64, i64* %13
%56 = getelementptr inbounds i16, i16* %54, i64 %55
%57 = load i16, i16* %56
%58 = zext i16 %57 to i32
%59 = add nsw i32 %53, %58
%60 = load i16, i16* %12
%61 = zext i16 %60 to i32
%62 = add nsw i32 %59, %61
%63 = sext i32 %62 to i64
store i64 %63, i64* %11
%64 = load i64, i64* %11
%65 = trunc i64 %64 to i16
%66 = load i16*, i16** %6
%67 = load i64, i64* %13
%68 = getelementptr inbounds i16, i16* %66, i64 %67
store i16 %65, i16* %68
%69 = load i64, i64* %11
%70 = lshr i64 %69, 16
%71 = trunc i64 %70 to i16
store i16 %71, i16* %12
br label %72
72: ; preds = %48
%73 = load i64, i64* %13
%74 = add nsw i64 %73, 1
store i64 %74, i64* %13
br label %44
75: ; preds = %44
%76 = load i16*, i16** %6
%77 = load i16*, i16** %7
%78 = icmp ne i16* %76, %77
br i1 %78, label %79, label %106
79: ; preds = %75
br label %80
80: ; preds = %102, %79
%81 = load i64, i64* %13
%82 = load i64, i64* %9
%83 = icmp ult i64 %81, %82
br i1 %83, label %84, label %105
84: ; preds = %80
%85 = load i16*, i16** %7
%86 = load i64, i64* %13
%87 = getelementptr inbounds i16, i16* %85, i64 %86
%88 = load i16, i16* %87
%89 = zext i16 %88 to i32
%90 = load i16, i16* %12
%91 = zext i16 %90 to i32
%92 = add nsw i32 %89, %91
%93 = sext i32 %92 to i64
store i64 %93, i64* %11
%94 = load i64, i64* %11
%95 = trunc i64 %94 to i16
%96 = load i16*, i16** %6
%97 = load i64, i64* %13
%98 = getelementptr inbounds i16, i16* %96, i64 %97
store i16 %95, i16* %98
%99 = load i64, i64* %11
%100 = lshr i64 %99, 16
%101 = trunc i64 %100 to i16
store i16 %101, i16* %12
br label %102
102: ; preds = %84
%103 = load i64, i64* %13
%104 = add nsw i64 %103, 1
store i64 %104, i64* %13
br label %80
105: ; preds = %80
br label %140
106: ; preds = %75
br label %107
107: ; preds = %135, %106
%108 = load i16, i16* %12
%109 = zext i16 %108 to i32
%110 = icmp ne i32 %109, 0
br i1 %110, label %111, label %115
111: ; preds = %107
%112 = load i64, i64* %13
%113 = load i64, i64* %9
%114 = icmp ult i64 %112, %113
br label %115
115: ; preds = %111, %107
%116 = phi i1 [ false, %107 ], [ %114, %111 ]
br i1 %116, label %117, label %138
117: ; preds = %115
%118 = load i16*, i16** %7
%119 = load i64, i64* %13
%120 = getelementptr inbounds i16, i16* %118, i64 %119
%121 = load i16, i16* %120
%122 = zext i16 %121 to i32
%123 = load i16, i16* %12
%124 = zext i16 %123 to i32
%125 = add nsw i32 %122, %124
%126 = sext i32 %125 to i64
store i64 %126, i64* %11
%127 = load i64, i64* %11
%128 = trunc i64 %127 to i16
%129 = load i16*, i16** %6
%130 = load i64, i64* %13
%131 = getelementptr inbounds i16, i16* %129, i64 %130
store i16 %128, i16* %131
%132 = load i64, i64* %11
%133 = lshr i64 %132, 16
%134 = trunc i64 %133 to i16
store i16 %134, i16* %12
br label %135
135: ; preds = %117
%136 = load i64, i64* %13
%137 = add nsw i64 %136, 1
store i64 %137, i64* %13
br label %107
138: ; preds = %115
%139 = load i64, i64* %9
store i64 %139, i64* %13
br label %140
140: ; preds = %138, %105
%141 = load i16, i16* %12
%142 = icmp ne i16 %141, 0
br i1 %142, label %143, label %149
143: ; preds = %140
%144 = load i16, i16* %12
%145 = load i16*, i16** %6
%146 = load i64, i64* %13
%147 = add nsw i64 %146, 1
store i64 %147, i64* %13
%148 = getelementptr inbounds i16, i16* %145, i64 %146
store i16 %144, i16* %148
br label %149
149: ; preds = %143, %140
%150 = load i64, i64* %13
ret i64 %150
}

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 %143
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 %140, 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 %143
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 %140, label %105
126: ; preds = %101, %126
%127 = phi i64 [ %133, %126 ], [ %76, %101 ]
%128 = getelementptr inbounds i16, i16* %0, i64 %127
%129 = load i16, i16* %128
%130 = zext i16 %129 to i64
%131 = add nuw nsw i64 %130, 1
%132 = trunc i64 %131 to i16
store i16 %132, i16* %128
%133 = add nuw nsw i64 %127, 1
%134 = icmp eq i16 %129, -1
%135 = icmp ult i64 %133, %9
%136 = select i1 %134, i1 %135, i1 false
br i1 %136, label %126, label %137
137: ; preds = %126
%138 = lshr i64 %131, 16
%139 = trunc i64 %138 to i16
br label %143
140: ; preds = %105, %96
%141 = phi i64 [ %97, %96 ], [ %123, %105 ]
%142 = trunc i64 %141 to i16
br label %143
143: ; preds = %79, %140, %101, %137
%144 = phi i16 [ %139, %137 ], [ %77, %101 ], [ %142, %140 ], [ %77, %79 ]
%145 = phi i64 [ %9, %137 ], [ %9, %101 ], [ %9, %140 ], [ %76, %79 ]
%146 = icmp eq i16 %144, 0
br i1 %146, label %150, label %147
147: ; preds = %143
%148 = add nsw i64 %145, 1
%149 = getelementptr inbounds i16, i16* %0, i64 %145
store i16 1, i16* %149
br label %150
150: ; preds = %147, %143
%151 = phi i64 [ %148, %147 ], [ %145, %143 ]
ret i64 %151
}