#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 acos(double);
double cos(double);
double sqrt(double);
double gord(int n, double x) {
  double colat = acos(x);
  double c1 = 1.41421356237309504880;
  int i;
  double fn = (double)n;
  double ang = fn * colat;
  double s1 = 0.0;
  double c4 = 1.0;
  double a = -1.0;
  double b = 0.0;
  double fi;
  for (i = 1; i <= n; i++) {
    c1 = c1 * sqrt(1.0 - 1.0 / (4.0 * i * i));
  }
  for (i = 0; i <= n; i = i + 2) {
    if (i == n) {
      c4 = 0.5 * c4;
    }
    s1 = s1 + c4 * cos(ang);
    a = a + 2.0;
    b = b + 1.0;
    fi = (double)i;
    ang = colat * (fn - fi - 2.0);
    c4 = (a * (fn - b + 1.0) / (b * (fn + fn - a))) * c4;
  }
  return (s1 * c1);
}


x86 assembly (clang, -O0):
<gord>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1030 <acos@plt>
movsd  %xmm0,-0x18(%rbp)
movsd  0xeb6(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
cvtsi2sdl -0x4(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe80(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xe6b(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1215 <gord+0xe5>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
cvtsi2sdl -0x24(%rbp),%xmm1
movsd  0xe5c(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe27(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  0xe1b(%rip),%xmm0
subsd  %xmm1,%xmm0
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x68(%rbp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11a9 <gord+0x79>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1323 <gord+0x1f3>
mov    -0x24(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1246 <gord+0x116>
movsd  0xddc(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x38(%rbp),%xmm0
call   1040 <cos@plt>
movsd  -0x78(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x70(%rbp),%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xd9a(%rip),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xd70(%rip),%xmm0
addsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cvtsi2sdl -0x24(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
subsd  -0x60(%rbp),%xmm1
movsd  0xd5d(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
subsd  -0x58(%rbp),%xmm1
movsd  0xd21(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x58(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
addsd  -0x30(%rbp),%xmm2
subsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    121c <gord+0xec>
movsd  -0x40(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gord>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x58,%rsp
mov    %edi,%r15d
call   1030 <acos@plt>
movsd  %xmm0,0x38(%rsp)
test   %r15d,%r15d
jle    1172 <gord+0x42>
cmp    $0x1,%r15d
jne    117f <gord+0x4f>
movsd  0xead(%rip),%xmm0
movsd  0xe9d(%rip),%xmm3
test   $0x1,%r15b
jne    1292 <gord+0x162>
jmp    12db <gord+0x1ab>
movsd  0xe86(%rip),%xmm3
jmp    12db <gord+0x1ab>
mov    %r15d,%r14d
and    $0xfffffffe,%r14d
mov    $0x1,%eax
movsd  0xe6d(%rip),%xmm3
movsd  0xe75(%rip),%xmm2
movsd  0xe65(%rip),%xmm4
xorpd  %xmm5,%xmm5
jmp    11ef <gord+0xbf>
nopl   0x0(%rax)
movsd  %xmm6,0x10(%rsp)
call   1050 <sqrt@plt>
movsd  0x10(%rsp),%xmm6
xorpd  %xmm5,%xmm5
movsd  0xe3b(%rip),%xmm4
movsd  0xe3b(%rip),%xmm2
movsd  0x8(%rsp),%xmm3
mulsd  %xmm6,%xmm3
mulsd  %xmm0,%xmm3
lea    0x1(%rbx),%eax
cmp    %r14d,%ebx
je     1282 <gord+0x152>
mov    %eax,%ebp
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movapd %xmm0,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm0,%xmm1
movapd %xmm4,%xmm0
divsd  %xmm1,%xmm0
addsd  %xmm4,%xmm0
ucomisd %xmm5,%xmm0
movsd  %xmm3,0x8(%rsp)
jb     1230 <gord+0x100>
xorps  %xmm6,%xmm6
sqrtsd %xmm0,%xmm6
jmp    124d <gord+0x11d>
cs nopw 0x0(%rax,%rax,1)
nop
call   1050 <sqrt@plt>
xorpd  %xmm5,%xmm5
movsd  0xdc7(%rip),%xmm4
movsd  0xdc7(%rip),%xmm2
movapd %xmm0,%xmm6
lea    0x1(%rbp),%ebx
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
movapd %xmm0,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm0,%xmm1
movapd %xmm4,%xmm0
divsd  %xmm1,%xmm0
addsd  %xmm4,%xmm0
ucomisd %xmm5,%xmm0
jb     11b0 <gord+0x80>
sqrtsd %xmm0,%xmm0
jmp    11d5 <gord+0xa5>
add    $0x2,%ebp
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
test   $0x1,%r15b
je     12db <gord+0x1ab>
movsd  0xd76(%rip),%xmm1
mulsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movsd  0xd5e(%rip),%xmm2
movapd %xmm2,%xmm0
divsd  %xmm1,%xmm0
addsd  %xmm2,%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     12c6 <gord+0x196>
sqrtsd %xmm0,%xmm0
jmp    12d7 <gord+0x1a7>
movsd  %xmm3,0x8(%rsp)
call   1050 <sqrt@plt>
movsd  0x8(%rsp),%xmm3
mulsd  %xmm0,%xmm3
movsd  %xmm3,0x8(%rsp)
test   %r15d,%r15d
js     13ed <gord+0x2bd>
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
xorpd  %xmm4,%xmm4
movhpd 0xd1a(%rip),%xmm4
movapd %xmm0,%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x28(%rsp)
xor    %ebp,%ebp
xorpd  %xmm5,%xmm5
movsd  0xcee(%rip),%xmm1
movsd  %xmm0,0x30(%rsp)
xorpd  %xmm6,%xmm6
jmp    13bd <gord+0x28d>
nopl   0x0(%rax)
movsd  %xmm2,0x40(%rsp)
mulsd  0x38(%rsp),%xmm0
call   1040 <cos@plt>
movsd  0x40(%rsp),%xmm7
mulsd  %xmm7,%xmm0
movsd  0x50(%rsp),%xmm5
addsd  %xmm0,%xmm5
movapd 0x10(%rsp),%xmm4
addpd  0xcdd(%rip),%xmm4
movsd  0x30(%rsp),%xmm1
movapd %xmm1,%xmm0
movsd  0x48(%rsp),%xmm6
subsd  %xmm6,%xmm0
addsd  0xca9(%rip),%xmm0
subsd  %xmm4,%xmm1
addsd  0xc7d(%rip),%xmm1
movapd %xmm4,%xmm2
unpckhpd %xmm4,%xmm2
mulsd  %xmm2,%xmm1
movsd  0x28(%rsp),%xmm3
subsd  %xmm2,%xmm3
mulsd  %xmm4,%xmm3
divsd  %xmm3,%xmm1
mulsd  %xmm7,%xmm1
addsd  0xc7b(%rip),%xmm6
add    $0x2,%ebp
cmp    %r15d,%ebp
jg     13f1 <gord+0x2c1>
movsd  %xmm6,0x48(%rsp)
movsd  %xmm5,0x50(%rsp)
movapd %xmm4,0x10(%rsp)
movapd %xmm1,%xmm2
mulsd  0xc45(%rip),%xmm2
cmp    %ebp,%r15d
je     1330 <gord+0x200>
movapd %xmm1,%xmm2
jmp    1330 <gord+0x200>
xorpd  %xmm5,%xmm5
movsd  0x8(%rsp),%xmm0
mulsd  %xmm5,%xmm0
add    $0x58,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @gord(i32 %0, double %1) {
%3 = alloca i32
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca i32
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
store i32 %0, i32* %3
store double %1, double* %4
%15 = load double, double* %4
%16 = call double @acos(double %15)
store double %16, double* %5
store double 0x3FF6A09E667F3BCD, double* %6
%17 = load i32, i32* %3
%18 = sitofp i32 %17 to double
store double %18, double* %8
%19 = load double, double* %8
%20 = load double, double* %5
%21 = fmul double %19, %20
store double %21, double* %9
store double 0.000000e+00, double* %10
store double 1.000000e+00, double* %11
store double -1.000000e+00, double* %12
store double 0.000000e+00, double* %13
store i32 1, i32* %7
br label %22
22: ; preds = %38, %2
%23 = load i32, i32* %7
%24 = load i32, i32* %3
%25 = icmp sle i32 %23, %24
br i1 %25, label %26, label %41
26: ; preds = %22
%27 = load double, double* %6
%28 = load i32, i32* %7
%29 = sitofp i32 %28 to double
%30 = fmul double 4.000000e+00, %29
%31 = load i32, i32* %7
%32 = sitofp i32 %31 to double
%33 = fmul double %30, %32
%34 = fdiv double 1.000000e+00, %33
%35 = fsub double 1.000000e+00, %34
%36 = call double @sqrt(double %35)
%37 = fmul double %27, %36
store double %37, double* %6
br label %38
38: ; preds = %26
%39 = load i32, i32* %7
%40 = add nsw i32 %39, 1
store i32 %40, i32* %7
br label %22
41: ; preds = %22
store i32 0, i32* %7
br label %42
42: ; preds = %87, %41
%43 = load i32, i32* %7
%44 = load i32, i32* %3
%45 = icmp sle i32 %43, %44
br i1 %45, label %46, label %90
46: ; preds = %42
%47 = load i32, i32* %7
%48 = load i32, i32* %3
%49 = icmp eq i32 %47, %48
br i1 %49, label %50, label %53
50: ; preds = %46
%51 = load double, double* %11
%52 = fmul double 5.000000e-01, %51
store double %52, double* %11
br label %53
53: ; preds = %50, %46
%54 = load double, double* %10
%55 = load double, double* %11
%56 = load double, double* %9
%57 = call double @cos(double %56)
%58 = call double @llvm.fmuladd.f64(double %55, double %57, double %54)
store double %58, double* %10
%59 = load double, double* %12
%60 = fadd double %59, 2.000000e+00
store double %60, double* %12
%61 = load double, double* %13
%62 = fadd double %61, 1.000000e+00
store double %62, double* %13
%63 = load i32, i32* %7
%64 = sitofp i32 %63 to double
store double %64, double* %14
%65 = load double, double* %5
%66 = load double, double* %8
%67 = load double, double* %14
%68 = fsub double %66, %67
%69 = fsub double %68, 2.000000e+00
%70 = fmul double %65, %69
store double %70, double* %9
%71 = load double, double* %12
%72 = load double, double* %8
%73 = load double, double* %13
%74 = fsub double %72, %73
%75 = fadd double %74, 1.000000e+00
%76 = fmul double %71, %75
%77 = load double, double* %13
%78 = load double, double* %8
%79 = load double, double* %8
%80 = fadd double %78, %79
%81 = load double, double* %12
%82 = fsub double %80, %81
%83 = fmul double %77, %82
%84 = fdiv double %76, %83
%85 = load double, double* %11
%86 = fmul double %84, %85
store double %86, double* %11
br label %87
87: ; preds = %53
%88 = load i32, i32* %7
%89 = add nsw i32 %88, 2
store i32 %89, i32* %7
br label %42
90: ; preds = %42
%91 = load double, double* %10
%92 = load double, double* %6
%93 = fmul double %91, %92
ret double %93
}

LLVM IR (-O2):
define double @gord(i32 %0, double %1) {
%3 = tail call double @acos(double %1)
%4 = sitofp i32 %0 to double
%5 = icmp slt i32 %0, 1
br i1 %5, label %25, label %6
6: ; preds = %2
%7 = and i32 %0, 1
%8 = icmp eq i32 %0, 1
br i1 %8, label %13, label %9
9: ; preds = %6
%10 = and i32 %0, -2
br label %30
11: ; preds = %30
%12 = sitofp i32 %49 to double
br label %13
13: ; preds = %11, %6
%14 = phi double [ undef, %6 ], [ %48, %11 ]
%15 = phi double [ 0x3FF6A09E667F3BCD, %6 ], [ %48, %11 ]
%16 = phi double [ 1.000000e+00, %6 ], [ %12, %11 ]
%17 = icmp eq i32 %7, 0
br i1 %17, label %25, label %18
18: ; preds = %13
%19 = fmul double %16, 4.000000e+00
%20 = fmul double %19, %16
%21 = fdiv double 1.000000e+00, %20
%22 = fsub double 1.000000e+00, %21
%23 = tail call double @sqrt(double %22)
%24 = fmul double %15, %23
br label %25
25: ; preds = %18, %13, %2
%26 = phi double [ 0x3FF6A09E667F3BCD, %2 ], [ %14, %13 ], [ %24, %18 ]
%27 = icmp slt i32 %0, 0
br i1 %27, label %79, label %28
28: ; preds = %25
%29 = fadd double %4, %4
br label %52
30: ; preds = %30, %9
%31 = phi double [ 0x3FF6A09E667F3BCD, %9 ], [ %48, %30 ]
%32 = phi i32 [ 1, %9 ], [ %49, %30 ]
%33 = phi i32 [ 0, %9 ], [ %50, %30 ]
%34 = sitofp i32 %32 to double
%35 = fmul double %34, 4.000000e+00
%36 = fmul double %35, %34
%37 = fdiv double 1.000000e+00, %36
%38 = fsub double 1.000000e+00, %37
%39 = tail call double @sqrt(double %38)
%40 = fmul double %31, %39
%41 = add nuw i32 %32, 1
%42 = sitofp i32 %41 to double
%43 = fmul double %42, 4.000000e+00
%44 = fmul double %43, %42
%45 = fdiv double 1.000000e+00, %44
%46 = fsub double 1.000000e+00, %45
%47 = tail call double @sqrt(double %46)
%48 = fmul double %40, %47
%49 = add nuw i32 %32, 2
%50 = add i32 %33, 2
%51 = icmp eq i32 %50, %10
br i1 %51, label %11, label %30
52: ; preds = %28, %52
%53 = phi double [ 1.000000e+00, %28 ], [ %76, %52 ]
%54 = phi double [ 0.000000e+00, %28 ], [ %63, %52 ]
%55 = phi double [ %4, %28 ], [ %67, %52 ]
%56 = phi i32 [ 0, %28 ], [ %77, %52 ]
%57 = phi <2 x double> [ <double 0.000000e+00, double -1.000000e+00>, %28 ], [ %64, %52 ]
%58 = fmul double %3, %55
%59 = icmp eq i32 %56, %0
%60 = fmul double %53, 5.000000e-01
%61 = select i1 %59, double %60, double %53
%62 = tail call double @cos(double %58)
%63 = tail call double @llvm.fmuladd.f64(double %61, double %62, double %54)
%64 = fadd <2 x double> %57, <double 1.000000e+00, double 2.000000e+00>
%65 = sitofp i32 %56 to double
%66 = fsub double %4, %65
%67 = fadd double %66, -2.000000e+00
%68 = extractelement <2 x double> %64, i64 0
%69 = fsub double %4, %68
%70 = fadd double %69, 1.000000e+00
%71 = extractelement <2 x double> %64, i64 1
%72 = fmul double %71, %70
%73 = fsub double %29, %71
%74 = fmul double %68, %73
%75 = fdiv double %72, %74
%76 = fmul double %61, %75
%77 = add nuw nsw i32 %56, 2
%78 = icmp sgt i32 %77, %0
br i1 %78, label %79, label %52
79: ; preds = %52, %25
%80 = phi double [ 0.000000e+00, %25 ], [ %63, %52 ]
%81 = fmul double %26, %80
ret double %81
}