#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 sqrt(double);
void mean_sd(double *x, int n, double *mean, double *sd) {
  double ave, var, diff, error;
  int i;
  ave = 0.0;
  for (i = 0; i < n; i++)
    ave += x[i];
  ave /= n;
  diff = var = 0.0;
  for (i = 0; i < n; i++) {
    diff = x[i] - ave;
    error += diff;
    var += diff * diff;
  }
  var = (var - error * error / n) / (n - 1);
  *mean = ave;
  *sd = sqrt(var);
}


x86 assembly (clang, -O0):
<mean_sd>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1167 <mean_sd+0x57>
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1136 <mean_sd+0x26>
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11ed <mean_sd+0xdd>
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1191 <mean_sd+0x81>
movsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm2
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x30(%rbp),%xmm0
call   1030 <sqrt@plt>
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mean_sd>:
push   %r14
push   %rbx
push   %rax
mov    %rcx,%r14
test   %esi,%esi
jle    1136 <mean_sd+0x26>
mov    %esi,%r9d
lea    -0x1(%r9),%r8
mov    %r9d,%ecx
and    $0x7,%ecx
cmp    $0x7,%r8
jae    114b <mean_sd+0x3b>
xorpd  %xmm1,%xmm1
xor    %ebx,%ebx
jmp    1198 <mean_sd+0x88>
cvtsi2sd %esi,%xmm2
xorpd  %xmm0,%xmm0
xorpd  %xmm1,%xmm1
divsd  %xmm2,%xmm1
jmp    128e <mean_sd+0x17e>
mov    %r9d,%eax
and    $0xfffffff8,%eax
xorpd  %xmm1,%xmm1
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
addsd  (%rdi,%rbx,8),%xmm1
addsd  0x8(%rdi,%rbx,8),%xmm1
addsd  0x10(%rdi,%rbx,8),%xmm1
addsd  0x18(%rdi,%rbx,8),%xmm1
addsd  0x20(%rdi,%rbx,8),%xmm1
addsd  0x28(%rdi,%rbx,8),%xmm1
addsd  0x30(%rdi,%rbx,8),%xmm1
addsd  0x38(%rdi,%rbx,8),%xmm1
add    $0x8,%rbx
cmp    %rbx,%rax
jne    1160 <mean_sd+0x50>
test   %rcx,%rcx
je     11be <mean_sd+0xae>
lea    (%rdi,%rbx,8),%rax
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
addsd  (%rax,%rbx,8),%xmm1
add    $0x1,%rbx
cmp    %rbx,%rcx
jne    11b0 <mean_sd+0xa0>
cvtsi2sd %esi,%xmm2
divsd  %xmm2,%xmm1
test   %esi,%esi
jle    11e1 <mean_sd+0xd1>
mov    %r9d,%ecx
and    $0x3,%ecx
cmp    $0x3,%r8
jae    11ea <mean_sd+0xda>
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
jmp    1260 <mean_sd+0x150>
xorpd  %xmm0,%xmm0
jmp    128e <mean_sd+0x17e>
and    $0xfffffffc,%r9d
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rdi,%rbx,8),%xmm4
movsd  0x8(%rdi,%rbx,8),%xmm5
subsd  %xmm1,%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm4,%xmm4
addsd  %xmm0,%xmm4
subsd  %xmm1,%xmm5
addsd  %xmm5,%xmm3
mulsd  %xmm5,%xmm5
addsd  %xmm4,%xmm5
movsd  0x10(%rdi,%rbx,8),%xmm4
subsd  %xmm1,%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm4,%xmm4
addsd  %xmm5,%xmm4
movsd  0x18(%rdi,%rbx,8),%xmm0
subsd  %xmm1,%xmm0
addsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm0
addsd  %xmm4,%xmm0
add    $0x4,%rbx
cmp    %rbx,%r9
jne    1200 <mean_sd+0xf0>
test   %rcx,%rcx
je     128e <mean_sd+0x17e>
lea    (%rdi,%rbx,8),%rax
xor    %edi,%edi
nopl   0x0(%rax,%rax,1)
movsd  (%rax,%rdi,8),%xmm4
subsd  %xmm1,%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm4,%xmm4
addsd  %xmm4,%xmm0
add    $0x1,%rdi
cmp    %rdi,%rcx
jne    1270 <mean_sd+0x160>
mulsd  %xmm3,%xmm3
divsd  %xmm2,%xmm3
subsd  %xmm3,%xmm0
add    $0xffffffff,%esi
xorps  %xmm2,%xmm2
cvtsi2sd %esi,%xmm2
divsd  %xmm2,%xmm0
movsd  %xmm1,(%rdx)
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     12bc <mean_sd+0x1ac>
sqrtsd %xmm0,%xmm0
jmp    12c1 <mean_sd+0x1b1>
call   1030 <sqrt@plt>
movsd  %xmm0,(%r14)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @mean_sd(double* %0, i32 %1, double* %2, double* %3) {
%5 = alloca double*
%6 = alloca i32
%7 = alloca double*
%8 = alloca double*
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca i32
store double* %0, double** %5
store i32 %1, i32* %6
store double* %2, double** %7
store double* %3, double** %8
store double 0.000000e+00, double* %9
store i32 0, i32* %13
br label %14
14: ; preds = %26, %4
%15 = load i32, i32* %13
%16 = load i32, i32* %6
%17 = icmp slt i32 %15, %16
br i1 %17, label %18, label %29
18: ; preds = %14
%19 = load double*, double** %5
%20 = load i32, i32* %13
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds double, double* %19, i64 %21
%23 = load double, double* %22
%24 = load double, double* %9
%25 = fadd double %24, %23
store double %25, double* %9
br label %26
26: ; preds = %18
%27 = load i32, i32* %13
%28 = add nsw i32 %27, 1
store i32 %28, i32* %13
br label %14
29: ; preds = %14
%30 = load i32, i32* %6
%31 = sitofp i32 %30 to double
%32 = load double, double* %9
%33 = fdiv double %32, %31
store double %33, double* %9
store double 0.000000e+00, double* %10
store double 0.000000e+00, double* %11
store i32 0, i32* %13
br label %34
34: ; preds = %53, %29
%35 = load i32, i32* %13
%36 = load i32, i32* %6
%37 = icmp slt i32 %35, %36
br i1 %37, label %38, label %56
38: ; preds = %34
%39 = load double*, double** %5
%40 = load i32, i32* %13
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds double, double* %39, i64 %41
%43 = load double, double* %42
%44 = load double, double* %9
%45 = fsub double %43, %44
store double %45, double* %11
%46 = load double, double* %11
%47 = load double, double* %12
%48 = fadd double %47, %46
store double %48, double* %12
%49 = load double, double* %11
%50 = load double, double* %11
%51 = load double, double* %10
%52 = call double @llvm.fmuladd.f64(double %49, double %50, double %51)
store double %52, double* %10
br label %53
53: ; preds = %38
%54 = load i32, i32* %13
%55 = add nsw i32 %54, 1
store i32 %55, i32* %13
br label %34
56: ; preds = %34
%57 = load double, double* %10
%58 = load double, double* %12
%59 = load double, double* %12
%60 = fmul double %58, %59
%61 = load i32, i32* %6
%62 = sitofp i32 %61 to double
%63 = fdiv double %60, %62
%64 = fsub double %57, %63
%65 = load i32, i32* %6
%66 = sub nsw i32 %65, 1
%67 = sitofp i32 %66 to double
%68 = fdiv double %64, %67
store double %68, double* %10
%69 = load double, double* %9
%70 = load double*, double** %7
store double %69, double* %70
%71 = load double, double* %10
%72 = call double @sqrt(double %71)
%73 = load double*, double** %8
store double %72, double* %73
ret void
}

LLVM IR (-O2):
define void @mean_sd(double* nocapture %0, i32 %1, double* nocapture writeonly %2, double* nocapture writeonly %3) {
%5 = icmp sgt i32 %1, 0
br i1 %5, label %9, label %6
6: ; preds = %4
%7 = sitofp i32 %1 to double
%8 = fdiv double 0.000000e+00, %7
br label %128
9: ; preds = %4
%10 = zext i32 %1 to i64
%11 = add nsw i64 %10, -1
%12 = and i64 %10, 7
%13 = icmp ult i64 %11, 7
br i1 %13, label %54, label %14
14: ; preds = %9
%15 = and i64 %10, 4294967288
br label %16
16: ; preds = %16, %14
%17 = phi i64 [ 0, %14 ], [ %51, %16 ]
%18 = phi double [ 0.000000e+00, %14 ], [ %50, %16 ]
%19 = phi i64 [ 0, %14 ], [ %52, %16 ]
%20 = getelementptr inbounds double, double* %0, i64 %17
%21 = load double, double* %20
%22 = fadd double %18, %21
%23 = or i64 %17, 1
%24 = getelementptr inbounds double, double* %0, i64 %23
%25 = load double, double* %24
%26 = fadd double %22, %25
%27 = or i64 %17, 2
%28 = getelementptr inbounds double, double* %0, i64 %27
%29 = load double, double* %28
%30 = fadd double %26, %29
%31 = or i64 %17, 3
%32 = getelementptr inbounds double, double* %0, i64 %31
%33 = load double, double* %32
%34 = fadd double %30, %33
%35 = or i64 %17, 4
%36 = getelementptr inbounds double, double* %0, i64 %35
%37 = load double, double* %36
%38 = fadd double %34, %37
%39 = or i64 %17, 5
%40 = getelementptr inbounds double, double* %0, i64 %39
%41 = load double, double* %40
%42 = fadd double %38, %41
%43 = or i64 %17, 6
%44 = getelementptr inbounds double, double* %0, i64 %43
%45 = load double, double* %44
%46 = fadd double %42, %45
%47 = or i64 %17, 7
%48 = getelementptr inbounds double, double* %0, i64 %47
%49 = load double, double* %48
%50 = fadd double %46, %49
%51 = add nuw nsw i64 %17, 8
%52 = add i64 %19, 8
%53 = icmp eq i64 %52, %15
br i1 %53, label %54, label %16
54: ; preds = %16, %9
%55 = phi double [ undef, %9 ], [ %50, %16 ]
%56 = phi i64 [ 0, %9 ], [ %51, %16 ]
%57 = phi double [ 0.000000e+00, %9 ], [ %50, %16 ]
%58 = icmp eq i64 %12, 0
br i1 %58, label %69, label %59
59: ; preds = %54, %59
%60 = phi i64 [ %66, %59 ], [ %56, %54 ]
%61 = phi double [ %65, %59 ], [ %57, %54 ]
%62 = phi i64 [ %67, %59 ], [ 0, %54 ]
%63 = getelementptr inbounds double, double* %0, i64 %60
%64 = load double, double* %63
%65 = fadd double %61, %64
%66 = add nuw nsw i64 %60, 1
%67 = add i64 %62, 1
%68 = icmp eq i64 %67, %12
br i1 %68, label %69, label %59
69: ; preds = %59, %54
%70 = phi double [ %55, %54 ], [ %65, %59 ]
%71 = sitofp i32 %1 to double
%72 = fdiv double %70, %71
br i1 %5, label %73, label %128
73: ; preds = %69
%74 = and i64 %10, 3
%75 = icmp ult i64 %11, 3
br i1 %75, label %109, label %76
76: ; preds = %73
%77 = and i64 %10, 4294967292
br label %78
78: ; preds = %78, %76
%79 = phi i64 [ 0, %76 ], [ %106, %78 ]
%80 = phi double [ undef, %76 ], [ %104, %78 ]
%81 = phi double [ 0.000000e+00, %76 ], [ %105, %78 ]
%82 = phi i64 [ 0, %76 ], [ %107, %78 ]
%83 = getelementptr inbounds double, double* %0, i64 %79
%84 = load double, double* %83
%85 = fsub double %84, %72
%86 = fadd double %80, %85
%87 = tail call double @llvm.fmuladd.f64(double %85, double %85, double %81)
%88 = or i64 %79, 1
%89 = getelementptr inbounds double, double* %0, i64 %88
%90 = load double, double* %89
%91 = fsub double %90, %72
%92 = fadd double %86, %91
%93 = tail call double @llvm.fmuladd.f64(double %91, double %91, double %87)
%94 = or i64 %79, 2
%95 = getelementptr inbounds double, double* %0, i64 %94
%96 = load double, double* %95
%97 = fsub double %96, %72
%98 = fadd double %92, %97
%99 = tail call double @llvm.fmuladd.f64(double %97, double %97, double %93)
%100 = or i64 %79, 3
%101 = getelementptr inbounds double, double* %0, i64 %100
%102 = load double, double* %101
%103 = fsub double %102, %72
%104 = fadd double %98, %103
%105 = tail call double @llvm.fmuladd.f64(double %103, double %103, double %99)
%106 = add nuw nsw i64 %79, 4
%107 = add i64 %82, 4
%108 = icmp eq i64 %107, %77
br i1 %108, label %109, label %78
109: ; preds = %78, %73
%110 = phi double [ undef, %73 ], [ %105, %78 ]
%111 = phi i64 [ 0, %73 ], [ %106, %78 ]
%112 = phi double [ undef, %73 ], [ %104, %78 ]
%113 = phi double [ 0.000000e+00, %73 ], [ %105, %78 ]
%114 = icmp eq i64 %74, 0
br i1 %114, label %128, label %115
115: ; preds = %109, %115
%116 = phi i64 [ %125, %115 ], [ %111, %109 ]
%117 = phi double [ %123, %115 ], [ %112, %109 ]
%118 = phi double [ %124, %115 ], [ %113, %109 ]
%119 = phi i64 [ %126, %115 ], [ 0, %109 ]
%120 = getelementptr inbounds double, double* %0, i64 %116
%121 = load double, double* %120
%122 = fsub double %121, %72
%123 = fadd double %117, %122
%124 = tail call double @llvm.fmuladd.f64(double %122, double %122, double %118)
%125 = add nuw nsw i64 %116, 1
%126 = add i64 %119, 1
%127 = icmp eq i64 %126, %74
br i1 %127, label %128, label %115
128: ; preds = %109, %115, %6, %69
%129 = phi double [ %72, %69 ], [ %8, %6 ], [ %72, %115 ], [ %72, %109 ]
%130 = phi double [ %71, %69 ], [ %7, %6 ], [ %71, %115 ], [ %71, %109 ]
%131 = phi double [ 0.000000e+00, %69 ], [ 0.000000e+00, %6 ], [ %110, %109 ], [ %124, %115 ]
%132 = phi double [ undef, %69 ], [ undef, %6 ], [ %112, %109 ], [ %123, %115 ]
%133 = fmul double %132, %132
%134 = fdiv double %133, %130
%135 = fsub double %131, %134
%136 = add nsw i32 %1, -1
%137 = sitofp i32 %136 to double
%138 = fdiv double %135, %137
store double %129, double* %2
%139 = tail call double @sqrt(double %138)
store double %139, double* %3
ret void
}