#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 */
int abs(int);
double cos(double);
int /*<<< orphan*/ printf(char *, int, int);
double sin(double);
void reals_(double *a, double *b, int n, int isn) {
  int inc, j, k, lim, mm, ml, nf, nk, nh;
  double aa, ab, ba, bb, cd, cn, dr, em, rad, re, sd, sn;
  double xx;
  a--;
  b--;
  inc = abs(isn);
  nf = abs(n);
  if (nf * isn == 0) {
    printf("\nerror - zero in reals parameters : %d : %d ", n, isn);
    return;
  }
  nk = (nf * inc) + 2;
  nh = nk / 2;
  rad = 0.785398163397448278900;
  dr = -4.0 / (double)(nf);
  xx = sin((double)0.5 * dr * rad);
  cd = 2.0 * xx * xx;
  sd = sin(dr * rad);
  lim = 32;
  mm = lim;
  ml = 0;
  sn = 0.0;
  if (isn < 0) {
    cn = 1.0;
    a[nk - 1] = a[1];
    b[nk - 1] = b[1];
  } else {
    cn = -1.0;
    sd = -sd;
  }
  for (j = 1; j <= nh; j += inc) {
    k = nk - j;
    aa = a[j] + a[k];
    ab = a[j] - a[k];
    ba = b[j] + b[k];
    bb = b[j] - b[k];
    re = (cn * ba) + (sn * ab);
    em = (sn * ba) - (cn * ab);
    b[k] = (double)((em - bb) * 0.5);
    b[j] = (double)((em + bb) * 0.5);
    a[k] = (double)((aa - re) * 0.5);
    a[j] = (double)((aa + re) * 0.5);
    ml++;
    if (ml != mm) {
      aa = cn - ((cd * cn) + (sd * sn));
      sn = ((sd * cn) - (cd * sn)) + sn;
      cn = aa;
    } else {
      mm += lim;
      sn = ((double)ml) * dr * rad;
      cn = cos(sn);
      if (isn > 0)
        cn = -cn;
      sn = sin(sn);
    }
  }
  return;
}


x86 assembly (clang, -O0):
<reals_>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%edi
call   1030 <abs@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%edi
call   1030 <abs@plt>
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
imul   -0x18(%rbp),%eax
cmp    $0x0,%eax
jne    11ae <reals_+0x6e>
mov    -0x14(%rbp),%esi
mov    -0x18(%rbp),%edx
lea    0xe8c(%rip),%rdi
call   1040 <printf@plt>
jmp    15a3 <reals_+0x463>
mov    -0x34(%rbp),%eax
imul   -0x1c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x3c(%rbp)
movsd  0xe47(%rip),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
cvtsi2sdl -0x34(%rbp),%xmm1
movsd  0xe2a(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  0xe11(%rip),%xmm0
mulsd  -0x78(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
call   1050 <sin@plt>
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0xde7(%rip),%xmm0
mulsd  -0xa8(%rbp),%xmm0
ff
mulsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0x68(%rbp)
movsd  -0x78(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
call   1050 <sin@plt>
movsd  %xmm0,-0x98(%rbp)
ff
movl   $0x20,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
cmpl   $0x0,-0x18(%rbp)
jge    12b9 <reals_+0x179>
movsd  0xdaf(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12ed <reals_+0x1ad>
movsd  0xd5f(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jg     159e <reals_+0x45e>
mov    -0x38(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x70(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
subsd  -0x60(%rbp),%xmm0
movsd  0xc0f(%rip),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x80(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  0xbec(%rip),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
subsd  -0x90(%rbp),%xmm0
ff
movsd  0xbc6(%rip),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x48(%rbp),%xmm0
addsd  -0x90(%rbp),%xmm0
ff
movsd  0xba0(%rip),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
je     1516 <reals_+0x3d6>
movsd  -0x70(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
movsd  -0x70(%rbp),%xmm3
movsd  -0x98(%rbp),%xmm2
ff
mulsd  -0xa0(%rbp),%xmm2
ff
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0x70(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
jmp    158b <reals_+0x44b>
mov    -0x28(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cvtsi2sdl -0x30(%rbp),%xmm0
mulsd  -0x78(%rbp),%xmm0
mulsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
call   1060 <cos@plt>
movsd  %xmm0,-0x70(%rbp)
cmpl   $0x0,-0x18(%rbp)
jle    1576 <reals_+0x436>
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xa0(%rbp),%xmm0
ff
call   1050 <sin@plt>
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    1590 <reals_+0x450>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    12f4 <reals_+0x1b4>
jmp    15a3 <reals_+0x463>
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<reals_>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %ecx,%ebx
mov    %ecx,%r15d
neg    %r15d
cmovs  %ecx,%r15d
mov    %edx,%eax
neg    %eax
cmovs  %edx,%eax
mov    %eax,%ecx
imul   %ebx,%ecx
test   %ecx,%ecx
je     11e4 <reals_+0xb4>
mov    %rsi,%r13
mov    %rdi,%rbp
mov    %r15d,%r14d
imul   %eax,%r14d
lea    0x2(%r14),%r12d
cvtsi2sd %eax,%xmm0
movsd  0xe85(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movsd  0xe7b(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  0xe77(%rip),%xmm0
call   1040 <sin@plt>
movapd %xmm0,%xmm1
addsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movapd %xmm1,0x30(%rsp)
movsd  0x8(%rsp),%xmm0
mulsd  0xe52(%rip),%xmm0
call   1040 <sin@plt>
movapd %xmm0,%xmm8
test   %ebx,%ebx
mov    %ebx,0x4(%rsp)
js     1202 <reals_+0xd2>
xorpd  0xe57(%rip),%xmm8
movsd  0xe36(%rip),%xmm9
jmp    1226 <reals_+0xf6>
lea    0xe55(%rip),%rdi
mov    %edx,%esi
mov    %ebx,%edx
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <printf@plt>
movsd  0x0(%rbp),%xmm0
mov    %r14d,%eax
movsd  %xmm0,0x0(%rbp,%rax,8)
movsd  0x0(%r13),%xmm0
movsd  %xmm0,0x0(%r13,%rax,8)
movsd  0xdfa(%rip),%xmm9
movapd 0xe02(%rip),%xmm0
xorpd  0x30(%rsp),%xmm0
movapd %xmm0,0x50(%rsp)
mov    %r15d,%edx
mov    %r12d,%r15d
mov    %r12d,%eax
shr    %r15d
lea    -0x10(,%rax,8),%rbx
ff
lea    0x0(,%rdx,8),%rsi
mov    $0x20,%edi
xorpd  %xmm0,%xmm0
mov    $0x1,%r12d
mov    $0x1,%r14d
movsd  0xd95(%rip),%xmm7
movapd %xmm8,0x60(%rsp)
mov    %rbp,0x28(%rsp)
mov    %rsi,0x20(%rsp)
mov    %r13,0x18(%rsp)
jmp    12e1 <reals_+0x1b1>
nopl   0x0(%rax,%rax,1)
movapd %xmm0,0x40(%rsp)
movsd  0x10(%rsp),%xmm0
add    $0x20,%ebp
call   1040 <sin@plt>
mov    %ebp,%edi
movapd 0x60(%rsp),%xmm8
movapd 0x40(%rsp),%xmm9
mov    %r13,%rdx
mov    0x18(%rsp),%r13
mov    0x28(%rsp),%rbp
mov    0x20(%rsp),%rsi
movsd  0xd3a(%rip),%xmm7
add    %rdx,%r12
sub    %rsi,%rbx
add    $0x1,%r14d
cmp    %r12d,%r15d
jb     13fe <reals_+0x2ce>
mov    %r12d,%eax
shl    $0x3,%rax
movsd  -0x8(%rbp,%rax,1),%xmm2
movsd  0x0(%rbp,%rbx,1),%xmm3
movapd %xmm2,%xmm1
addsd  %xmm3,%xmm1
subsd  %xmm3,%xmm2
movsd  -0x8(%r13,%rax,1),%xmm3
movsd  0x0(%r13,%rbx,1),%xmm4
movapd %xmm3,%xmm5
addsd  %xmm4,%xmm5
subsd  %xmm4,%xmm3
movapd %xmm0,%xmm4
mulsd  %xmm2,%xmm4
movapd %xmm9,%xmm6
mulsd  %xmm5,%xmm6
addsd  %xmm4,%xmm6
mulsd  %xmm9,%xmm2
mulsd  %xmm0,%xmm5
subsd  %xmm2,%xmm5
movapd %xmm5,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm7,%xmm2
movsd  %xmm2,0x0(%r13,%rbx,1)
addsd  %xmm3,%xmm5
mulsd  %xmm7,%xmm5
movsd  %xmm5,-0x8(%r13,%rax,1)
movapd %xmm1,%xmm2
subsd  %xmm6,%xmm2
mulsd  %xmm7,%xmm2
movsd  %xmm2,0x0(%rbp,%rbx,1)
addsd  %xmm1,%xmm6
mulsd  %xmm7,%xmm6
movsd  %xmm6,-0x8(%rbp,%rax,1)
cmp    %edi,%r14d
jne    13c0 <reals_+0x290>
mov    %rdx,%r13
mov    %edi,%ebp
xorps  %xmm0,%xmm0
cvtsi2sd %edi,%xmm0
mulsd  0x8(%rsp),%xmm0
mulsd  0xc73(%rip),%xmm0
movsd  %xmm0,0x10(%rsp)
call   1050 <cos@plt>
cmpl   $0x0,0x4(%rsp)
jle    1290 <reals_+0x160>
xorpd  0xc75(%rip),%xmm0
jmp    1290 <reals_+0x160>
movapd %xmm8,%xmm1
mulsd  %xmm0,%xmm1
movapd 0x30(%rsp),%xmm2
mulsd  %xmm9,%xmm2
addsd  %xmm1,%xmm2
movapd %xmm0,%xmm1
mulsd  0x50(%rsp),%xmm1
movapd %xmm8,%xmm3
mulsd  %xmm9,%xmm3
subsd  %xmm2,%xmm9
addsd  %xmm1,%xmm3
addsd  %xmm3,%xmm0
jmp    12ce <reals_+0x19e>
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [45 x i8] c"\0Aerror - zero in reals parameters : %d : %d \00"
define void @reals_(double* nocapture %0, double* nocapture %1, i32 %2, i32 %3) {
%5 = getelementptr inbounds double, double* %0, i64 -1
%6 = getelementptr inbounds double, double* %1, i64 -1
%7 = tail call i32 @llvm.abs.i32(i32 %3, i1 true)
%8 = tail call i32 @llvm.abs.i32(i32 %2, i1 true)
%9 = mul nsw i32 %8, %3
%10 = icmp eq i32 %9, 0
br i1 %10, label %11, label %13
11: ; preds = %4
%12 = tail call i32 @printf(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str, i64 0, i64 0), i32 %2, i32 %3)
br label %101
13: ; preds = %4
%14 = mul nsw i32 %7, %8
%15 = add nuw nsw i32 %14, 2
%16 = lshr i32 %15, 1
%17 = sitofp i32 %8 to double
%18 = fdiv double -4.000000e+00, %17
%19 = fmul double %18, 5.000000e-01
%20 = fmul double %19, 0x3FE921FB54442D18
%21 = tail call double @sin(double %20)
%22 = fmul double %21, 2.000000e+00
%23 = fmul double %21, %22
%24 = fmul double %18, 0x3FE921FB54442D18
%25 = tail call double @sin(double %24)
%26 = icmp slt i32 %3, 0
br i1 %26, label %27, label %34
27: ; preds = %13
%28 = load double, double* %0
%29 = add nuw nsw i32 %14, 1
%30 = zext i32 %29 to i64
%31 = getelementptr inbounds double, double* %5, i64 %30
store double %28, double* %31
%32 = load double, double* %1
%33 = getelementptr inbounds double, double* %6, i64 %30
store double %32, double* %33
br label %36
34: ; preds = %13
%35 = fneg double %25
br label %36
36: ; preds = %27, %34
%37 = phi double [ 1.000000e+00, %27 ], [ -1.000000e+00, %34 ]
%38 = phi double [ %25, %27 ], [ %35, %34 ]
%39 = fneg double %23
%40 = icmp sgt i32 %3, 0
%41 = zext i32 %7 to i64
%42 = zext i32 %15 to i64
br label %43
43: ; preds = %36, %94
%44 = phi i64 [ 1, %36 ], [ %98, %94 ]
%45 = phi double [ 0.000000e+00, %36 ], [ %97, %94 ]
%46 = phi i32 [ 32, %36 ], [ %96, %94 ]
%47 = phi i32 [ 0, %36 ], [ %76, %94 ]
%48 = phi double [ %37, %36 ], [ %95, %94 ]
%49 = sub nsw i64 %42, %44
%50 = and i64 %44, 4294967295
%51 = getelementptr inbounds double, double* %5, i64 %50
%52 = load double, double* %51
%53 = getelementptr inbounds double, double* %5, i64 %49
%54 = load double, double* %53
%55 = fadd double %52, %54
%56 = fsub double %52, %54
%57 = getelementptr inbounds double, double* %6, i64 %50
%58 = load double, double* %57
%59 = getelementptr inbounds double, double* %6, i64 %49
%60 = load double, double* %59
%61 = fadd double %58, %60
%62 = fsub double %58, %60
%63 = fmul double %45, %56
%64 = tail call double @llvm.fmuladd.f64(double %48, double %61, double %63)
%65 = fneg double %48
%66 = fmul double %56, %65
%67 = tail call double @llvm.fmuladd.f64(double %45, double %61, double %66)
%68 = fsub double %67, %62
%69 = fmul double %68, 5.000000e-01
store double %69, double* %59
%70 = fadd double %62, %67
%71 = fmul double %70, 5.000000e-01
store double %71, double* %57
%72 = fsub double %55, %64
%73 = fmul double %72, 5.000000e-01
store double %73, double* %53
%74 = fadd double %55, %64
%75 = fmul double %74, 5.000000e-01
store double %75, double* %51
%76 = add nuw nsw i32 %47, 1
%77 = icmp eq i32 %76, %46
br i1 %77, label %85, label %78
78: ; preds = %43
%79 = fmul double %38, %45
%80 = tail call double @llvm.fmuladd.f64(double %23, double %48, double %79)
%81 = fsub double %48, %80
%82 = fmul double %45, %39
%83 = tail call double @llvm.fmuladd.f64(double %38, double %48, double %82)
%84 = fadd double %45, %83
br label %94
85: ; preds = %43
%86 = add nsw i32 %46, 32
%87 = sitofp i32 %46 to double
%88 = fmul double %18, %87
%89 = fmul double %88, 0x3FE921FB54442D18
%90 = tail call double @cos(double %89)
%91 = fneg double %90
%92 = select i1 %40, double %91, double %90
%93 = tail call double @sin(double %89)
br label %94
94: ; preds = %78, %85
%95 = phi double [ %81, %78 ], [ %92, %85 ]
%96 = phi i32 [ %46, %78 ], [ %86, %85 ]
%97 = phi double [ %84, %78 ], [ %93, %85 ]
%98 = add i64 %44, %41
%99 = trunc i64 %98 to i32
%100 = icmp ult i32 %16, %99
br i1 %100, label %101, label %43
101: ; preds = %94, %11
ret void
}