#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 double clock_t;

/* Variables and functions */
double CLOCKS_PER_SEC;
double clock();
int /*<<< orphan*/ dumb_fht(float *, int);
double fabs(float);
int /*<<< orphan*/ fht_float(float *, int);
int /*<<< orphan*/ free(float *);
void *malloc(int);
int /*<<< orphan*/ printf(char *, double);
int rand();
int /*<<< orphan*/ srand(int);
int main(void) {
  srand(4057218);
  for (int log_n = 1; log_n <= 30; ++log_n) {
    printf("%d ", log_n);
    int n = 1 << log_n;
    void *buf = malloc(sizeof(float) * n + 32);
    char *start = buf;
    while ((size_t)start % 32 != 0)
      start = start + 1;
    float *a = (float *)start;
    float *aux = (float *)malloc(sizeof(double) * n);
    for (int i = 0; i < n; ++i) {
      a[i] = 1.0 - 2.0 * (rand() & 1);
      aux[i] = a[i];
    }
    fht_float(a, log_n);
    dumb_fht(aux, log_n);
    double max_error = 0.0;
    for (int i = 0; i < n; ++i) {
      double error = fabs(a[i] - aux[i]);
      if (error > max_error) {
        max_error = error;
      }
    }
    if (max_error > 1e-5) {
      printf("ERROR: %.10lf\n", max_error);
      return 1;
    }
    for (int num_it = 10;; num_it *= 2) {
      clock_t tt1 = clock();
      for (int it = 0; it < num_it; ++it) {
        fht_float(a, log_n);
      }
      clock_t tt2 = clock();
      double sec = (tt2 - tt1) / (CLOCKS_PER_SEC + 0.0);
      if (sec >= 1.0) {
        printf("%.10e\n", sec / (num_it + 0.0));
        break;
      }
    }
    free(buf);
    free(aux);
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x3de882,%edi
call   1060 <srand@plt>
movl   $0x1,-0x8(%rbp)
cmpl   $0x1e,-0x8(%rbp)
jg     1437 <main+0x2a7>
cvtsi2sdl -0x8(%rbp),%xmm0
lea    0xe47(%rip),%rdi
call   1050 <printf@plt>
mov    -0x8(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,-0xc(%rbp)
movslq -0xc(%rbp),%rax
shl    $0x2,%rax
add    $0x20,%rax
mov    %eax,%edi
call   1090 <malloc@plt>
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    $0x1f,%rax
cmp    $0x0,%rax
je     121d <main+0x8d>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11fa <main+0x6a>
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
movslq -0xc(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1090 <malloc@plt>
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12a2 <main+0x112>
mov    $0x0,%al
call   10b0 <rand@plt>
and    $0x1,%eax
cvtsi2sd %eax,%xmm1
addsd  %xmm1,%xmm1
movsd  0xda3(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    123f <main+0xaf>
mov    -0x28(%rbp),%rdi
mov    -0x8(%rbp),%esi
call   10a0 <fht_float@plt>
mov    -0x30(%rbp),%rdi
mov    -0x8(%rbp),%esi
call   1080 <dumb_fht@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1326 <main+0x196>
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
call   1070 <fabs@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1313 <main+0x183>
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1318 <main+0x188>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    12c9 <main+0x139>
movsd  -0x40(%rbp),%xmm0
movsd  0xccd(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    135a <main+0x1ca>
movsd  -0x40(%rbp),%xmm0
lea    0xccb(%rip),%rdi
call   1050 <printf@plt>
movl   $0x1,-0x4(%rbp)
jmp    143e <main+0x2ae>
movl   $0xa,-0x54(%rbp)
mov    $0x0,%al
call   1040 <clock@plt>
movsd  %xmm0,-0x60(%rbp)
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
cmp    -0x54(%rbp),%eax
jge    139a <main+0x20a>
mov    -0x28(%rbp),%rdi
mov    -0x8(%rbp),%esi
call   10a0 <fht_float@plt>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1374 <main+0x1e4>
mov    $0x0,%al
call   1040 <clock@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm0
subsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
mov    0x2c2e(%rip),%rax
addsd  (%rax),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  0xc34(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1404 <main+0x274>
movsd  -0x78(%rbp),%xmm0
cvtsi2sdl -0x54(%rbp),%xmm1
xorps  %xmm2,%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
lea    0xc29(%rip),%rdi
call   1050 <printf@plt>
jmp    1417 <main+0x287>
jmp    1409 <main+0x279>
mov    -0x54(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1361 <main+0x1d1>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    11b3 <main+0x23>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    $0x3de882,%edi
call   1060 <srand@plt>
mov    $0x1,%r13d
xchg   %ax,%ax
xorps  %xmm0,%xmm0
cvtsi2sd %r13d,%xmm0
lea    0xe59(%rip),%rdi
call   1050 <printf@plt>
mov    $0x1,%r12d
mov    %r13d,%ecx
shl    %cl,%r12d
lea    0x20(,%r12,4),%edi
call   1090 <malloc@plt>
mov    %eax,%ecx
neg    %ecx
and    $0x1f,%ecx
mov    %rax,0x18(%rsp)
mov    %rcx,0x8(%rsp)
lea    (%rax,%rcx,1),%rbp
lea    0x0(,%r12,8),%edi
call   1090 <malloc@plt>
mov    %rax,%rbx
cmp    $0x2,%r12d
mov    $0x1,%r14d
cmovge %r12d,%r14d
xor    %r15d,%r15d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %eax,%eax
call   10b0 <rand@plt>
and    $0x1,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
addsd  %xmm0,%xmm0
movsd  0xdc3(%rip),%xmm1
subsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,0x0(%rbp,%r15,4)
movss  %xmm0,(%rbx,%r15,4)
add    $0x1,%r15
cmp    %r15,%r14
jne    1220 <main+0x90>
mov    %rbp,%rdi
mov    %r13d,%esi
call   10a0 <fht_float@plt>
mov    %rbx,0x10(%rsp)
mov    %rbx,%rdi
mov    %r13d,%esi
call   1080 <dumb_fht@plt>
cmp    $0x2,%r12d
jge    1290 <main+0x100>
xorps  %xmm0,%xmm0
xor    %r15d,%r15d
mov    0x10(%rsp),%rbx
jmp    1307 <main+0x177>
nopl   0x0(%rax)
mov    %r14d,%eax
and    $0x7ffffffe,%eax
mov    %rax,0x20(%rsp)
mov    0x18(%rsp),%rax
mov    0x8(%rsp),%rcx
lea    (%rax,%rcx,1),%r12
add    $0x4,%r12
xorps  %xmm0,%xmm0
xor    %r15d,%r15d
mov    0x10(%rsp),%rbx
nopw   0x0(%rax,%rax,1)
movsd  %xmm0,0x8(%rsp)
movss  -0x4(%r12,%r15,4),%xmm0
subss  (%rbx,%r15,4),%xmm0
call   1070 <fabs@plt>
maxsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movss  (%r12,%r15,4),%xmm0
subss  0x4(%rbx,%r15,4),%xmm0
call   1070 <fabs@plt>
maxsd  0x8(%rsp),%xmm0
add    $0x2,%r15
cmp    %r15,0x20(%rsp)
jne    12c0 <main+0x130>
test   $0x1,%r14b
mov    %rbx,%r12
je     132e <main+0x19e>
movsd  %xmm0,0x8(%rsp)
movss  0x0(%rbp,%r15,4),%xmm0
subss  (%r12,%r15,4),%xmm0
call   1070 <fabs@plt>
maxsd  0x8(%rsp),%xmm0
ucomisd 0xcd2(%rip),%xmm0
ja     13e8 <main+0x258>
mov    $0xa,%eax
mov    0x2ca0(%rip),%r15
nopl   0x0(%rax,%rax,1)
mov    %eax,%r14d
xor    %eax,%eax
call   1040 <clock@plt>
movsd  %xmm0,0x8(%rsp)
cmp    $0x2,%r14d
mov    $0x1,%ebx
cmovae %r14d,%ebx
nopl   (%rax)
mov    %rbp,%rdi
mov    %r13d,%esi
call   10a0 <fht_float@plt>
add    $0xffffffff,%ebx
jne    1370 <main+0x1e0>
xor    %eax,%eax
call   1040 <clock@plt>
subsd  0x8(%rsp),%xmm0
movsd  (%r15),%xmm1
addsd  0xc76(%rip),%xmm1
divsd  %xmm1,%xmm0
lea    (%r14,%r14,1),%eax
ucomisd 0xc56(%rip),%xmm0
jb     1350 <main+0x1c0>
xorps  %xmm1,%xmm1
cvtsi2sd %r14d,%xmm1
divsd  %xmm1,%xmm0
lea    0xc6c(%rip),%rdi
call   1050 <printf@plt>
mov    0x18(%rsp),%rdi
call   1030 <free@plt>
mov    %r12,%rdi
call   1030 <free@plt>
add    $0x1,%r13d
cmp    $0x1f,%r13d
jne    11b0 <main+0x20>
xor    %eax,%eax
jmp    13f9 <main+0x269>
lea    0xc2d(%rip),%rdi
call   1050 <printf@plt>
mov    $0x1,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [4 x i8] c"%d \00"
@.str.1 = [15 x i8] c"ERROR: %.10lf\0A\00"
@CLOCKS_PER_SEC = global double 0.000000e+00
@.str.2 = [7 x i8] c"%.10e\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca float*
%7 = alloca float*
%8 = alloca i32
%9 = alloca double
%10 = alloca i32
%11 = alloca double
%12 = alloca i32
%13 = alloca double
%14 = alloca i32
%15 = alloca double
%16 = alloca double
store i32 0, i32* %1
%17 = call i32 @srand(i32 4057218)
store i32 1, i32* %2
br label %18
18: ; preds = %157, %0
%19 = load i32, i32* %2
%20 = icmp sle i32 %19, 30
br i1 %20, label %21, label %160
21: ; preds = %18
%22 = load i32, i32* %2
%23 = sitofp i32 %22 to double
%24 = call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %23)
%25 = load i32, i32* %2
%26 = shl i32 1, %25
store i32 %26, i32* %3
%27 = load i32, i32* %3
%28 = sext i32 %27 to i64
%29 = mul i64 4, %28
%30 = add i64 %29, 32
%31 = trunc i64 %30 to i32
%32 = call i8* @malloc(i32 %31)
store i8* %32, i8** %4
%33 = load i8*, i8** %4
store i8* %33, i8** %5
br label %34
34: ; preds = %39, %21
%35 = load i8*, i8** %5
%36 = ptrtoint i8* %35 to i64
%37 = urem i64 %36, 32
%38 = icmp ne i64 %37, 0
br i1 %38, label %39, label %42
39: ; preds = %34
%40 = load i8*, i8** %5
%41 = getelementptr inbounds i8, i8* %40, i64 1
store i8* %41, i8** %5
br label %34
42: ; preds = %34
%43 = load i8*, i8** %5
%44 = bitcast i8* %43 to float*
store float* %44, float** %6
%45 = load i32, i32* %3
%46 = sext i32 %45 to i64
%47 = mul i64 8, %46
%48 = trunc i64 %47 to i32
%49 = call i8* @malloc(i32 %48)
%50 = bitcast i8* %49 to float*
store float* %50, float** %7
store i32 0, i32* %8
br label %51
51: ; preds = %74, %42
%52 = load i32, i32* %8
%53 = load i32, i32* %3
%54 = icmp slt i32 %52, %53
br i1 %54, label %55, label %77
55: ; preds = %51
%56 = call i32 (...) @rand()
%57 = and i32 %56, 1
%58 = sitofp i32 %57 to double
%59 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %58, double 1.000000e+00)
%60 = fptrunc double %59 to float
%61 = load float*, float** %6
%62 = load i32, i32* %8
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds float, float* %61, i64 %63
store float %60, float* %64
%65 = load float*, float** %6
%66 = load i32, i32* %8
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds float, float* %65, i64 %67
%69 = load float, float* %68
%70 = load float*, float** %7
%71 = load i32, i32* %8
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds float, float* %70, i64 %72
store float %69, float* %73
br label %74
74: ; preds = %55
%75 = load i32, i32* %8
%76 = add nsw i32 %75, 1
store i32 %76, i32* %8
br label %51
77: ; preds = %51
%78 = load float*, float** %6
%79 = load i32, i32* %2
%80 = call i32 @fht_float(float* %78, i32 %79)
%81 = load float*, float** %7
%82 = load i32, i32* %2
%83 = call i32 @dumb_fht(float* %81, i32 %82)
store double 0.000000e+00, double* %9
store i32 0, i32* %10
br label %84
84: ; preds = %107, %77
%85 = load i32, i32* %10
%86 = load i32, i32* %3
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %110
88: ; preds = %84
%89 = load float*, float** %6
%90 = load i32, i32* %10
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds float, float* %89, i64 %91
%93 = load float, float* %92
%94 = load float*, float** %7
%95 = load i32, i32* %10
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds float, float* %94, i64 %96
%98 = load float, float* %97
%99 = fsub float %93, %98
%100 = call double @fabs(float %99)
store double %100, double* %11
%101 = load double, double* %11
%102 = load double, double* %9
%103 = fcmp ogt double %101, %102
br i1 %103, label %104, label %106
104: ; preds = %88
%105 = load double, double* %11
store double %105, double* %9
br label %106
106: ; preds = %104, %88
br label %107
107: ; preds = %106
%108 = load i32, i32* %10
%109 = add nsw i32 %108, 1
store i32 %109, i32* %10
br label %84
110: ; preds = %84
%111 = load double, double* %9
%112 = fcmp ogt double %111, 1.000000e-05
br i1 %112, label %113, label %116
113: ; preds = %110
%114 = load double, double* %9
%115 = call i32 @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), double %114)
store i32 1, i32* %1
br label %161
116: ; preds = %110
store i32 10, i32* %12
br label %117
117: ; preds = %148, %116
%118 = call double (...) @clock()
store double %118, double* %13
store i32 0, i32* %14
br label %119
119: ; preds = %127, %117
%120 = load i32, i32* %14
%121 = load i32, i32* %12
%122 = icmp slt i32 %120, %121
br i1 %122, label %123, label %130
123: ; preds = %119
%124 = load float*, float** %6
%125 = load i32, i32* %2
%126 = call i32 @fht_float(float* %124, i32 %125)
br label %127
127: ; preds = %123
%128 = load i32, i32* %14
%129 = add nsw i32 %128, 1
store i32 %129, i32* %14
br label %119
130: ; preds = %119
%131 = call double (...) @clock()
store double %131, double* %15
%132 = load double, double* %15
%133 = load double, double* %13
%134 = fsub double %132, %133
%135 = load double, double* @CLOCKS_PER_SEC
%136 = fadd double %135, 0.000000e+00
%137 = fdiv double %134, %136
store double %137, double* %16
%138 = load double, double* %16
%139 = fcmp oge double %138, 1.000000e+00
br i1 %139, label %140, label %147
140: ; preds = %130
%141 = load double, double* %16
%142 = load i32, i32* %12
%143 = sitofp i32 %142 to double
%144 = fadd double %143, 0.000000e+00
%145 = fdiv double %141, %144
%146 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), double %145)
br label %151
147: ; preds = %130
br label %148
148: ; preds = %147
%149 = load i32, i32* %12
%150 = mul nsw i32 %149, 2
store i32 %150, i32* %12
br label %117
151: ; preds = %140
%152 = load i8*, i8** %4
%153 = bitcast i8* %152 to float*
%154 = call i32 @free(float* %153)
%155 = load float*, float** %7
%156 = call i32 @free(float* %155)
br label %157
157: ; preds = %151
%158 = load i32, i32* %2
%159 = add nsw i32 %158, 1
store i32 %159, i32* %2
br label %18
160: ; preds = %18
store i32 0, i32* %1
br label %161
161: ; preds = %160, %113
%162 = load i32, i32* %1
ret i32 %162
}

LLVM IR (-O2):
@.str = [4 x i8] c"%d \00"
@.str.1 = [15 x i8] c"ERROR: %.10lf\0A\00"
@CLOCKS_PER_SEC = global double 0.000000e+00
@.str.2 = [7 x i8] c"%.10e\0A\00"
define i32 @main() {
%1 = tail call i32 @srand(i32 4057218)
br label %11
2: ; preds = %94
%3 = sitofp i32 %91 to double
%4 = fdiv double %99, %3
%5 = tail call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), double %4)
%6 = bitcast i8* %18 to float*
%7 = tail call i32 @free(float* %6)
%8 = tail call i32 @free(float* %26)
%9 = add nuw nsw i32 %12, 1
%10 = icmp eq i32 %9, 31
br i1 %10, label %107, label %11
11: ; preds = %2, %0
%12 = phi i32 [ 1, %0 ], [ %9, %2 ]
%13 = sitofp i32 %12 to double
%14 = tail call i32 @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %13)
%15 = shl nuw nsw i32 1, %12
%16 = shl i32 %15, 2
%17 = add i32 %16, 32
%18 = tail call i8* @malloc(i32 %17)
%19 = ptrtoint i8* %18 to i64
%20 = sub i64 0, %19
%21 = and i64 %20, 31
%22 = getelementptr i8, i8* %18, i64 %21
%23 = bitcast i8* %22 to float*
%24 = shl i32 %15, 3
%25 = tail call i8* @malloc(i32 %24)
%26 = bitcast i8* %25 to float*
%27 = call i32 @llvm.smax.i32(i32 %15, i32 1)
%28 = zext i32 %27 to i64
br label %36
29: ; preds = %36
%30 = tail call i32 @fht_float(float* %23, i32 %12)
%31 = tail call i32 @dumb_fht(float* %26, i32 %12)
%32 = and i64 %28, 1
%33 = icmp slt i32 %15, 2
br i1 %33, label %47, label %34
34: ; preds = %29
%35 = and i64 %28, 2147483646
br label %64
36: ; preds = %11, %36
%37 = phi i64 [ 0, %11 ], [ %45, %36 ]
%38 = tail call i32 (...) @rand()
%39 = and i32 %38, 1
%40 = sitofp i32 %39 to double
%41 = tail call double @llvm.fmuladd.f64(double %40, double -2.000000e+00, double 1.000000e+00)
%42 = fptrunc double %41 to float
%43 = getelementptr inbounds float, float* %23, i64 %37
store float %42, float* %43
%44 = getelementptr inbounds float, float* %26, i64 %37
store float %42, float* %44
%45 = add nuw nsw i64 %37, 1
%46 = icmp eq i64 %45, %28
br i1 %46, label %29, label %36
47: ; preds = %64, %29
%48 = phi double [ undef, %29 ], [ %84, %64 ]
%49 = phi i64 [ 0, %29 ], [ %85, %64 ]
%50 = phi double [ 0.000000e+00, %29 ], [ %84, %64 ]
%51 = icmp eq i64 %32, 0
br i1 %51, label %61, label %52
52: ; preds = %47
%53 = getelementptr inbounds float, float* %23, i64 %49
%54 = load float, float* %53
%55 = getelementptr inbounds float, float* %26, i64 %49
%56 = load float, float* %55
%57 = fsub float %54, %56
%58 = tail call double @fabs(float %57)
%59 = fcmp ogt double %58, %50
%60 = select i1 %59, double %58, double %50
br label %61
61: ; preds = %47, %52
%62 = phi double [ %48, %47 ], [ %60, %52 ]
%63 = fcmp ogt double %62, 1.000000e-05
br i1 %63, label %88, label %90
64: ; preds = %64, %34
%65 = phi i64 [ 0, %34 ], [ %85, %64 ]
%66 = phi double [ 0.000000e+00, %34 ], [ %84, %64 ]
%67 = phi i64 [ 0, %34 ], [ %86, %64 ]
%68 = getelementptr inbounds float, float* %23, i64 %65
%69 = load float, float* %68
%70 = getelementptr inbounds float, float* %26, i64 %65
%71 = load float, float* %70
%72 = fsub float %69, %71
%73 = tail call double @fabs(float %72)
%74 = fcmp ogt double %73, %66
%75 = select i1 %74, double %73, double %66
%76 = or i64 %65, 1
%77 = getelementptr inbounds float, float* %23, i64 %76
%78 = load float, float* %77
%79 = getelementptr inbounds float, float* %26, i64 %76
%80 = load float, float* %79
%81 = fsub float %78, %80
%82 = tail call double @fabs(float %81)
%83 = fcmp ogt double %82, %75
%84 = select i1 %83, double %82, double %75
%85 = add nuw nsw i64 %65, 2
%86 = add i64 %67, 2
%87 = icmp eq i64 %86, %35
br i1 %87, label %47, label %64
88: ; preds = %61
%89 = tail call i32 @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), double %62)
br label %107
90: ; preds = %61, %94
%91 = phi i32 [ %101, %94 ], [ 10, %61 ]
%92 = tail call double (...) @clock()
%93 = call i32 @llvm.umax.i32(i32 %91, i32 1)
br label %102
94: ; preds = %102
%95 = tail call double (...) @clock()
%96 = fsub double %95, %92
%97 = load double, double* @CLOCKS_PER_SEC
%98 = fadd double %97, 0.000000e+00
%99 = fdiv double %96, %98
%100 = fcmp ult double %99, 1.000000e+00
%101 = shl nsw i32 %91, 1
br i1 %100, label %90, label %2
102: ; preds = %90, %102
%103 = phi i32 [ 0, %90 ], [ %105, %102 ]
%104 = tail call i32 @fht_float(float* %23, i32 %12)
%105 = add nuw i32 %103, 1
%106 = icmp eq i32 %105, %93
br i1 %106, label %94, label %102
107: ; preds = %2, %88
%108 = phi i32 [ 1, %88 ], [ 0, %2 ]
ret i32 %108
}