#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 doubleMAD(int, double *);
double doublemedian(int, double *);
double Tukey_d(int ndat, double *dat) {
  int niter = 10;
  int n, i;
  double s;
  double t, u, c;
  double sdenom, snumer;
  s = doubleMAD(ndat, dat) / 0.6745;
  t = doublemedian(ndat, dat);
  c = 6.0;
  for (n = 0; n < niter; n++) {
    snumer = 0;
    sdenom = 0;
    for (i = 0; i < ndat; i++) {
      u = (dat[i] - t) / (c * s);
      if (u < 1 && u > -1) {
        snumer += dat[i] * (1. - u * u) * (1. - u * u);
        sdenom += (1. - u * u) * (1. - u * u);
      }
    }
    if (sdenom != 0) {
      t = snumer / sdenom;
    } else {
      c *= 1.1;
    }
  }
  return t;
}


x86 assembly (clang, -O0):
<Tukey_d>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0xa,-0x14(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x10(%rbp),%rsi
call   1030 <doubleMAD@plt>
movsd  0xebe(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x4(%rbp),%edi
mov    -0x10(%rbp),%rsi
call   1040 <doublemedian@plt>
movsd  %xmm0,-0x30(%rbp)
movsd  0xe94(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1358 <Tukey_d+0x238>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1302 <Tukey_d+0x1e2>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xe44(%rip),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    12ef <Tukey_d+0x1cf>
movsd  -0x38(%rbp),%xmm0
movsd  0xe34(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    12ef <Tukey_d+0x1cf>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x38(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xde8(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x38(%rbp),%xmm1
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm1,%xmm2
movsd  0xdb3(%rip),%xmm1
addsd  %xmm1,%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xd70(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm2
movsd  -0x38(%rbp),%xmm1
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm1,%xmm2
movsd  0xd3f(%rip),%xmm1
addsd  %xmm1,%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    12f4 <Tukey_d+0x1d4>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    119b <Tukey_d+0x7b>
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    131f <Tukey_d+0x1ff>
jp     131f <Tukey_d+0x1ff>
jmp    1333 <Tukey_d+0x213>
movsd  -0x50(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1345 <Tukey_d+0x225>
movsd  0xcd5(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    134a <Tukey_d+0x22a>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1178 <Tukey_d+0x58>
movsd  -0x30(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Tukey_d>:
push   %rbp
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %edi,%ebp
call   1030 <doubleMAD@plt>
divsd  0xecb(%rip),%xmm0
movsd  %xmm0,(%rsp)
mov    %ebp,%edi
mov    %rbx,%rsi
call   1040 <doublemedian@plt>
movsd  (%rsp),%xmm11
mov    %ebp,%eax
xor    %ecx,%ecx
movsd  0xeb1(%rip),%xmm10
movsd  0xeb1(%rip),%xmm1
movsd  0xeb1(%rip),%xmm3
xorpd  %xmm9,%xmm9
movsd  0xeab(%rip),%xmm8
jmp    1191 <Tukey_d+0x71>
nopw   0x0(%rax,%rax,1)
mulsd  %xmm8,%xmm10
add    $0x1,%ecx
cmp    $0xa,%ecx
je     121e <Tukey_d+0xfe>
test   %ebp,%ebp
jle    1180 <Tukey_d+0x60>
movapd %xmm11,%xmm7
mulsd  %xmm10,%xmm7
xorpd  %xmm6,%xmm6
xor    %edx,%edx
jmp    11b9 <Tukey_d+0x99>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rdx
cmp    %rdx,%rax
je     1200 <Tukey_d+0xe0>
movsd  (%rbx,%rdx,8),%xmm4
movapd %xmm4,%xmm5
subsd  %xmm0,%xmm5
divsd  %xmm7,%xmm5
ucomisd %xmm5,%xmm1
jbe    11b0 <Tukey_d+0x90>
ucomisd %xmm3,%xmm5
jbe    11b0 <Tukey_d+0x90>
mulsd  %xmm5,%xmm5
movapd %xmm1,%xmm2
subsd  %xmm5,%xmm2
mulsd  %xmm2,%xmm4
movapd %xmm2,%xmm5
unpcklpd %xmm4,%xmm5
unpcklpd %xmm2,%xmm2
mulpd  %xmm5,%xmm2
addpd  %xmm2,%xmm6
jmp    11b0 <Tukey_d+0x90>
nopl   0x0(%rax)
ucomisd %xmm9,%xmm6
jne    120d <Tukey_d+0xed>
jnp    1180 <Tukey_d+0x60>
movapd %xmm6,%xmm0
unpckhpd %xmm6,%xmm0
divsd  %xmm6,%xmm0
jmp    1185 <Tukey_d+0x65>
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define double @Tukey_d(i32 %0, double* %1) {
%3 = tail call double @doubleMAD(i32 %0, double* %1)
%4 = fdiv double %3, 6.745000e-01
%5 = tail call double @doublemedian(i32 %0, double* %1)
%6 = icmp sgt i32 %0, 0
%7 = zext i32 %0 to i64
br label %8
8: ; preds = %2, %44
%9 = phi double [ 6.000000e+00, %2 ], [ %46, %44 ]
%10 = phi i32 [ 0, %2 ], [ %47, %44 ]
%11 = phi double [ %5, %2 ], [ %45, %44 ]
br i1 %6, label %12, label %42
12: ; preds = %8
%13 = fmul double %4, %9
br label %14
14: ; preds = %12, %32
%15 = phi i64 [ 0, %12 ], [ %34, %32 ]
%16 = phi <2 x double> [ zeroinitializer, %12 ], [ %33, %32 ]
%17 = getelementptr inbounds double, double* %1, i64 %15
%18 = load double, double* %17
%19 = fsub double %18, %11
%20 = fdiv double %19, %13
%21 = fcmp olt double %20, 1.000000e+00
%22 = fcmp ogt double %20, -1.000000e+00
%23 = and i1 %21, %22
br i1 %23, label %24, label %32
24: ; preds = %14
%25 = fneg double %20
%26 = tail call double @llvm.fmuladd.f64(double %25, double %20, double 1.000000e+00)
%27 = fmul double %18, %26
%28 = insertelement <2 x double> poison, double %26, i64 0
%29 = insertelement <2 x double> %28, double %27, i64 1
%30 = shufflevector <2 x double> %28, <2 x double> poison, <2 x i32> zeroinitializer
%31 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %29, <2 x double> %30, <2 x double> %16)
br label %32
32: ; preds = %14, %24
%33 = phi <2 x double> [ %31, %24 ], [ %16, %14 ]
%34 = add nuw nsw i64 %15, 1
%35 = icmp eq i64 %34, %7
br i1 %35, label %36, label %14
36: ; preds = %32
%37 = extractelement <2 x double> %33, i64 0
%38 = fcmp une double %37, 0.000000e+00
br i1 %38, label %39, label %42
39: ; preds = %36
%40 = extractelement <2 x double> %33, i64 1
%41 = fdiv double %40, %37
br label %44
42: ; preds = %8, %36
%43 = fmul double %9, 1.100000e+00
br label %44
44: ; preds = %39, %42
%45 = phi double [ %41, %39 ], [ %11, %42 ]
%46 = phi double [ %9, %39 ], [ %43, %42 ]
%47 = add nuw nsw i32 %10, 1
%48 = icmp eq i32 %47, 10
br i1 %48, label %49, label %8
49: ; preds = %44
ret double %45
}