#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 int int64_t;

/* Variables and functions */
double stdlib_strided_dnanvarianceyc(const int64_t N, const double correction,
                                     const double *X, const int64_t stride) {
  double sum;
  int64_t ix;
  double nc;
  double n;
  double S;
  double v;
  double d;
  double i;
  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;
  }
  for (i = 0; i < N; i++) {
    v = X[ix];
    if (v == v) {
      break;
    }
    ix += stride;
  }
  if (i == N) {
    return 0.0 / 0.0;
  }
  ix += stride;
  sum = v;
  S = 0.0;
  n = 1.0;
  i += 1;
  for (; i < N; i++) {
    v = X[ix];
    if (v == v) {
      n += 1.0;
      sum += v;
      d = (n * v) - sum;
      S += (1.0 / (n * (n - 1.0))) * d * d;
    }
    ix += stride;
  }
  nc = n - correction;
  if (nc <= 0.0) {
    return 0.0 / 0.0;
  }
  return S / nc;
}


x86 assembly (clang, -O0):
<stdlib_strided_dnanvarianceyc>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %edx,-0x24(%rbp)
cmpl   $0x0,-0xc(%rbp)
jg     112f <stdlib_strided_dnanvarianceyc+0x2f>
movsd  0xee3(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13c0 <stdlib_strided_dnanvarianceyc+0x2c0>
cmpl   $0x1,-0xc(%rbp)
je     1143 <stdlib_strided_dnanvarianceyc+0x43>
cmpl   $0x0,-0x24(%rbp)
jne    119c <stdlib_strided_dnanvarianceyc+0x9c>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
ucomisd -0x58(%rbp),%xmm0
jne    118a <stdlib_strided_dnanvarianceyc+0x8a>
jp     118a <stdlib_strided_dnanvarianceyc+0x8a>
cvtsi2sdl -0xc(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    118a <stdlib_strided_dnanvarianceyc+0x8a>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13c0 <stdlib_strided_dnanvarianceyc+0x2c0>
movsd  0xe76(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13c0 <stdlib_strided_dnanvarianceyc+0x2c0>
cmpl   $0x0,-0x24(%rbp)
jge    11ba <stdlib_strided_dnanvarianceyc+0xba>
mov    $0x1,%eax
sub    -0xc(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    11c1 <stdlib_strided_dnanvarianceyc+0xc1>
movl   $0x0,-0x34(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    122a <stdlib_strided_dnanvarianceyc+0x12a>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
ucomisd -0x58(%rbp),%xmm0
jne    120a <stdlib_strided_dnanvarianceyc+0x10a>
jp     120a <stdlib_strided_dnanvarianceyc+0x10a>
jmp    122a <stdlib_strided_dnanvarianceyc+0x12a>
mov    -0x24(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
movsd  0xde5(%rip),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    11c9 <stdlib_strided_dnanvarianceyc+0xc9>
movsd  -0x68(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jne    1256 <stdlib_strided_dnanvarianceyc+0x156>
jp     1256 <stdlib_strided_dnanvarianceyc+0x156>
movsd  0xdbc(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13c0 <stdlib_strided_dnanvarianceyc+0x2c0>
mov    -0x24(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xd87(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xd7a(%rip),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1382 <stdlib_strided_dnanvarianceyc+0x282>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
ucomisd -0x58(%rbp),%xmm0
jne    1362 <stdlib_strided_dnanvarianceyc+0x262>
jp     1362 <stdlib_strided_dnanvarianceyc+0x262>
movsd  0xd2c(%rip),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x58(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  0xcce(%rip),%xmm2
subsd  %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  0xcbe(%rip),%xmm0
divsd  %xmm1,%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x24(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
movsd  0xc8d(%rip),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    1290 <stdlib_strided_dnanvarianceyc+0x190>
movsd  -0x48(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x40(%rbp),%xmm0
jb     13b1 <stdlib_strided_dnanvarianceyc+0x2b1>
movsd  0xc61(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    13c0 <stdlib_strided_dnanvarianceyc+0x2c0>
movsd  -0x50(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<stdlib_strided_dnanvarianceyc>:
movsd  0xef7(%rip),%xmm9
test   %edi,%edi
jle    1160 <stdlib_strided_dnanvarianceyc+0x60>
cmp    $0x1,%edi
je     1166 <stdlib_strided_dnanvarianceyc+0x66>
test   %edx,%edx
je     1166 <stdlib_strided_dnanvarianceyc+0x66>
mov    $0x1,%ecx
sub    %edi,%ecx
imul   %edx,%ecx
movslq %edx,%rax
sar    $0x1f,%edx
cvtsi2sd %edi,%xmm2
and    %ecx,%edx
movslq %edx,%rcx
xorpd  %xmm3,%xmm3
movsd  0xecd(%rip),%xmm6
nopl   0x0(%rax,%rax,1)
movsd  (%rsi,%rcx,8),%xmm5
ucomisd %xmm5,%xmm5
jnp    1158 <stdlib_strided_dnanvarianceyc+0x58>
add    %rax,%rcx
addsd  %xmm6,%xmm3
ucomisd %xmm3,%xmm2
ja     1140 <stdlib_strided_dnanvarianceyc+0x40>
ucomisd %xmm2,%xmm3
jne    118f <stdlib_strided_dnanvarianceyc+0x8f>
jp     118f <stdlib_strided_dnanvarianceyc+0x8f>
movapd %xmm9,%xmm0
ret
movsd  (%rsi),%xmm1
ucomisd %xmm1,%xmm1
jp     1189 <stdlib_strided_dnanvarianceyc+0x89>
xorps  %xmm1,%xmm1
cvtsi2sd %edi,%xmm1
subsd  %xmm0,%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
ja     1236 <stdlib_strided_dnanvarianceyc+0x136>
movapd %xmm9,%xmm0
ret
addsd  %xmm6,%xmm3
xorpd  %xmm8,%xmm8
ucomisd %xmm3,%xmm2
xorpd  %xmm12,%xmm12
jbe    121c <stdlib_strided_dnanvarianceyc+0x11c>
movslq %ecx,%rcx
add    %rax,%rcx
lea    (%rsi,%rcx,8),%rcx
shl    $0x3,%rax
movsd  0xe4e(%rip),%xmm11
xorpd  %xmm12,%xmm12
movsd  0xe48(%rip),%xmm10
movapd %xmm11,%xmm6
nopl   (%rax)
movsd  (%rcx),%xmm1
ucomisd %xmm1,%xmm1
jp     120e <stdlib_strided_dnanvarianceyc+0x10e>
addsd  %xmm11,%xmm6
addsd  %xmm1,%xmm5
mulsd  %xmm6,%xmm1
subsd  %xmm5,%xmm1
movapd %xmm6,%xmm4
addsd  %xmm10,%xmm4
mulsd  %xmm6,%xmm4
movapd %xmm11,%xmm7
divsd  %xmm4,%xmm7
mulsd  %xmm1,%xmm7
mulsd  %xmm1,%xmm7
addsd  %xmm7,%xmm12
addsd  %xmm11,%xmm3
add    %rax,%rcx
ucomisd %xmm3,%xmm2
ja     11d0 <stdlib_strided_dnanvarianceyc+0xd0>
subsd  %xmm0,%xmm6
ucomisd %xmm6,%xmm8
movapd %xmm9,%xmm0
jae    1236 <stdlib_strided_dnanvarianceyc+0x136>
divsd  %xmm6,%xmm12
movapd %xmm12,%xmm0
ret

LLVM IR (-O0):
define double @stdlib_strided_dnanvarianceyc(i32 %0, double %1, double* %2, i32 %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca double
%8 = alloca double*
%9 = alloca i32
%10 = alloca double
%11 = alloca i32
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
store i32 %0, i32* %6
store double %1, double* %7
store double* %2, double** %8
store i32 %3, i32* %9
%18 = load i32, i32* %6
%19 = icmp sle i32 %18, 0
br i1 %19, label %20, label %21
20: ; preds = %4
store double 0x7FF8000000000000, double* %5
br label %140
21: ; preds = %4
%22 = load i32, i32* %6
%23 = icmp eq i32 %22, 1
br i1 %23, label %27, label %24
24: ; preds = %21
%25 = load i32, i32* %9
%26 = icmp eq i32 %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* %15
%31 = load double, double* %15
%32 = load double, double* %15
%33 = fcmp oeq double %31, %32
br i1 %33, label %34, label %41
34: ; preds = %27
%35 = load i32, i32* %6
%36 = sitofp i32 %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 %140
41: ; preds = %34, %27
store double 0x7FF8000000000000, double* %5
br label %140
42: ; preds = %24
%43 = load i32, i32* %9
%44 = icmp slt i32 %43, 0
br i1 %44, label %45, label %50
45: ; preds = %42
%46 = load i32, i32* %6
%47 = sub nsw i32 1, %46
%48 = load i32, i32* %9
%49 = mul nsw i32 %47, %48
store i32 %49, i32* %11
br label %51
50: ; preds = %42
store i32 0, i32* %11
br label %51
51: ; preds = %50, %45
store double 0.000000e+00, double* %17
br label %52
52: ; preds = %71, %51
%53 = load double, double* %17
%54 = load i32, i32* %6
%55 = sitofp i32 %54 to double
%56 = fcmp olt double %53, %55
br i1 %56, label %57, label %74
57: ; preds = %52
%58 = load double*, double** %8
%59 = load i32, i32* %11
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds double, double* %58, i64 %60
%62 = load double, double* %61
store double %62, double* %15
%63 = load double, double* %15
%64 = load double, double* %15
%65 = fcmp oeq double %63, %64
br i1 %65, label %66, label %67
66: ; preds = %57
br label %74
67: ; preds = %57
%68 = load i32, i32* %9
%69 = load i32, i32* %11
%70 = add nsw i32 %69, %68
store i32 %70, i32* %11
br label %71
71: ; preds = %67
%72 = load double, double* %17
%73 = fadd double %72, 1.000000e+00
store double %73, double* %17
br label %52
74: ; preds = %66, %52
%75 = load double, double* %17
%76 = load i32, i32* %6
%77 = sitofp i32 %76 to double
%78 = fcmp oeq double %75, %77
br i1 %78, label %79, label %80
79: ; preds = %74
store double 0x7FF8000000000000, double* %5
br label %140
80: ; preds = %74
%81 = load i32, i32* %9
%82 = load i32, i32* %11
%83 = add nsw i32 %82, %81
store i32 %83, i32* %11
%84 = load double, double* %15
store double %84, double* %10
store double 0.000000e+00, double* %14
store double 1.000000e+00, double* %13
%85 = load double, double* %17
%86 = fadd double %85, 1.000000e+00
store double %86, double* %17
br label %87
87: ; preds = %126, %80
%88 = load double, double* %17
%89 = load i32, i32* %6
%90 = sitofp i32 %89 to double
%91 = fcmp olt double %88, %90
br i1 %91, label %92, label %129
92: ; preds = %87
%93 = load double*, double** %8
%94 = load i32, i32* %11
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds double, double* %93, i64 %95
%97 = load double, double* %96
store double %97, double* %15
%98 = load double, double* %15
%99 = load double, double* %15
%100 = fcmp oeq double %98, %99
br i1 %100, label %101, label %122
101: ; preds = %92
%102 = load double, double* %13
%103 = fadd double %102, 1.000000e+00
store double %103, double* %13
%104 = load double, double* %15
%105 = load double, double* %10
%106 = fadd double %105, %104
store double %106, double* %10
%107 = load double, double* %13
%108 = load double, double* %15
%109 = load double, double* %10
%110 = fneg double %109
%111 = call double @llvm.fmuladd.f64(double %107, double %108, double %110)
store double %111, double* %16
%112 = load double, double* %13
%113 = load double, double* %13
%114 = fsub double %113, 1.000000e+00
%115 = fmul double %112, %114
%116 = fdiv double 1.000000e+00, %115
%117 = load double, double* %16
%118 = fmul double %116, %117
%119 = load double, double* %16
%120 = load double, double* %14
%121 = call double @llvm.fmuladd.f64(double %118, double %119, double %120)
store double %121, double* %14
br label %122
122: ; preds = %101, %92
%123 = load i32, i32* %9
%124 = load i32, i32* %11
%125 = add nsw i32 %124, %123
store i32 %125, i32* %11
br label %126
126: ; preds = %122
%127 = load double, double* %17
%128 = fadd double %127, 1.000000e+00
store double %128, double* %17
br label %87
129: ; preds = %87
%130 = load double, double* %13
%131 = load double, double* %7
%132 = fsub double %130, %131
store double %132, double* %12
%133 = load double, double* %12
%134 = fcmp ole double %133, 0.000000e+00
br i1 %134, label %135, label %136
135: ; preds = %129
store double 0x7FF8000000000000, double* %5
br label %140
136: ; preds = %129
%137 = load double, double* %14
%138 = load double, double* %12
%139 = fdiv double %137, %138
store double %139, double* %5
br label %140
140: ; preds = %136, %135, %79, %41, %40, %20
%141 = load double, double* %5
ret double %141
}

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