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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double cos(double);
int /*<<< orphan*/ incrementRadon(double *, double, double);
double sin(double);
void radon(double *pPtr, double *iPtr, double *thetaPtr, double *xCosTable,
           double *ySinTable, int M, int N, int xOrigin, int yOrigin,
           int numAngles, int rFirst, int rSize) {
  int k, m, n;
  double angle;
  double cosine, sine;
  double *pr;
  double *pixelPtr;
  double pixel;
  double x, y;
  double r;
  for (k = 0; k < numAngles; k++) {
    angle = thetaPtr[k];
    pr = pPtr + k * rSize;
    cosine = cos(angle);
    sine = sin(angle);
    for (n = 0; n < N; n++) {
      x = n - xOrigin;
      xCosTable[2 * n] = (x - 0.25) * cosine;
      xCosTable[2 * n + 1] = (x + 0.25) * cosine;
    }
    for (m = 0; m < M; m++) {
      y = yOrigin - m;
      ySinTable[2 * m] = (y - 0.25) * sine;
      ySinTable[2 * m + 1] = (y + 0.25) * sine;
    }
    pixelPtr = iPtr;
    for (n = 0; n < N; n++) {
      for (m = 0; m < M; m++) {
        pixel = *pixelPtr++;
        if (pixel != 0.0) {
          pixel *= 0.25;
          r = xCosTable[2 * n] + ySinTable[2 * m] - rFirst;
          incrementRadon(pr, pixel, r);
          r = xCosTable[2 * n + 1] + ySinTable[2 * m] - rFirst;
          incrementRadon(pr, pixel, r);
          r = xCosTable[2 * n] + ySinTable[2 * m + 1] - rFirst;
          incrementRadon(pr, pixel, r);
          r = xCosTable[2 * n + 1] + ySinTable[2 * m + 1] - rFirst;
          incrementRadon(pr, pixel, r);
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<radon>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    0x28(%rbp),%eax
jge    148d <radon+0x35d>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   0x38(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
call   1050 <cos@plt>
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
call   1040 <sin@plt>
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    1240 <radon+0x110>
mov    -0x38(%rbp),%eax
sub    0x18(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  0xe10(%rip),%xmm1
subsd  %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0xded(%rip),%xmm0
addsd  -0x70(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11c8 <radon+0x98>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    12bf <radon+0x18f>
mov    0x20(%rbp),%eax
sub    -0x34(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  0xd91(%rip),%xmm1
subsd  %xmm1,%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0xd6e(%rip),%xmm0
addsd  -0x78(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1247 <radon+0x117>
mov    -0x10(%rbp),%rax
mov    %rax,-0x60(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    147a <radon+0x34a>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1467 <radon+0x337>
mov    -0x60(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x60(%rbp)
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1322 <radon+0x1f2>
jp     1322 <radon+0x1f2>
jmp    1454 <radon+0x324>
movsd  0xcd6(%rip),%xmm0
mulsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl 0x30(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x58(%rbp),%rdi
movsd  -0x68(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
call   1030 <incrementRadon@plt>
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl 0x30(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x58(%rbp),%rdi
movsd  -0x68(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
call   1030 <incrementRadon@plt>
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl 0x30(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x58(%rbp),%rdi
movsd  -0x68(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
call   1030 <incrementRadon@plt>
mov    -0x20(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl 0x30(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x58(%rbp),%rdi
movsd  -0x68(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
call   1030 <incrementRadon@plt>
jmp    1459 <radon+0x329>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    12e1 <radon+0x1b1>
jmp    146c <radon+0x33c>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    12ce <radon+0x19e>
jmp    147f <radon+0x34f>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    116c <radon+0x3c>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<radon>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x108,%rsp
mov    %r9d,0x4(%rsp)
mov    %r8,0x18(%rsp)
mov    %rcx,0x10(%rsp)
mov    %rdx,0xc8(%rsp)
mov    %rsi,0xb8(%rsp)
mov    %rdi,0xb0(%rsp)
mov    0x158(%rsp),%eax
test   %eax,%eax
jle    17cc <radon+0x69c>
mov    0x148(%rsp),%ecx
mov    0x140(%rsp),%ebx
cvtsi2sdl 0x160(%rsp),%xmm0
movsd  %xmm0,0x20(%rsp)
movslq 0x168(%rsp),%rdx
mov    %rdx,0xa8(%rsp)
mov    %eax,%eax
mov    %rax,0xc0(%rsp)
mov    %ebx,%eax
mov    0x4(%rsp),%edx
mov    %rax,0x28(%rsp)
and    $0xfffffffe,%eax
mov    %rax,0x98(%rsp)
add    $0xfffffffffffffffe,%rax
mov    %rax,0x90(%rsp)
mov    %rax,%rsi
shr    %rsi
add    $0x1,%rsi
mov    %edx,%eax
and    $0xfffffffe,%eax
mov    %rax,0x80(%rsp)
add    $0xfffffffffffffffe,%rax
mov    %rax,0x78(%rsp)
mov    %rax,%rdi
shr    %rdi
add    $0x1,%rdi
movd   %ecx,%xmm0
pshufd $0x50,%xmm0,%xmm7
mov    %rsi,%rax
mov    %rsi,0x88(%rsp)
and    $0xfffffffffffffffe,%rsi
mov    %rsi,0x68(%rsp)
movd   0x150(%rsp),%xmm0
pshufd $0x50,%xmm0,%xmm2
mov    %rdi,%rax
mov    %rdi,0x70(%rsp)
and    $0xfffffffffffffffe,%rdi
mov    %rdi,0x60(%rsp)
neg    %ecx
mov    %rcx,0xa0(%rsp)
mov    0x10(%rsp),%rax
add    $0x20,%rax
mov    %rax,0x58(%rsp)
mov    0x18(%rsp),%rax
add    $0x20,%rax
mov    %rax,0x50(%rsp)
mov    %rdx,0x30(%rsp)
lea    0x0(,%rdx,8),%rax
mov    %rax,0xd8(%rsp)
xor    %ebp,%ebp
movdqa %xmm7,0xe0(%rsp)
movdqa %xmm2,0xf0(%rsp)
mov    0x10(%rsp),%r14
jmp    12ae <radon+0x17e>
nopl   0x0(%rax)
mov    0x38(%rsp),%rbp
add    $0x1,%rbp
cmp    0xc0(%rsp),%rbp
mov    0x140(%rsp),%ebx
je     17cc <radon+0x69c>
mov    0xc8(%rsp),%rax
movsd  (%rax,%rbp,8),%xmm0
movsd  %xmm0,0x8(%rsp)
call   1050 <cos@plt>
movaps %xmm0,0x40(%rsp)
movsd  0x8(%rsp),%xmm0
call   1040 <sin@plt>
movapd 0x40(%rsp),%xmm12
test   %ebx,%ebx
movapd 0xd69(%rip),%xmm2
jle    1495 <radon+0x365>
cmp    $0x1,%ebx
jne    1300 <radon+0x1d0>
xor    %eax,%eax
jmp    1441 <radon+0x311>
nopl   0x0(%rax)
movapd %xmm12,%xmm1
unpcklpd %xmm12,%xmm1
cmpq   $0x0,0x90(%rsp)
je     178b <radon+0x65b>
mov    0x68(%rsp),%rcx
mov    0x58(%rsp),%rdx
xor    %eax,%eax
movdqa 0xcd3(%rip),%xmm2
movdqa 0xe0(%rsp),%xmm8
movapd 0xcd0(%rip),%xmm9
movapd 0xcd8(%rip),%xmm7
movdqa 0xcdf(%rip),%xmm10
movdqa 0xce6(%rip),%xmm11
nopw   0x0(%rax,%rax,1)
movdqa %xmm2,%xmm3
psubd  %xmm8,%xmm3
cvtdq2pd %xmm3,%xmm4
movapd %xmm4,%xmm5
addpd  %xmm9,%xmm5
mulpd  %xmm1,%xmm5
addpd  %xmm7,%xmm4
mulpd  %xmm1,%xmm4
movapd %xmm5,%xmm6
unpcklpd %xmm4,%xmm6
movhlps %xmm5,%xmm4
movups %xmm4,-0x10(%rdx)
movupd %xmm6,-0x20(%rdx)
paddd  %xmm10,%xmm3
cvtdq2pd %xmm3,%xmm3
movapd %xmm3,%xmm4
addpd  %xmm9,%xmm4
mulpd  %xmm1,%xmm4
addpd  %xmm7,%xmm3
mulpd  %xmm1,%xmm3
movapd %xmm4,%xmm5
unpcklpd %xmm3,%xmm5
movhlps %xmm4,%xmm3
movups %xmm3,0x10(%rdx)
movupd %xmm5,(%rdx)
add    $0x4,%rax
paddd  %xmm11,%xmm2
add    $0x40,%rdx
add    $0xfffffffffffffffe,%rcx
jne    1360 <radon+0x230>
testb  $0x1,0x88(%rsp)
01
je     1427 <radon+0x2f7>
psubd  %xmm8,%xmm2
cvtdq2pd %xmm2,%xmm2
movapd %xmm2,%xmm3
addpd  0xc17(%rip),%xmm3
mulpd  %xmm1,%xmm3
addpd  0xc1b(%rip),%xmm2
mulpd  %xmm1,%xmm2
shl    $0x4,%rax
movapd %xmm3,%xmm1
unpcklpd %xmm2,%xmm1
movhlps %xmm3,%xmm2
mov    0x10(%rsp),%rcx
movups %xmm2,0x10(%rcx,%rax,1)
movupd %xmm1,(%rcx,%rax,1)
mov    0x98(%rsp),%rcx
mov    %rcx,%rax
cmp    0x28(%rsp),%rcx
movapd 0xc11(%rip),%xmm2
je     1495 <radon+0x365>
unpcklpd %xmm12,%xmm12
mov    0xa0(%rsp),%rcx
add    %eax,%ecx
mov    0x28(%rsp),%rdx
sub    %rax,%rdx
shl    $0x4,%rax
add    0x10(%rsp),%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
unpcklpd %xmm1,%xmm1
addpd  %xmm2,%xmm1
mulpd  %xmm12,%xmm1
movupd %xmm1,(%rax)
add    $0x1,%ecx
add    $0x10,%rax
add    $0xffffffffffffffff,%rdx
jne    1470 <radon+0x340>
cmpl   $0x0,0x4(%rsp)
movdqa 0xf0(%rsp),%xmm2
movapd 0xb64(%rip),%xmm9
movapd 0xb6b(%rip),%xmm10
movdqa 0xb72(%rip),%xmm11
movdqa 0xb79(%rip),%xmm12
jle    1654 <radon+0x524>
cmpl   $0x1,0x4(%rsp)
jne    14f0 <radon+0x3c0>
xor    %eax,%eax
movapd 0xb72(%rip),%xmm3
jmp    1608 <radon+0x4d8>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movapd %xmm0,%xmm8
unpcklpd %xmm0,%xmm8
cmpq   $0x0,0x78(%rsp)
je     17b2 <radon+0x682>
mov    0x60(%rsp),%rcx
mov    0x50(%rsp),%rdx
xor    %eax,%eax
movdqa 0xae6(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
movdqa %xmm2,%xmm3
psubd  %xmm1,%xmm3
cvtdq2pd %xmm3,%xmm4
movapd %xmm4,%xmm5
addpd  %xmm9,%xmm5
mulpd  %xmm8,%xmm5
addpd  %xmm10,%xmm4
mulpd  %xmm8,%xmm4
movapd %xmm5,%xmm6
unpcklpd %xmm4,%xmm6
movhlps %xmm5,%xmm4
movups %xmm4,-0x10(%rdx)
movupd %xmm6,-0x20(%rdx)
psubd  %xmm11,%xmm3
cvtdq2pd %xmm3,%xmm3
movapd %xmm3,%xmm4
addpd  %xmm9,%xmm4
mulpd  %xmm8,%xmm4
addpd  %xmm10,%xmm3
mulpd  %xmm8,%xmm3
movapd %xmm4,%xmm5
unpcklpd %xmm3,%xmm5
movhlps %xmm4,%xmm3
movups %xmm3,0x10(%rdx)
movupd %xmm5,(%rdx)
add    $0x4,%rax
paddd  %xmm12,%xmm1
add    $0x40,%rdx
add    $0xfffffffffffffffe,%rcx
jne    1520 <radon+0x3f0>
testb  $0x1,0x70(%rsp)
je     15ee <radon+0x4be>
movdqa %xmm2,%xmm3
psubd  %xmm1,%xmm3
cvtdq2pd %xmm3,%xmm4
movapd %xmm4,%xmm3
addpd  0xa52(%rip),%xmm3
mulpd  %xmm8,%xmm3
addpd  0xa55(%rip),%xmm4
mulpd  %xmm8,%xmm4
shl    $0x4,%rax
movapd %xmm3,%xmm1
unpcklpd %xmm4,%xmm1
movhlps %xmm3,%xmm4
mov    0x18(%rsp),%rcx
movups %xmm4,0x10(%rcx,%rax,1)
movupd %xmm1,(%rcx,%rax,1)
mov    0x80(%rsp),%rcx
mov    %rcx,%rax
cmp    0x30(%rsp),%rcx
movapd 0xa4a(%rip),%xmm3
je     1654 <radon+0x524>
unpcklpd %xmm0,%xmm0
mov    0x150(%rsp),%ecx
sub    %eax,%ecx
mov    0x30(%rsp),%rdx
sub    %rax,%rdx
shl    $0x4,%rax
add    0x18(%rsp),%rax
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
unpcklpd %xmm1,%xmm1
addpd  %xmm3,%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,(%rax)
add    $0xffffffff,%ecx
add    $0x10,%rax
add    $0xffffffffffffffff,%rdx
jne    1630 <radon+0x500>
mov    %rbp,0x38(%rsp)
test   %ebx,%ebx
jle    1290 <radon+0x160>
mov    0x38(%rsp),%rax
imul   0xa8(%rsp),%rax
mov    0xb0(%rsp),%rcx
lea    (%rcx,%rax,8),%r12
xor    %eax,%eax
mov    0xb8(%rsp),%rcx
mov    %rcx,0x40(%rsp)
jmp    16ac <radon+0x57c>
nopl   0x0(%rax)
add    %r15,0x40(%rsp)
mov    0xd0(%rsp),%rax
add    $0x1,%rax
cmp    0x28(%rsp),%rax
je     1290 <radon+0x160>
cmpl   $0x0,0x4(%rsp)
jle    169d <radon+0x56d>
lea    (%rax,%rax,1),%r13
mov    %rax,0xd0(%rsp)
lea    (%rax,%rax,1),%rbx
add    $0x1,%rbx
xor    %r15d,%r15d
jmp    16de <radon+0x5ae>
nopl   0x0(%rax)
add    $0x8,%r15
cmp    %r15,0xd8(%rsp)
je     1690 <radon+0x560>
mov    0x40(%rsp),%rax
movsd  (%rax,%r15,1),%xmm0
ucomisd 0x977(%rip),%xmm0
jne    16f5 <radon+0x5c5>
jnp    16d0 <radon+0x5a0>
mulsd  0x963(%rip),%xmm0
movsd  (%r14,%r13,8),%xmm1
mov    0x18(%rsp),%rbp
addsd  0x0(%rbp,%r15,2),%xmm1
subsd  0x20(%rsp),%xmm1
mov    %r12,%rdi
movsd  %xmm0,0x8(%rsp)
call   1030 <incrementRadon@plt>
movsd  (%r14,%rbx,8),%xmm1
addsd  0x0(%rbp,%r15,2),%xmm1
subsd  0x20(%rsp),%xmm1
mov    %r12,%rdi
movsd  0x8(%rsp),%xmm0
call   1030 <incrementRadon@plt>
movsd  (%r14,%r13,8),%xmm1
addsd  0x8(%rbp,%r15,2),%xmm1
subsd  0x20(%rsp),%xmm1
mov    %r12,%rdi
movsd  0x8(%rsp),%xmm0
call   1030 <incrementRadon@plt>
movsd  (%r14,%rbx,8),%xmm1
addsd  0x8(%rbp,%r15,2),%xmm1
subsd  0x20(%rsp),%xmm1
mov    %r12,%rdi
movsd  0x8(%rsp),%xmm0
call   1030 <incrementRadon@plt>
jmp    16d0 <radon+0x5a0>
xor    %eax,%eax
movdqa 0x86b(%rip),%xmm2
movdqa 0xe0(%rsp),%xmm8
testb  $0x1,0x88(%rsp)
01
jne    13e4 <radon+0x2b4>
jmp    1427 <radon+0x2f7>
xor    %eax,%eax
movdqa 0x844(%rip),%xmm1
testb  $0x1,0x70(%rsp)
jne    15a6 <radon+0x476>
jmp    15ee <radon+0x4be>
add    $0x108,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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