#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double sqrt(double);
int window_dist(char *seq1, char *seq2, int seq_length, int window_length,
                double *avg_pid_ptr, double *stdev_ptr) {
  double pid, avg_pid, avg_pid_sq, stdev;
  int begin, pos, common_length, identical_length;
  int window_ctr, all_gaps;
  avg_pid = 0.0;
  avg_pid_sq = 0.0;
  window_ctr = 0;
  for (begin = 0; begin <= seq_length - window_length; begin++) {
    common_length = identical_length = 0;
    all_gaps = 0;
    for (pos = begin; pos < begin + window_length; pos++) {
      if (seq1[pos] == '.' || seq2[pos] == '.') {
        all_gaps += (seq1[pos] == seq2[pos]);
        continue;
      }
      common_length++;
      if (seq1[pos] == seq2[pos])
        identical_length++;
    }
    if (all_gaps == window_length)
      continue;
    pid = common_length ? (double)identical_length / common_length : 0.0;
    avg_pid += pid;
    avg_pid_sq += pid * pid;
    window_ctr++;
  }
  if (window_ctr) {
    avg_pid /= window_ctr;
    avg_pid_sq /= window_ctr;
    stdev = avg_pid_sq - avg_pid * avg_pid;
    stdev = (stdev > 0) ? sqrt(stdev) : 0.0;
  } else {
    stdev = 0.0;
  }
  *avg_pid_ptr = avg_pid;
  *stdev_ptr = stdev;
  return 0;
}


x86 assembly (clang, -O0):
<window_dist>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x5c(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    -0x18(%rbp),%ecx
cmp    %ecx,%eax
jg     12b1 <window_dist+0x1a1>
movl   $0x0,-0x58(%rbp)
movl   $0x0,-0x54(%rbp)
movl   $0x0,-0x60(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    -0x4c(%rbp),%ecx
add    -0x18(%rbp),%ecx
cmp    %ecx,%eax
jge    1225 <window_dist+0x115>
mov    -0x8(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     11b3 <window_dist+0xa3>
mov    -0x10(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    11e0 <window_dist+0xd0>
mov    -0x8(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x50(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
add    -0x60(%rbp),%eax
mov    %eax,-0x60(%rbp)
jmp    1217 <window_dist+0x107>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x50(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    1212 <window_dist+0x102>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1217 <window_dist+0x107>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1178 <window_dist+0x68>
mov    -0x60(%rbp),%eax
cmp    -0x18(%rbp),%eax
jne    1236 <window_dist+0x126>
jmp    12a3 <window_dist+0x193>
cmpl   $0x0,-0x54(%rbp)
je     1258 <window_dist+0x148>
cvtsi2sdl -0x58(%rbp),%xmm0
cvtsi2sdl -0x54(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    1265 <window_dist+0x155>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    1265 <window_dist+0x155>
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    114c <window_dist+0x3c>
cmpl   $0x0,-0x5c(%rbp)
je     1356 <window_dist+0x246>
cvtsi2sdl -0x5c(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
cvtsi2sdl -0x5c(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    133a <window_dist+0x22a>
movsd  -0x48(%rbp),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x70(%rbp)
jmp    1347 <window_dist+0x237>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
jmp    1347 <window_dist+0x237>
movsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    135e <window_dist+0x24e>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
xor    %eax,%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<window_dist>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
pxor   %xmm2,%xmm2
pxor   %xmm1,%xmm1
sub    %ecx,%edx
jl     150a <window_dist+0x3fa>
mov    %r8,0x10(%rsp)
mov    %r9,0x18(%rsp)
add    $0x1,%edx
lea    0x4(%rdi),%r10
lea    0x4(%rsi),%r9
xorpd  %xmm0,%xmm0
xor    %r8d,%r8d
mov    $0x1,%eax
mov    $0xffffffff,%ebp
movdqa 0xea3(%rip),%xmm10
pcmpeqd %xmm7,%xmm7
mov    %ecx,%ebx
movl   $0x0,0xc(%rsp)
pxor   %xmm2,%xmm2
mov    %rcx,0x38(%rsp)
mov    %rdx,0x28(%rsp)
jmp    11ae <window_dist+0x9e>
nopl   0x0(%rax,%rax,1)
mov    0x28(%rsp),%rdx
mov    0x8(%rsp),%eax
mov    (%rsp),%ebp
mov    0x4(%rsp),%ebx
add    $0x1,%r8
add    $0x1,%ebx
add    $0x1,%eax
add    $0xffffffff,%ebp
add    $0x1,%r10
add    $0x1,%r9
cmp    %rdx,%r8
je     14a5 <window_dist+0x395>
cmp    %eax,%ebx
mov    %eax,%r15d
cmovg  %ebx,%r15d
lea    (%r8,%rcx,1),%r13d
lea    0x1(%r8),%r14d
cmp    %r14d,%r13d
cmovg  %r13d,%r14d
test   %ecx,%ecx
jle    1470 <window_dist+0x360>
mov    %ebx,0x4(%rsp)
mov    %ebp,(%rsp)
mov    %eax,0x8(%rsp)
mov    %r8d,%eax
not    %eax
add    %eax,%r14d
xor    %eax,%eax
mov    %r8,%rbp
mov    $0x0,%r12d
mov    $0x0,%r11d
cmp    $0x7,%r14d
jb     1444 <window_dist+0x334>
movsd  %xmm0,0x30(%rsp)
movq   %xmm2,0x20(%rsp)
add    (%rsp),%r15d
add    $0x1,%r15
and    $0xfffffffffffffff8,%r15
add    $0x1,%r14
mov    %r14,%rcx
and    $0xfffffffffffffff8,%rcx
lea    (%r8,%rcx,1),%rbp
pxor   %xmm3,%xmm3
xor    %r11d,%r11d
pxor   %xmm12,%xmm12
pxor   %xmm13,%xmm13
pxor   %xmm14,%xmm14
pxor   %xmm15,%xmm15
pxor   %xmm2,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqa %xmm3,0x40(%rsp)
movd   -0x4(%r10,%r11,1),%xmm8
movd   (%r10,%r11,1),%xmm9
movdqa %xmm8,%xmm1
pcmpeqb %xmm10,%xmm1
movdqa %xmm1,%xmm0
pxor   %xmm7,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm3
movdqa %xmm9,%xmm4
pcmpeqb %xmm10,%xmm4
movdqa %xmm4,%xmm0
pxor   %xmm7,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm11
movd   -0x4(%r9,%r11,1),%xmm6
movd   (%r9,%r11,1),%xmm0
movdqa %xmm6,%xmm5
pcmpeqb %xmm10,%xmm5
pxor   %xmm7,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
pand   %xmm3,%xmm5
movdqa %xmm0,%xmm3
pcmpeqb %xmm10,%xmm3
pxor   %xmm7,%xmm3
punpcklbw %xmm3,%xmm3
punpcklwd %xmm3,%xmm7
pand   %xmm11,%xmm7
movdqa %xmm8,%xmm3
pcmpeqb %xmm6,%xmm3
pand   %xmm1,%xmm6
pandn  %xmm10,%xmm1
por    %xmm6,%xmm1
movdqa %xmm9,%xmm6
pcmpeqb %xmm0,%xmm6
pand   %xmm4,%xmm0
pandn  %xmm10,%xmm4
por    %xmm0,%xmm4
pcmpeqb %xmm8,%xmm1
movdqa 0xcff(%rip),%xmm0
pcmpeqb %xmm9,%xmm4
punpcklbw %xmm3,%xmm3
punpcklwd %xmm3,%xmm3
psrad  $0x18,%xmm5
pand   %xmm0,%xmm3
pand   %xmm5,%xmm3
paddd  %xmm3,%xmm13
movdqa 0x40(%rsp),%xmm3
punpcklbw %xmm6,%xmm6
punpcklwd %xmm6,%xmm6
psrad  $0x18,%xmm7
pand   %xmm0,%xmm6
pand   %xmm7,%xmm6
paddd  %xmm6,%xmm14
punpcklbw %xmm1,%xmm1
punpcklwd %xmm1,%xmm1
psubd  %xmm5,%xmm15
pandn  %xmm1,%xmm5
pand   %xmm0,%xmm5
paddd  %xmm5,%xmm3
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
psubd  %xmm7,%xmm2
pandn  %xmm4,%xmm7
pand   %xmm0,%xmm7
paddd  %xmm7,%xmm12
pcmpeqd %xmm7,%xmm7
add    $0x8,%r11
cmp    %r11,%r15
jne    1250 <window_dist+0x140>
paddd  %xmm15,%xmm2
pshufd $0xee,%xmm2,%xmm0
paddd  %xmm2,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%r11d
paddd  %xmm13,%xmm14
pshufd $0xee,%xmm14,%xmm0
paddd  %xmm14,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%r12d
paddd  %xmm3,%xmm12
pshufd $0xee,%xmm12,%xmm0
paddd  %xmm12,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %rcx,%r14
movq   0x20(%rsp),%xmm2
movsd  0x30(%rsp),%xmm0
jne    1444 <window_dist+0x334>
mov    0x38(%rsp),%rcx
cmp    %ecx,%eax
je     1180 <window_dist+0x70>
test   %r11d,%r11d
je     147b <window_dist+0x36b>
xorps  %xmm3,%xmm3
cvtsi2sd %r12d,%xmm3
xorps  %xmm1,%xmm1
cvtsi2sd %r11d,%xmm1
divsd  %xmm1,%xmm3
jmp    147f <window_dist+0x36f>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %edx,%ecx
xor    %edx,%edx
cmp    %cl,%bl
sete   %dl
add    %edx,%eax
add    $0x1,%rbp
cmp    %ebp,%r13d
jle    13fb <window_dist+0x2eb>
movzbl (%rdi,%rbp,1),%ebx
movzbl (%rsi,%rbp,1),%edx
cmp    $0x2e,%bl
je     1430 <window_dist+0x320>
mov    $0x2e,%cl
cmp    $0x2e,%dl
je     1432 <window_dist+0x322>
add    $0x1,%r11d
xor    %ecx,%ecx
cmp    %dl,%bl
sete   %cl
add    %ecx,%r12d
jmp    143b <window_dist+0x32b>
nopl   0x0(%rax,%rax,1)
xorpd  %xmm3,%xmm3
jne    148f <window_dist+0x37f>
jmp    1190 <window_dist+0x80>
pxor   %xmm3,%xmm3
mov    0x28(%rsp),%rdx
mov    0x8(%rsp),%eax
mov    (%rsp),%ebp
mov    0x4(%rsp),%ebx
addsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm3
addsd  %xmm3,%xmm0
addl   $0x1,0xc(%rsp)
jmp    1190 <window_dist+0x80>
mov    0xc(%rsp),%eax
test   %eax,%eax
je     14e5 <window_dist+0x3d5>
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm2
divsd  %xmm1,%xmm0
movapd %xmm2,%xmm1
mulsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1500 <window_dist+0x3f0>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     14eb <window_dist+0x3db>
xorps  %xmm1,%xmm1
sqrtsd %xmm0,%xmm1
jmp    1500 <window_dist+0x3f0>
pxor   %xmm1,%xmm1
jmp    1500 <window_dist+0x3f0>
movsd  %xmm2,0x20(%rsp)
call   1030 <sqrt@plt>
movsd  0x20(%rsp),%xmm2
movapd %xmm0,%xmm1
mov    0x18(%rsp),%r9
mov    0x10(%rsp),%r8
movsd  %xmm2,(%r8)
movq   %xmm1,(%r9)
xor    %eax,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @window_dist(i8* nocapture %0, i8* nocapture %1, i32 %2, i32 %3, double* nocapture writeonly %4, double* nocapture writeonly %5) {
%7 = icmp slt i32 %2, %3
br i1 %7, label %167, label %8
8: ; preds = %6
%9 = add i32 %2, 1
%10 = sub i32 %9, %3
%11 = zext i32 %10 to i64
%12 = icmp sgt i32 %3, 0
%13 = icmp eq i32 %3, 0
br label %14
14: ; preds = %8, %150
%15 = phi i64 [ 0, %8 ], [ %154, %150 ]
%16 = phi i32 [ 0, %8 ], [ %153, %150 ]
%17 = phi double [ 0.000000e+00, %8 ], [ %152, %150 ]
%18 = phi double [ 0.000000e+00, %8 ], [ %151, %150 ]
%19 = trunc i64 %15 to i32
%20 = add i32 %19, %3
%21 = trunc i64 %15 to i32
%22 = add i32 %21, 1
%23 = call i32 @llvm.smax.i32(i32 %20, i32 %22)
%24 = trunc i64 %15 to i32
%25 = xor i32 %24, -1
%26 = add i32 %23, %25
%27 = zext i32 %26 to i64
%28 = add nuw nsw i64 %27, 1
%29 = trunc i64 %15 to i32
%30 = add nsw i32 %29, %3
br i1 %12, label %31, label %138
31: ; preds = %14
%32 = icmp ult i32 %26, 7
br i1 %32, label %99, label %33
33: ; preds = %31
%34 = and i64 %28, 8589934584
%35 = add nuw i64 %15, %34
br label %36
36: ; preds = %36, %33
%37 = phi i64 [ 0, %33 ], [ %89, %36 ]
%38 = phi <4 x i32> [ zeroinitializer, %33 ], [ %84, %36 ]
%39 = phi <4 x i32> [ zeroinitializer, %33 ], [ %88, %36 ]
%40 = phi <4 x i32> [ zeroinitializer, %33 ], [ %77, %36 ]
%41 = phi <4 x i32> [ zeroinitializer, %33 ], [ %80, %36 ]
%42 = phi <4 x i32> [ zeroinitializer, %33 ], [ %72, %36 ]
%43 = phi <4 x i32> [ zeroinitializer, %33 ], [ %74, %36 ]
%44 = add i64 %15, %37
%45 = getelementptr inbounds i8, i8* %0, i64 %44
%46 = bitcast i8* %45 to <4 x i8>*
%47 = load <4 x i8>, <4 x i8>* %46
%48 = getelementptr inbounds i8, i8* %45, i64 4
%49 = bitcast i8* %48 to <4 x i8>*
%50 = load <4 x i8>, <4 x i8>* %49
%51 = icmp eq <4 x i8> %47, <i8 46, i8 46, i8 46, i8 46>
%52 = icmp eq <4 x i8> %50, <i8 46, i8 46, i8 46, i8 46>
%53 = getelementptr inbounds i8, i8* %1, i64 %44
%54 = bitcast i8* %53 to <4 x i8>*
%55 = load <4 x i8>, <4 x i8>* %54
%56 = getelementptr inbounds i8, i8* %53, i64 4
%57 = bitcast i8* %56 to <4 x i8>*
%58 = load <4 x i8>, <4 x i8>* %57
%59 = icmp ne <4 x i8> %55, <i8 46, i8 46, i8 46, i8 46>
%60 = icmp ne <4 x i8> %58, <i8 46, i8 46, i8 46, i8 46>
%61 = icmp eq <4 x i8> %47, %55
%62 = icmp eq <4 x i8> %50, %58
%63 = xor <4 x i1> %51, <i1 true, i1 true, i1 true, i1 true>
%64 = xor <4 x i1> %52, <i1 true, i1 true, i1 true, i1 true>
%65 = select <4 x i1> %51, <4 x i8> %55, <4 x i8> <i8 46, i8 46, i8 46, i8 46>
%66 = select <4 x i1> %52, <4 x i8> %58, <4 x i8> <i8 46, i8 46, i8 46, i8 46>
%67 = icmp eq <4 x i8> %47, %65
%68 = icmp eq <4 x i8> %50, %66
%69 = select <4 x i1> %63, <4 x i1> %59, <4 x i1> zeroinitializer
%70 = select <4 x i1> %64, <4 x i1> %60, <4 x i1> zeroinitializer
%71 = zext <4 x i1> %69 to <4 x i32>
%72 = add <4 x i32> %42, %71
%73 = zext <4 x i1> %70 to <4 x i32>
%74 = add <4 x i32> %43, %73
%75 = select <4 x i1> %69, <4 x i1> %61, <4 x i1> zeroinitializer
%76 = zext <4 x i1> %75 to <4 x i32>
%77 = add <4 x i32> %40, %76
%78 = select <4 x i1> %70, <4 x i1> %62, <4 x i1> zeroinitializer
%79 = zext <4 x i1> %78 to <4 x i32>
%80 = add <4 x i32> %41, %79
%81 = xor <4 x i1> %69, <i1 true, i1 true, i1 true, i1 true>
%82 = select <4 x i1> %81, <4 x i1> %67, <4 x i1> zeroinitializer
%83 = zext <4 x i1> %82 to <4 x i32>
%84 = add <4 x i32> %38, %83
%85 = xor <4 x i1> %70, <i1 true, i1 true, i1 true, i1 true>
%86 = select <4 x i1> %85, <4 x i1> %68, <4 x i1> zeroinitializer
%87 = zext <4 x i1> %86 to <4 x i32>
%88 = add <4 x i32> %39, %87
%89 = add nuw i64 %37, 8
%90 = icmp eq i64 %89, %34
br i1 %90, label %91, label %36
91: ; preds = %36
%92 = add <4 x i32> %74, %72
%93 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %92)
%94 = add <4 x i32> %80, %77
%95 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %94)
%96 = add <4 x i32> %88, %84
%97 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %96)
%98 = icmp eq i64 %28, %34
br i1 %98, label %133, label %99
99: ; preds = %31, %91
%100 = phi i64 [ %15, %31 ], [ %35, %91 ]
%101 = phi i32 [ 0, %31 ], [ %97, %91 ]
%102 = phi i32 [ 0, %31 ], [ %95, %91 ]
%103 = phi i32 [ 0, %31 ], [ %93, %91 ]
br label %104
104: ; preds = %99, %126
%105 = phi i64 [ %130, %126 ], [ %100, %99 ]
%106 = phi i32 [ %129, %126 ], [ %101, %99 ]
%107 = phi i32 [ %128, %126 ], [ %102, %99 ]
%108 = phi i32 [ %127, %126 ], [ %103, %99 ]
%109 = getelementptr inbounds i8, i8* %0, i64 %105
%110 = load i8, i8* %109
%111 = icmp eq i8 %110, 46
%112 = getelementptr inbounds i8, i8* %1, i64 %105
%113 = load i8, i8* %112
br i1 %111, label %116, label %114
114: ; preds = %104
%115 = icmp eq i8 %113, 46
br i1 %115, label %116, label %121
116: ; preds = %104, %114
%117 = phi i8 [ 46, %114 ], [ %113, %104 ]
%118 = icmp eq i8 %110, %117
%119 = zext i1 %118 to i32
%120 = add nsw i32 %106, %119
br label %126
121: ; preds = %114
%122 = add nsw i32 %108, 1
%123 = icmp eq i8 %110, %113
%124 = zext i1 %123 to i32
%125 = add nsw i32 %107, %124
br label %126
126: ; preds = %121, %116
%127 = phi i32 [ %108, %116 ], [ %122, %121 ]
%128 = phi i32 [ %107, %116 ], [ %125, %121 ]
%129 = phi i32 [ %120, %116 ], [ %106, %121 ]
%130 = add nuw nsw i64 %105, 1
%131 = trunc i64 %130 to i32
%132 = icmp sgt i32 %30, %131
br i1 %132, label %104, label %133
133: ; preds = %126, %91
%134 = phi i32 [ %93, %91 ], [ %127, %126 ]
%135 = phi i32 [ %95, %91 ], [ %128, %126 ]
%136 = phi i32 [ %97, %91 ], [ %129, %126 ]
%137 = icmp eq i32 %136, %3
br i1 %137, label %150, label %139
138: ; preds = %14
br i1 %13, label %150, label %145
139: ; preds = %133
%140 = icmp eq i32 %134, 0
br i1 %140, label %145, label %141
141: ; preds = %139
%142 = sitofp i32 %135 to double
%143 = sitofp i32 %134 to double
%144 = fdiv double %142, %143
br label %145
145: ; preds = %138, %139, %141
%146 = phi double [ %144, %141 ], [ 0.000000e+00, %139 ], [ 0.000000e+00, %138 ]
%147 = fadd double %18, %146
%148 = tail call double @llvm.fmuladd.f64(double %146, double %146, double %17)
%149 = add nsw i32 %16, 1
br label %150
150: ; preds = %138, %133, %145
%151 = phi double [ %18, %133 ], [ %147, %145 ], [ %18, %138 ]
%152 = phi double [ %17, %133 ], [ %148, %145 ], [ %17, %138 ]
%153 = phi i32 [ %16, %133 ], [ %149, %145 ], [ %16, %138 ]
%154 = add nuw nsw i64 %15, 1
%155 = icmp eq i64 %154, %11
br i1 %155, label %156, label %14
156: ; preds = %150
%157 = icmp eq i32 %153, 0
br i1 %157, label %167, label %158
158: ; preds = %156
%159 = sitofp i32 %153 to double
%160 = fdiv double %151, %159
%161 = fdiv double %152, %159
%162 = fneg double %160
%163 = tail call double @llvm.fmuladd.f64(double %162, double %160, double %161)
%164 = fcmp ogt double %163, 0.000000e+00
br i1 %164, label %165, label %167
165: ; preds = %158
%166 = tail call double @sqrt(double %163)
br label %167
167: ; preds = %6, %156, %165, %158
%168 = phi double [ %160, %158 ], [ %160, %165 ], [ %151, %156 ], [ 0.000000e+00, %6 ]
%169 = phi double [ 0.000000e+00, %158 ], [ %166, %165 ], [ 0.000000e+00, %156 ], [ 0.000000e+00, %6 ]
store double %168, double* %4
store double %169, double* %5
ret i32 0
}