void sobel2cf(float *in, float *outx, float *outy, int w, int h) {
  float gd1, gd2;
  int x, y;
  float *ino0, *ino1, *ino2;
  float *outxo, *outyo;
  for (x = 0; x < w; x++)
    outx[x] = 0.0;
  for (x = 0; x < w; x++)
    outy[x] = 0.0;
  for (x = w * h - w; x < w * h; x++)
    outx[x] = 0.0;
  for (x = w * h - w; x < w * h; x++)
    outy[x] = 0.0;
  for (y = 1; y < h - 1; y++) {
    ino0 = in + y * w - w;
    ino1 = in + y * w;
    ino2 = in + y * w + w;
    outxo = outx + y * w;
    outyo = outy + y * w;
    outxo[0] = 0;
    outxo[w - 1] = 0;
    outyo[0] = 0;
    outyo[w - 1] = 0;
    for (x = 1; x < w - 1; x++) {
      gd1 = ino2[x + 1] - ino0[x - 1];
      gd2 = ino2[x - 1] - ino0[x + 1];
      outxo[x] = (gd1 - gd2 - 2.0 * ino1[x - 1] + 2.0 * ino1[x + 1]);
      outyo[x] = (gd1 + gd2 - 2.0 * ino0[x] + 2.0 * ino2[x]);
    }
  }
}


x86 assembly (clang, -O0):
<sobel2cf>:
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   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1148 <sobel2cf+0x48>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    111e <sobel2cf+0x1e>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1179 <sobel2cf+0x79>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    114f <sobel2cf+0x4f>
mov    -0x1c(%rbp),%eax
imul   -0x20(%rbp),%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
imul   -0x20(%rbp),%ecx
cmp    %ecx,%eax
jge    11b6 <sobel2cf+0xb6>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1186 <sobel2cf+0x86>
mov    -0x1c(%rbp),%eax
imul   -0x20(%rbp),%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
imul   -0x20(%rbp),%ecx
cmp    %ecx,%eax
jge    11f3 <sobel2cf+0xf3>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11c3 <sobel2cf+0xc3>
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0x20(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    141a <sobel2cf+0x31a>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x50(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x50(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x58(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x58(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1407 <sobel2cf+0x307>
mov    -0x48(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x38(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x38(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x24(%rbp),%xmm0
subss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
mov    -0x40(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm0
subsd  %xmm0,%xmm1
mov    -0x40(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x50(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x24(%rbp),%xmm0
addss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
mov    -0x38(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm0
subsd  %xmm0,%xmm1
mov    -0x48(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x58(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12ea <sobel2cf+0x1ea>
jmp    140c <sobel2cf+0x30c>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11fa <sobel2cf+0xfa>
pop    %rbp
ret

x86 assembly (clang, -O2):
<sobel2cf>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xf8,%rsp
mov    %r8d,%r12d
mov    %rdx,%r15
mov    %rsi,%rbp
mov    %rdi,0x30(%rsp)
test   %ecx,%ecx
mov    %rcx,0x8(%rsp)
jle    11a7 <sobel2cf+0x97>
mov    %ecx,%ebx
shl    $0x2,%rbx
mov    %rbp,%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
mov    %r15,%rdi
xor    %esi,%esi
mov    %rbx,%rdx
call   1030 <memset@plt>
mov    %r12d,%eax
imul   0x8(%rsp),%eax
mov    %eax,%ecx
sub    0x8(%rsp),%ecx
movslq %ecx,%rbx
lea    0x1(%rbx),%ecx
cmp    %ecx,%eax
cmovle %ecx,%eax
lea    0x0(,%rbx,4),%rdi
add    %rbp,%rdi
mov    %ebx,%ecx
not    %ecx
add    %eax,%ecx
lea    0x4(,%rcx,4),%r14
xor    %esi,%esi
mov    %r14,%rdx
call   1030 <memset@plt>
lea    (%r15,%rbx,4),%rdi
xor    %esi,%esi
mov    %r14,%rdx
call   1030 <memset@plt>
mov    0x8(%rsp),%rcx
cmp    $0x3,%r12d
jl     172e <sobel2cf+0x61e>
mov    %r12,%rax
add    $0xffffffff,%eax
movslq %ecx,%rsi
lea    -0x1(%rcx),%edi
movslq %edi,%rdx
mov    %rdx,0xe8(%rsp)
lea    0x1(%rsi),%rdx
mov    %rdx,0xc0(%rsp)
lea    (%rsi,%rdi,1),%rdx
mov    %rdx,0xb8(%rsp)
lea    (%rsi,%rsi,1),%rdx
mov    %rdx,0xb0(%rsp)
lea    0x1(%rdi,%rsi,2),%rdx
mov    %rdx,0xa8(%rsp)
lea    0x1(%rdi),%rdx
mov    %rdx,0xa0(%rsp)
lea    0x1(%rsi,%rdi,1),%rdx
mov    %rdx,0x98(%rsp)
mov    %rdi,0xc8(%rsp)
lea    -0x1(%rdi),%rdx
mov    %rdx,0x38(%rsp)
and    $0xfffffffffffffffc,%rdx
mov    %rdx,0x90(%rsp)
add    $0x1,%rdx
mov    %rdx,0x88(%rsp)
mov    0x30(%rsp),%rdx
lea    0x8(%rdx,%rsi,4),%r9
lea    0x0(,%rsi,4),%rdi
mov    %rdi,0xe0(%rsp)
lea    0x8(%rdx,%rsi,8),%r11
lea    0x8(%rdx),%rdi
lea    0x4(%rbp,%rsi,4),%r12
lea    0x4(%r15,%rsi,4),%r10
lea    0x0(%rbp,%rsi,4),%rbx
mov    %rbx,0x80(%rsp)
lea    -0x4(%rdx,%rsi,4),%rbx
mov    %rbx,0x78(%rsp)
lea    (%r15,%rsi,4),%rbx
mov    %rbx,0x70(%rsp)
mov    %rsi,0x28(%rsp)
lea    (%rdx,%rsi,8),%rsi
mov    %rsi,0x68(%rsp)
mov    $0x1,%esi
xor    %ebx,%ebx
mov    %rbx,0x48(%rsp)
mov    %rdx,0x60(%rsp)
mov    %rax,0x10(%rsp)
mov    %r15,0x58(%rsp)
mov    %rbp,0x50(%rsp)
jmp    131b <sobel2cf+0x20b>
nopl   0x0(%rax,%rax,1)
mov    0xf0(%rsp),%rsi
add    $0x1,%rsi
addq   $0x1,0x48(%rsp)
mov    0xe0(%rsp),%rax
add    %rax,%r9
add    %rax,%r11
add    %rax,%rdi
add    %rax,%r12
add    %rax,%r10
add    %rax,0x80(%rsp)
add    %rax,0x78(%rsp)
add    %rax,0x70(%rsp)
add    %rax,0x68(%rsp)
add    %rax,0x60(%rsp)
mov    %rbp,%rax
cmp    %rbp,%rsi
mov    0x58(%rsp),%r15
mov    0x50(%rsp),%rbp
je     172e <sobel2cf+0x61e>
mov    %rsi,0xf0(%rsp)
mov    %rsi,%rdx
imul   0x28(%rsp),%rdx
lea    0x0(,%rdx,4),%rsi
add    %rbp,%rsi
lea    (%r15,%rdx,4),%rbx
movl   $0x0,0x0(%rbp,%rdx,4)
mov    0xe8(%rsp),%rbp
movl   $0x0,(%rsi,%rbp,4)
movl   $0x0,(%r15,%rdx,4)
movl   $0x0,(%rbx,%rbp,4)
cmp    $0x3,%ecx
mov    %rax,%rbp
jl     12c0 <sobel2cf+0x1b0>
mov    $0x1,%ebx
cmpq   $0x4,0x38(%rsp)
jae    1470 <sobel2cf+0x360>
mov    0xc8(%rsp),%rsi
sub    %rbx,%rsi
mov    0x80(%rsp),%rax
lea    (%rax,%rbx,4),%rdx
mov    0x78(%rsp),%rax
lea    (%rax,%rbx,4),%r8
mov    0x70(%rsp),%rax
lea    (%rax,%rbx,4),%r14
mov    0x68(%rsp),%rax
lea    (%rax,%rbx,4),%r15
mov    0x60(%rsp),%rax
lea    (%rax,%rbx,4),%rbx
xor    %r13d,%r13d
nopl   0x0(%rax)
movss  0x4(%r15,%r13,4),%xmm0
subss  -0x4(%rbx,%r13,4),%xmm0
movss  -0x4(%r15,%r13,4),%xmm1
subss  0x4(%rbx,%r13,4),%xmm1
movaps %xmm0,%xmm2
subss  %xmm1,%xmm2
cvtss2sd %xmm2,%xmm2
movss  (%r8,%r13,4),%xmm3
movss  0x8(%r8,%r13,4),%xmm4
cvtss2sd %xmm3,%xmm3
addsd  %xmm3,%xmm3
subsd  %xmm3,%xmm2
xorps  %xmm3,%xmm3
cvtss2sd %xmm4,%xmm3
addsd  %xmm3,%xmm3
addsd  %xmm2,%xmm3
xorps  %xmm2,%xmm2
cvtsd2ss %xmm3,%xmm2
movss  %xmm2,(%rdx,%r13,4)
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
movss  (%rbx,%r13,4),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm1
subsd  %xmm1,%xmm0
movss  (%r15,%r13,4),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,(%r14,%r13,4)
add    $0x1,%r13
cmp    %r13,%rsi
jne    13c0 <sobel2cf+0x2b0>
jmp    12c0 <sobel2cf+0x1b0>
nopw   0x0(%rax,%rax,1)
mov    0x48(%rsp),%rdx
imul   0x28(%rsp),%rdx
mov    0xc0(%rsp),%rcx
lea    (%rcx,%rdx,1),%rsi
mov    0xb8(%rsp),%rax
lea    (%rax,%rdx,1),%r8
mov    0xb0(%rsp),%rax
lea    (%rax,%rdx,1),%r14
mov    0xa8(%rsp),%rax
lea    (%rax,%rdx,1),%r15
mov    0xa0(%rsp),%rax
add    %rdx,%rax
mov    %rax,0x20(%rsp)
mov    0x98(%rsp),%rax
lea    (%rax,%rdx,1),%rax
mov    %rax,0x18(%rsp)
mov    0x50(%rsp),%rcx
lea    (%rcx,%rsi,4),%rbp
lea    (%rcx,%r8,4),%rcx
mov    0x58(%rsp),%rbx
lea    (%rbx,%rsi,4),%rsi
lea    (%rbx,%r8,4),%r8
mov    0x30(%rsp),%r13
lea    0x0(%r13,%r14,4),%r14
lea    0x0(%r13,%r15,4),%rax
mov    %rax,0xd8(%rsp)
lea    0x0(%r13,%rdx,4),%rbx
mov    %rbx,0x40(%rsp)
mov    0x20(%rsp),%rbx
lea    0x0(%r13,%rbx,4),%r15
mov    %r15,0xd0(%rsp)
mov    0x18(%rsp),%rbx
lea    0x0(,%rbx,4),%rbx
add    %r13,%rbx
cmp    %r8,%rbp
setb   0x20(%rsp)
cmp    %rcx,%rsi
setb   0x18(%rsp)
cmp    %rax,%rbp
setb   0x7(%rsp)
cmp    %rcx,%r14
setb   0x6(%rsp)
cmp    %r15,%rbp
setb   0x5(%rsp)
cmp    %rcx,0x40(%rsp)
setb   0x4(%rsp)
cmp    %rbx,%rbp
mov    0x28(%rsp),%rax
lea    (%rdx,%rax,1),%rdx
lea    0x0(%r13,%rdx,4),%rdx
setb   %bpl
cmp    %rcx,%rdx
setb   %r13b
cmp    0xd8(%rsp),%rsi
setb   %cl
cmp    %r8,%r14
setb   %r15b
cmp    0xd0(%rsp),%rsi
setb   %al
cmp    %r8,0x40(%rsp)
setb   %r14b
cmp    %rbx,%rsi
setb   %sil
cmp    %r8,%rdx
setb   %r8b
mov    0x18(%rsp),%dl
test   %dl,0x20(%rsp)
jne    171a <sobel2cf+0x60a>
mov    0x6(%rsp),%dl
and    %dl,0x7(%rsp)
mov    $0x1,%ebx
jne    170b <sobel2cf+0x5fb>
mov    0x4(%rsp),%dl
and    %dl,0x5(%rsp)
jne    170b <sobel2cf+0x5fb>
and    %r13b,%bpl
jne    170b <sobel2cf+0x5fb>
and    %r15b,%cl
mov    0x10(%rsp),%rbp
jne    1701 <sobel2cf+0x5f1>
and    %r14b,%al
mov    0x8(%rsp),%rcx
jne    137e <sobel2cf+0x26e>
and    %r8b,%sil
jne    137e <sobel2cf+0x26e>
xor    %ebx,%ebx
mov    0x90(%rsp),%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x8(%r11,%rbx,4),%xmm0
movups (%r11,%rbx,4),%xmm1
movups -0x8(%rdi,%rbx,4),%xmm2
subps  %xmm2,%xmm1
movups (%rdi,%rbx,4),%xmm2
subps  %xmm2,%xmm0
movaps %xmm1,%xmm2
subps  %xmm0,%xmm2
cvtps2pd %xmm2,%xmm3
movhlps %xmm2,%xmm2
cvtps2pd %xmm2,%xmm2
cvtps2pd -0x8(%r9,%rbx,4),%xmm4
addpd  %xmm4,%xmm4
cvtps2pd (%r9,%rbx,4),%xmm5
subpd  %xmm4,%xmm3
addpd  %xmm5,%xmm5
cvtps2pd 0x8(%r9,%rbx,4),%xmm4
subpd  %xmm5,%xmm2
addpd  %xmm4,%xmm4
addpd  %xmm2,%xmm4
addpd  %xmm3,%xmm5
cvtpd2ps %xmm5,%xmm2
cvtpd2ps %xmm4,%xmm3
unpcklpd %xmm3,%xmm2
addps  %xmm1,%xmm0
cvtps2pd %xmm0,%xmm1
movupd %xmm2,(%r12,%rbx,4)
movhlps %xmm0,%xmm0
cvtps2pd %xmm0,%xmm0
cvtps2pd -0x4(%rdi,%rbx,4),%xmm2
cvtps2pd 0x4(%rdi,%rbx,4),%xmm3
addpd  %xmm3,%xmm3
subpd  %xmm3,%xmm0
addpd  %xmm2,%xmm2
subpd  %xmm2,%xmm1
cvtps2pd 0x4(%r11,%rbx,4),%xmm2
cvtps2pd -0x4(%r11,%rbx,4),%xmm3
addpd  %xmm3,%xmm3
addpd  %xmm1,%xmm3
addpd  %xmm2,%xmm2
addpd  %xmm0,%xmm2
cvtpd2ps %xmm2,%xmm0
cvtpd2ps %xmm3,%xmm1
unpcklpd %xmm0,%xmm1
movupd %xmm1,(%r10,%rbx,4)
add    $0x4,%rbx
cmp    %rbx,%rax
jne    1620 <sobel2cf+0x510>
mov    0x88(%rsp),%rbx
cmp    %rax,0x38(%rsp)
je     12c0 <sobel2cf+0x1b0>
jmp    137e <sobel2cf+0x26e>
mov    0x8(%rsp),%rcx
jmp    137e <sobel2cf+0x26e>
mov    0x10(%rsp),%rbp
mov    0x8(%rsp),%rcx
jmp    137e <sobel2cf+0x26e>
mov    0x10(%rsp),%rbp
mov    0x8(%rsp),%rcx
mov    $0x1,%ebx
jmp    137e <sobel2cf+0x26e>
add    $0xf8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @sobel2cf(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 float
%12 = alloca float
%13 = alloca i32
%14 = alloca i32
%15 = alloca float*
%16 = alloca float*
%17 = alloca float*
%18 = alloca float*
%19 = alloca float*
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 0, i32* %13
br label %20
20: ; preds = %29, %5
%21 = load i32, i32* %13
%22 = load i32, i32* %9
%23 = icmp slt i32 %21, %22
br i1 %23, label %24, label %32
24: ; preds = %20
%25 = load float*, float** %7
%26 = load i32, i32* %13
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds float, float* %25, i64 %27
store float 0.000000e+00, float* %28
br label %29
29: ; preds = %24
%30 = load i32, i32* %13
%31 = add nsw i32 %30, 1
store i32 %31, i32* %13
br label %20
32: ; preds = %20
store i32 0, i32* %13
br label %33
33: ; preds = %42, %32
%34 = load i32, i32* %13
%35 = load i32, i32* %9
%36 = icmp slt i32 %34, %35
br i1 %36, label %37, label %45
37: ; preds = %33
%38 = load float*, float** %8
%39 = load i32, i32* %13
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds float, float* %38, i64 %40
store float 0.000000e+00, float* %41
br label %42
42: ; preds = %37
%43 = load i32, i32* %13
%44 = add nsw i32 %43, 1
store i32 %44, i32* %13
br label %33
45: ; preds = %33
%46 = load i32, i32* %9
%47 = load i32, i32* %10
%48 = mul nsw i32 %46, %47
%49 = load i32, i32* %9
%50 = sub nsw i32 %48, %49
store i32 %50, i32* %13
br label %51
51: ; preds = %62, %45
%52 = load i32, i32* %13
%53 = load i32, i32* %9
%54 = load i32, i32* %10
%55 = mul nsw i32 %53, %54
%56 = icmp slt i32 %52, %55
br i1 %56, label %57, label %65
57: ; preds = %51
%58 = load float*, float** %7
%59 = load i32, i32* %13
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds float, float* %58, i64 %60
store float 0.000000e+00, float* %61
br label %62
62: ; preds = %57
%63 = load i32, i32* %13
%64 = add nsw i32 %63, 1
store i32 %64, i32* %13
br label %51
65: ; preds = %51
%66 = load i32, i32* %9
%67 = load i32, i32* %10
%68 = mul nsw i32 %66, %67
%69 = load i32, i32* %9
%70 = sub nsw i32 %68, %69
store i32 %70, i32* %13
br label %71
71: ; preds = %82, %65
%72 = load i32, i32* %13
%73 = load i32, i32* %9
%74 = load i32, i32* %10
%75 = mul nsw i32 %73, %74
%76 = icmp slt i32 %72, %75
br i1 %76, label %77, label %85
77: ; preds = %71
%78 = load float*, float** %8
%79 = load i32, i32* %13
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds float, float* %78, i64 %80
store float 0.000000e+00, float* %81
br label %82
82: ; preds = %77
%83 = load i32, i32* %13
%84 = add nsw i32 %83, 1
store i32 %84, i32* %13
br label %71
85: ; preds = %71
store i32 1, i32* %14
br label %86
86: ; preds = %227, %85
%87 = load i32, i32* %14
%88 = load i32, i32* %10
%89 = sub nsw i32 %88, 1
%90 = icmp slt i32 %87, %89
br i1 %90, label %91, label %230
91: ; preds = %86
%92 = load float*, float** %6
%93 = load i32, i32* %14
%94 = load i32, i32* %9
%95 = mul nsw i32 %93, %94
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds float, float* %92, i64 %96
%98 = load i32, i32* %9
%99 = sext i32 %98 to i64
%100 = sub i64 0, %99
%101 = getelementptr inbounds float, float* %97, i64 %100
store float* %101, float** %15
%102 = load float*, float** %6
%103 = load i32, i32* %14
%104 = load i32, i32* %9
%105 = mul nsw i32 %103, %104
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds float, float* %102, i64 %106
store float* %107, float** %16
%108 = load float*, float** %6
%109 = load i32, i32* %14
%110 = load i32, i32* %9
%111 = mul nsw i32 %109, %110
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds float, float* %108, i64 %112
%114 = load i32, i32* %9
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds float, float* %113, i64 %115
store float* %116, float** %17
%117 = load float*, float** %7
%118 = load i32, i32* %14
%119 = load i32, i32* %9
%120 = mul nsw i32 %118, %119
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds float, float* %117, i64 %121
store float* %122, float** %18
%123 = load float*, float** %8
%124 = load i32, i32* %14
%125 = load i32, i32* %9
%126 = mul nsw i32 %124, %125
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds float, float* %123, i64 %127
store float* %128, float** %19
%129 = load float*, float** %18
%130 = getelementptr inbounds float, float* %129, i64 0
store float 0.000000e+00, float* %130
%131 = load float*, float** %18
%132 = load i32, i32* %9
%133 = sub nsw i32 %132, 1
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds float, float* %131, i64 %134
store float 0.000000e+00, float* %135
%136 = load float*, float** %19
%137 = getelementptr inbounds float, float* %136, i64 0
store float 0.000000e+00, float* %137
%138 = load float*, float** %19
%139 = load i32, i32* %9
%140 = sub nsw i32 %139, 1
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds float, float* %138, i64 %141
store float 0.000000e+00, float* %142
store i32 1, i32* %13
br label %143
143: ; preds = %223, %91
%144 = load i32, i32* %13
%145 = load i32, i32* %9
%146 = sub nsw i32 %145, 1
%147 = icmp slt i32 %144, %146
br i1 %147, label %148, label %226
148: ; preds = %143
%149 = load float*, float** %17
%150 = load i32, i32* %13
%151 = add nsw i32 %150, 1
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds float, float* %149, i64 %152
%154 = load float, float* %153
%155 = load float*, float** %15
%156 = load i32, i32* %13
%157 = sub nsw i32 %156, 1
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds float, float* %155, i64 %158
%160 = load float, float* %159
%161 = fsub float %154, %160
store float %161, float* %11
%162 = load float*, float** %17
%163 = load i32, i32* %13
%164 = sub nsw i32 %163, 1
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds float, float* %162, i64 %165
%167 = load float, float* %166
%168 = load float*, float** %15
%169 = load i32, i32* %13
%170 = add nsw i32 %169, 1
%171 = sext i32 %170 to i64
%172 = getelementptr inbounds float, float* %168, i64 %171
%173 = load float, float* %172
%174 = fsub float %167, %173
store float %174, float* %12
%175 = load float, float* %11
%176 = load float, float* %12
%177 = fsub float %175, %176
%178 = fpext float %177 to double
%179 = load float*, float** %16
%180 = load i32, i32* %13
%181 = sub nsw i32 %180, 1
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds float, float* %179, i64 %182
%184 = load float, float* %183
%185 = fpext float %184 to double
%186 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %185, double %178)
%187 = load float*, float** %16
%188 = load i32, i32* %13
%189 = add nsw i32 %188, 1
%190 = sext i32 %189 to i64
%191 = getelementptr inbounds float, float* %187, i64 %190
%192 = load float, float* %191
%193 = fpext float %192 to double
%194 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %193, double %186)
%195 = fptrunc double %194 to float
%196 = load float*, float** %18
%197 = load i32, i32* %13
%198 = sext i32 %197 to i64
%199 = getelementptr inbounds float, float* %196, i64 %198
store float %195, float* %199
%200 = load float, float* %11
%201 = load float, float* %12
%202 = fadd float %200, %201
%203 = fpext float %202 to double
%204 = load float*, float** %15
%205 = load i32, i32* %13
%206 = sext i32 %205 to i64
%207 = getelementptr inbounds float, float* %204, i64 %206
%208 = load float, float* %207
%209 = fpext float %208 to double
%210 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %209, double %203)
%211 = load float*, float** %17
%212 = load i32, i32* %13
%213 = sext i32 %212 to i64
%214 = getelementptr inbounds float, float* %211, i64 %213
%215 = load float, float* %214
%216 = fpext float %215 to double
%217 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %216, double %210)
%218 = fptrunc double %217 to float
%219 = load float*, float** %19
%220 = load i32, i32* %13
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds float, float* %219, i64 %221
store float %218, float* %222
br label %223
223: ; preds = %148
%224 = load i32, i32* %13
%225 = add nsw i32 %224, 1
store i32 %225, i32* %13
br label %143
226: ; preds = %143
br label %227
227: ; preds = %226
%228 = load i32, i32* %14
%229 = add nsw i32 %228, 1
store i32 %229, i32* %14
br label %86
230: ; preds = %86
ret void
}

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