#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 */
scalar_t__ MYCALLOC(int, int);
int /*<<< orphan*/ MYFREE(char *);
double pow(int, int);
double psi2(int m, int n, int *ARRAY, int PT) {
  int i, j, k;
  double sum, numOfBlocks;
  unsigned int *P;
  if ((m == 0) || (m == -1))
    return 0.0;
  numOfBlocks = n;
  P = (unsigned int *)MYCALLOC(65536, sizeof(unsigned int));
  for (i = 0; i < numOfBlocks; i++) {
    k = 1;
    for (j = 0; j < m; j++) {
      if (((ARRAY[((((PT + i + j) % (n)) < 0 ? ((PT + i + j) % (n)) + (n)
                                             : ((PT + i + j) % (n))) >>
                   5)] >>
            ((((PT + i + j) % (n)) < 0 ? ((PT + i + j) % (n)) + (n)
                                       : ((PT + i + j) % (n))) &
             31)) &
           1) == 0)
        k *= 2;
      else
        k = 2 * k + 1;
    }
    P[k - 1]++;
  }
  sum = 0.0;
  for (i = (int)pow(2, m) - 1; i < (int)pow(2, m + 1) - 1; i++)
    sum += pow(P[i], 2);
  sum = (sum * pow(2, m) / (double)n) - (double)n;
  MYFREE((char *)P);
  return sum;
}


x86 assembly (clang, -O0):
<psi2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     1159 <psi2+0x29>
cmpl   $0xffffffff,-0xc(%rbp)
jne    1166 <psi2+0x36>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1378 <psi2+0x248>
cvtsi2sdl -0x10(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    $0x10000,%edi
mov    $0x4,%esi
call   1040 <MYCALLOC@plt>
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x20(%rbp)
cvtsi2sdl -0x20(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    12b7 <psi2+0x187>
movl   $0x1,-0x28(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1293 <psi2+0x163>
mov    -0x18(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cltd
idivl  -0x10(%rbp)
cmp    $0x0,%edx
jge    11ee <psi2+0xbe>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cltd
idivl  -0x10(%rbp)
add    -0x10(%rbp),%edx
mov    %edx,-0x4c(%rbp)
jmp    11fe <psi2+0xce>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cltd
idivl  -0x10(%rbp)
mov    %edx,-0x4c(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x4c(%rbp),%ecx
sar    $0x5,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x50(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cltd
idivl  -0x10(%rbp)
cmp    $0x0,%edx
jge    123f <psi2+0x10f>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cltd
idivl  -0x10(%rbp)
add    -0x10(%rbp),%edx
mov    %edx,-0x54(%rbp)
jmp    124f <psi2+0x11f>
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cltd
idivl  -0x10(%rbp)
mov    %edx,-0x54(%rbp)
mov    -0x50(%rbp),%eax
mov    -0x54(%rbp),%ecx
and    $0x1f,%ecx
sar    %cl,%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    1274 <psi2+0x144>
mov    -0x28(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1280 <psi2+0x150>
mov    -0x28(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1285 <psi2+0x155>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11ac <psi2+0x7c>
mov    -0x40(%rbp),%rax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    118a <psi2+0x5a>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0xc(%rbp),%esi
mov    $0x2,%edi
call   1050 <pow@plt>
cvttsd2si %xmm0,%eax
sub    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0xc(%rbp),%esi
add    $0x1,%esi
mov    $0x2,%edi
call   1050 <pow@plt>
mov    -0x58(%rbp),%eax
cvttsd2si %xmm0,%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    132b <psi2+0x1fb>
mov    -0x40(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%edi
mov    $0x2,%esi
call   1050 <pow@plt>
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12d6 <psi2+0x1a6>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0xc(%rbp),%esi
mov    $0x2,%edi
call   1050 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0x60(%rbp),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
cvtsi2sdl -0x10(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x40(%rbp),%rdi
call   1030 <MYFREE@plt>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<psi2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %edi,%r14d
lea    0x1(%r14),%eax
xorps  %xmm0,%xmm0
mov    %eax,0xc(%rsp)
cmp    $0x2,%eax
jb     129c <psi2+0x16c>
mov    %ecx,%r13d
mov    %rdx,%r15
mov    %esi,%ebp
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
movsd  %xmm0,0x10(%rsp)
mov    $0x10000,%edi
mov    $0x4,%esi
call   1040 <MYCALLOC@plt>
movsd  0x10(%rsp),%xmm1
mov    %rax,%r12
test   %ebp,%ebp
jle    11eb <psi2+0xbb>
xor    %r8d,%r8d
jmp    11af <psi2+0x7f>
nopl   0x0(%rax,%rax,1)
movslq %edi,%rax
addl   $0x1,-0x4(%r12,%rax,4)
add    $0x1,%r8d
xorps  %xmm0,%xmm0
cvtsi2sd %r8d,%xmm0
add    $0x1,%r13d
ucomisd %xmm0,%xmm1
jbe    11eb <psi2+0xbb>
mov    $0x1,%edi
test   %r14d,%r14d
jle    1190 <psi2+0x60>
mov    %r13d,%esi
mov    %r14d,%ebx
nop
mov    %esi,%eax
cltd
idiv   %ebp
mov    %edx,%ecx
sar    $0x1f,%ecx
and    %ebp,%ecx
add    %edx,%ecx
mov    %ecx,%eax
sar    $0x5,%eax
cltq
mov    (%r15,%rax,4),%eax
shr    %cl,%eax
and    $0x1,%eax
lea    (%rax,%rdi,2),%edi
add    $0x1,%esi
add    $0xffffffff,%ebx
jne    11c0 <psi2+0x90>
jmp    1190 <psi2+0x60>
mov    $0x2,%edi
mov    %r14d,%esi
call   1050 <pow@plt>
cvttsd2si %xmm0,%ebx
mov    $0x2,%edi
mov    0xc(%rsp),%ebp
mov    %ebp,%esi
call   1050 <pow@plt>
cvttsd2si %xmm0,%eax
xorpd  %xmm0,%xmm0
movsd  %xmm0,(%rsp)
cmp    %eax,%ebx
jge    126a <psi2+0x13a>
add    $0xffffffff,%ebx
movslq %ebx,%rbx
xorpd  %xmm0,%xmm0
movsd  %xmm0,(%rsp)
nopl   0x0(%rax)
mov    (%r12,%rbx,4),%edi
mov    $0x2,%esi
call   1050 <pow@plt>
movsd  (%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rsp)
add    $0x1,%rbx
mov    $0x2,%edi
mov    %ebp,%esi
call   1050 <pow@plt>
cvttsd2si %xmm0,%eax
add    $0xffffffff,%eax
cltq
cmp    %rax,%rbx
jl     1230 <psi2+0x100>
mov    $0x2,%edi
mov    %r14d,%esi
call   1050 <pow@plt>
mulsd  (%rsp),%xmm0
movsd  0x10(%rsp),%xmm1
divsd  %xmm1,%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rsp)
mov    %r12,%rdi
call   1030 <MYFREE@plt>
movsd  (%rsp),%xmm0
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @psi2(i32 %0, i32 %1, i32* %2, i32 %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca double
%14 = alloca double
%15 = alloca i32*
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32* %2, i32** %8
store i32 %3, i32* %9
%16 = load i32, i32* %6
%17 = icmp eq i32 %16, 0
br i1 %17, label %21, label %18
18: ; preds = %4
%19 = load i32, i32* %6
%20 = icmp eq i32 %19, -1
br i1 %20, label %21, label %22
21: ; preds = %18, %4
store double 0.000000e+00, double* %5
br label %165
22: ; preds = %18
%23 = load i32, i32* %7
%24 = sitofp i32 %23 to double
store double %24, double* %14
%25 = call i64 @MYCALLOC(i32 65536, i32 4)
%26 = inttoptr i64 %25 to i32*
store i32* %26, i32** %15
store i32 0, i32* %10
br label %27
27: ; preds = %122, %22
%28 = load i32, i32* %10
%29 = sitofp i32 %28 to double
%30 = load double, double* %14
%31 = fcmp olt double %29, %30
br i1 %31, label %32, label %125
32: ; preds = %27
store i32 1, i32* %12
store i32 0, i32* %11
br label %33
33: ; preds = %111, %32
%34 = load i32, i32* %11
%35 = load i32, i32* %6
%36 = icmp slt i32 %34, %35
br i1 %36, label %37, label %114
37: ; preds = %33
%38 = load i32*, i32** %8
%39 = load i32, i32* %9
%40 = load i32, i32* %10
%41 = add nsw i32 %39, %40
%42 = load i32, i32* %11
%43 = add nsw i32 %41, %42
%44 = load i32, i32* %7
%45 = srem i32 %43, %44
%46 = icmp slt i32 %45, 0
br i1 %46, label %47, label %57
47: ; preds = %37
%48 = load i32, i32* %9
%49 = load i32, i32* %10
%50 = add nsw i32 %48, %49
%51 = load i32, i32* %11
%52 = add nsw i32 %50, %51
%53 = load i32, i32* %7
%54 = srem i32 %52, %53
%55 = load i32, i32* %7
%56 = add nsw i32 %54, %55
br label %65
57: ; preds = %37
%58 = load i32, i32* %9
%59 = load i32, i32* %10
%60 = add nsw i32 %58, %59
%61 = load i32, i32* %11
%62 = add nsw i32 %60, %61
%63 = load i32, i32* %7
%64 = srem i32 %62, %63
br label %65
65: ; preds = %57, %47
%66 = phi i32 [ %56, %47 ], [ %64, %57 ]
%67 = ashr i32 %66, 5
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i32, i32* %38, i64 %68
%70 = load i32, i32* %69
%71 = load i32, i32* %9
%72 = load i32, i32* %10
%73 = add nsw i32 %71, %72
%74 = load i32, i32* %11
%75 = add nsw i32 %73, %74
%76 = load i32, i32* %7
%77 = srem i32 %75, %76
%78 = icmp slt i32 %77, 0
br i1 %78, label %79, label %89
79: ; preds = %65
%80 = load i32, i32* %9
%81 = load i32, i32* %10
%82 = add nsw i32 %80, %81
%83 = load i32, i32* %11
%84 = add nsw i32 %82, %83
%85 = load i32, i32* %7
%86 = srem i32 %84, %85
%87 = load i32, i32* %7
%88 = add nsw i32 %86, %87
br label %97
89: ; preds = %65
%90 = load i32, i32* %9
%91 = load i32, i32* %10
%92 = add nsw i32 %90, %91
%93 = load i32, i32* %11
%94 = add nsw i32 %92, %93
%95 = load i32, i32* %7
%96 = srem i32 %94, %95
br label %97
97: ; preds = %89, %79
%98 = phi i32 [ %88, %79 ], [ %96, %89 ]
%99 = and i32 %98, 31
%100 = ashr i32 %70, %99
%101 = and i32 %100, 1
%102 = icmp eq i32 %101, 0
br i1 %102, label %103, label %106
103: ; preds = %97
%104 = load i32, i32* %12
%105 = mul nsw i32 %104, 2
store i32 %105, i32* %12
br label %110
106: ; preds = %97
%107 = load i32, i32* %12
%108 = mul nsw i32 2, %107
%109 = add nsw i32 %108, 1
store i32 %109, i32* %12
br label %110
110: ; preds = %106, %103
br label %111
111: ; preds = %110
%112 = load i32, i32* %11
%113 = add nsw i32 %112, 1
store i32 %113, i32* %11
br label %33
114: ; preds = %33
%115 = load i32*, i32** %15
%116 = load i32, i32* %12
%117 = sub nsw i32 %116, 1
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i32, i32* %115, i64 %118
%120 = load i32, i32* %119
%121 = add i32 %120, 1
store i32 %121, i32* %119
br label %122
122: ; preds = %114
%123 = load i32, i32* %10
%124 = add nsw i32 %123, 1
store i32 %124, i32* %10
br label %27
125: ; preds = %27
store double 0.000000e+00, double* %13
%126 = load i32, i32* %6
%127 = call double @pow(i32 2, i32 %126)
%128 = fptosi double %127 to i32
%129 = sub nsw i32 %128, 1
store i32 %129, i32* %10
br label %130
130: ; preds = %147, %125
%131 = load i32, i32* %10
%132 = load i32, i32* %6
%133 = add nsw i32 %132, 1
%134 = call double @pow(i32 2, i32 %133)
%135 = fptosi double %134 to i32
%136 = sub nsw i32 %135, 1
%137 = icmp slt i32 %131, %136
br i1 %137, label %138, label %150
138: ; preds = %130
%139 = load i32*, i32** %15
%140 = load i32, i32* %10
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds i32, i32* %139, i64 %141
%143 = load i32, i32* %142
%144 = call double @pow(i32 %143, i32 2)
%145 = load double, double* %13
%146 = fadd double %145, %144
store double %146, double* %13
br label %147
147: ; preds = %138
%148 = load i32, i32* %10
%149 = add nsw i32 %148, 1
store i32 %149, i32* %10
br label %130
150: ; preds = %130
%151 = load double, double* %13
%152 = load i32, i32* %6
%153 = call double @pow(i32 2, i32 %152)
%154 = fmul double %151, %153
%155 = load i32, i32* %7
%156 = sitofp i32 %155 to double
%157 = fdiv double %154, %156
%158 = load i32, i32* %7
%159 = sitofp i32 %158 to double
%160 = fsub double %157, %159
store double %160, double* %13
%161 = load i32*, i32** %15
%162 = bitcast i32* %161 to i8*
%163 = call i32 @MYFREE(i8* %162)
%164 = load double, double* %13
store double %164, double* %5
br label %165
165: ; preds = %150, %21
%166 = load double, double* %5
ret double %166
}

LLVM IR (-O2):
define double @psi2(i32 %0, i32 %1, i32* nocapture %2, i32 %3) {
%5 = add i32 %0, 1
%6 = icmp ult i32 %5, 2
br i1 %6, label %77, label %7
7: ; preds = %4
%8 = sitofp i32 %1 to double
%9 = tail call i64 @MYCALLOC(i32 65536, i32 4)
%10 = inttoptr i64 %9 to i32*
%11 = icmp sgt i32 %1, 0
br i1 %11, label %12, label %47
12: ; preds = %7
%13 = icmp sgt i32 %0, 0
br label %14
14: ; preds = %12, %37
%15 = phi i32 [ 0, %12 ], [ %44, %37 ]
br i1 %13, label %16, label %37
16: ; preds = %14
%17 = add nsw i32 %15, %3
br label %18
18: ; preds = %16, %18
%19 = phi i32 [ 1, %16 ], [ %34, %18 ]
%20 = phi i32 [ 0, %16 ], [ %35, %18 ]
%21 = add nsw i32 %17, %20
%22 = srem i32 %21, %1
%23 = icmp slt i32 %22, 0
%24 = select i1 %23, i32 %1, i32 0
%25 = add nsw i32 %24, %22
%26 = ashr i32 %25, 5
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i32, i32* %2, i64 %27
%29 = load i32, i32* %28
%30 = and i32 %25, 31
%31 = shl nsw i32 %19, 1
%32 = lshr i32 %29, %30
%33 = and i32 %32, 1
%34 = or i32 %33, %31
%35 = add nuw nsw i32 %20, 1
%36 = icmp eq i32 %35, %0
br i1 %36, label %37, label %18
37: ; preds = %18, %14
%38 = phi i32 [ 1, %14 ], [ %34, %18 ]
%39 = add nsw i32 %38, -1
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i32, i32* %10, i64 %40
%42 = load i32, i32* %41
%43 = add i32 %42, 1
store i32 %43, i32* %41
%44 = add nuw nsw i32 %15, 1
%45 = sitofp i32 %44 to double
%46 = fcmp olt double %45, %8
br i1 %46, label %14, label %47
47: ; preds = %37, %7
%48 = tail call double @pow(i32 2, i32 %0)
%49 = fptosi double %48 to i32
%50 = tail call double @pow(i32 2, i32 %5)
%51 = fptosi double %50 to i32
%52 = icmp slt i32 %49, %51
br i1 %52, label %53, label %69
53: ; preds = %47
%54 = add i32 %49, -1
%55 = sext i32 %54 to i64
br label %56
56: ; preds = %53, %56
%57 = phi i64 [ %55, %53 ], [ %63, %56 ]
%58 = phi double [ 0.000000e+00, %53 ], [ %62, %56 ]
%59 = getelementptr inbounds i32, i32* %10, i64 %57
%60 = load i32, i32* %59
%61 = tail call double @pow(i32 %60, i32 2)
%62 = fadd double %58, %61
%63 = add nsw i64 %57, 1
%64 = tail call double @pow(i32 2, i32 %5)
%65 = fptosi double %64 to i32
%66 = add nsw i32 %65, -1
%67 = sext i32 %66 to i64
%68 = icmp slt i64 %63, %67
br i1 %68, label %56, label %69
69: ; preds = %56, %47
%70 = phi double [ 0.000000e+00, %47 ], [ %62, %56 ]
%71 = tail call double @pow(i32 2, i32 %0)
%72 = fmul double %70, %71
%73 = fdiv double %72, %8
%74 = fsub double %73, %8
%75 = inttoptr i64 %9 to i8*
%76 = tail call i32 @MYFREE(i8* %75)
br label %77
77: ; preds = %4, %69
%78 = phi double [ %74, %69 ], [ 0.000000e+00, %4 ]
ret double %78
}