#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 */
typedef scalar_t__ int64_t;

/* Variables and functions */
double stdlib_strided_dnanvariancetk(const int64_t N, const double correction,
                                     const double *X, const int64_t stride) {
  int64_t ix;
  int64_t n;
  int64_t i;
  double S2;
  double nc;
  double dn;
  double S;
  double v;
  if (N <= 0) {
    return 0.0 / 0.0;
  }
  if (N == 1 || stride == 0) {
    v = X[0];
    if (v == v && (double)N - correction > 0.0) {
      return 0.0;
    }
    return 0.0 / 0.0;
  }
  if (stride < 0) {
    ix = (1 - N) * stride;
  } else {
    ix = 0;
  }
  S2 = 0.0;
  S = 0.0;
  n = 0;
  for (i = 0; i < N; i++) {
    v = X[ix];
    if (v == v) {
      S2 += v * v;
      S += v;
      n += 1;
    }
    ix += stride;
  }
  dn = (double)n;
  nc = dn - correction;
  if (nc <= 0.0) {
    return 0.0 / 0.0;
  }
  return (S2 - ((S / dn) * S)) / nc;
}


x86 assembly (clang, -O0):
<stdlib_strided_dnanvariancetk>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
cmpq   $0x0,-0x10(%rbp)
jg     1132 <stdlib_strided_dnanvariancetk+0x32>
movsd  0xed8(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12ed <stdlib_strided_dnanvariancetk+0x1ed>
cmpq   $0x1,-0x10(%rbp)
je     1148 <stdlib_strided_dnanvariancetk+0x48>
cmpq   $0x0,-0x28(%rbp)
jne    11a2 <stdlib_strided_dnanvariancetk+0xa2>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jne    1190 <stdlib_strided_dnanvariancetk+0x90>
jp     1190 <stdlib_strided_dnanvariancetk+0x90>
cvtsi2sdq -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1190 <stdlib_strided_dnanvariancetk+0x90>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12ed <stdlib_strided_dnanvariancetk+0x1ed>
movsd  0xe68(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12ed <stdlib_strided_dnanvariancetk+0x1ed>
cmpq   $0x0,-0x28(%rbp)
jge    11c4 <stdlib_strided_dnanvariancetk+0xc4>
mov    $0x1,%eax
sub    -0x10(%rbp),%rax
imul   -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    11cc <stdlib_strided_dnanvariancetk+0xcc>
movq   $0x0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movq   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1276 <stdlib_strided_dnanvariancetk+0x176>
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x68(%rbp),%xmm0
jne    1259 <stdlib_strided_dnanvariancetk+0x159>
jp     1259 <stdlib_strided_dnanvariancetk+0x159>
movsd  -0x68(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x68(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    11ec <stdlib_strided_dnanvariancetk+0xec>
cvtsi2sdq -0x38(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x50(%rbp),%xmm0
jb     12b0 <stdlib_strided_dnanvariancetk+0x1b0>
movsd  0xd5a(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12ed <stdlib_strided_dnanvariancetk+0x1ed>
movsd  -0x48(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
divsd  -0x58(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
divsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<stdlib_strided_dnanvariancetk>:
push   %rbx
movsd  0xef7(%rip),%xmm1
test   %rdi,%rdi
jle    11f1 <stdlib_strided_dnanvariancetk+0xf1>
cmp    $0x1,%rdi
je     11d1 <stdlib_strided_dnanvariancetk+0xd1>
test   %rdx,%rdx
je     11d1 <stdlib_strided_dnanvariancetk+0xd1>
mov    $0x1,%eax
sub    %rdi,%rax
imul   %rdx,%rax
mov    %rdx,%r8
sar    $0x3f,%r8
and    %rax,%r8
mov    %rdi,%rcx
and    $0xfffffffffffffffe,%rcx
lea    0x0(,%r8,8),%r9
mov    %rdx,%r10
shl    $0x4,%r10
shl    $0x3,%rdx
lea    (%rdx,%r8,8),%r11
xorpd  %xmm2,%xmm2
xor    %eax,%eax
movsd  0xea1(%rip),%xmm4
xorpd  %xmm3,%xmm3
jmp    118a <stdlib_strided_dnanvariancetk+0x8a>
nopl   (%rax)
movapd %xmm4,%xmm6
addsd  %xmm5,%xmm2
addsd  %xmm6,%xmm2
mov    %bl,%dl
add    %rdx,%rax
add    %r10,%rsi
add    $0xfffffffffffffffe,%rcx
je     11f7 <stdlib_strided_dnanvariancetk+0xf7>
movsd  (%rsi,%r9,1),%xmm5
xor    %edx,%edx
ucomisd %xmm5,%xmm5
setnp  %bl
jp     11a7 <stdlib_strided_dnanvariancetk+0xa7>
movapd %xmm5,%xmm6
mulsd  %xmm5,%xmm6
addsd  %xmm6,%xmm3
jnp    11ad <stdlib_strided_dnanvariancetk+0xad>
movapd %xmm4,%xmm5
mov    %bl,%dl
add    %rdx,%rax
movsd  (%rsi,%r11,1),%xmm6
xor    %edx,%edx
ucomisd %xmm6,%xmm6
setnp  %bl
jp     1170 <stdlib_strided_dnanvariancetk+0x70>
movapd %xmm6,%xmm7
mulsd  %xmm6,%xmm7
addsd  %xmm7,%xmm3
jmp    1174 <stdlib_strided_dnanvariancetk+0x74>
movsd  (%rsi),%xmm2
ucomisd %xmm2,%xmm2
jp     11f1 <stdlib_strided_dnanvariancetk+0xf1>
xorps  %xmm2,%xmm2
cvtsi2sd %rdi,%xmm2
subsd  %xmm0,%xmm2
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
ja     1261 <stdlib_strided_dnanvariancetk+0x161>
movapd %xmm1,%xmm0
pop    %rbx
ret
test   $0x1,%dil
je     122b <stdlib_strided_dnanvariancetk+0x12b>
movsd  (%rsi,%r8,8),%xmm4
xor    %ecx,%ecx
ucomisd %xmm4,%xmm4
setnp  %cl
jp     121a <stdlib_strided_dnanvariancetk+0x11a>
movapd %xmm4,%xmm5
mulsd  %xmm4,%xmm5
addsd  %xmm5,%xmm3
jnp    1224 <stdlib_strided_dnanvariancetk+0x124>
movsd  0xde4(%rip),%xmm4
add    %rcx,%rax
addsd  %xmm4,%xmm2
xorps  %xmm5,%xmm5
cvtsi2sd %rax,%xmm5
movapd %xmm5,%xmm4
subsd  %xmm0,%xmm4
xorpd  %xmm0,%xmm0
ucomisd %xmm4,%xmm0
movapd %xmm1,%xmm0
jae    1261 <stdlib_strided_dnanvariancetk+0x161>
movapd %xmm2,%xmm0
divsd  %xmm5,%xmm0
mulsd  %xmm2,%xmm0
subsd  %xmm0,%xmm3
divsd  %xmm4,%xmm3
movapd %xmm3,%xmm0
pop    %rbx
ret

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

LLVM IR (-O2):
define double @stdlib_strided_dnanvariancetk(i64 %0, double %1, double* nocapture %2, i64 %3) {
%5 = icmp slt i64 %0, 1
br i1 %5, label %77, label %6
6: ; preds = %4
%7 = icmp eq i64 %0, 1
%8 = icmp eq i64 %3, 0
%9 = or i1 %7, %8
br i1 %9, label %10, label %18
10: ; preds = %6
%11 = load double, double* %2
%12 = fcmp ord double %11, 0.000000e+00
br i1 %12, label %13, label %17
13: ; preds = %10
%14 = sitofp i64 %0 to double
%15 = fsub double %14, %1
%16 = fcmp ogt double %15, 0.000000e+00
br i1 %16, label %77, label %17
17: ; preds = %13, %10
br label %77
18: ; preds = %6
%19 = icmp slt i64 %3, 0
%20 = sub nsw i64 1, %0
%21 = mul nsw i64 %20, %3
%22 = select i1 %19, i64 %21, i64 0
%23 = and i64 %0, 1
%24 = and i64 %0, -2
br label %25
25: ; preds = %25, %18
%26 = phi double [ 0.000000e+00, %18 ], [ %49, %25 ]
%27 = phi i64 [ %22, %18 ], [ %50, %25 ]
%28 = phi double [ 0.000000e+00, %18 ], [ %47, %25 ]
%29 = phi i64 [ 0, %18 ], [ %46, %25 ]
%30 = phi i64 [ 0, %18 ], [ %51, %25 ]
%31 = getelementptr inbounds double, double* %2, i64 %27
%32 = load double, double* %31
%33 = fcmp ord double %32, 0.000000e+00
%34 = tail call double @llvm.fmuladd.f64(double %32, double %32, double %28)
%35 = zext i1 %33 to i64
%36 = add nuw nsw i64 %29, %35
%37 = select i1 %33, double %34, double %28
%38 = select i1 %33, double %32, double -0.000000e+00
%39 = fadd double %26, %38
%40 = add nsw i64 %27, %3
%41 = getelementptr inbounds double, double* %2, i64 %40
%42 = load double, double* %41
%43 = fcmp ord double %42, 0.000000e+00
%44 = tail call double @llvm.fmuladd.f64(double %42, double %42, double %37)
%45 = zext i1 %43 to i64
%46 = add nuw nsw i64 %36, %45
%47 = select i1 %43, double %44, double %37
%48 = select i1 %43, double %42, double -0.000000e+00
%49 = fadd double %39, %48
%50 = add nsw i64 %40, %3
%51 = add i64 %30, 2
%52 = icmp eq i64 %51, %24
br i1 %52, label %53, label %25
53: ; preds = %25
%54 = icmp eq i64 %23, 0
br i1 %54, label %65, label %55
55: ; preds = %53
%56 = getelementptr inbounds double, double* %2, i64 %50
%57 = load double, double* %56
%58 = fcmp ord double %57, 0.000000e+00
%59 = tail call double @llvm.fmuladd.f64(double %57, double %57, double %47)
%60 = zext i1 %58 to i64
%61 = add nuw nsw i64 %46, %60
%62 = select i1 %58, double %59, double %47
%63 = select i1 %58, double %57, double -0.000000e+00
%64 = fadd double %49, %63
br label %65
65: ; preds = %53, %55
%66 = phi i64 [ %46, %53 ], [ %61, %55 ]
%67 = phi double [ %47, %53 ], [ %62, %55 ]
%68 = phi double [ %49, %53 ], [ %64, %55 ]
%69 = sitofp i64 %66 to double
%70 = fsub double %69, %1
%71 = fcmp ugt double %70, 0.000000e+00
br i1 %71, label %72, label %77
72: ; preds = %65
%73 = fneg double %68
%74 = fdiv double %73, %69
%75 = tail call double @llvm.fmuladd.f64(double %74, double %68, double %67)
%76 = fdiv double %75, %70
br label %77
77: ; preds = %65, %13, %4, %72, %17
%78 = phi double [ 0x7FF8000000000000, %17 ], [ %76, %72 ], [ 0x7FF8000000000000, %4 ], [ 0.000000e+00, %13 ], [ 0x7FF8000000000000, %65 ]
ret double %78
}