void SENNA_nn_distance(int *dest, int idx, int max_idx, int sentence_size,
                       int padding_size) {
  int i;
  max_idx = (max_idx - 1) / 2;
  for (i = 0; i < padding_size; i++)
    dest[i] =
        ((((i - padding_size - idx) < (max_idx) ? (i - padding_size - idx)
                                                : (max_idx))) > (-max_idx)
             ? (((i - padding_size - idx) < (max_idx) ? (i - padding_size - idx)
                                                      : (max_idx)))
             : (-max_idx)) +
        max_idx;
  for (i = 0; i < sentence_size; i++)
    dest[i + padding_size] =
        ((((i - idx) < (max_idx) ? (i - idx) : (max_idx))) > (-max_idx)
             ? (((i - idx) < (max_idx) ? (i - idx) : (max_idx)))
             : (-max_idx)) +
        max_idx;
  for (i = 0; i < padding_size; i++)
    dest[i + padding_size + sentence_size] =
        ((((i + sentence_size - idx) < (max_idx) ? (i + sentence_size - idx)
                                                 : (max_idx))) > (-max_idx)
             ? (((i + sentence_size - idx) < (max_idx)
                     ? (i + sentence_size - idx)
                     : (max_idx)))
             : (-max_idx)) +
        max_idx;
}


x86 assembly (clang, -O0):
<SENNA_nn_distance>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11cd <SENNA_nn_distance+0xcd>
mov    -0x1c(%rbp),%eax
sub    -0x18(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    115c <SENNA_nn_distance+0x5c>
mov    -0x1c(%rbp),%eax
sub    -0x18(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    1162 <SENNA_nn_distance+0x62>
mov    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
xor    %ecx,%ecx
sub    -0x10(%rbp),%ecx
cmp    %ecx,%eax
jle    11a6 <SENNA_nn_distance+0xa6>
mov    -0x1c(%rbp),%eax
sub    -0x18(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1195 <SENNA_nn_distance+0x95>
mov    -0x1c(%rbp),%eax
sub    -0x18(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    119b <SENNA_nn_distance+0x9b>
mov    -0x10(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    11ae <SENNA_nn_distance+0xae>
xor    %eax,%eax
sub    -0x10(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%edx
add    -0x10(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    112d <SENNA_nn_distance+0x2d>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    126d <SENNA_nn_distance+0x16d>
mov    -0x1c(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11fd <SENNA_nn_distance+0xfd>
mov    -0x1c(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1203 <SENNA_nn_distance+0x103>
mov    -0x10(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
xor    %ecx,%ecx
sub    -0x10(%rbp),%ecx
cmp    %ecx,%eax
jle    1241 <SENNA_nn_distance+0x141>
mov    -0x1c(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1230 <SENNA_nn_distance+0x130>
mov    -0x1c(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1236 <SENNA_nn_distance+0x136>
mov    -0x10(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1249 <SENNA_nn_distance+0x149>
xor    %eax,%eax
sub    -0x10(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%edx
add    -0x10(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11d4 <SENNA_nn_distance+0xd4>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    131c <SENNA_nn_distance+0x21c>
mov    -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    12a3 <SENNA_nn_distance+0x1a3>
mov    -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    12a9 <SENNA_nn_distance+0x1a9>
mov    -0x10(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
xor    %ecx,%ecx
sub    -0x10(%rbp),%ecx
cmp    %ecx,%eax
jle    12ed <SENNA_nn_distance+0x1ed>
mov    -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    12dc <SENNA_nn_distance+0x1dc>
mov    -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    12e2 <SENNA_nn_distance+0x1e2>
mov    -0x10(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x40(%rbp)
jmp    12f5 <SENNA_nn_distance+0x1f5>
xor    %eax,%eax
sub    -0x10(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%edx
add    -0x10(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x18(%rbp),%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1274 <SENNA_nn_distance+0x174>
pop    %rbp
ret

x86 assembly (clang, -O2):
<SENNA_nn_distance>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %edx,%eax
add    $0xffffffff,%eax
shr    $0x1f,%eax
lea    (%rdx,%rax,1),%r13d
add    $0xffffffff,%r13d
sar    %r13d
mov    %r8d,%r9d
test   %r8d,%r8d
jle    123f <SENNA_nn_distance+0x13f>
lea    (%r8,%rsi,1),%r10d
mov    %r13d,%eax
neg    %eax
cmp    $0x8,%r8d
jae    113f <SENNA_nn_distance+0x3f>
xor    %ebp,%ebp
jmp    121a <SENNA_nn_distance+0x11a>
mov    %r9d,%ebp
and    $0xfffffff8,%ebp
movd   %r10d,%xmm0
pshufd $0x0,%xmm0,%xmm0
movd   %r13d,%xmm1
pshufd $0x0,%xmm1,%xmm4
movd   %eax,%xmm2
pshufd $0x0,%xmm2,%xmm2
lea    0x0(,%r9,4),%rbx
and    $0xffffffffffffffe0,%rbx
movdqa 0xe8a(%rip),%xmm3
xor    %edx,%edx
movdqa 0xe8f(%rip),%xmm8
movdqa 0xe97(%rip),%xmm5
nopl   0x0(%rax)
movdqa %xmm3,%xmm6
psubd  %xmm0,%xmm6
movdqa %xmm6,%xmm7
paddd  %xmm8,%xmm7
movdqa %xmm4,%xmm1
pcmpgtd %xmm6,%xmm1
pand   %xmm1,%xmm6
pandn  %xmm4,%xmm1
por    %xmm6,%xmm1
movdqa %xmm4,%xmm6
pcmpgtd %xmm7,%xmm6
pand   %xmm6,%xmm7
pandn  %xmm4,%xmm6
por    %xmm7,%xmm6
movdqa %xmm1,%xmm7
pcmpgtd %xmm2,%xmm7
pand   %xmm7,%xmm1
pandn  %xmm2,%xmm7
por    %xmm1,%xmm7
movdqa %xmm6,%xmm1
pcmpgtd %xmm2,%xmm1
pand   %xmm1,%xmm6
pandn  %xmm2,%xmm1
por    %xmm6,%xmm1
paddd  %xmm4,%xmm7
paddd  %xmm4,%xmm1
movdqu %xmm7,(%rdi,%rdx,1)
movdqu %xmm1,0x10(%rdi,%rdx,1)
paddd  %xmm5,%xmm3
add    $0x20,%rdx
cmp    %rdx,%rbx
jne    1190 <SENNA_nn_distance+0x90>
cmp    %r9,%rbp
je     123f <SENNA_nn_distance+0x13f>
neg    %r10d
nopl   (%rax)
lea    (%r10,%rbp,1),%edx
cmp    %r13d,%edx
cmovge %r13d,%edx
cmp    %eax,%edx
cmovle %eax,%edx
add    %r13d,%edx
mov    %edx,(%rdi,%rbp,4)
add    $0x1,%rbp
cmp    %rbp,%r9
jne    1220 <SENNA_nn_distance+0x120>
test   %ecx,%ecx
jle    1515 <SENNA_nn_distance+0x415>
mov    %r13d,%r12d
neg    %r12d
movslq %esi,%r10
movslq %r13d,%r11
movslq %r8d,%rax
mov    %ecx,%r14d
cmp    $0x4,%ecx
jae    1265 <SENNA_nn_distance+0x165>
xor    %ebx,%ebx
jmp    14db <SENNA_nn_distance+0x3db>
mov    %r14d,%ebx
and    $0xfffffffc,%ebx
movq   %r10,%xmm0
pshufd $0x44,%xmm0,%xmm11
movq   %r11,%xmm0
pshufd $0x44,%xmm0,%xmm2
movd   %r13d,%xmm0
pshufd $0x0,%xmm0,%xmm13
movd   %r12d,%xmm1
pshufd $0x0,%xmm1,%xmm14
lea    -0x4(%rbx),%rbp
mov    %rbp,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
test   %rbp,%rbp
mov    %rax,-0x20(%rsp)
mov    %rsi,-0x28(%rsp)
movdqa %xmm2,-0x18(%rsp)
mov    %rdx,-0x30(%rsp)
je     1425 <SENNA_nn_distance+0x325>
mov    %rdx,%rbp
and    $0xfffffffffffffffe,%rbp
lea    (%rdi,%rax,4),%r15
add    $0x10,%r15
movdqa 0xd56(%rip),%xmm1
movdqa 0xd5d(%rip),%xmm15
xor    %edx,%edx
movdqa 0xd62(%rip),%xmm12
movdqa %xmm2,%xmm0
pxor   %xmm12,%xmm0
movdqa 0xd60(%rip),%xmm9
movdqa 0xd67(%rip),%xmm10
nopl   0x0(%rax)
movdqa %xmm1,%xmm5
psubq  %xmm11,%xmm5
movdqa %xmm15,%xmm2
psubq  %xmm11,%xmm2
movdqa %xmm2,%xmm3
pxor   %xmm12,%xmm3
movdqa %xmm0,%xmm7
pcmpgtd %xmm3,%xmm7
movdqa %xmm5,%xmm4
pxor   %xmm12,%xmm4
movdqa %xmm0,%xmm6
pcmpgtd %xmm4,%xmm6
movdqa %xmm7,%xmm8
shufps $0x88,%xmm6,%xmm8
pcmpeqd %xmm0,%xmm3
pcmpeqd %xmm0,%xmm4
shufps $0xdd,%xmm4,%xmm3
andps  %xmm8,%xmm3
shufps $0xdd,%xmm6,%xmm7
orps   %xmm3,%xmm7
movdqa %xmm2,%xmm3
shufps $0x88,%xmm5,%xmm3
andps  %xmm7,%xmm3
andnps %xmm13,%xmm7
orps   %xmm3,%xmm7
movaps %xmm7,%xmm3
pcmpgtd %xmm14,%xmm3
andps  %xmm3,%xmm7
pandn  %xmm14,%xmm3
por    %xmm7,%xmm3
paddd  %xmm13,%xmm3
movdqu %xmm3,-0x10(%r15,%rdx,4)
paddq  %xmm9,%xmm5
paddq  %xmm9,%xmm2
movdqa %xmm2,%xmm3
pxor   %xmm12,%xmm3
movdqa %xmm0,%xmm7
pcmpgtd %xmm3,%xmm7
shufps $0x88,%xmm5,%xmm2
pxor   %xmm12,%xmm5
movdqa %xmm0,%xmm4
pcmpgtd %xmm5,%xmm4
movdqa %xmm7,%xmm6
shufps $0x88,%xmm4,%xmm6
pcmpeqd %xmm0,%xmm3
pcmpeqd %xmm0,%xmm5
shufps $0xdd,%xmm5,%xmm3
andps  %xmm6,%xmm3
shufps $0xdd,%xmm4,%xmm7
orps   %xmm3,%xmm7
andps  %xmm7,%xmm2
andnps %xmm13,%xmm7
orps   %xmm2,%xmm7
movaps %xmm7,%xmm2
pcmpgtd %xmm14,%xmm2
andps  %xmm2,%xmm7
pandn  %xmm14,%xmm2
por    %xmm7,%xmm2
paddd  %xmm13,%xmm2
movdqu %xmm2,(%r15,%rdx,4)
add    $0x8,%rdx
paddq  %xmm10,%xmm15
paddq  %xmm10,%xmm1
add    $0xfffffffffffffffe,%rbp
jne    1310 <SENNA_nn_distance+0x210>
jmp    1438 <SENNA_nn_distance+0x338>
movdqa 0xc03(%rip),%xmm1
movdqa 0xc0a(%rip),%xmm15
xor    %edx,%edx
testb  $0x1,-0x30(%rsp)
mov    -0x28(%rsp),%rsi
mov    -0x20(%rsp),%rax
je     14d6 <SENNA_nn_distance+0x3d6>
psubq  %xmm11,%xmm1
psubq  %xmm11,%xmm15
movdqa 0xbf1(%rip),%xmm0
movdqa -0x18(%rsp),%xmm6
pxor   %xmm0,%xmm6
movdqa %xmm15,%xmm2
pxor   %xmm0,%xmm2
movdqa %xmm6,%xmm3
pcmpgtd %xmm2,%xmm3
pxor   %xmm1,%xmm0
movdqa %xmm6,%xmm4
pcmpgtd %xmm0,%xmm4
movdqa %xmm3,%xmm5
shufps $0x88,%xmm4,%xmm5
pcmpeqd %xmm6,%xmm2
pcmpeqd %xmm6,%xmm0
shufps $0xdd,%xmm0,%xmm2
andps  %xmm5,%xmm2
shufps $0xdd,%xmm4,%xmm3
orps   %xmm2,%xmm3
shufps $0x88,%xmm1,%xmm15
andps  %xmm3,%xmm15
andnps %xmm13,%xmm3
orps   %xmm15,%xmm3
movaps %xmm3,%xmm0
pcmpgtd %xmm14,%xmm0
andps  %xmm0,%xmm3
pandn  %xmm14,%xmm0
por    %xmm3,%xmm0
paddd  %xmm13,%xmm0
add    %rax,%rdx
movdqu %xmm0,(%rdi,%rdx,4)
cmp    %r14,%rbx
je     1515 <SENNA_nn_distance+0x415>
lea    (%rdi,%rax,4),%r15
mov    %r10d,%edx
neg    %edx
neg    %r10
nopw   0x0(%rax,%rax,1)
lea    (%r10,%rbx,1),%rbp
lea    (%rdx,%rbx,1),%eax
cmp    %r11,%rbp
cmovge %r13d,%eax
cmp    %r12d,%eax
cmovle %r12d,%eax
add    %r13d,%eax
mov    %eax,(%r15,%rbx,4)
add    $0x1,%rbx
cmp    %rbx,%r14
jne    14f0 <SENNA_nn_distance+0x3f0>
test   %r8d,%r8d
jle    16c9 <SENNA_nn_distance+0x5c9>
mov    %r13d,%edx
neg    %edx
cmp    $0x8,%r8d
jae    15b8 <SENNA_nn_distance+0x4b8>
xor    %ebx,%ebx
mov    %rbx,%r11
not    %r11
test   $0x1,%r9b
je     1560 <SENNA_nn_distance+0x460>
lea    (%rbx,%rcx,1),%r10d
mov    %r10d,%ebp
sub    %esi,%ebp
cmp    %r13d,%ebp
cmovge %r13d,%ebp
cmp    %edx,%ebp
cmovle %edx,%ebp
add    %r13d,%ebp
add    %r8d,%r10d
movslq %r10d,%rax
mov    %ebp,(%rdi,%rax,4)
or     $0x1,%rbx
add    %r9,%r11
je     16c9 <SENNA_nn_distance+0x5c9>
add    %ecx,%r8d
sub    %esi,%ecx
xchg   %ax,%ax
lea    (%rcx,%rbx,1),%eax
cmp    %r13d,%eax
cmovge %r13d,%eax
cmp    %edx,%eax
cmovle %edx,%eax
add    %r13d,%eax
lea    (%r8,%rbx,1),%rsi
movslq %esi,%rsi
mov    %eax,(%rdi,%rsi,4)
lea    (%rcx,%rbx,1),%eax
add    $0x1,%eax
cmp    %r13d,%eax
cmovge %r13d,%eax
cmp    %edx,%eax
cmovle %edx,%eax
add    %r13d,%eax
add    $0x1,%esi
movslq %esi,%rsi
mov    %eax,(%rdi,%rsi,4)
add    $0x2,%rbx
cmp    %rbx,%r9
jne    1570 <SENNA_nn_distance+0x470>
jmp    16c9 <SENNA_nn_distance+0x5c9>
lea    -0x1(%r9),%rbp
lea    (%r8,%rcx,1),%eax
lea    (%rax,%rbp,1),%r10d
xor    %ebx,%ebx
cmp    %eax,%r10d
jl     152f <SENNA_nn_distance+0x42f>
shr    $0x20,%rbp
jne    152f <SENNA_nn_distance+0x42f>
mov    %r9d,%ebx
and    $0xfffffff8,%ebx
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm9
movd   %esi,%xmm1
pshufd $0x0,%xmm1,%xmm1
movd   %r13d,%xmm2
pshufd $0x0,%xmm2,%xmm0
movd   %edx,%xmm3
pshufd $0x0,%xmm3,%xmm3
lea    0x4(%rcx),%ebp
movd   %ebp,%xmm4
pshufd $0x0,%xmm4,%xmm6
movdqa 0x9e7(%rip),%xmm5
movdqa 0x9fe(%rip),%xmm8
mov    %rbx,%rbp
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm5,%xmm7
paddd  %xmm9,%xmm7
movdqa %xmm6,%xmm4
paddd  %xmm5,%xmm4
psubd  %xmm1,%xmm7
psubd  %xmm1,%xmm4
movdqa %xmm0,%xmm2
pcmpgtd %xmm7,%xmm2
pand   %xmm2,%xmm7
pandn  %xmm0,%xmm2
por    %xmm7,%xmm2
movdqa %xmm0,%xmm7
pcmpgtd %xmm4,%xmm7
pand   %xmm7,%xmm4
pandn  %xmm0,%xmm7
por    %xmm4,%xmm7
movdqa %xmm2,%xmm4
pcmpgtd %xmm3,%xmm4
pand   %xmm4,%xmm2
pandn  %xmm3,%xmm4
por    %xmm2,%xmm4
movdqa %xmm7,%xmm2
pcmpgtd %xmm3,%xmm2
pand   %xmm2,%xmm7
pandn  %xmm3,%xmm2
por    %xmm7,%xmm2
paddd  %xmm0,%xmm4
paddd  %xmm0,%xmm2
cltq
movdqu %xmm4,(%rdi,%rax,4)
movdqu %xmm2,0x10(%rdi,%rax,4)
paddd  %xmm8,%xmm5
add    $0x8,%eax
add    $0xfffffffffffffff8,%rbp
jne    1630 <SENNA_nn_distance+0x530>
cmp    %r9,%rbx
jne    152f <SENNA_nn_distance+0x42f>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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