#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 */
int logf(int);
int /*<<< orphan*/ median(float *, int, float *);
float sqrt(int);
void denoise_donohoSoft_DWTAnlz(float *ip, float *op, int n) {
  float med, trshld;
  for (int j = 1; j < n; j *= 2) {
    median(ip + j, j, &med);
    trshld = med / 0.6745 * sqrt(2 * logf(j));
    for (int i = j; i < 2 * j; i++) {
      if (ip[i] > trshld)
        op[i] = ip[i] - trshld;
      else if (ip[i] < -trshld)
        op[i] = ip[i] + trshld;
      else
        op[i] = 0;
    }
  }
}


x86 assembly (clang, -O0):
<denoise_donohoSoft_DWTAnlz>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    128f <denoise_donohoSoft_DWTAnlz+0x15f>
mov    -0x8(%rbp),%rdi
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x20(%rbp),%esi
lea    -0x18(%rbp),%rdx
call   1030 <median@plt>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe7e(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%edi
call   1040 <logf@plt>
mov    %eax,%edi
shl    $0x1,%edi
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
cmp    %ecx,%eax
jge    127c <denoise_donohoSoft_DWTAnlz+0x14c>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x1c(%rbp),%xmm0
jbe    1208 <denoise_donohoSoft_DWTAnlz+0xd8>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1269 <denoise_donohoSoft_DWTAnlz+0x139>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x1c(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
ucomiss %xmm1,%xmm0
jbe    1254 <denoise_donohoSoft_DWTAnlz+0x124>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1264 <denoise_donohoSoft_DWTAnlz+0x134>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    1269 <denoise_donohoSoft_DWTAnlz+0x139>
jmp    126e <denoise_donohoSoft_DWTAnlz+0x13e>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11bc <denoise_donohoSoft_DWTAnlz+0x8c>
jmp    1281 <denoise_donohoSoft_DWTAnlz+0x151>
mov    -0x20(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    114a <denoise_donohoSoft_DWTAnlz+0x1a>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<denoise_donohoSoft_DWTAnlz>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
cmp    $0x2,%edx
jl     13a3 <denoise_donohoSoft_DWTAnlz+0x273>
mov    %edx,%r14d
mov    %rsi,%r12
mov    %rdi,%rbp
lea    0x10(%rdi),%rax
mov    %rax,0x8(%rsp)
lea    0x10(%rsi),%r13
mov    $0x1,%r8d
lea    0x4(%rsp),%r15
jmp    1179 <denoise_donohoSoft_DWTAnlz+0x49>
nopw   0x0(%rax,%rax,1)
cmp    %r14d,%r8d
jge    13a3 <denoise_donohoSoft_DWTAnlz+0x273>
mov    %r8d,%ebx
mov    %r8d,%eax
lea    0x0(,%rax,4),%rdi
add    %rbp,%rdi
mov    %r8d,%esi
mov    %r15,%rdx
call   1030 <median@plt>
movss  0x4(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  0xe59(%rip),%xmm0
movsd  %xmm0,0x10(%rsp)
mov    %ebx,%edi
call   1040 <logf@plt>
lea    (%rax,%rax,1),%edi
call   1050 <sqrt@plt>
lea    (%rbx,%rbx,1),%r8d
cmp    %r8d,%ebx
jge    1170 <denoise_donohoSoft_DWTAnlz+0x40>
cvtss2sd %xmm0,%xmm0
movsd  0x10(%rsp),%xmm1
mulsd  %xmm0,%xmm1
xorps  %xmm10,%xmm10
cvtsd2ss %xmm1,%xmm10
movaps %xmm10,%xmm8
xorps  0xe28(%rip),%xmm8
movslq %ebx,%rax
movslq %r8d,%rcx
mov    %rcx,%r9
sub    %rax,%r9
cmp    $0x8,%r9
jb     1222 <denoise_donohoSoft_DWTAnlz+0xf2>
lea    (%r12,%rax,4),%rdx
lea    0x0(,%rcx,4),%rsi
add    %rbp,%rsi
cmp    %rsi,%rdx
jae    124b <denoise_donohoSoft_DWTAnlz+0x11b>
lea    (%r12,%rcx,4),%rdx
lea    0x0(,%rax,4),%rsi
add    %rbp,%rsi
cmp    %rdx,%rsi
jae    124b <denoise_donohoSoft_DWTAnlz+0x11b>
mov    %rax,%rdx
mov    %rdx,%rsi
test   $0x1,%dl
je     132e <denoise_donohoSoft_DWTAnlz+0x1fe>
movss  0x0(%rbp,%rdx,4),%xmm1
ucomiss %xmm10,%xmm1
jbe    1313 <denoise_donohoSoft_DWTAnlz+0x1e3>
subss  %xmm10,%xmm1
jmp    1321 <denoise_donohoSoft_DWTAnlz+0x1f1>
mov    %r9,%rdi
and    $0xfffffffffffffff8,%rdi
lea    (%rdi,%rax,1),%rdx
movaps %xmm10,%xmm11
shufps $0x0,%xmm10,%xmm11
movaps %xmm8,%xmm3
shufps $0x0,%xmm8,%xmm3
movaps %xmm11,%xmm9
xorps  0xd9c(%rip),%xmm9
mov    0x8(%rsp),%rsi
lea    (%rsi,%rax,4),%rbx
lea    0x0(,%rax,4),%rax
add    %r13,%rax
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movups -0x10(%rbx,%rsi,4),%xmm4
movups (%rbx,%rsi,4),%xmm5
movaps %xmm11,%xmm6
cmpnltps %xmm4,%xmm6
movaps %xmm11,%xmm7
cmpnltps %xmm5,%xmm7
movaps %xmm4,%xmm1
cmpltps %xmm3,%xmm1
andps  %xmm6,%xmm1
movaps %xmm11,%xmm2
andps  %xmm1,%xmm2
andnps %xmm9,%xmm1
orps   %xmm2,%xmm1
addps  %xmm4,%xmm1
cmpnltps %xmm3,%xmm4
movaps %xmm5,%xmm2
cmpltps %xmm3,%xmm2
andps  %xmm7,%xmm2
movaps %xmm11,%xmm0
andps  %xmm2,%xmm0
andnps %xmm9,%xmm2
orps   %xmm0,%xmm2
addps  %xmm5,%xmm2
cmpnltps %xmm3,%xmm5
andps  %xmm6,%xmm4
andps  %xmm7,%xmm5
andnps %xmm1,%xmm4
andnps %xmm2,%xmm5
movups %xmm4,-0x10(%rax,%rsi,4)
movups %xmm5,(%rax,%rsi,4)
add    $0x8,%rsi
cmp    %rsi,%rdi
jne    1290 <denoise_donohoSoft_DWTAnlz+0x160>
cmp    %rdi,%r9
je     1170 <denoise_donohoSoft_DWTAnlz+0x40>
jmp    1225 <denoise_donohoSoft_DWTAnlz+0xf5>
xorps  %xmm2,%xmm2
ucomiss %xmm1,%xmm8
jbe    1324 <denoise_donohoSoft_DWTAnlz+0x1f4>
addss  %xmm10,%xmm1
movaps %xmm1,%xmm2
movss  %xmm2,(%r12,%rdx,4)
lea    0x1(%rdx),%rsi
not    %rdx
add    %rcx,%rdx
jne    135c <denoise_donohoSoft_DWTAnlz+0x22c>
jmp    1170 <denoise_donohoSoft_DWTAnlz+0x40>
nopl   0x0(%rax,%rax,1)
subss  %xmm10,%xmm1
movaps %xmm1,%xmm2
movss  %xmm2,0x4(%r12,%rsi,4)
add    $0x2,%rsi
cmp    %rsi,%rcx
je     1170 <denoise_donohoSoft_DWTAnlz+0x40>
movss  0x0(%rbp,%rsi,4),%xmm1
ucomiss %xmm10,%xmm1
jbe    1370 <denoise_donohoSoft_DWTAnlz+0x240>
subss  %xmm10,%xmm1
jmp    137e <denoise_donohoSoft_DWTAnlz+0x24e>
nop
xorps  %xmm2,%xmm2
ucomiss %xmm1,%xmm8
jbe    1381 <denoise_donohoSoft_DWTAnlz+0x251>
addss  %xmm10,%xmm1
movaps %xmm1,%xmm2
movss  %xmm2,(%r12,%rsi,4)
movss  0x4(%rbp,%rsi,4),%xmm1
ucomiss %xmm10,%xmm1
ja     1340 <denoise_donohoSoft_DWTAnlz+0x210>
xorps  %xmm2,%xmm2
ucomiss %xmm1,%xmm8
jbe    1348 <denoise_donohoSoft_DWTAnlz+0x218>
addss  %xmm10,%xmm1
jmp    1345 <denoise_donohoSoft_DWTAnlz+0x215>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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