#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 */
float stdlib_strided_snanvarianceyc(const int64_t N, const float correction,
                                    const float *X, const int64_t stride) {
  int64_t ix;
  float sum;
  double nc;
  double n;
  double i;
  float S;
  float v;
  float d;
  if (N <= 0) {
    return 0.0f / 0.0f;
  }
  if (N == 1 || stride == 0) {
    v = X[0];
    if (v == v && (double)N - (double)correction > 0.0) {
      return 0.0f;
    }
    return 0.0f / 0.0f;
  }
  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.0f / 0.0f;
  }
  ix += stride;
  sum = v;
  S = 0.0f;
  n = 1.0;
  i += 1;
  for (; i < N; i++) {
    v = X[ix];
    if (v == v) {
      n += 1.0;
      sum += v;
      d = (float)(n * (double)v) - sum;
      S += (float)(1.0 / (n * (n - 1.0))) * d * d;
    }
    ix += stride;
  }
  nc = n - (double)correction;
  if (nc <= 0.0) {
    return 0.0f / 0.0f;
  }
  return (double)S / nc;
}


x86 assembly (clang, -O0):
<stdlib_strided_snanvarianceyc>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
cmpl   $0x0,-0x8(%rbp)
jg     112f <stdlib_strided_snanvarianceyc+0x2f>
movss  0xee3(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13c6 <stdlib_strided_snanvarianceyc+0x2c6>
cmpl   $0x1,-0x8(%rbp)
je     1143 <stdlib_strided_snanvarianceyc+0x43>
cmpl   $0x0,-0x1c(%rbp)
jne    11a3 <stdlib_strided_snanvarianceyc+0xa3>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x48(%rbp),%xmm0
ucomiss -0x48(%rbp),%xmm0
jne    1191 <stdlib_strided_snanvarianceyc+0x91>
jp     1191 <stdlib_strided_snanvarianceyc+0x91>
cvtsi2sdl -0x8(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1191 <stdlib_strided_snanvarianceyc+0x91>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13c6 <stdlib_strided_snanvarianceyc+0x2c6>
movss  0xe6f(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13c6 <stdlib_strided_snanvarianceyc+0x2c6>
cmpl   $0x0,-0x1c(%rbp)
jge    11c1 <stdlib_strided_snanvarianceyc+0xc1>
mov    $0x1,%eax
sub    -0x8(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    11c8 <stdlib_strided_snanvarianceyc+0xc8>
movl   $0x0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1230 <stdlib_strided_snanvarianceyc+0x130>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x48(%rbp),%xmm0
ucomiss -0x48(%rbp),%xmm0
jne    1210 <stdlib_strided_snanvarianceyc+0x110>
jp     1210 <stdlib_strided_snanvarianceyc+0x110>
jmp    1230 <stdlib_strided_snanvarianceyc+0x130>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsd  0xddf(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    11d0 <stdlib_strided_snanvarianceyc+0xd0>
movsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x8(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jne    125c <stdlib_strided_snanvarianceyc+0x15c>
jp     125c <stdlib_strided_snanvarianceyc+0x15c>
movss  0xdb6(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13c6 <stdlib_strided_snanvarianceyc+0x2c6>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movsd  0xd81(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xd74(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1378 <stdlib_strided_snanvarianceyc+0x278>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x48(%rbp),%xmm0
ucomiss -0x48(%rbp),%xmm0
jne    1358 <stdlib_strided_snanvarianceyc+0x258>
jp     1358 <stdlib_strided_snanvarianceyc+0x258>
movsd  0xd27(%rip),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movss  -0x48(%rbp),%xmm0
addss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movsd  -0x38(%rbp),%xmm0
movss  -0x48(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
subss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  0xcdc(%rip),%xmm2
subsd  %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  0xccc(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mulss  -0x4c(%rbp),%xmm0
movss  -0x4c(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsd  0xc97(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1296 <stdlib_strided_snanvarianceyc+0x196>
movsd  -0x38(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x30(%rbp),%xmm0
jb     13af <stdlib_strided_snanvarianceyc+0x2af>
movss  0xc63(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    13c6 <stdlib_strided_snanvarianceyc+0x2c6>
movss  -0x44(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x30(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<stdlib_strided_snanvarianceyc>:
movss  0xef7(%rip),%xmm8
test   %edi,%edi
jle    115f <stdlib_strided_snanvarianceyc+0x5f>
cmp    $0x1,%edi
je     1164 <stdlib_strided_snanvarianceyc+0x64>
test   %edx,%edx
je     1164 <stdlib_strided_snanvarianceyc+0x64>
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),%xmm7
nopl   0x0(%rax,%rax,1)
movss  (%rsi,%rcx,4),%xmm5
ucomiss %xmm5,%xmm5
jnp    1157 <stdlib_strided_snanvarianceyc+0x57>
add    %rax,%rcx
addsd  %xmm7,%xmm3
ucomisd %xmm3,%xmm2
ja     1140 <stdlib_strided_snanvarianceyc+0x40>
ucomisd %xmm2,%xmm3
jne    1192 <stdlib_strided_snanvarianceyc+0x92>
jp     1192 <stdlib_strided_snanvarianceyc+0x92>
movaps %xmm8,%xmm0
ret
movss  (%rsi),%xmm1
ucomiss %xmm1,%xmm1
jp     118d <stdlib_strided_snanvarianceyc+0x8d>
xorps  %xmm1,%xmm1
cvtsi2sd %edi,%xmm1
cvtss2sd %xmm0,%xmm0
subsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm1
ja     1250 <stdlib_strided_snanvarianceyc+0x150>
movaps %xmm8,%xmm0
ret
addsd  %xmm7,%xmm3
xorps  %xmm11,%xmm11
ucomisd %xmm3,%xmm2
jbe    122a <stdlib_strided_snanvarianceyc+0x12a>
movslq %ecx,%rcx
add    %rax,%rcx
lea    (%rsi,%rcx,4),%rcx
shl    $0x2,%rax
movsd  0xe4d(%rip),%xmm10
xorps  %xmm11,%xmm11
movsd  0xe48(%rip),%xmm9
movapd %xmm10,%xmm7
nopl   (%rax)
movss  (%rcx),%xmm1
ucomiss %xmm1,%xmm1
jp     121c <stdlib_strided_snanvarianceyc+0x11c>
addsd  %xmm10,%xmm7
addss  %xmm1,%xmm5
cvtss2sd %xmm1,%xmm1
mulsd  %xmm7,%xmm1
cvtsd2ss %xmm1,%xmm1
movapd %xmm7,%xmm4
addsd  %xmm9,%xmm4
mulsd  %xmm7,%xmm4
movapd %xmm10,%xmm6
divsd  %xmm4,%xmm6
xorps  %xmm4,%xmm4
cvtsd2ss %xmm6,%xmm4
subss  %xmm5,%xmm1
mulss  %xmm1,%xmm4
mulss  %xmm1,%xmm4
addss  %xmm4,%xmm11
addsd  %xmm10,%xmm3
add    %rax,%rcx
ucomisd %xmm3,%xmm2
ja     11d0 <stdlib_strided_snanvarianceyc+0xd0>
cvtss2sd %xmm0,%xmm0
subsd  %xmm0,%xmm7
xorpd  %xmm0,%xmm0
ucomisd %xmm7,%xmm0
movaps %xmm8,%xmm0
jae    1250 <stdlib_strided_snanvarianceyc+0x150>
xorps  %xmm0,%xmm0
cvtss2sd %xmm11,%xmm0
divsd  %xmm7,%xmm0
cvtsd2ss %xmm0,%xmm0
ret

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

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