long MultModM(long s, long t, long M) {
  long R, S0, S1, q, qh, rh, k;
  if (s < 0)
    s += M;
  if (t < 0)
    t += M;
  if (s < (32768)) {
    S0 = s;
    R = 0;
  } else {
    S1 = s / (32768);
    S0 = s - (32768) * S1;
    qh = M / (32768);
    rh = M - (32768) * qh;
    if (S1 >= (32768)) {
      S1 -= (32768);
      k = t / qh;
      R = (32768) * (t - k * qh) - k * rh;
      while (R < 0)
        R += M;
    } else
      R = 0;
    if (S1 != 0) {
      q = M / S1;
      k = t / q;
      R -= k * (M - S1 * q);
      if (R > 0)
        R -= M;
      R += S1 * (t - k * q);
      while (R < 0)
        R += M;
    }
    k = R / qh;
    R = (32768) * (R - k * qh) - k * rh;
    while (R < 0)
      R += M;
  }
  if (S0 != 0) {
    q = M / S0;
    k = t / q;
    R -= k * (M - S0 * q);
    if (R > 0)
      R -= M;
    R += (S0 * (t - k * q));
    while (R < 0)
      R += M;
  }
  return R;
}


x86 assembly (clang, -O0):
<MultModM>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
cmpq   $0x0,-0x8(%rbp)
jge    1127 <MultModM+0x27>
mov    -0x18(%rbp),%rax
add    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
cmpq   $0x0,-0x10(%rbp)
jge    113e <MultModM+0x3e>
mov    -0x18(%rbp),%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
cmpq   $0x8000,-0x8(%rbp)
jge    1161 <MultModM+0x61>
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
movq   $0x0,-0x20(%rbp)
jmp    131a <MultModM+0x21a>
mov    -0x8(%rbp),%rax
mov    $0x8000,%ecx
cqto
idiv   %rcx
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
shl    $0xf,%rcx
sub    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    $0x8000,%ecx
cqto
idiv   %rcx
mov    %rax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
shl    $0xf,%rcx
sub    %rcx,%rax
mov    %rax,-0x48(%rbp)
cmpq   $0x8000,-0x30(%rbp)
jl     121a <MultModM+0x11a>
mov    -0x30(%rbp),%rax
sub    $0x8000,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
cqto
idivq  -0x40(%rbp)
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x50(%rbp),%rcx
imul   -0x40(%rbp),%rcx
sub    %rcx,%rax
shl    $0xf,%rax
mov    -0x50(%rbp),%rcx
imul   -0x48(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jge    1215 <MultModM+0x115>
mov    -0x18(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    11f9 <MultModM+0xf9>
jmp    1222 <MultModM+0x122>
movq   $0x0,-0x20(%rbp)
cmpq   $0x0,-0x30(%rbp)
je     12c7 <MultModM+0x1c7>
mov    -0x18(%rbp),%rax
cqto
idivq  -0x30(%rbp)
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
cqto
idivq  -0x38(%rbp)
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rdx
imul   -0x38(%rbp),%rdx
sub    %rdx,%rax
imul   %rax,%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jle    1286 <MultModM+0x186>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x50(%rbp),%rdx
imul   -0x38(%rbp),%rdx
sub    %rdx,%rcx
imul   %rcx,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jge    12c2 <MultModM+0x1c2>
mov    -0x18(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    12a6 <MultModM+0x1a6>
jmp    12c7 <MultModM+0x1c7>
mov    -0x20(%rbp),%rax
cqto
idivq  -0x40(%rbp)
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
imul   -0x40(%rbp),%rcx
sub    %rcx,%rax
shl    $0xf,%rax
mov    -0x50(%rbp),%rcx
imul   -0x48(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jge    1315 <MultModM+0x215>
mov    -0x18(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    12f9 <MultModM+0x1f9>
jmp    131a <MultModM+0x21a>
cmpq   $0x0,-0x28(%rbp)
je     13bf <MultModM+0x2bf>
mov    -0x18(%rbp),%rax
cqto
idivq  -0x28(%rbp)
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
cqto
idivq  -0x38(%rbp)
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rdx
imul   -0x38(%rbp),%rdx
sub    %rdx,%rax
imul   %rax,%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jle    137e <MultModM+0x27e>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x50(%rbp),%rdx
imul   -0x38(%rbp),%rdx
sub    %rdx,%rcx
imul   %rcx,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jge    13ba <MultModM+0x2ba>
mov    -0x18(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    139e <MultModM+0x29e>
jmp    13bf <MultModM+0x2bf>
mov    -0x20(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<MultModM>:
push   %r15
push   %r14
push   %rbx
mov    %rdx,%rcx
mov    %rdi,%r9
sar    $0x3f,%r9
and    %rdx,%r9
add    %rdi,%r9
mov    %rsi,%r8
sar    $0x3f,%r8
and    %rdx,%r8
add    %rsi,%r8
cmp    $0x8000,%r9
jge    1132 <MultModM+0x32>
xor    %edi,%edi
jmp    1265 <MultModM+0x165>
mov    %r9,%r10
shr    $0xf,%r10
lea    0x7fff(%rcx),%rax
test   %rcx,%rcx
cmovns %rcx,%rax
mov    %rax,%r14
sar    $0xf,%r14
and    $0xffffffffffff8000,%rax
mov    %rcx,%r11
sub    %rax,%r11
cmp    $0x40000000,%r9
jb     117c <MultModM+0x7c>
mov    %r8,%rax
or     %r14,%rax
shr    $0x20,%rax
je     1183 <MultModM+0x83>
mov    %r8,%rax
cqto
idiv   %r14
mov    %rdx,%rdi
jmp    118d <MultModM+0x8d>
xor    %edi,%edi
mov    %r10,%r15
jmp    11b1 <MultModM+0xb1>
mov    %r8d,%eax
xor    %edx,%edx
div    %r14d
mov    %edx,%edi
shl    $0xf,%rdi
imul   %r11,%rax
sub    %rax,%rdi
sub    %rcx,%rdi
nopl   0x0(%rax,%rax,1)
add    %rcx,%rdi
js     11a0 <MultModM+0xa0>
mov    %r10,%r15
add    $0xffffffffffff8000,%r15
je     1225 <MultModM+0x125>
mov    %rcx,%rax
or     %r15,%rax
shr    $0x20,%rax
je     11ca <MultModM+0xca>
mov    %rcx,%rax
cqto
idiv   %r15
mov    %rax,%rsi
jmp    11d3 <MultModM+0xd3>
mov    %ecx,%eax
xor    %edx,%edx
div    %r15d
mov    %eax,%esi
mov    %r8,%rax
or     %rsi,%rax
shr    $0x20,%rax
je     11e9 <MultModM+0xe9>
mov    %r8,%rax
cqto
idiv   %rsi
jmp    11f0 <MultModM+0xf0>
mov    %r8d,%eax
xor    %edx,%edx
div    %esi
imul   %r15,%rsi
sub    %rcx,%rsi
imul   %rax,%rsi
lea    (%rsi,%rdi,1),%rax
xor    %ebx,%ebx
test   %rax,%rax
cmovg  %rcx,%rbx
imul   %r15,%rdx
add    %rdi,%rdx
add    %rsi,%rdx
sub    %rbx,%rdx
sub    %rcx,%rdx
mov    %rdx,%rdi
nopl   0x0(%rax,%rax,1)
add    %rcx,%rdi
js     1220 <MultModM+0x120>
shl    $0xf,%r10
mov    %rdi,%rax
or     %r14,%rax
shr    $0x20,%rax
je     1242 <MultModM+0x142>
mov    %rdi,%rax
cqto
idiv   %r14
mov    %rdx,%rdi
jmp    124b <MultModM+0x14b>
mov    %edi,%eax
xor    %edx,%edx
div    %r14d
mov    %edx,%edi
sub    %r10,%r9
shl    $0xf,%rdi
imul   %r11,%rax
sub    %rax,%rdi
sub    %rcx,%rdi
nopl   0x0(%rax)
add    %rcx,%rdi
js     1260 <MultModM+0x160>
test   %r9,%r9
je     12e5 <MultModM+0x1e5>
mov    %rcx,%rax
or     %r9,%rax
shr    $0x20,%rax
je     1283 <MultModM+0x183>
mov    %rcx,%rax
cqto
idiv   %r9
mov    %rax,%rsi
jmp    128c <MultModM+0x18c>
mov    %ecx,%eax
xor    %edx,%edx
div    %r9d
mov    %eax,%esi
mov    %r8,%rax
or     %rsi,%rax
shr    $0x20,%rax
je     12a2 <MultModM+0x1a2>
mov    %r8,%rax
cqto
idiv   %rsi
jmp    12a9 <MultModM+0x1a9>
mov    %r8d,%eax
xor    %edx,%edx
div    %esi
imul   %r9,%rsi
sub    %rcx,%rsi
imul   %rax,%rsi
lea    (%rsi,%rdi,1),%rax
xor    %ebx,%ebx
test   %rax,%rax
cmovg  %rcx,%rbx
imul   %r9,%rdx
add    %rdi,%rdx
add    %rsi,%rdx
sub    %rbx,%rdx
sub    %rcx,%rdx
mov    %rdx,%rdi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    %rcx,%rdi
js     12e0 <MultModM+0x1e0>
mov    %rdi,%rax
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i64 @MultModM(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
store i64 %0, i64* %4
store i64 %1, i64* %5
store i64 %2, i64* %6
%14 = load i64, i64* %4
%15 = icmp slt i64 %14, 0
br i1 %15, label %16, label %20
16: ; preds = %3
%17 = load i64, i64* %6
%18 = load i64, i64* %4
%19 = add nsw i64 %18, %17
store i64 %19, i64* %4
br label %20
20: ; preds = %16, %3
%21 = load i64, i64* %5
%22 = icmp slt i64 %21, 0
br i1 %22, label %23, label %27
23: ; preds = %20
%24 = load i64, i64* %6
%25 = load i64, i64* %5
%26 = add nsw i64 %25, %24
store i64 %26, i64* %5
br label %27
27: ; preds = %23, %20
%28 = load i64, i64* %4
%29 = icmp slt i64 %28, 32768
br i1 %29, label %30, label %32
30: ; preds = %27
%31 = load i64, i64* %4
store i64 %31, i64* %8
store i64 0, i64* %7
br label %137
32: ; preds = %27
%33 = load i64, i64* %4
%34 = sdiv i64 %33, 32768
store i64 %34, i64* %9
%35 = load i64, i64* %4
%36 = load i64, i64* %9
%37 = mul nsw i64 32768, %36
%38 = sub nsw i64 %35, %37
store i64 %38, i64* %8
%39 = load i64, i64* %6
%40 = sdiv i64 %39, 32768
store i64 %40, i64* %11
%41 = load i64, i64* %6
%42 = load i64, i64* %11
%43 = mul nsw i64 32768, %42
%44 = sub nsw i64 %41, %43
store i64 %44, i64* %12
%45 = load i64, i64* %9
%46 = icmp sge i64 %45, 32768
br i1 %46, label %47, label %71
47: ; preds = %32
%48 = load i64, i64* %9
%49 = sub nsw i64 %48, 32768
store i64 %49, i64* %9
%50 = load i64, i64* %5
%51 = load i64, i64* %11
%52 = sdiv i64 %50, %51
store i64 %52, i64* %13
%53 = load i64, i64* %5
%54 = load i64, i64* %13
%55 = load i64, i64* %11
%56 = mul nsw i64 %54, %55
%57 = sub nsw i64 %53, %56
%58 = mul nsw i64 32768, %57
%59 = load i64, i64* %13
%60 = load i64, i64* %12
%61 = mul nsw i64 %59, %60
%62 = sub nsw i64 %58, %61
store i64 %62, i64* %7
br label %63
63: ; preds = %66, %47
%64 = load i64, i64* %7
%65 = icmp slt i64 %64, 0
br i1 %65, label %66, label %70
66: ; preds = %63
%67 = load i64, i64* %6
%68 = load i64, i64* %7
%69 = add nsw i64 %68, %67
store i64 %69, i64* %7
br label %63
70: ; preds = %63
br label %72
71: ; preds = %32
store i64 0, i64* %7
br label %72
72: ; preds = %71, %70
%73 = load i64, i64* %9
%74 = icmp ne i64 %73, 0
br i1 %74, label %75, label %115
75: ; preds = %72
%76 = load i64, i64* %6
%77 = load i64, i64* %9
%78 = sdiv i64 %76, %77
store i64 %78, i64* %10
%79 = load i64, i64* %5
%80 = load i64, i64* %10
%81 = sdiv i64 %79, %80
store i64 %81, i64* %13
%82 = load i64, i64* %13
%83 = load i64, i64* %6
%84 = load i64, i64* %9
%85 = load i64, i64* %10
%86 = mul nsw i64 %84, %85
%87 = sub nsw i64 %83, %86
%88 = mul nsw i64 %82, %87
%89 = load i64, i64* %7
%90 = sub nsw i64 %89, %88
store i64 %90, i64* %7
%91 = load i64, i64* %7
%92 = icmp sgt i64 %91, 0
br i1 %92, label %93, label %97
93: ; preds = %75
%94 = load i64, i64* %6
%95 = load i64, i64* %7
%96 = sub nsw i64 %95, %94
store i64 %96, i64* %7
br label %97
97: ; preds = %93, %75
%98 = load i64, i64* %9
%99 = load i64, i64* %5
%100 = load i64, i64* %13
%101 = load i64, i64* %10
%102 = mul nsw i64 %100, %101
%103 = sub nsw i64 %99, %102
%104 = mul nsw i64 %98, %103
%105 = load i64, i64* %7
%106 = add nsw i64 %105, %104
store i64 %106, i64* %7
br label %107
107: ; preds = %110, %97
%108 = load i64, i64* %7
%109 = icmp slt i64 %108, 0
br i1 %109, label %110, label %114
110: ; preds = %107
%111 = load i64, i64* %6
%112 = load i64, i64* %7
%113 = add nsw i64 %112, %111
store i64 %113, i64* %7
br label %107
114: ; preds = %107
br label %115
115: ; preds = %114, %72
%116 = load i64, i64* %7
%117 = load i64, i64* %11
%118 = sdiv i64 %116, %117
store i64 %118, i64* %13
%119 = load i64, i64* %7
%120 = load i64, i64* %13
%121 = load i64, i64* %11
%122 = mul nsw i64 %120, %121
%123 = sub nsw i64 %119, %122
%124 = mul nsw i64 32768, %123
%125 = load i64, i64* %13
%126 = load i64, i64* %12
%127 = mul nsw i64 %125, %126
%128 = sub nsw i64 %124, %127
store i64 %128, i64* %7
br label %129
129: ; preds = %132, %115
%130 = load i64, i64* %7
%131 = icmp slt i64 %130, 0
br i1 %131, label %132, label %136
132: ; preds = %129
%133 = load i64, i64* %6
%134 = load i64, i64* %7
%135 = add nsw i64 %134, %133
store i64 %135, i64* %7
br label %129
136: ; preds = %129
br label %137
137: ; preds = %136, %30
%138 = load i64, i64* %8
%139 = icmp ne i64 %138, 0
br i1 %139, label %140, label %180
140: ; preds = %137
%141 = load i64, i64* %6
%142 = load i64, i64* %8
%143 = sdiv i64 %141, %142
store i64 %143, i64* %10
%144 = load i64, i64* %5
%145 = load i64, i64* %10
%146 = sdiv i64 %144, %145
store i64 %146, i64* %13
%147 = load i64, i64* %13
%148 = load i64, i64* %6
%149 = load i64, i64* %8
%150 = load i64, i64* %10
%151 = mul nsw i64 %149, %150
%152 = sub nsw i64 %148, %151
%153 = mul nsw i64 %147, %152
%154 = load i64, i64* %7
%155 = sub nsw i64 %154, %153
store i64 %155, i64* %7
%156 = load i64, i64* %7
%157 = icmp sgt i64 %156, 0
br i1 %157, label %158, label %162
158: ; preds = %140
%159 = load i64, i64* %6
%160 = load i64, i64* %7
%161 = sub nsw i64 %160, %159
store i64 %161, i64* %7
br label %162
162: ; preds = %158, %140
%163 = load i64, i64* %8
%164 = load i64, i64* %5
%165 = load i64, i64* %13
%166 = load i64, i64* %10
%167 = mul nsw i64 %165, %166
%168 = sub nsw i64 %164, %167
%169 = mul nsw i64 %163, %168
%170 = load i64, i64* %7
%171 = add nsw i64 %170, %169
store i64 %171, i64* %7
br label %172
172: ; preds = %175, %162
%173 = load i64, i64* %7
%174 = icmp slt i64 %173, 0
br i1 %174, label %175, label %179
175: ; preds = %172
%176 = load i64, i64* %6
%177 = load i64, i64* %7
%178 = add nsw i64 %177, %176
store i64 %178, i64* %7
br label %172
179: ; preds = %172
br label %180
180: ; preds = %179, %137
%181 = load i64, i64* %7
ret i64 %181
}

LLVM IR (-O2):
define i64 @MultModM(i64 %0, i64 %1, i64 %2) {
%4 = icmp slt i64 %0, 0
%5 = select i1 %4, i64 %2, i64 0
%6 = add nsw i64 %5, %0
%7 = icmp slt i64 %1, 0
%8 = select i1 %7, i64 %2, i64 0
%9 = add nsw i64 %8, %1
%10 = icmp slt i64 %6, 32768
br i1 %10, label %65, label %11
11: ; preds = %3
%12 = lshr i64 %6, 15
%13 = mul nsw i64 %12, -32768
%14 = add nsw i64 %13, %6
%15 = sdiv i64 %2, 32768
%16 = mul i64 %15, -32768
%17 = add i64 %16, %2
%18 = icmp ugt i64 %6, 1073741823
br i1 %18, label %19, label %33
19: ; preds = %11
%20 = sdiv i64 %9, %15
%21 = mul nsw i64 %20, %15
%22 = srem i64 %9, %15
%23 = shl nsw i64 %22, 15
%24 = mul nsw i64 %20, %17
%25 = sub nsw i64 %23, %24
br label %26
26: ; preds = %26, %19
%27 = phi i64 [ %25, %19 ], [ %29, %26 ]
%28 = icmp slt i64 %27, 0
%29 = add nsw i64 %27, %2
br i1 %28, label %26, label %30
30: ; preds = %26
%31 = add nsw i64 %12, -32768
%32 = icmp eq i64 %31, 0
br i1 %32, label %53, label %33
33: ; preds = %11, %30
%34 = phi i64 [ %31, %30 ], [ %12, %11 ]
%35 = phi i64 [ %27, %30 ], [ 0, %11 ]
%36 = sdiv i64 %2, %34
%37 = sdiv i64 %9, %36
%38 = mul nsw i64 %36, %34
%39 = sub i64 %38, %2
%40 = mul i64 %39, %37
%41 = add i64 %40, %35
%42 = icmp sgt i64 %41, 0
%43 = select i1 %42, i64 %2, i64 0
%44 = mul nsw i64 %37, %36
%45 = srem i64 %9, %36
%46 = mul nsw i64 %45, %34
%47 = add i64 %46, %41
%48 = sub i64 %47, %43
br label %49
49: ; preds = %49, %33
%50 = phi i64 [ %48, %33 ], [ %52, %49 ]
%51 = icmp slt i64 %50, 0
%52 = add nsw i64 %50, %2
br i1 %51, label %49, label %53
53: ; preds = %49, %30
%54 = phi i64 [ %27, %30 ], [ %50, %49 ]
%55 = sdiv i64 %54, %15
%56 = mul nsw i64 %55, %15
%57 = srem i64 %54, %15
%58 = shl nsw i64 %57, 15
%59 = mul nsw i64 %55, %17
%60 = sub nsw i64 %58, %59
br label %61
61: ; preds = %61, %53
%62 = phi i64 [ %60, %53 ], [ %64, %61 ]
%63 = icmp slt i64 %62, 0
%64 = add nsw i64 %62, %2
br i1 %63, label %61, label %65
65: ; preds = %61, %3
%66 = phi i64 [ 0, %3 ], [ %62, %61 ]
%67 = phi i64 [ %6, %3 ], [ %14, %61 ]
%68 = icmp eq i64 %67, 0
br i1 %68, label %87, label %69
69: ; preds = %65
%70 = sdiv i64 %2, %67
%71 = sdiv i64 %9, %70
%72 = mul nsw i64 %70, %67
%73 = sub i64 %72, %2
%74 = mul i64 %73, %71
%75 = add i64 %74, %66
%76 = icmp sgt i64 %75, 0
%77 = select i1 %76, i64 %2, i64 0
%78 = mul nsw i64 %71, %70
%79 = srem i64 %9, %70
%80 = mul nsw i64 %79, %67
%81 = add i64 %80, %75
%82 = sub i64 %81, %77
br label %83
83: ; preds = %83, %69
%84 = phi i64 [ %82, %69 ], [ %86, %83 ]
%85 = icmp slt i64 %84, 0
%86 = add nsw i64 %84, %2
br i1 %85, label %83, label %87
87: ; preds = %83, %65
%88 = phi i64 [ %66, %65 ], [ %84, %83 ]
ret i64 %88
}