void centered_gradient(const float *input, float *dx, float *dy, const int nx,
                       const int ny) {
  for (int i = 1; i < ny - 1; i++) {
    for (int j = 1; j < nx - 1; j++) {
      const int k = i * nx + j;
      dx[k] = 0.5 * (input[k + 1] - input[k - 1]);
      dy[k] = 0.5 * (input[k + nx] - input[k - nx]);
    }
  }
  for (int j = 1; j < nx - 1; j++) {
    dx[j] = 0.5 * (input[j + 1] - input[j - 1]);
    dy[j] = 0.5 * (input[j + nx] - input[j]);
    const int k = (ny - 1) * nx + j;
    dx[k] = 0.5 * (input[k + 1] - input[k - 1]);
    dy[k] = 0.5 * (input[k] - input[k - nx]);
  }
  for (int i = 1; i < ny - 1; i++) {
    const int p = i * nx;
    dx[p] = 0.5 * (input[p + 1] - input[p]);
    dy[p] = 0.5 * (input[p + nx] - input[p - nx]);
    const int k = (i + 1) * nx - 1;
    dx[k] = 0.5 * (input[k] - input[k - 1]);
    dy[k] = 0.5 * (input[k + nx] - input[k - nx]);
  }
  dx[0] = 0.5 * (input[1] - input[0]);
  dy[0] = 0.5 * (input[nx] - input[0]);
  dx[nx - 1] = 0.5 * (input[nx - 1] - input[nx - 2]);
  dy[nx - 1] = 0.5 * (input[2 * nx - 1] - input[nx - 1]);
  dx[(ny - 1) * nx] = 0.5 * (input[(ny - 1) * nx + 1] - input[(ny - 1) * nx]);
  dy[(ny - 1) * nx] = 0.5 * (input[(ny - 1) * nx] - input[(ny - 2) * nx]);
  dx[ny * nx - 1] = 0.5 * (input[ny * nx - 1] - input[ny * nx - 1 - 1]);
  dy[ny * nx - 1] = 0.5 * (input[ny * nx - 1] - input[(ny - 1) * nx - 1]);
}


x86 assembly (clang, -O0):
<centered_gradient>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11ff <centered_gradient+0xff>
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11ec <centered_gradient+0xec>
mov    -0x24(%rbp),%eax
imul   -0x1c(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe7c(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe37(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1136 <centered_gradient+0x36>
jmp    11f1 <centered_gradient+0xf1>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    111e <centered_gradient+0x1e>
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    133f <centered_gradient+0x23f>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdb9(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd79(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
imul   -0x1c(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd24(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xce4(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1206 <centered_gradient+0x106>
movl   $0x1,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1489 <centered_gradient+0x389>
mov    -0x38(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc74(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc2f(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
imul   -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xbdf(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x40(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xb9a(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1346 <centered_gradient+0x246>
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xb5a(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
subss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xb29(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xae9(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xa9c(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xa47(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x2,%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0x9f1(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
sub    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0x998(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0x93f(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<centered_gradient>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %rsi,-0x48(%rsp)
mov    %rdi,-0x40(%rsp)
lea    -0x1(%r8),%eax
lea    -0x1(%rcx),%esi
mov    %rcx,-0x38(%rsp)
movslq %ecx,%rcx
mov    %rcx,-0x70(%rsp)
mov    %eax,-0x24(%rsp)
mov    %eax,%eax
mov    %rax,-0x18(%rsp)
mov    %esi,-0x28(%rsp)
mov    %esi,%eax
mov    %rax,-0x50(%rsp)
mov    %r8,0x8(%rsp)
cmp    $0x3,%r8d
jl     14bc <centered_gradient+0x3bc>
mov    -0x70(%rsp),%rcx
lea    0x1(%rcx),%r9
mov    -0x50(%rsp),%rax
lea    (%rcx,%rax,1),%rsi
mov    %rsi,0x38(%rsp)
lea    (%rcx,%rcx,1),%rsi
mov    %rsi,(%rsp)
lea    0x1(%rcx,%rcx,1),%rsi
mov    %rsi,0x30(%rsp)
lea    (%rax,%rcx,2),%rsi
mov    %rsi,0x28(%rsp)
lea    0x1(%rcx,%rax,1),%rsi
mov    %rsi,0x20(%rsp)
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rsp)
and    $0xfffffffffffffffc,%rax
mov    %rax,0x18(%rsp)
add    $0x1,%rax
mov    %rax,0x10(%rsp)
lea    0x4(%rdx,%rcx,4),%r13
lea    0x0(,%rcx,4),%rax
mov    %rax,0x50(%rsp)
mov    -0x40(%rsp),%r11
lea    0x4(%r11,%rcx,8),%r10
mov    -0x48(%rsp),%rax
lea    0x4(%rax,%rcx,4),%r14
lea    0x8(%r11,%rcx,4),%r8
mov    $0x1,%r15d
movss  0xe2f(%rip),%xmm0
movaps 0xe18(%rip),%xmm1
xor    %eax,%eax
mov    %rax,-0x10(%rsp)
mov    %rcx,-0x8(%rsp)
mov    %r9,0x40(%rsp)
mov    %rdx,-0x68(%rsp)
jmp    123a <centered_gradient+0x13a>
add    $0x1,%r15
addq   $0x1,-0x10(%rsp)
mov    0x50(%rsp),%rax
add    %rax,%r13
add    %rax,%r11
add    %rax,%r10
add    %rax,%r14
add    %rax,%r8
mov    -0x70(%rsp),%rax
add    %rax,%r9
add    %rax,-0x8(%rsp)
add    %rax,(%rsp)
cmp    -0x18(%rsp),%r15
je     14bc <centered_gradient+0x3bc>
cmpl   $0x3,-0x38(%rsp)
jl     1200 <centered_gradient+0x100>
mov    $0x1,%edi
cmpq   $0x4,-0x20(%rsp)
jb     1430 <centered_gradient+0x330>
mov    %rdx,%rsi
mov    -0x10(%rsp),%r12
imul   -0x70(%rsp),%r12
mov    0x40(%rsp),%rax
lea    (%rax,%r12,1),%rdx
mov    0x38(%rsp),%rax
add    %r12,%rax
mov    -0x50(%rsp),%rcx
lea    (%r12,%rcx,1),%rdi
mov    0x30(%rsp),%rcx
lea    (%rcx,%r12,1),%rcx
mov    %rcx,-0x78(%rsp)
mov    0x28(%rsp),%rcx
lea    (%rcx,%r12,1),%rcx
mov    %rcx,-0x60(%rsp)
mov    0x20(%rsp),%rcx
lea    (%rcx,%r12,1),%rcx
mov    %rcx,-0x30(%rsp)
mov    -0x48(%rsp),%rcx
lea    (%rcx,%rdx,4),%rbx
lea    (%rcx,%rax,4),%rcx
lea    (%rsi,%rdx,4),%rbp
lea    (%rsi,%rax,4),%rsi
mov    -0x40(%rsp),%rax
lea    0x4(%rax,%r12,4),%rdx
mov    %rdx,-0x58(%rsp)
lea    (%rax,%rdi,4),%rdx
mov    -0x78(%rsp),%rdi
lea    (%rax,%rdi,4),%rdi
mov    %rdi,-0x78(%rsp)
mov    -0x60(%rsp),%rdi
lea    (%rax,%rdi,4),%rdi
mov    %rdi,-0x60(%rsp)
mov    -0x30(%rsp),%rdi
lea    (%rax,%rdi,4),%rdi
mov    %rdi,0x48(%rsp)
cmp    %rsi,%rbx
setb   -0x30(%rsp)
cmp    %rcx,%rbp
setb   -0x79(%rsp)
cmp    %rdx,%rbx
setb   -0x7a(%rsp)
cmp    %rcx,-0x58(%rsp)
setb   -0x7b(%rsp)
cmp    -0x60(%rsp),%rbx
setb   -0x7c(%rsp)
cmp    %rcx,-0x78(%rsp)
setb   -0x7d(%rsp)
mov    0x48(%rsp),%rdi
cmp    %rdi,%rbx
mov    -0x70(%rsp),%rbx
lea    (%r12,%rbx,1),%rbx
lea    (%rax,%rbx,4),%rbx
setb   %r12b
cmp    %rcx,%rbx
setb   -0x7e(%rsp)
cmp    %rdx,%rbp
setb   %cl
cmp    %rsi,-0x58(%rsp)
setb   -0x58(%rsp)
cmp    -0x60(%rsp),%rbp
setb   %al
cmp    %rsi,-0x78(%rsp)
setb   -0x78(%rsp)
cmp    %rdi,%rbp
setb   %bpl
cmp    %rsi,%rbx
setb   %bl
mov    -0x79(%rsp),%dl
test   %dl,-0x30(%rsp)
jne    14ad <centered_gradient+0x3ad>
mov    -0x7b(%rsp),%dl
and    %dl,-0x7a(%rsp)
mov    $0x1,%edi
jne    14a6 <centered_gradient+0x3a6>
mov    -0x7d(%rsp),%dl
and    %dl,-0x7c(%rsp)
jne    14a6 <centered_gradient+0x3a6>
and    -0x7e(%rsp),%r12b
jne    14a6 <centered_gradient+0x3a6>
and    -0x58(%rsp),%cl
mov    -0x68(%rsp),%rdx
jne    1430 <centered_gradient+0x330>
and    -0x78(%rsp),%al
jne    1430 <centered_gradient+0x330>
and    %bl,%bpl
jne    1430 <centered_gradient+0x330>
xor    %eax,%eax
mov    0x18(%rsp),%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x8(%r8,%rax,4),%xmm2
movups (%r8,%rax,4),%xmm3
subps  %xmm2,%xmm3
mulps  %xmm1,%xmm3
movups %xmm3,(%r14,%rax,4)
movups (%r10,%rax,4),%xmm2
movups 0x4(%r11,%rax,4),%xmm3
subps  %xmm3,%xmm2
mulps  %xmm1,%xmm2
movups %xmm2,0x0(%r13,%rax,4)
add    $0x4,%rax
cmp    %rax,%rcx
jne    13e0 <centered_gradient+0x2e0>
mov    0x10(%rsp),%rdi
cmp    %rcx,-0x20(%rsp)
je     1200 <centered_gradient+0x100>
cs nopw 0x0(%rax,%rax,1)
mov    -0x50(%rsp),%r12
sub    %rdi,%r12
lea    (%rdi,%r9,1),%rax
mov    -0x40(%rsp),%rcx
lea    (%rcx,%rax,4),%rbp
mov    -0x8(%rsp),%rax
add    %rdi,%rax
mov    -0x48(%rsp),%rsi
lea    (%rsi,%rax,4),%rsi
lea    (%rdx,%rax,4),%rbx
mov    (%rsp),%rax
add    %rdi,%rax
lea    (%rcx,%rax,4),%rax
lea    (%r11,%rdi,4),%rcx
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
movss  0x0(%rbp,%rdi,4),%xmm2
subss  -0x8(%rbp,%rdi,4),%xmm2
mulss  %xmm0,%xmm2
movss  %xmm2,(%rsi,%rdi,4)
movss  (%rax,%rdi,4),%xmm2
subss  (%rcx,%rdi,4),%xmm2
mulss  %xmm0,%xmm2
movss  %xmm2,(%rbx,%rdi,4)
add    $0x1,%rdi
cmp    %rdi,%r12
jne    1470 <centered_gradient+0x370>
jmp    1200 <centered_gradient+0x100>
mov    -0x68(%rsp),%rdx
jmp    1430 <centered_gradient+0x330>
mov    -0x68(%rsp),%rdx
mov    $0x1,%edi
jmp    1430 <centered_gradient+0x330>
cmpl   $0x3,-0x38(%rsp)
mov    -0x40(%rsp),%rbp
mov    -0x48(%rsp),%r14
mov    -0x24(%rsp),%r12d
jl     159f <centered_gradient+0x49f>
mov    %r12d,%eax
mov    -0x38(%rsp),%rcx
imul   %ecx,%eax
mov    %ecx,%edi
cltq
lea    0x0(,%rax,4),%rcx
add    %rbp,%rcx
lea    0x1(%rax),%rsi
lea    (%r14,%rax,4),%r8
add    $0x4,%r8
lea    (%rdx,%rax,4),%r9
add    $0x4,%r9
sub    %rdi,%rsi
lea    0x0(,%rsi,4),%rax
add    %rbp,%rax
lea    0x4(,%rdi,4),%rbx
add    %rbp,%rbx
mov    -0x50(%rsp),%rsi
lea    -0x4(,%rsi,4),%rsi
ff
xor    %edi,%edi
movss  0xadc(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  0x8(%rbp,%rdi,1),%xmm1
subss  0x0(%rbp,%rdi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,0x4(%r14,%rdi,1)
movss  (%rbx,%rdi,1),%xmm1
subss  0x4(%rbp,%rdi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,0x4(%rdx,%rdi,1)
movss  0x8(%rcx,%rdi,1),%xmm1
subss  (%rcx,%rdi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r8,%rdi,1)
movss  0x4(%rcx,%rdi,1),%xmm1
subss  (%rax,%rdi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r9,%rdi,1)
add    $0x4,%rdi
cmp    %rdi,%rsi
jne    1540 <centered_gradient+0x440>
mov    0x8(%rsp),%r15
cmp    $0x3,%r15d
mov    -0x18(%rsp),%rdi
jl     166f <centered_gradient+0x56f>
mov    -0x70(%rsp),%rsi
lea    0x0(,%rsi,4),%rcx
add    %rbp,%rcx
lea    0x0(,%rsi,4),%r8
lea    (%r14,%rsi,4),%r9
lea    (%rdx,%rsi,4),%r10
lea    0x0(,%rsi,8),%rbx
add    %rbp,%rbx
add    $0xffffffffffffffff,%rdi
lea    (%rsi,%rsi,2),%rax
lea    -0x4(,%rax,4),%r11
ff
add    %rbp,%r11
lea    (%r14,%rsi,8),%r13
add    $0xfffffffffffffffc,%r13
lea    (%rdx,%rsi,8),%rax
add    $0xfffffffffffffffc,%rax
xor    %esi,%esi
movss  0xa05(%rip),%xmm0
nopl   0x0(%rax,%rax,1)
movss  0x4(%rcx,%rsi,1),%xmm1
subss  (%rcx,%rsi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r9,%rsi,1)
movss  (%rbx,%rsi,1),%xmm1
subss  0x0(%rbp,%rsi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r10,%rsi,1)
movss  -0x4(%rbx,%rsi,1),%xmm1
subss  -0x8(%rbx,%rsi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,0x0(%r13,%rsi,1)
movss  (%r11,%rsi,1),%xmm1
subss  -0x4(%rcx,%rsi,1),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rax,%rsi,1)
add    %r8,%rsi
add    $0xffffffffffffffff,%rdi
jne    1610 <centered_gradient+0x510>
movss  0x4(%rbp),%xmm1
subss  0x0(%rbp),%xmm1
movss  0x98f(%rip),%xmm0
mulss  %xmm0,%xmm1
movss  %xmm1,(%r14)
mov    -0x70(%rsp),%rcx
movss  0x0(%rbp,%rcx,4),%xmm1
subss  0x0(%rbp),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rdx)
movslq -0x28(%rsp),%rax
movss  0x0(%rbp,%rax,4),%xmm1
subss  -0x8(%rbp,%rcx,4),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r14,%rax,4)
mov    -0x38(%rsp),%rsi
lea    (%rsi,%rsi,1),%ecx
movslq %ecx,%rcx
movss  -0x4(%rbp,%rcx,4),%xmm1
subss  0x0(%rbp,%rax,4),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rdx,%rax,4)
imul   %esi,%r12d
movslq %r12d,%rax
movss  0x4(%rbp,%rax,4),%xmm1
subss  0x0(%rbp,%rax,4),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r14,%rax,4)
movss  0x0(%rbp,%rax,4),%xmm1
lea    -0x2(%r15),%ecx
imul   %esi,%ecx
movslq %ecx,%rcx
subss  0x0(%rbp,%rcx,4),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rdx,%rax,4)
imul   %esi,%r15d
movslq %r15d,%rcx
movss  -0x4(%rbp,%rcx,4),%xmm1
subss  -0x8(%rbp,%rcx,4),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,-0x4(%r14,%rcx,4)
movss  -0x4(%rbp,%rcx,4),%xmm1
subss  -0x4(%rbp,%rax,4),%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,-0x4(%rdx,%rcx,4)
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @centered_gradient(float* %0, float* %1, float* %2, i32 %3, i32 %4) {
%6 = alloca float*
%7 = alloca float*
%8 = alloca float*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
store float* %0, float** %6
store float* %1, float** %7
store float* %2, float** %8
store i32 %3, i32* %9
store i32 %4, i32* %10
store i32 1, i32* %11
br label %19
19: ; preds = %82, %5
%20 = load i32, i32* %11
%21 = load i32, i32* %10
%22 = sub nsw i32 %21, 1
%23 = icmp slt i32 %20, %22
br i1 %23, label %24, label %85
24: ; preds = %19
store i32 1, i32* %12
br label %25
25: ; preds = %78, %24
%26 = load i32, i32* %12
%27 = load i32, i32* %9
%28 = sub nsw i32 %27, 1
%29 = icmp slt i32 %26, %28
br i1 %29, label %30, label %81
30: ; preds = %25
%31 = load i32, i32* %11
%32 = load i32, i32* %9
%33 = mul nsw i32 %31, %32
%34 = load i32, i32* %12
%35 = add nsw i32 %33, %34
store i32 %35, i32* %13
%36 = load float*, float** %6
%37 = load i32, i32* %13
%38 = add nsw i32 %37, 1
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds float, float* %36, i64 %39
%41 = load float, float* %40
%42 = load float*, float** %6
%43 = load i32, i32* %13
%44 = sub nsw i32 %43, 1
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds float, float* %42, i64 %45
%47 = load float, float* %46
%48 = fsub float %41, %47
%49 = fpext float %48 to double
%50 = fmul double 5.000000e-01, %49
%51 = fptrunc double %50 to float
%52 = load float*, float** %7
%53 = load i32, i32* %13
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds float, float* %52, i64 %54
store float %51, float* %55
%56 = load float*, float** %6
%57 = load i32, i32* %13
%58 = load i32, i32* %9
%59 = add nsw i32 %57, %58
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds float, float* %56, i64 %60
%62 = load float, float* %61
%63 = load float*, float** %6
%64 = load i32, i32* %13
%65 = load i32, i32* %9
%66 = sub nsw i32 %64, %65
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds float, float* %63, i64 %67
%69 = load float, float* %68
%70 = fsub float %62, %69
%71 = fpext float %70 to double
%72 = fmul double 5.000000e-01, %71
%73 = fptrunc double %72 to float
%74 = load float*, float** %8
%75 = load i32, i32* %13
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds float, float* %74, i64 %76
store float %73, float* %77
br label %78
78: ; preds = %30
%79 = load i32, i32* %12
%80 = add nsw i32 %79, 1
store i32 %80, i32* %12
br label %25
81: ; preds = %25
br label %82
82: ; preds = %81
%83 = load i32, i32* %11
%84 = add nsw i32 %83, 1
store i32 %84, i32* %11
br label %19
85: ; preds = %19
store i32 1, i32* %14
br label %86
86: ; preds = %178, %85
%87 = load i32, i32* %14
%88 = load i32, i32* %9
%89 = sub nsw i32 %88, 1
%90 = icmp slt i32 %87, %89
br i1 %90, label %91, label %181
91: ; preds = %86
%92 = load float*, float** %6
%93 = load i32, i32* %14
%94 = add nsw i32 %93, 1
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds float, float* %92, i64 %95
%97 = load float, float* %96
%98 = load float*, float** %6
%99 = load i32, i32* %14
%100 = sub nsw i32 %99, 1
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds float, float* %98, i64 %101
%103 = load float, float* %102
%104 = fsub float %97, %103
%105 = fpext float %104 to double
%106 = fmul double 5.000000e-01, %105
%107 = fptrunc double %106 to float
%108 = load float*, float** %7
%109 = load i32, i32* %14
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds float, float* %108, i64 %110
store float %107, float* %111
%112 = load float*, float** %6
%113 = load i32, i32* %14
%114 = load i32, i32* %9
%115 = add nsw i32 %113, %114
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds float, float* %112, i64 %116
%118 = load float, float* %117
%119 = load float*, float** %6
%120 = load i32, i32* %14
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds float, float* %119, i64 %121
%123 = load float, float* %122
%124 = fsub float %118, %123
%125 = fpext float %124 to double
%126 = fmul double 5.000000e-01, %125
%127 = fptrunc double %126 to float
%128 = load float*, float** %8
%129 = load i32, i32* %14
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds float, float* %128, i64 %130
store float %127, float* %131
%132 = load i32, i32* %10
%133 = sub nsw i32 %132, 1
%134 = load i32, i32* %9
%135 = mul nsw i32 %133, %134
%136 = load i32, i32* %14
%137 = add nsw i32 %135, %136
store i32 %137, i32* %15
%138 = load float*, float** %6
%139 = load i32, i32* %15
%140 = add nsw i32 %139, 1
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds float, float* %138, i64 %141
%143 = load float, float* %142
%144 = load float*, float** %6
%145 = load i32, i32* %15
%146 = sub nsw i32 %145, 1
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds float, float* %144, i64 %147
%149 = load float, float* %148
%150 = fsub float %143, %149
%151 = fpext float %150 to double
%152 = fmul double 5.000000e-01, %151
%153 = fptrunc double %152 to float
%154 = load float*, float** %7
%155 = load i32, i32* %15
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds float, float* %154, i64 %156
store float %153, float* %157
%158 = load float*, float** %6
%159 = load i32, i32* %15
%160 = sext i32 %159 to i64
%161 = getelementptr inbounds float, float* %158, i64 %160
%162 = load float, float* %161
%163 = load float*, float** %6
%164 = load i32, i32* %15
%165 = load i32, i32* %9
%166 = sub nsw i32 %164, %165
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds float, float* %163, i64 %167
%169 = load float, float* %168
%170 = fsub float %162, %169
%171 = fpext float %170 to double
%172 = fmul double 5.000000e-01, %171
%173 = fptrunc double %172 to float
%174 = load float*, float** %8
%175 = load i32, i32* %15
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds float, float* %174, i64 %176
store float %173, float* %177
br label %178
178: ; preds = %91
%179 = load i32, i32* %14
%180 = add nsw i32 %179, 1
store i32 %180, i32* %14
br label %86
181: ; preds = %86
store i32 1, i32* %16
br label %182
182: ; preds = %278, %181
%183 = load i32, i32* %16
%184 = load i32, i32* %10
%185 = sub nsw i32 %184, 1
%186 = icmp slt i32 %183, %185
br i1 %186, label %187, label %281
187: ; preds = %182
%188 = load i32, i32* %16
%189 = load i32, i32* %9
%190 = mul nsw i32 %188, %189
store i32 %190, i32* %17
%191 = load float*, float** %6
%192 = load i32, i32* %17
%193 = add nsw i32 %192, 1
%194 = sext i32 %193 to i64
%195 = getelementptr inbounds float, float* %191, i64 %194
%196 = load float, float* %195
%197 = load float*, float** %6
%198 = load i32, i32* %17
%199 = sext i32 %198 to i64
%200 = getelementptr inbounds float, float* %197, i64 %199
%201 = load float, float* %200
%202 = fsub float %196, %201
%203 = fpext float %202 to double
%204 = fmul double 5.000000e-01, %203
%205 = fptrunc double %204 to float
%206 = load float*, float** %7
%207 = load i32, i32* %17
%208 = sext i32 %207 to i64
%209 = getelementptr inbounds float, float* %206, i64 %208
store float %205, float* %209
%210 = load float*, float** %6
%211 = load i32, i32* %17
%212 = load i32, i32* %9
%213 = add nsw i32 %211, %212
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds float, float* %210, i64 %214
%216 = load float, float* %215
%217 = load float*, float** %6
%218 = load i32, i32* %17
%219 = load i32, i32* %9
%220 = sub nsw i32 %218, %219
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds float, float* %217, i64 %221
%223 = load float, float* %222
%224 = fsub float %216, %223
%225 = fpext float %224 to double
%226 = fmul double 5.000000e-01, %225
%227 = fptrunc double %226 to float
%228 = load float*, float** %8
%229 = load i32, i32* %17
%230 = sext i32 %229 to i64
%231 = getelementptr inbounds float, float* %228, i64 %230
store float %227, float* %231
%232 = load i32, i32* %16
%233 = add nsw i32 %232, 1
%234 = load i32, i32* %9
%235 = mul nsw i32 %233, %234
%236 = sub nsw i32 %235, 1
store i32 %236, i32* %18
%237 = load float*, float** %6
%238 = load i32, i32* %18
%239 = sext i32 %238 to i64
%240 = getelementptr inbounds float, float* %237, i64 %239
%241 = load float, float* %240
%242 = load float*, float** %6
%243 = load i32, i32* %18
%244 = sub nsw i32 %243, 1
%245 = sext i32 %244 to i64
%246 = getelementptr inbounds float, float* %242, i64 %245
%247 = load float, float* %246
%248 = fsub float %241, %247
%249 = fpext float %248 to double
%250 = fmul double 5.000000e-01, %249
%251 = fptrunc double %250 to float
%252 = load float*, float** %7
%253 = load i32, i32* %18
%254 = sext i32 %253 to i64
%255 = getelementptr inbounds float, float* %252, i64 %254
store float %251, float* %255
%256 = load float*, float** %6
%257 = load i32, i32* %18
%258 = load i32, i32* %9
%259 = add nsw i32 %257, %258
%260 = sext i32 %259 to i64
%261 = getelementptr inbounds float, float* %256, i64 %260
%262 = load float, float* %261
%263 = load float*, float** %6
%264 = load i32, i32* %18
%265 = load i32, i32* %9
%266 = sub nsw i32 %264, %265
%267 = sext i32 %266 to i64
%268 = getelementptr inbounds float, float* %263, i64 %267
%269 = load float, float* %268
%270 = fsub float %262, %269
%271 = fpext float %270 to double
%272 = fmul double 5.000000e-01, %271
%273 = fptrunc double %272 to float
%274 = load float*, float** %8
%275 = load i32, i32* %18
%276 = sext i32 %275 to i64
%277 = getelementptr inbounds float, float* %274, i64 %276
store float %273, float* %277
br label %278
278: ; preds = %187
%279 = load i32, i32* %16
%280 = add nsw i32 %279, 1
store i32 %280, i32* %16
br label %182
281: ; preds = %182
%282 = load float*, float** %6
%283 = getelementptr inbounds float, float* %282, i64 1
%284 = load float, float* %283
%285 = load float*, float** %6
%286 = getelementptr inbounds float, float* %285, i64 0
%287 = load float, float* %286
%288 = fsub float %284, %287
%289 = fpext float %288 to double
%290 = fmul double 5.000000e-01, %289
%291 = fptrunc double %290 to float
%292 = load float*, float** %7
%293 = getelementptr inbounds float, float* %292, i64 0
store float %291, float* %293
%294 = load float*, float** %6
%295 = load i32, i32* %9
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds float, float* %294, i64 %296
%298 = load float, float* %297
%299 = load float*, float** %6
%300 = getelementptr inbounds float, float* %299, i64 0
%301 = load float, float* %300
%302 = fsub float %298, %301
%303 = fpext float %302 to double
%304 = fmul double 5.000000e-01, %303
%305 = fptrunc double %304 to float
%306 = load float*, float** %8
%307 = getelementptr inbounds float, float* %306, i64 0
store float %305, float* %307
%308 = load float*, float** %6
%309 = load i32, i32* %9
%310 = sub nsw i32 %309, 1
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds float, float* %308, i64 %311
%313 = load float, float* %312
%314 = load float*, float** %6
%315 = load i32, i32* %9
%316 = sub nsw i32 %315, 2
%317 = sext i32 %316 to i64
%318 = getelementptr inbounds float, float* %314, i64 %317
%319 = load float, float* %318
%320 = fsub float %313, %319
%321 = fpext float %320 to double
%322 = fmul double 5.000000e-01, %321
%323 = fptrunc double %322 to float
%324 = load float*, float** %7
%325 = load i32, i32* %9
%326 = sub nsw i32 %325, 1
%327 = sext i32 %326 to i64
%328 = getelementptr inbounds float, float* %324, i64 %327
store float %323, float* %328
%329 = load float*, float** %6
%330 = load i32, i32* %9
%331 = mul nsw i32 2, %330
%332 = sub nsw i32 %331, 1
%333 = sext i32 %332 to i64
%334 = getelementptr inbounds float, float* %329, i64 %333
%335 = load float, float* %334
%336 = load float*, float** %6
%337 = load i32, i32* %9
%338 = sub nsw i32 %337, 1
%339 = sext i32 %338 to i64
%340 = getelementptr inbounds float, float* %336, i64 %339
%341 = load float, float* %340
%342 = fsub float %335, %341
%343 = fpext float %342 to double
%344 = fmul double 5.000000e-01, %343
%345 = fptrunc double %344 to float
%346 = load float*, float** %8
%347 = load i32, i32* %9
%348 = sub nsw i32 %347, 1
%349 = sext i32 %348 to i64
%350 = getelementptr inbounds float, float* %346, i64 %349
store float %345, float* %350
%351 = load float*, float** %6
%352 = load i32, i32* %10
%353 = sub nsw i32 %352, 1
%354 = load i32, i32* %9
%355 = mul nsw i32 %353, %354
%356 = add nsw i32 %355, 1
%357 = sext i32 %356 to i64
%358 = getelementptr inbounds float, float* %351, i64 %357
%359 = load float, float* %358
%360 = load float*, float** %6
%361 = load i32, i32* %10
%362 = sub nsw i32 %361, 1
%363 = load i32, i32* %9
%364 = mul nsw i32 %362, %363
%365 = sext i32 %364 to i64
%366 = getelementptr inbounds float, float* %360, i64 %365
%367 = load float, float* %366
%368 = fsub float %359, %367
%369 = fpext float %368 to double
%370 = fmul double 5.000000e-01, %369
%371 = fptrunc double %370 to float
%372 = load float*, float** %7
%373 = load i32, i32* %10
%374 = sub nsw i32 %373, 1
%375 = load i32, i32* %9
%376 = mul nsw i32 %374, %375
%377 = sext i32 %376 to i64
%378 = getelementptr inbounds float, float* %372, i64 %377
store float %371, float* %378
%379 = load float*, float** %6
%380 = load i32, i32* %10
%381 = sub nsw i32 %380, 1
%382 = load i32, i32* %9
%383 = mul nsw i32 %381, %382
%384 = sext i32 %383 to i64
%385 = getelementptr inbounds float, float* %379, i64 %384
%386 = load float, float* %385
%387 = load float*, float** %6
%388 = load i32, i32* %10
%389 = sub nsw i32 %388, 2
%390 = load i32, i32* %9
%391 = mul nsw i32 %389, %390
%392 = sext i32 %391 to i64
%393 = getelementptr inbounds float, float* %387, i64 %392
%394 = load float, float* %393
%395 = fsub float %386, %394
%396 = fpext float %395 to double
%397 = fmul double 5.000000e-01, %396
%398 = fptrunc double %397 to float
%399 = load float*, float** %8
%400 = load i32, i32* %10
%401 = sub nsw i32 %400, 1
%402 = load i32, i32* %9
%403 = mul nsw i32 %401, %402
%404 = sext i32 %403 to i64
%405 = getelementptr inbounds float, float* %399, i64 %404
store float %398, float* %405
%406 = load float*, float** %6
%407 = load i32, i32* %10
%408 = load i32, i32* %9
%409 = mul nsw i32 %407, %408
%410 = sub nsw i32 %409, 1
%411 = sext i32 %410 to i64
%412 = getelementptr inbounds float, float* %406, i64 %411
%413 = load float, float* %412
%414 = load float*, float** %6
%415 = load i32, i32* %10
%416 = load i32, i32* %9
%417 = mul nsw i32 %415, %416
%418 = sub nsw i32 %417, 1
%419 = sub nsw i32 %418, 1
%420 = sext i32 %419 to i64
%421 = getelementptr inbounds float, float* %414, i64 %420
%422 = load float, float* %421
%423 = fsub float %413, %422
%424 = fpext float %423 to double
%425 = fmul double 5.000000e-01, %424
%426 = fptrunc double %425 to float
%427 = load float*, float** %7
%428 = load i32, i32* %10
%429 = load i32, i32* %9
%430 = mul nsw i32 %428, %429
%431 = sub nsw i32 %430, 1
%432 = sext i32 %431 to i64
%433 = getelementptr inbounds float, float* %427, i64 %432
store float %426, float* %433
%434 = load float*, float** %6
%435 = load i32, i32* %10
%436 = load i32, i32* %9
%437 = mul nsw i32 %435, %436
%438 = sub nsw i32 %437, 1
%439 = sext i32 %438 to i64
%440 = getelementptr inbounds float, float* %434, i64 %439
%441 = load float, float* %440
%442 = load float*, float** %6
%443 = load i32, i32* %10
%444 = sub nsw i32 %443, 1
%445 = load i32, i32* %9
%446 = mul nsw i32 %444, %445
%447 = sub nsw i32 %446, 1
%448 = sext i32 %447 to i64
%449 = getelementptr inbounds float, float* %442, i64 %448
%450 = load float, float* %449
%451 = fsub float %441, %450
%452 = fpext float %451 to double
%453 = fmul double 5.000000e-01, %452
%454 = fptrunc double %453 to float
%455 = load float*, float** %8
%456 = load i32, i32* %10
%457 = load i32, i32* %9
%458 = mul nsw i32 %456, %457
%459 = sub nsw i32 %458, 1
%460 = sext i32 %459 to i64
%461 = getelementptr inbounds float, float* %455, i64 %460
store float %454, float* %461
ret void
}

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