#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 */
scalar_t__ ceil(float);
void kde(float *density, int nRow, int nCol, float cellSize, float xMin,
         float yMax, float *xCor, float *yCor, int *pCount, int nHH,
         float bandwidth) {
  int searchWindow = (int)(ceil(bandwidth / cellSize));
  int wXMin, wYMin, wXMax, wYMax;
  float cellX, cellY;
  float dist2;
  float bandwidth2 = bandwidth * bandwidth;
  int rowID, colID;
  for (int i = 0; i < nRow * nCol; i++) {
    density[i] = 0.0f;
  }
  if (bandwidth < 1) {
    for (int k = 0; k < nHH; k++) {
      rowID = (int)((yMax - yCor[k]) / cellSize);
      colID = (int)((xCor[k] - xMin) / cellSize);
      if (colID >= 0 && colID < nCol && rowID >= 0 && rowID < nRow) {
        density[rowID * nCol + colID] += pCount[k];
      }
    }
  } else {
    for (int k = 0; k < nHH; k++) {
      rowID = (int)((yMax - yCor[k]) / cellSize);
      colID = (int)((xCor[k] - xMin) / cellSize);
      wXMin = colID - searchWindow;
      wXMax = colID + searchWindow + 1;
      wYMin = rowID - searchWindow;
      wYMax = rowID + searchWindow + 1;
      if (wXMin < 0) {
        wXMin = 0;
      }
      if (wXMax > nCol) {
        wXMax = nCol;
      }
      if (wYMin < 0) {
        wYMin = 0;
      }
      if (wYMax > nRow) {
        wYMax = nRow;
      }
      for (int m = wYMin; m < wYMax; m++) {
        for (int n = wXMin; n < wXMax; n++) {
          cellX = xMin + cellSize * (n + 0.5);
          cellY = yMax - cellSize * (m + 0.5);
          dist2 = (cellX - xCor[k]) * (cellX - xCor[k]) +
                  (cellY - yCor[k]) * (cellY - yCor[k]);
          if (dist2 < bandwidth2) {
            density[m * nCol + n] +=
                pCount[k] + (1 - dist2 / bandwidth2) * (1 - dist2 / bandwidth2);
          }
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<kde>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
movss  %xmm2,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
movss  %xmm3,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
call   1030 <ceil@plt>
mov    %eax,-0x40(%rbp)
movss  -0x3c(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x60(%rbp)
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
mov    -0xc(%rbp),%ecx
imul   -0x10(%rbp),%ecx
cmp    %ecx,%eax
jge    11a0 <kde+0x90>
mov    -0x8(%rbp),%rax
movslq -0x6c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1170 <kde+0x60>
movss  0xe58(%rip),%xmm0
ucomiss -0x3c(%rbp),%xmm0
jbe    126d <kde+0x15d>
movl   $0x0,-0x70(%rbp)
mov    -0x70(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    1268 <kde+0x158>
movss  -0x1c(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x70(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
divss  -0x14(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x64(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x70(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x18(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x68(%rbp)
cmpl   $0x0,-0x68(%rbp)
jl     1255 <kde+0x145>
mov    -0x68(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1255 <kde+0x145>
cmpl   $0x0,-0x64(%rbp)
jl     1255 <kde+0x145>
mov    -0x64(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1255 <kde+0x145>
mov    -0x38(%rbp),%rax
movslq -0x70(%rbp),%rcx
cvtsi2ssl (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x64(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x68(%rbp),%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    125a <kde+0x14a>
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
jmp    11b9 <kde+0xa9>
jmp    14d5 <kde+0x3c5>
movl   $0x0,-0x74(%rbp)
mov    -0x74(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    14d0 <kde+0x3c0>
movss  -0x1c(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
divss  -0x14(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x64(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x18(%rbp),%xmm0
divss  -0x14(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x68(%rbp)
mov    -0x68(%rbp),%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x68(%rbp),%eax
add    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x64(%rbp),%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x64(%rbp),%eax
add    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x44(%rbp)
jge    12f7 <kde+0x1e7>
movl   $0x0,-0x44(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jle    1309 <kde+0x1f9>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x48(%rbp)
jge    131a <kde+0x20a>
movl   $0x0,-0x48(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0xc(%rbp),%eax
jle    132c <kde+0x21c>
mov    -0xc(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x78(%rbp)
mov    -0x78(%rbp),%eax
cmp    -0x50(%rbp),%eax
jge    14bd <kde+0x3ad>
mov    -0x44(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jge    14aa <kde+0x39a>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
cvtsi2sdl -0x7c(%rbp),%xmm2
movsd  0xc99(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
cvtsi2sdl -0x78(%rbp),%xmm2
movsd  0xc65(%rip),%xmm3
addsd  %xmm3,%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x54(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
movss  -0x54(%rbp),%xmm2
mov    -0x28(%rbp),%rax
movslq -0x74(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm2
movss  -0x58(%rbp),%xmm1
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm1
movss  -0x58(%rbp),%xmm3
mov    -0x30(%rbp),%rax
movslq -0x74(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm3
mulss  %xmm3,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x5c(%rbp)
movss  -0x5c(%rbp),%xmm1
movss  -0x60(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    1497 <kde+0x387>
mov    -0x38(%rbp),%rax
movslq -0x74(%rbp),%rcx
cvtsi2ssl (%rax,%rcx,4),%xmm1
movss  -0x5c(%rbp),%xmm2
divss  -0x60(%rbp),%xmm2
movss  0xba6(%rip),%xmm0
subss  %xmm2,%xmm0
movss  -0x5c(%rbp),%xmm3
divss  -0x60(%rbp),%xmm3
movss  0xb90(%rip),%xmm2
subss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x78(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x7c(%rbp),%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    149c <kde+0x38c>
mov    -0x7c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7c(%rbp)
jmp    1344 <kde+0x234>
jmp    14af <kde+0x39f>
mov    -0x78(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x78(%rbp)
jmp    1332 <kde+0x222>
jmp    14c2 <kde+0x3b2>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1274 <kde+0x164>
jmp    14d5 <kde+0x3c5>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kde>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %r9,%r14
mov    %r8,%r15
mov    %rcx,%rbx
movdqa %xmm2,0x50(%rsp)
movaps %xmm1,0x20(%rsp)
movaps %xmm0,%xmm1
mov    %edx,%ebp
mov    %esi,%r12d
mov    %rdi,%r13
movss  %xmm3,0x10(%rsp)
movaps %xmm3,%xmm0
movaps %xmm1,0x40(%rsp)
divss  %xmm1,%xmm0
call   1030 <ceil@plt>
mov    %rax,0x18(%rsp)
mov    %ebp,0x8(%rsp)
mov    %r12d,0xc(%rsp)
imul   %r12d,%ebp
test   %ebp,%ebp
jle    118a <kde+0x6a>
mov    %ebp,%edx
shl    $0x2,%rdx
mov    %r13,%rdi
xor    %esi,%esi
call   1040 <memset@plt>
mov    0xa0(%rsp),%eax
movss  0xe66(%rip),%xmm15
movss  0x10(%rsp),%xmm4
ucomiss %xmm4,%xmm15
jbe    126b <kde+0x14b>
test   %eax,%eax
movaps 0x50(%rsp),%xmm4
movaps 0x20(%rsp),%xmm5
movaps 0x40(%rsp),%xmm6
jle    146e <kde+0x34e>
mov    %eax,%eax
shufps $0x0,%xmm5,%xmm5
shufps $0x0,%xmm6,%xmm6
movd   0x8(%rsp),%xmm1
movd   0xc(%rsp),%xmm0
punpckldq %xmm1,%xmm0
xor    %ecx,%ecx
jmp    11ed <kde+0xcd>
nop
add    $0x1,%rcx
cmp    %rcx,%rax
je     146e <kde+0x34e>
movss  (%rbx,%rcx,4),%xmm1
movlhps %xmm4,%xmm1
shufps $0xe2,%xmm4,%xmm1
movss  (%r15,%rcx,4),%xmm2
movaps %xmm5,%xmm3
movss  %xmm2,%xmm3
subps  %xmm3,%xmm1
divps  %xmm6,%xmm1
cvttps2dq %xmm1,%xmm1
pshufd $0x55,%xmm1,%xmm2
movd   %xmm2,%edx
test   %edx,%edx
js     11e0 <kde+0xc0>
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pshufd $0x50,%xmm2,%xmm2
movmskpd %xmm2,%edi
test   $0x2,%dil
je     11e0 <kde+0xc0>
movd   %xmm1,%esi
test   %esi,%esi
js     11e0 <kde+0xc0>
test   $0x1,%dil
je     11e0 <kde+0xc0>
xorps  %xmm1,%xmm1
cvtsi2ssl (%r14,%rcx,4),%xmm1
imul   0x8(%rsp),%esi
add    %edx,%esi
movslq %esi,%rdx
mov    %r13,%rsi
addss  0x0(%r13,%rdx,4),%xmm1
movss  %xmm1,0x0(%r13,%rdx,4)
jmp    11e0 <kde+0xc0>
mov    %r13,0x38(%rsp)
test   %eax,%eax
movaps 0x50(%rsp),%xmm12
movaps 0x20(%rsp),%xmm13
movaps 0x40(%rsp),%xmm14
jle    146e <kde+0x34e>
mulss  %xmm4,%xmm4
xorps  %xmm1,%xmm1
cvtss2sd %xmm13,%xmm1
xorps  %xmm2,%xmm2
cvtss2sd %xmm14,%xmm2
cvtss2sd %xmm12,%xmm10
movaps 0xd65(%rip),%xmm11
xorps  %xmm2,%xmm11
movslq 0x8(%rsp),%rcx
mov    %eax,%eax
mov    %rax,0x10(%rsp)
shufps $0x0,%xmm13,%xmm13
shufps $0x0,%xmm14,%xmm14
movd   0x18(%rsp),%xmm5
pshufd $0x50,%xmm5,%xmm9
mov    %rcx,0x20(%rsp)
lea    0x0(,%rcx,4),%r13
pxor   %xmm8,%xmm8
movsd  0xd35(%rip),%xmm7
xor    %edi,%edi
jmp    12ff <kde+0x1df>
nop
add    $0x1,%rdi
cmp    0x10(%rsp),%rdi
je     146e <kde+0x34e>
movss  (%rbx,%rdi,4),%xmm5
movlhps %xmm12,%xmm5
shufps $0xe2,%xmm12,%xmm5
movss  (%r15,%rdi,4),%xmm6
movaps %xmm13,%xmm3
movss  %xmm6,%xmm3
subps  %xmm3,%xmm5
divps  %xmm14,%xmm5
cvttps2dq %xmm5,%xmm3
pshufd $0x55,%xmm3,%xmm5
movd   %xmm5,%ecx
mov    0x18(%rsp),%rax
lea    (%rcx,%rax,1),%r12d
add    $0x1,%r12d
mov    %ecx,%ebp
add    %eax,%ebp
movd   %xmm3,%esi
psubd  %xmm9,%xmm3
mov    %esi,%r8d
add    %eax,%r8d
pshufd $0x50,%xmm3,%xmm5
pcmpgtd %xmm8,%xmm5
movmskpd %xmm5,%r9d
pshufd $0x55,%xmm3,%xmm5
movd   %xmm5,%ecx
test   $0x2,%r9b
mov    $0x0,%r10d
cmove  %r10d,%ecx
add    %eax,%esi
add    $0x1,%esi
mov    0x8(%rsp),%edx
cmp    %edx,%ebp
cmovge %edx,%r12d
movd   %xmm3,%ebp
test   $0x1,%r9b
cmove  %r10d,%ebp
mov    0xc(%rsp),%eax
cmp    %eax,%r8d
cmovge %eax,%esi
cmp    %esi,%ebp
jge    12f0 <kde+0x1d0>
mov    %ecx,%r10d
mov    %ebp,%ebp
mov    %esi,%esi
mov    %r12d,%r8d
mov    0x20(%rsp),%rdx
imul   %rbp,%rdx
mov    0x38(%rsp),%rax
lea    (%rax,%rdx,4),%r9
jmp    13d0 <kde+0x2b0>
add    $0x1,%rbp
add    %r13,%r9
cmp    %rsi,%rbp
je     12f0 <kde+0x1d0>
cmp    %r12d,%ecx
jge    13c0 <kde+0x2a0>
xorps  %xmm3,%xmm3
cvtsi2sd %ebp,%xmm3
addsd  %xmm7,%xmm3
mulsd  %xmm11,%xmm3
addsd  %xmm10,%xmm3
xorps  %xmm6,%xmm6
cvtsd2ss %xmm3,%xmm6
mov    %r10,%r11
jmp    1409 <kde+0x2e9>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r11
cmp    %r11,%r8
je     13c0 <kde+0x2a0>
xorps  %xmm3,%xmm3
cvtsi2sd %r11d,%xmm3
addsd  %xmm7,%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
xorps  %xmm5,%xmm5
cvtsd2ss %xmm3,%xmm5
subss  (%rbx,%rdi,4),%xmm5
movaps %xmm6,%xmm3
subss  (%r15,%rdi,4),%xmm3
mulss  %xmm3,%xmm3
mulss  %xmm5,%xmm5
addss  %xmm3,%xmm5
ucomiss %xmm5,%xmm4
jbe    1400 <kde+0x2e0>
xorps  %xmm3,%xmm3
cvtsi2ssl (%r14,%rdi,4),%xmm3
divss  %xmm4,%xmm5
movaps %xmm15,%xmm0
subss  %xmm5,%xmm0
mulss  %xmm0,%xmm0
addss  %xmm3,%xmm0
addss  (%r9,%r11,4),%xmm0
movss  %xmm0,(%r9,%r11,4)
jmp    1400 <kde+0x2e0>
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @kde(float* %0, i32 %1, i32 %2, float %3, float %4, float %5, float* %6, float* %7, i32* %8, i32 %9, float %10) {
%12 = alloca float*
%13 = alloca i32
%14 = alloca i32
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float*
%19 = alloca float*
%20 = alloca i32*
%21 = alloca i32
%22 = alloca float
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca float
%29 = alloca float
%30 = alloca float
%31 = alloca float
%32 = alloca i32
%33 = alloca i32
%34 = alloca i32
%35 = alloca i32
%36 = alloca i32
%37 = alloca i32
%38 = alloca i32
store float* %0, float** %12
store i32 %1, i32* %13
store i32 %2, i32* %14
store float %3, float* %15
store float %4, float* %16
store float %5, float* %17
store float* %6, float** %18
store float* %7, float** %19
store i32* %8, i32** %20
store i32 %9, i32* %21
store float %10, float* %22
%39 = load float, float* %22
%40 = load float, float* %15
%41 = fdiv float %39, %40
%42 = call i64 @ceil(float %41)
%43 = trunc i64 %42 to i32
store i32 %43, i32* %23
%44 = load float, float* %22
%45 = load float, float* %22
%46 = fmul float %44, %45
store float %46, float* %31
store i32 0, i32* %34
br label %47
47: ; preds = %58, %11
%48 = load i32, i32* %34
%49 = load i32, i32* %13
%50 = load i32, i32* %14
%51 = mul nsw i32 %49, %50
%52 = icmp slt i32 %48, %51
br i1 %52, label %53, label %61
53: ; preds = %47
%54 = load float*, float** %12
%55 = load i32, i32* %34
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds float, float* %54, i64 %56
store float 0.000000e+00, float* %57
br label %58
58: ; preds = %53
%59 = load i32, i32* %34
%60 = add nsw i32 %59, 1
store i32 %60, i32* %34
br label %47
61: ; preds = %47
%62 = load float, float* %22
%63 = fcmp olt float %62, 1.000000e+00
br i1 %63, label %64, label %125
64: ; preds = %61
store i32 0, i32* %35
br label %65
65: ; preds = %121, %64
%66 = load i32, i32* %35
%67 = load i32, i32* %21
%68 = icmp slt i32 %66, %67
br i1 %68, label %69, label %124
69: ; preds = %65
%70 = load float, float* %17
%71 = load float*, float** %19
%72 = load i32, i32* %35
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds float, float* %71, i64 %73
%75 = load float, float* %74
%76 = fsub float %70, %75
%77 = load float, float* %15
%78 = fdiv float %76, %77
%79 = fptosi float %78 to i32
store i32 %79, i32* %32
%80 = load float*, float** %18
%81 = load i32, i32* %35
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds float, float* %80, i64 %82
%84 = load float, float* %83
%85 = load float, float* %16
%86 = fsub float %84, %85
%87 = load float, float* %15
%88 = fdiv float %86, %87
%89 = fptosi float %88 to i32
store i32 %89, i32* %33
%90 = load i32, i32* %33
%91 = icmp sge i32 %90, 0
br i1 %91, label %92, label %120
92: ; preds = %69
%93 = load i32, i32* %33
%94 = load i32, i32* %14
%95 = icmp slt i32 %93, %94
br i1 %95, label %96, label %120
96: ; preds = %92
%97 = load i32, i32* %32
%98 = icmp sge i32 %97, 0
br i1 %98, label %99, label %120
99: ; preds = %96
%100 = load i32, i32* %32
%101 = load i32, i32* %13
%102 = icmp slt i32 %100, %101
br i1 %102, label %103, label %120
103: ; preds = %99
%104 = load i32*, i32** %20
%105 = load i32, i32* %35
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds i32, i32* %104, i64 %106
%108 = load i32, i32* %107
%109 = sitofp i32 %108 to float
%110 = load float*, float** %12
%111 = load i32, i32* %32
%112 = load i32, i32* %14
%113 = mul nsw i32 %111, %112
%114 = load i32, i32* %33
%115 = add nsw i32 %113, %114
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds float, float* %110, i64 %116
%118 = load float, float* %117
%119 = fadd float %118, %109
store float %119, float* %117
br label %120
120: ; preds = %103, %99, %96, %92, %69
br label %121
121: ; preds = %120
%122 = load i32, i32* %35
%123 = add nsw i32 %122, 1
store i32 %123, i32* %35
br label %65
124: ; preds = %65
br label %288
125: ; preds = %61
store i32 0, i32* %36
br label %126
126: ; preds = %284, %125
%127 = load i32, i32* %36
%128 = load i32, i32* %21
%129 = icmp slt i32 %127, %128
br i1 %129, label %130, label %287
130: ; preds = %126
%131 = load float, float* %17
%132 = load float*, float** %19
%133 = load i32, i32* %36
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds float, float* %132, i64 %134
%136 = load float, float* %135
%137 = fsub float %131, %136
%138 = load float, float* %15
%139 = fdiv float %137, %138
%140 = fptosi float %139 to i32
store i32 %140, i32* %32
%141 = load float*, float** %18
%142 = load i32, i32* %36
%143 = sext i32 %142 to i64
%144 = getelementptr inbounds float, float* %141, i64 %143
%145 = load float, float* %144
%146 = load float, float* %16
%147 = fsub float %145, %146
%148 = load float, float* %15
%149 = fdiv float %147, %148
%150 = fptosi float %149 to i32
store i32 %150, i32* %33
%151 = load i32, i32* %33
%152 = load i32, i32* %23
%153 = sub nsw i32 %151, %152
store i32 %153, i32* %24
%154 = load i32, i32* %33
%155 = load i32, i32* %23
%156 = add nsw i32 %154, %155
%157 = add nsw i32 %156, 1
store i32 %157, i32* %26
%158 = load i32, i32* %32
%159 = load i32, i32* %23
%160 = sub nsw i32 %158, %159
store i32 %160, i32* %25
%161 = load i32, i32* %32
%162 = load i32, i32* %23
%163 = add nsw i32 %161, %162
%164 = add nsw i32 %163, 1
store i32 %164, i32* %27
%165 = load i32, i32* %24
%166 = icmp slt i32 %165, 0
br i1 %166, label %167, label %168
167: ; preds = %130
store i32 0, i32* %24
br label %168
168: ; preds = %167, %130
%169 = load i32, i32* %26
%170 = load i32, i32* %14
%171 = icmp sgt i32 %169, %170
br i1 %171, label %172, label %174
172: ; preds = %168
%173 = load i32, i32* %14
store i32 %173, i32* %26
br label %174
174: ; preds = %172, %168
%175 = load i32, i32* %25
%176 = icmp slt i32 %175, 0
br i1 %176, label %177, label %178
177: ; preds = %174
store i32 0, i32* %25
br label %178
178: ; preds = %177, %174
%179 = load i32, i32* %27
%180 = load i32, i32* %13
%181 = icmp sgt i32 %179, %180
br i1 %181, label %182, label %184
182: ; preds = %178
%183 = load i32, i32* %13
store i32 %183, i32* %27
br label %184
184: ; preds = %182, %178
%185 = load i32, i32* %25
store i32 %185, i32* %37
br label %186
186: ; preds = %280, %184
%187 = load i32, i32* %37
%188 = load i32, i32* %27
%189 = icmp slt i32 %187, %188
br i1 %189, label %190, label %283
190: ; preds = %186
%191 = load i32, i32* %24
store i32 %191, i32* %38
br label %192
192: ; preds = %276, %190
%193 = load i32, i32* %38
%194 = load i32, i32* %26
%195 = icmp slt i32 %193, %194
br i1 %195, label %196, label %279
196: ; preds = %192
%197 = load float, float* %16
%198 = fpext float %197 to double
%199 = load float, float* %15
%200 = fpext float %199 to double
%201 = load i32, i32* %38
%202 = sitofp i32 %201 to double
%203 = fadd double %202, 5.000000e-01
%204 = call double @llvm.fmuladd.f64(double %200, double %203, double %198)
%205 = fptrunc double %204 to float
store float %205, float* %28
%206 = load float, float* %17
%207 = fpext float %206 to double
%208 = load float, float* %15
%209 = fpext float %208 to double
%210 = load i32, i32* %37
%211 = sitofp i32 %210 to double
%212 = fadd double %211, 5.000000e-01
%213 = fneg double %209
%214 = call double @llvm.fmuladd.f64(double %213, double %212, double %207)
%215 = fptrunc double %214 to float
store float %215, float* %29
%216 = load float, float* %28
%217 = load float*, float** %18
%218 = load i32, i32* %36
%219 = sext i32 %218 to i64
%220 = getelementptr inbounds float, float* %217, i64 %219
%221 = load float, float* %220
%222 = fsub float %216, %221
%223 = load float, float* %28
%224 = load float*, float** %18
%225 = load i32, i32* %36
%226 = sext i32 %225 to i64
%227 = getelementptr inbounds float, float* %224, i64 %226
%228 = load float, float* %227
%229 = fsub float %223, %228
%230 = load float, float* %29
%231 = load float*, float** %19
%232 = load i32, i32* %36
%233 = sext i32 %232 to i64
%234 = getelementptr inbounds float, float* %231, i64 %233
%235 = load float, float* %234
%236 = fsub float %230, %235
%237 = load float, float* %29
%238 = load float*, float** %19
%239 = load i32, i32* %36
%240 = sext i32 %239 to i64
%241 = getelementptr inbounds float, float* %238, i64 %240
%242 = load float, float* %241
%243 = fsub float %237, %242
%244 = fmul float %236, %243
%245 = call float @llvm.fmuladd.f32(float %222, float %229, float %244)
store float %245, float* %30
%246 = load float, float* %30
%247 = load float, float* %31
%248 = fcmp olt float %246, %247
br i1 %248, label %249, label %275
249: ; preds = %196
%250 = load i32*, i32** %20
%251 = load i32, i32* %36
%252 = sext i32 %251 to i64
%253 = getelementptr inbounds i32, i32* %250, i64 %252
%254 = load i32, i32* %253
%255 = sitofp i32 %254 to float
%256 = load float, float* %30
%257 = load float, float* %31
%258 = fdiv float %256, %257
%259 = fsub float 1.000000e+00, %258
%260 = load float, float* %30
%261 = load float, float* %31
%262 = fdiv float %260, %261
%263 = fsub float 1.000000e+00, %262
%264 = call float @llvm.fmuladd.f32(float %259, float %263, float %255)
%265 = load float*, float** %12
%266 = load i32, i32* %37
%267 = load i32, i32* %14
%268 = mul nsw i32 %266, %267
%269 = load i32, i32* %38
%270 = add nsw i32 %268, %269
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds float, float* %265, i64 %271
%273 = load float, float* %272
%274 = fadd float %273, %264
store float %274, float* %272
br label %275
275: ; preds = %249, %196
br label %276
276: ; preds = %275
%277 = load i32, i32* %38
%278 = add nsw i32 %277, 1
store i32 %278, i32* %38
br label %192
279: ; preds = %192
br label %280
280: ; preds = %279
%281 = load i32, i32* %37
%282 = add nsw i32 %281, 1
store i32 %282, i32* %37
br label %186
283: ; preds = %186
br label %284
284: ; preds = %283
%285 = load i32, i32* %36
%286 = add nsw i32 %285, 1
store i32 %286, i32* %36
br label %126
287: ; preds = %126
br label %288
288: ; preds = %287, %124
ret void
}

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