void compressxy(double *x, double *y, int *n) {
  int delta, i, j;
  double sum;
  for (i = 0; i < (*n) - 1; i++) {
    if (x[i] != x[i + 1])
      continue;
    sum = y[i] + y[i + 1];
    for (j = i + 2; j < (*n) && x[j] == x[i]; j++)
      sum += y[j];
    delta = j - i - 1;
    y[i] = sum / (double)(delta + 1);
    for (; j < (*n); j++) {
      x[j - delta] = x[j];
      y[j - delta] = y[j];
    }
    (*n) -= delta;
  }
}


x86 assembly (clang, -O0):
<compressxy>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    129d <compressxy+0x19d>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jne    115b <compressxy+0x5b>
jp     115b <compressxy+0x5b>
jmp    1160 <compressxy+0x60>
jmp    128f <compressxy+0x18f>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rdx
xor    %eax,%eax
cmp    (%rdx),%ecx
mov    %al,-0x31(%rbp)
jge    11c6 <compressxy+0xc6>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
sete   %al
setnp  %cl
and    %cl,%al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    11d6 <compressxy+0xd6>
jmp    11fb <compressxy+0xfb>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    118d <compressxy+0x8d>
mov    -0x24(%rbp),%eax
sub    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
mov    -0x18(%rbp),%rcx
cmp    (%rcx),%eax
jge    1282 <compressxy+0x182>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1227 <compressxy+0x127>
mov    -0x1c(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1117 <compressxy+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<compressxy>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    (%rdx),%r13d
cmp    $0x2,%r13d
jl     1579 <compressxy+0x479>
lea    0x30(%rsi),%rax
mov    %rax,-0x20(%rsp)
lea    0x30(%rdi),%rax
mov    %rax,-0x28(%rsp)
lea    0x8(%rdi),%r10
lea    0x8(%rsi),%rax
mov    %rax,(%rsp)
mov    $0x2,%r15d
mov    $0xffffffff,%r14d
xor    %eax,%eax
mov    %r10,-0x78(%rsp)
mov    %rdx,-0x38(%rsp)
jmp    1181 <compressxy+0x81>
mov    -0x78(%rsp),%r10
cs nopw 0x0(%rax,%rax,1)
nop
sub    %r11d,%r13d
mov    %r13d,(%rdx)
lea    -0x1(%r13),%eax
movslq %eax,%rcx
add    $0x1,%r15
add    $0xffffffff,%r14d
mov    %r12,%rax
cmp    %rcx,%r12
jge    1579 <compressxy+0x479>
movsd  (%rdi,%rax,8),%xmm1
lea    0x1(%rax),%r12
ucomisd 0x8(%rdi,%rax,8),%xmm1
jne    1166 <compressxy+0x66>
jp     1166 <compressxy+0x66>
movsd  (%rsi,%rax,8),%xmm0
addsd  (%rsi,%r12,8),%xmm0
lea    0x2(%rax),%ecx
cmp    %r13d,%ecx
jge    11f0 <compressxy+0xf0>
mov    %r13d,%ebp
mov    %r15,%rcx
nopl   (%rax)
movsd  (%rdi,%rcx,8),%xmm2
ucomisd %xmm1,%xmm2
jne    11f0 <compressxy+0xf0>
jp     11f0 <compressxy+0xf0>
addsd  (%rsi,%rcx,8),%xmm0
add    $0x1,%rcx
cmp    %ecx,%ebp
jne    11b0 <compressxy+0xb0>
mov    %r13d,%r11d
sub    %eax,%r11d
xorps  %xmm1,%xmm1
cvtsi2sd %r11d,%xmm1
add    $0xffffffff,%r11d
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rsi,%rax,8)
jmp    1160 <compressxy+0x60>
nopw   0x0(%rax,%rax,1)
mov    %ecx,%r11d
sub    %eax,%r11d
xorps  %xmm1,%xmm1
cvtsi2sd %r11d,%xmm1
add    $0xffffffff,%r11d
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rsi,%rax,8)
cmp    %r13d,%ecx
jge    1160 <compressxy+0x60>
movslq %ecx,%rbp
movslq %r11d,%r8
movslq %r13d,%r9
mov    %r9,%rbx
sub    %rbp,%rbx
cmp    $0x4,%rbx
jb     14b3 <compressxy+0x3b3>
mov    %rbp,-0x60(%rsp)
not    %rbp
add    %r9,%rbp
mov    %ecx,%eax
add    %ebp,%eax
jb     1440 <compressxy+0x340>
shr    $0x20,%rbp
jne    1440 <compressxy+0x340>
mov    %rbx,-0x30(%rsp)
mov    %r11d,-0x6c(%rsp)
mov    -0x60(%rsp),%rbp
mov    %rbp,%rax
sub    %r8,%rax
mov    %r8,%r10
lea    (%rdi,%rax,8),%r11
mov    %r9,%rbx
mov    %r8,-0x68(%rsp)
sub    %r8,%rbx
lea    (%rdi,%rbx,8),%r10
lea    (%rsi,%rax,8),%rax
mov    %rax,-0x10(%rsp)
lea    (%rsi,%rbx,8),%r8
mov    %r8,-0x8(%rsp)
mov    %ecx,%ebx
lea    (%rdi,%rbx,8),%rax
mov    %rax,-0x50(%rsp)
lea    (%r9,%rbx,1),%rax
sub    %rbp,%rax
lea    (%rdi,%rax,8),%rdx
mov    %rdx,-0x58(%rsp)
lea    (%rsi,%rax,8),%rax
mov    %rax,-0x18(%rsp)
cmp    %r8,%r11
setb   -0x40(%rsp)
mov    -0x10(%rsp),%r8
cmp    %r10,%r8
setb   -0x48(%rsp)
cmp    %rdx,%r11
setb   -0x79(%rsp)
mov    -0x50(%rsp),%rax
cmp    %r10,%rax
setb   -0x7a(%rsp)
mov    -0x18(%rsp),%rdx
cmp    %rdx,%r11
lea    (%rsi,%rbx,8),%rbx
setb   %r11b
cmp    %r10,%rbx
setb   -0x7b(%rsp)
cmp    -0x58(%rsp),%r8
setb   -0x58(%rsp)
mov    -0x8(%rsp),%r10
cmp    %r10,%rax
setb   -0x50(%rsp)
cmp    %rdx,%r8
setb   %al
cmp    %r10,%rbx
setb   %r10b
mov    -0x48(%rsp),%dl
test   %dl,-0x40(%rsp)
jne    1560 <compressxy+0x460>
mov    %r11d,%ebx
mov    -0x7a(%rsp),%dl
and    %dl,-0x79(%rsp)
mov    -0x6c(%rsp),%r11d
mov    -0x38(%rsp),%rdx
jne    1551 <compressxy+0x451>
and    -0x7b(%rsp),%bl
jne    1551 <compressxy+0x451>
mov    -0x50(%rsp),%bl
and    %bl,-0x58(%rsp)
mov    -0x68(%rsp),%r8
jne    14ae <compressxy+0x3ae>
and    %r10b,%al
jne    14ae <compressxy+0x3ae>
mov    %r13,-0x40(%rsp)
mov    -0x30(%rsp),%rax
and    $0xfffffffffffffffc,%rax
mov    %rax,-0x48(%rsp)
add    $0xfffffffffffffffc,%rax
mov    %rax,%r11
shr    $0x2,%r11
add    $0x1,%r11
test   %rax,%rax
je     1447 <compressxy+0x347>
mov    %r11,%rbx
and    $0xfffffffffffffffe,%r11
lea    (%rcx,%r14,1),%eax
movslq %eax,%rdx
mov    %rbp,%rax
sub    %rdx,%rax
mov    -0x20(%rsp),%rdx
lea    (%rdx,%rax,8),%rdx
mov    -0x28(%rsp),%rbp
lea    0x0(,%rax,8),%r8
add    %rbp,%r8
mov    -0x60(%rsp),%rbp
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    (%r10,%rbp,1),%rax
mov    %eax,%r13d
movups (%rdi,%r13,8),%xmm0
movups 0x10(%rdi,%r13,8),%xmm1
movups %xmm0,-0x30(%r8,%r10,8)
movups %xmm1,-0x20(%r8,%r10,8)
movups (%rsi,%r13,8),%xmm0
movups 0x10(%rsi,%r13,8),%xmm1
movups %xmm0,-0x30(%rdx,%r10,8)
movups %xmm1,-0x20(%rdx,%r10,8)
add    $0x4,%eax
movups (%rdi,%rax,8),%xmm0
movups 0x10(%rdi,%rax,8),%xmm1
movups %xmm0,-0x10(%r8,%r10,8)
movups %xmm1,(%r8,%r10,8)
movupd (%rsi,%rax,8),%xmm0
movupd 0x10(%rsi,%rax,8),%xmm1
movupd %xmm0,-0x10(%rdx,%r10,8)
movupd %xmm1,(%rdx,%r10,8)
add    $0x8,%r10
add    $0xfffffffffffffffe,%r11
jne    13d0 <compressxy+0x2d0>
jmp    144d <compressxy+0x34d>
mov    -0x60(%rsp),%rbp
jmp    14b3 <compressxy+0x3b3>
mov    %r11,%rbx
xor    %r10d,%r10d
test   $0x1,%bl
mov    -0x68(%rsp),%r8
je     148c <compressxy+0x38c>
add    %rbp,%r10
mov    %r10d,%eax
movups (%rdi,%rax,8),%xmm0
movups 0x10(%rdi,%rax,8),%xmm1
sub    %r8,%r10
movups %xmm0,(%rdi,%r10,8)
movups %xmm1,0x10(%rdi,%r10,8)
movupd (%rsi,%rax,8),%xmm0
movupd 0x10(%rsi,%rax,8),%xmm1
movupd %xmm0,(%rsi,%r10,8)
movupd %xmm1,0x10(%rsi,%r10,8)
mov    -0x48(%rsp),%rbx
cmp    %rbx,-0x30(%rsp)
mov    -0x38(%rsp),%rdx
mov    -0x40(%rsp),%r13
mov    -0x6c(%rsp),%r11d
je     1150 <compressxy+0x50>
add    %rbx,%rbp
mov    -0x78(%rsp),%r10
mov    %r13d,%eax
sub    %ebp,%eax
mov    %rbp,%rbx
test   $0x1,%al
je     14df <compressxy+0x3df>
mov    %ebx,%eax
movsd  (%rdi,%rax,8),%xmm0
mov    %rbx,%rbp
sub    %r8,%rbp
movsd  %xmm0,(%rdi,%rbp,8)
movsd  (%rsi,%rax,8),%xmm0
movsd  %xmm0,(%rsi,%rbp,8)
lea    0x1(%rbx),%rbp
not    %rbx
add    %r9,%rbx
je     1160 <compressxy+0x60>
add    %r14d,%ecx
movslq %ecx,%r8
shl    $0x3,%r8
mov    %r10,%rcx
sub    %r8,%rcx
mov    (%rsp),%rax
sub    %r8,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %ebp,%ebx
shl    $0x3,%rbx
movsd  (%rdi,%rbx,1),%xmm0
movsd  %xmm0,-0x8(%rcx,%rbp,8)
movsd  (%rsi,%rbx,1),%xmm0
movsd  %xmm0,-0x8(%rax,%rbp,8)
lea    0x1(%rbp),%ebx
movsd  (%rdi,%rbx,8),%xmm0
movsd  %xmm0,(%rcx,%rbp,8)
movsd  (%rsi,%rbx,8),%xmm0
movsd  %xmm0,(%rax,%rbp,8)
add    $0x2,%rbp
cmp    %rbp,%r9
jne    1510 <compressxy+0x410>
jmp    1160 <compressxy+0x60>
mov    -0x78(%rsp),%r10
mov    -0x68(%rsp),%r8
jmp    14b3 <compressxy+0x3b3>
mov    -0x78(%rsp),%r10
mov    -0x6c(%rsp),%r11d
mov    -0x68(%rsp),%r8
mov    -0x38(%rsp),%rdx
jmp    14b3 <compressxy+0x3b3>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @compressxy(double* nocapture %0, double* nocapture %1, i32* nocapture %2) {
%4 = load i32, i32* %2
%5 = icmp sgt i32 %4, 1
br i1 %5, label %6, label %244
6: ; preds = %3, %238
%7 = phi i64 [ %12, %238 ], [ 0, %3 ]
%8 = phi i64 [ %243, %238 ], [ 2, %3 ]
%9 = phi i32 [ %239, %238 ], [ %4, %3 ]
%10 = getelementptr inbounds double, double* %0, i64 %7
%11 = load double, double* %10
%12 = add nuw nsw i64 %7, 1
%13 = getelementptr inbounds double, double* %0, i64 %12
%14 = load double, double* %13
%15 = fcmp une double %11, %14
br i1 %15, label %238, label %16
16: ; preds = %6
%17 = getelementptr inbounds double, double* %1, i64 %7
%18 = load double, double* %17
%19 = getelementptr inbounds double, double* %1, i64 %12
%20 = load double, double* %19
%21 = fadd double %18, %20
%22 = trunc i64 %7 to i32
%23 = add i32 %22, 2
%24 = icmp slt i32 %23, %9
br i1 %24, label %25, label %46
25: ; preds = %16, %31
%26 = phi i64 [ %35, %31 ], [ %8, %16 ]
%27 = phi double [ %34, %31 ], [ %21, %16 ]
%28 = getelementptr inbounds double, double* %0, i64 %26
%29 = load double, double* %28
%30 = fcmp oeq double %29, %11
br i1 %30, label %31, label %44
31: ; preds = %25
%32 = getelementptr inbounds double, double* %1, i64 %26
%33 = load double, double* %32
%34 = fadd double %27, %33
%35 = add nuw nsw i64 %26, 1
%36 = trunc i64 %35 to i32
%37 = icmp eq i32 %9, %36
br i1 %37, label %38, label %25
38: ; preds = %31
%39 = trunc i64 %7 to i32
%40 = sub nsw i32 %9, %39
%41 = add i32 %40, -1
%42 = sitofp i32 %40 to double
%43 = fdiv double %34, %42
store double %43, double* %17
br label %235
44: ; preds = %25
%45 = trunc i64 %26 to i32
br label %46
46: ; preds = %44, %16
%47 = phi i32 [ %23, %16 ], [ %45, %44 ]
%48 = phi double [ %21, %16 ], [ %27, %44 ]
%49 = trunc i64 %7 to i32
%50 = sub nsw i32 %47, %49
%51 = add i32 %50, -1
%52 = sitofp i32 %50 to double
%53 = fdiv double %48, %52
store double %53, double* %17
%54 = icmp slt i32 %47, %9
br i1 %54, label %55, label %235
55: ; preds = %46
%56 = sext i32 %47 to i64
%57 = sext i32 %51 to i64
%58 = sext i32 %9 to i64
%59 = sub nsw i64 %58, %56
%60 = icmp ult i64 %59, 4
br i1 %60, label %194, label %61
61: ; preds = %55
%62 = xor i64 %56, -1
%63 = add nsw i64 %62, %58
%64 = trunc i64 %63 to i32
%65 = xor i32 %47, -1
%66 = icmp ult i32 %65, %64
%67 = icmp ugt i64 %63, 4294967295
%68 = or i1 %66, %67
br i1 %68, label %194, label %69
69: ; preds = %61
%70 = sub nsw i64 %56, %57
%71 = getelementptr double, double* %0, i64 %70
%72 = sub nsw i64 %58, %57
%73 = getelementptr double, double* %0, i64 %72
%74 = getelementptr double, double* %1, i64 %70
%75 = getelementptr double, double* %1, i64 %72
%76 = zext i32 %47 to i64
%77 = getelementptr double, double* %0, i64 %76
%78 = add nsw i64 %58, %76
%79 = sub nsw i64 %78, %56
%80 = getelementptr double, double* %0, i64 %79
%81 = getelementptr double, double* %1, i64 %76
%82 = getelementptr double, double* %1, i64 %79
%83 = icmp ult double* %71, %75
%84 = icmp ult double* %74, %73
%85 = and i1 %83, %84
%86 = icmp ult double* %71, %80
%87 = icmp ult double* %77, %73
%88 = and i1 %86, %87
%89 = or i1 %85, %88
%90 = icmp ult double* %71, %82
%91 = icmp ult double* %81, %73
%92 = and i1 %90, %91
%93 = or i1 %89, %92
%94 = icmp ult double* %74, %80
%95 = icmp ult double* %77, %75
%96 = and i1 %94, %95
%97 = or i1 %93, %96
%98 = icmp ult double* %74, %82
%99 = icmp ult double* %81, %75
%100 = and i1 %98, %99
%101 = or i1 %97, %100
br i1 %101, label %194, label %102
102: ; preds = %69
%103 = and i64 %59, -4
%104 = add nsw i64 %103, %56
%105 = add nsw i64 %103, -4
%106 = lshr exact i64 %105, 2
%107 = add nuw nsw i64 %106, 1
%108 = and i64 %107, 1
%109 = icmp eq i64 %105, 0
br i1 %109, label %165, label %110
110: ; preds = %102
%111 = and i64 %107, 9223372036854775806
br label %112
112: ; preds = %112, %110
%113 = phi i64 [ 0, %110 ], [ %162, %112 ]
%114 = phi i64 [ 0, %110 ], [ %163, %112 ]
%115 = add i64 %113, %56
%116 = and i64 %115, 4294967295
%117 = getelementptr inbounds double, double* %0, i64 %116
%118 = bitcast double* %117 to <2 x double>*
%119 = load <2 x double>, <2 x double>* %118
%120 = getelementptr inbounds double, double* %117, i64 2
%121 = bitcast double* %120 to <2 x double>*
%122 = load <2 x double>, <2 x double>* %121
%123 = sub nsw i64 %115, %57
%124 = getelementptr inbounds double, double* %0, i64 %123
%125 = bitcast double* %124 to <2 x double>*
store <2 x double> %119, <2 x double>* %125
%126 = getelementptr inbounds double, double* %124, i64 2
%127 = bitcast double* %126 to <2 x double>*
store <2 x double> %122, <2 x double>* %127
%128 = getelementptr inbounds double, double* %1, i64 %116
%129 = bitcast double* %128 to <2 x double>*
%130 = load <2 x double>, <2 x double>* %129
%131 = getelementptr inbounds double, double* %128, i64 2
%132 = bitcast double* %131 to <2 x double>*
%133 = load <2 x double>, <2 x double>* %132
%134 = getelementptr inbounds double, double* %1, i64 %123
%135 = bitcast double* %134 to <2 x double>*
store <2 x double> %130, <2 x double>* %135
%136 = getelementptr inbounds double, double* %134, i64 2
%137 = bitcast double* %136 to <2 x double>*
store <2 x double> %133, <2 x double>* %137
%138 = or i64 %113, 4
%139 = add i64 %138, %56
%140 = and i64 %139, 4294967295
%141 = getelementptr inbounds double, double* %0, i64 %140
%142 = bitcast double* %141 to <2 x double>*
%143 = load <2 x double>, <2 x double>* %142
%144 = getelementptr inbounds double, double* %141, i64 2
%145 = bitcast double* %144 to <2 x double>*
%146 = load <2 x double>, <2 x double>* %145
%147 = sub nsw i64 %139, %57
%148 = getelementptr inbounds double, double* %0, i64 %147
%149 = bitcast double* %148 to <2 x double>*
store <2 x double> %143, <2 x double>* %149
%150 = getelementptr inbounds double, double* %148, i64 2
%151 = bitcast double* %150 to <2 x double>*
store <2 x double> %146, <2 x double>* %151
%152 = getelementptr inbounds double, double* %1, i64 %140
%153 = bitcast double* %152 to <2 x double>*
%154 = load <2 x double>, <2 x double>* %153
%155 = getelementptr inbounds double, double* %152, i64 2
%156 = bitcast double* %155 to <2 x double>*
%157 = load <2 x double>, <2 x double>* %156
%158 = getelementptr inbounds double, double* %1, i64 %147
%159 = bitcast double* %158 to <2 x double>*
store <2 x double> %154, <2 x double>* %159
%160 = getelementptr inbounds double, double* %158, i64 2
%161 = bitcast double* %160 to <2 x double>*
store <2 x double> %157, <2 x double>* %161
%162 = add nuw i64 %113, 8
%163 = add i64 %114, 2
%164 = icmp eq i64 %163, %111
br i1 %164, label %165, label %112
165: ; preds = %112, %102
%166 = phi i64 [ 0, %102 ], [ %162, %112 ]
%167 = icmp eq i64 %108, 0
br i1 %167, label %192, label %168
168: ; preds = %165
%169 = add i64 %166, %56
%170 = and i64 %169, 4294967295
%171 = getelementptr inbounds double, double* %0, i64 %170
%172 = bitcast double* %171 to <2 x double>*
%173 = load <2 x double>, <2 x double>* %172
%174 = getelementptr inbounds double, double* %171, i64 2
%175 = bitcast double* %174 to <2 x double>*
%176 = load <2 x double>, <2 x double>* %175
%177 = sub nsw i64 %169, %57
%178 = getelementptr inbounds double, double* %0, i64 %177
%179 = bitcast double* %178 to <2 x double>*
store <2 x double> %173, <2 x double>* %179
%180 = getelementptr inbounds double, double* %178, i64 2
%181 = bitcast double* %180 to <2 x double>*
store <2 x double> %176, <2 x double>* %181
%182 = getelementptr inbounds double, double* %1, i64 %170
%183 = bitcast double* %182 to <2 x double>*
%184 = load <2 x double>, <2 x double>* %183
%185 = getelementptr inbounds double, double* %182, i64 2
%186 = bitcast double* %185 to <2 x double>*
%187 = load <2 x double>, <2 x double>* %186
%188 = getelementptr inbounds double, double* %1, i64 %177
%189 = bitcast double* %188 to <2 x double>*
store <2 x double> %184, <2 x double>* %189
%190 = getelementptr inbounds double, double* %188, i64 2
%191 = bitcast double* %190 to <2 x double>*
store <2 x double> %187, <2 x double>* %191
br label %192
192: ; preds = %165, %168
%193 = icmp eq i64 %59, %103
br i1 %193, label %235, label %194
194: ; preds = %69, %61, %55, %192
%195 = phi i64 [ %56, %69 ], [ %56, %61 ], [ %56, %55 ], [ %104, %192 ]
%196 = sub nsw i64 %58, %195
%197 = xor i64 %195, -1
%198 = and i64 %196, 1
%199 = icmp eq i64 %198, 0
br i1 %199, label %210, label %200
200: ; preds = %194
%201 = and i64 %195, 4294967295
%202 = getelementptr inbounds double, double* %0, i64 %201
%203 = load double, double* %202
%204 = sub nsw i64 %195, %57
%205 = getelementptr inbounds double, double* %0, i64 %204
store double %203, double* %205
%206 = getelementptr inbounds double, double* %1, i64 %201
%207 = load double, double* %206
%208 = getelementptr inbounds double, double* %1, i64 %204
store double %207, double* %208
%209 = add nsw i64 %195, 1
br label %210
210: ; preds = %200, %194
%211 = phi i64 [ %195, %194 ], [ %209, %200 ]
%212 = sub nsw i64 0, %58
%213 = icmp eq i64 %197, %212
br i1 %213, label %235, label %214
214: ; preds = %210, %214
%215 = phi i64 [ %233, %214 ], [ %211, %210 ]
%216 = and i64 %215, 4294967295
%217 = getelementptr inbounds double, double* %0, i64 %216
%218 = load double, double* %217
%219 = sub nsw i64 %215, %57
%220 = getelementptr inbounds double, double* %0, i64 %219
store double %218, double* %220
%221 = getelementptr inbounds double, double* %1, i64 %216
%222 = load double, double* %221
%223 = getelementptr inbounds double, double* %1, i64 %219
store double %222, double* %223
%224 = add nsw i64 %215, 1
%225 = and i64 %224, 4294967295
%226 = getelementptr inbounds double, double* %0, i64 %225
%227 = load double, double* %226
%228 = sub nsw i64 %224, %57
%229 = getelementptr inbounds double, double* %0, i64 %228
store double %227, double* %229
%230 = getelementptr inbounds double, double* %1, i64 %225
%231 = load double, double* %230
%232 = getelementptr inbounds double, double* %1, i64 %228
store double %231, double* %232
%233 = add nsw i64 %215, 2
%234 = icmp eq i64 %233, %58
br i1 %234, label %235, label %214
235: ; preds = %210, %214, %192, %38, %46
%236 = phi i32 [ %41, %38 ], [ %51, %46 ], [ %51, %192 ], [ %51, %214 ], [ %51, %210 ]
%237 = sub nsw i32 %9, %236
store i32 %237, i32* %2
br label %238
238: ; preds = %6, %235
%239 = phi i32 [ %9, %6 ], [ %237, %235 ]
%240 = add nsw i32 %239, -1
%241 = sext i32 %240 to i64
%242 = icmp slt i64 %12, %241
%243 = add nuw nsw i64 %8, 1
br i1 %242, label %6, label %244
244: ; preds = %238, %3
ret void
}