#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 M_PI;
int cos(double);
double fabs(double);
double similarity_measure(int n1, int *labels1, double *distances1, int n2,
                          int *labels2, double *distances2, double margin,
                          double cutoff) {
  double result, dav, delta;
  int i1, i2, c2;
  int *c_labels2;
  double *c_distances2;
  result = 0.0;
  i2 = 0;
  for (i1 = 0; i1 < n1; i1++) {
    if ((labels1[0] == labels2[0] ? (labels1[1] < labels2[1])
                                  : (labels1[0] < labels2[0]))) {
      goto next_iter;
    }
    while ((labels1[0] == labels2[0] ? (labels1[1] > labels2[1])
                                     : (labels1[0] > labels2[0])) &&
           i2 < n2) {
      labels2 += 2;
      distances2++;
      i2++;
    }
    if (i2 >= n2) {
      break;
    }
    if ((labels1[0] == labels2[0] ? (labels1[1] < labels2[1])
                                  : (labels1[0] < labels2[0]))) {
      goto next_iter;
    }
    c_labels2 = labels2;
    c_distances2 = distances2;
    c2 = i2;
    while ((labels1[0] == c_labels2[0] && labels1[1] == c_labels2[1]) &&
           c2 < n2) {
      dav = 0.5 * (*distances1 + *c_distances2);
      if (dav < cutoff) {
        delta = fabs(*distances1 - *c_distances2);
        if (delta < margin) {
          result += (1 - dav / cutoff) * 0.5 * (cos(delta / margin / M_PI) + 1);
        }
      }
      c_labels2 += 2;
      c_distances2++;
      c2++;
    }
  next_iter:
    labels1 += 2;
    distances1++;
  }
  return result;
}


x86 assembly (clang, -O0):
<similarity_measure>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm1,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x60(%rbp)
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1406 <similarity_measure+0x2f6>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    (%rcx),%eax
jne    1188 <similarity_measure+0x78>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    0x4(%rcx),%eax
jl     119a <similarity_measure+0x8a>
jmp    119f <similarity_measure+0x8f>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    (%rcx),%eax
jge    119f <similarity_measure+0x8f>
jmp    13e0 <similarity_measure+0x2d0>
jmp    11a4 <similarity_measure+0x94>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    (%rcx),%eax
jne    11d4 <similarity_measure+0xc4>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x28(%rbp),%rdx
xor    %eax,%eax
cmp    0x4(%rdx),%ecx
mov    %al,-0x79(%rbp)
jg     11eb <similarity_measure+0xdb>
jmp    11f7 <similarity_measure+0xe7>
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
mov    -0x28(%rbp),%rdx
xor    %eax,%eax
cmp    (%rdx),%ecx
mov    %al,-0x79(%rbp)
jle    11f7 <similarity_measure+0xe7>
mov    -0x60(%rbp),%eax
cmp    -0x1c(%rbp),%eax
setl   %al
mov    %al,-0x79(%rbp)
mov    -0x79(%rbp),%al
test   $0x1,%al
jne    1207 <similarity_measure+0xf7>
jmp    122d <similarity_measure+0x11d>
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x30(%rbp)
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    11a4 <similarity_measure+0x94>
mov    -0x60(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jl     123e <similarity_measure+0x12e>
jmp    1406 <similarity_measure+0x2f6>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    (%rcx),%eax
jne    1269 <similarity_measure+0x159>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    0x4(%rcx),%eax
jl     127b <similarity_measure+0x16b>
jmp    1280 <similarity_measure+0x170>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x28(%rbp),%rcx
cmp    (%rcx),%eax
jge    1280 <similarity_measure+0x170>
jmp    13e0 <similarity_measure+0x2d0>
mov    -0x28(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%ecx
mov    -0x70(%rbp),%rdx
xor    %eax,%eax
cmp    (%rdx),%ecx
mov    %al,-0x7a(%rbp)
jne    12d2 <similarity_measure+0x1c2>
mov    -0x10(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x70(%rbp),%rdx
xor    %eax,%eax
cmp    0x4(%rdx),%ecx
mov    %al,-0x7a(%rbp)
jne    12d2 <similarity_measure+0x1c2>
mov    -0x64(%rbp),%eax
cmp    -0x1c(%rbp),%eax
setl   %al
mov    %al,-0x7a(%rbp)
mov    -0x7a(%rbp),%al
test   $0x1,%al
jne    12e2 <similarity_measure+0x1d2>
jmp    13db <similarity_measure+0x2cb>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x78(%rbp),%rax
addsd  (%rax),%xmm1
movsd  0xd06(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    13b5 <similarity_measure+0x2a5>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x78(%rbp),%rax
subsd  (%rax),%xmm0
movaps 0xce2(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    13b0 <similarity_measure+0x2a0>
movsd  -0x50(%rbp),%xmm1
divsd  -0x40(%rbp),%xmm1
movsd  0xcab(%rip),%xmm0
subsd  %xmm1,%xmm0
movsd  0xc97(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x58(%rbp),%xmm0
divsd  -0x38(%rbp),%xmm0
mov    0x2c62(%rip),%rax
divsd  (%rax),%xmm0
call   1030 <cos@plt>
movsd  -0x88(%rbp),%xmm0
ff
add    $0x1,%eax
cvtsi2sd %eax,%xmm2
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    13b5 <similarity_measure+0x2a5>
mov    -0x70(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x70(%rbp)
mov    -0x78(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x78(%rbp)
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1296 <similarity_measure+0x186>
jmp    13e0 <similarity_measure+0x2d0>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1151 <similarity_measure+0x41>
movsd  -0x48(%rbp),%xmm0
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<similarity_measure>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
test   %edi,%edi
jle    12f7 <similarity_measure+0x1e7>
movapd %xmm0,%xmm4
mov    %r9,%r14
mov    %r8,%rbx
xorpd  %xmm5,%xmm5
xor    %r13d,%r13d
movsd  0xec1(%rip),%xmm6
movapd 0xec9(%rip),%xmm7
xor    %r9d,%r9d
movsd  %xmm1,0x10(%rsp)
movsd  %xmm0,0x8(%rsp)
mov    %edi,(%rsp)
jmp    1185 <similarity_measure+0x75>
mov    (%rsp),%edi
mov    0x4(%rsp),%r9d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x8,%rsi
add    $0x8,%rdx
add    $0x1,%r9d
cmp    %edi,%r9d
je     12fb <similarity_measure+0x1eb>
mov    (%rsi),%r8d
mov    (%rbx),%eax
cmp    %eax,%r8d
jne    1195 <similarity_measure+0x85>
mov    0x4(%rsi),%ebp
cmp    0x4(%rbx),%ebp
jge    11af <similarity_measure+0x9f>
jmp    1170 <similarity_measure+0x60>
nopl   0x0(%rax)
add    $0x8,%r14
add    $0x1,%r13d
mov    0x8(%rbx),%eax
add    $0x8,%rbx
cmp    %eax,%r8d
jne    11d0 <similarity_measure+0xc0>
mov    0x4(%rsi),%eax
mov    0x4(%rbx),%ebp
cmp    %ebp,%eax
jle    11f0 <similarity_measure+0xe0>
cmp    %ecx,%r13d
jl     11a0 <similarity_measure+0x90>
jmp    11f0 <similarity_measure+0xe0>
cs nopw 0x0(%rax,%rax,1)
nop
jle    11d7 <similarity_measure+0xc7>
cmp    %ecx,%r13d
jl     11a0 <similarity_measure+0x90>
cmp    %ecx,%r13d
jl     1170 <similarity_measure+0x60>
jmp    12fb <similarity_measure+0x1eb>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    %ecx,%r13d
jge    12fb <similarity_measure+0x1eb>
cmp    %ebp,%eax
jl     1170 <similarity_measure+0x60>
mov    %r9d,0x4(%rsp)
xor    %r15d,%r15d
mov    %r13d,%r12d
mov    %rdx,0x20(%rsp)
mov    %rsi,0x18(%rsp)
jmp    1236 <similarity_measure+0x126>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r12d
lea    0x8(%r15),%rdi
cmp    0x8(%rbx,%r15,1),%r8d
mov    %rdi,%r15
jne    115b <similarity_measure+0x4b>
mov    0x4(%rsi),%eax
cmp    0x4(%rbx,%r15,1),%eax
jne    115b <similarity_measure+0x4b>
cmp    %ecx,%r12d
jge    115b <similarity_measure+0x4b>
movsd  (%rdx),%xmm0
movsd  (%r14,%r15,1),%xmm2
movapd %xmm0,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm6,%xmm3
ucomisd %xmm3,%xmm1
jbe    1220 <similarity_measure+0x110>
subsd  %xmm2,%xmm0
andpd  %xmm7,%xmm0
ucomisd %xmm0,%xmm4
jbe    1220 <similarity_measure+0x110>
divsd  %xmm1,%xmm3
movsd  0xd85(%rip),%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm6,%xmm2
movsd  %xmm2,0x28(%rsp)
divsd  %xmm4,%xmm0
mov    0x2d4c(%rip),%rax
divsd  (%rax),%xmm0
movsd  %xmm5,0x30(%rsp)
mov    %ecx,%ebp
call   1030 <cos@plt>
movapd 0xd5b(%rip),%xmm7
movsd  0xd43(%rip),%xmm6
mov    %ebp,%ecx
mov    0x18(%rsp),%rsi
mov    0x20(%rsp),%rdx
movsd  0x30(%rsp),%xmm5
movsd  0x8(%rsp),%xmm4
movsd  0x10(%rsp),%xmm1
add    $0x1,%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x28(%rsp),%xmm0
addsd  %xmm0,%xmm5
mov    (%rsi),%r8d
jmp    1220 <similarity_measure+0x110>
xorpd  %xmm5,%xmm5
movapd %xmm5,%xmm0
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@M_PI = global double 0.000000e+00
define double @similarity_measure(i32 %0, i32* %1, double* %2, i32 %3, i32* %4, double* %5, double %6, double %7) {
%9 = alloca i32
%10 = alloca i32*
%11 = alloca double*
%12 = alloca i32
%13 = alloca i32*
%14 = alloca double*
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32*
%24 = alloca double*
store i32 %0, i32* %9
store i32* %1, i32** %10
store double* %2, double** %11
store i32 %3, i32* %12
store i32* %4, i32** %13
store double* %5, double** %14
store double %6, double* %15
store double %7, double* %16
store double 0.000000e+00, double* %17
store i32 0, i32* %21
store i32 0, i32* %20
br label %25
25: ; preds = %198, %8
%26 = load i32, i32* %20
%27 = load i32, i32* %9
%28 = icmp slt i32 %26, %27
br i1 %28, label %29, label %201
29: ; preds = %25
%30 = load i32*, i32** %10
%31 = getelementptr inbounds i32, i32* %30, i64 0
%32 = load i32, i32* %31
%33 = load i32*, i32** %13
%34 = getelementptr inbounds i32, i32* %33, i64 0
%35 = load i32, i32* %34
%36 = icmp eq i32 %32, %35
br i1 %36, label %37, label %45
37: ; preds = %29
%38 = load i32*, i32** %10
%39 = getelementptr inbounds i32, i32* %38, i64 1
%40 = load i32, i32* %39
%41 = load i32*, i32** %13
%42 = getelementptr inbounds i32, i32* %41, i64 1
%43 = load i32, i32* %42
%44 = icmp slt i32 %40, %43
br i1 %44, label %53, label %54
45: ; preds = %29
%46 = load i32*, i32** %10
%47 = getelementptr inbounds i32, i32* %46, i64 0
%48 = load i32, i32* %47
%49 = load i32*, i32** %13
%50 = getelementptr inbounds i32, i32* %49, i64 0
%51 = load i32, i32* %50
%52 = icmp slt i32 %48, %51
br i1 %52, label %53, label %54
53: ; preds = %45, %37
br label %193
54: ; preds = %45, %37
br label %55
55: ; preds = %85, %54
%56 = load i32*, i32** %10
%57 = getelementptr inbounds i32, i32* %56, i64 0
%58 = load i32, i32* %57
%59 = load i32*, i32** %13
%60 = getelementptr inbounds i32, i32* %59, i64 0
%61 = load i32, i32* %60
%62 = icmp eq i32 %58, %61
br i1 %62, label %63, label %71
63: ; preds = %55
%64 = load i32*, i32** %10
%65 = getelementptr inbounds i32, i32* %64, i64 1
%66 = load i32, i32* %65
%67 = load i32*, i32** %13
%68 = getelementptr inbounds i32, i32* %67, i64 1
%69 = load i32, i32* %68
%70 = icmp sgt i32 %66, %69
br i1 %70, label %79, label %83
71: ; preds = %55
%72 = load i32*, i32** %10
%73 = getelementptr inbounds i32, i32* %72, i64 0
%74 = load i32, i32* %73
%75 = load i32*, i32** %13
%76 = getelementptr inbounds i32, i32* %75, i64 0
%77 = load i32, i32* %76
%78 = icmp sgt i32 %74, %77
br i1 %78, label %79, label %83
79: ; preds = %71, %63
%80 = load i32, i32* %21
%81 = load i32, i32* %12
%82 = icmp slt i32 %80, %81
br label %83
83: ; preds = %79, %71, %63
%84 = phi i1 [ false, %71 ], [ false, %63 ], [ %82, %79 ]
br i1 %84, label %85, label %92
85: ; preds = %83
%86 = load i32*, i32** %13
%87 = getelementptr inbounds i32, i32* %86, i64 2
store i32* %87, i32** %13
%88 = load double*, double** %14
%89 = getelementptr inbounds double, double* %88, i32 1
store double* %89, double** %14
%90 = load i32, i32* %21
%91 = add nsw i32 %90, 1
store i32 %91, i32* %21
br label %55
92: ; preds = %83
%93 = load i32, i32* %21
%94 = load i32, i32* %12
%95 = icmp sge i32 %93, %94
br i1 %95, label %96, label %97
96: ; preds = %92
br label %201
97: ; preds = %92
%98 = load i32*, i32** %10
%99 = getelementptr inbounds i32, i32* %98, i64 0
%100 = load i32, i32* %99
%101 = load i32*, i32** %13
%102 = getelementptr inbounds i32, i32* %101, i64 0
%103 = load i32, i32* %102
%104 = icmp eq i32 %100, %103
br i1 %104, label %105, label %113
105: ; preds = %97
%106 = load i32*, i32** %10
%107 = getelementptr inbounds i32, i32* %106, i64 1
%108 = load i32, i32* %107
%109 = load i32*, i32** %13
%110 = getelementptr inbounds i32, i32* %109, i64 1
%111 = load i32, i32* %110
%112 = icmp slt i32 %108, %111
br i1 %112, label %121, label %122
113: ; preds = %97
%114 = load i32*, i32** %10
%115 = getelementptr inbounds i32, i32* %114, i64 0
%116 = load i32, i32* %115
%117 = load i32*, i32** %13
%118 = getelementptr inbounds i32, i32* %117, i64 0
%119 = load i32, i32* %118
%120 = icmp slt i32 %116, %119
br i1 %120, label %121, label %122
121: ; preds = %113, %105
br label %193
122: ; preds = %113, %105
%123 = load i32*, i32** %13
store i32* %123, i32** %23
%124 = load double*, double** %14
store double* %124, double** %24
%125 = load i32, i32* %21
store i32 %125, i32* %22
br label %126
126: ; preds = %185, %122
%127 = load i32*, i32** %10
%128 = getelementptr inbounds i32, i32* %127, i64 0
%129 = load i32, i32* %128
%130 = load i32*, i32** %23
%131 = getelementptr inbounds i32, i32* %130, i64 0
%132 = load i32, i32* %131
%133 = icmp eq i32 %129, %132
br i1 %133, label %134, label %146
134: ; preds = %126
%135 = load i32*, i32** %10
%136 = getelementptr inbounds i32, i32* %135, i64 1
%137 = load i32, i32* %136
%138 = load i32*, i32** %23
%139 = getelementptr inbounds i32, i32* %138, i64 1
%140 = load i32, i32* %139
%141 = icmp eq i32 %137, %140
br i1 %141, label %142, label %146
142: ; preds = %134
%143 = load i32, i32* %22
%144 = load i32, i32* %12
%145 = icmp slt i32 %143, %144
br label %146
146: ; preds = %142, %134, %126
%147 = phi i1 [ false, %134 ], [ false, %126 ], [ %145, %142 ]
br i1 %147, label %148, label %192
148: ; preds = %146
%149 = load double*, double** %11
%150 = load double, double* %149
%151 = load double*, double** %24
%152 = load double, double* %151
%153 = fadd double %150, %152
%154 = fmul double 5.000000e-01, %153
store double %154, double* %18
%155 = load double, double* %18
%156 = load double, double* %16
%157 = fcmp olt double %155, %156
br i1 %157, label %158, label %185
158: ; preds = %148
%159 = load double*, double** %11
%160 = load double, double* %159
%161 = load double*, double** %24
%162 = load double, double* %161
%163 = fsub double %160, %162
%164 = call double @llvm.fabs.f64(double %163)
store double %164, double* %19
%165 = load double, double* %19
%166 = load double, double* %15
%167 = fcmp olt double %165, %166
br i1 %167, label %168, label %184
168: ; preds = %158
%169 = load double, double* %18
%170 = load double, double* %16
%171 = fdiv double %169, %170
%172 = fsub double 1.000000e+00, %171
%173 = fmul double %172, 5.000000e-01
%174 = load double, double* %19
%175 = load double, double* %15
%176 = fdiv double %174, %175
%177 = load double, double* @M_PI
%178 = fdiv double %176, %177
%179 = call i32 @cos(double %178)
%180 = add nsw i32 %179, 1
%181 = sitofp i32 %180 to double
%182 = load double, double* %17
%183 = call double @llvm.fmuladd.f64(double %173, double %181, double %182)
store double %183, double* %17
br label %184
184: ; preds = %168, %158
br label %185
185: ; preds = %184, %148
%186 = load i32*, i32** %23
%187 = getelementptr inbounds i32, i32* %186, i64 2
store i32* %187, i32** %23
%188 = load double*, double** %24
%189 = getelementptr inbounds double, double* %188, i32 1
store double* %189, double** %24
%190 = load i32, i32* %22
%191 = add nsw i32 %190, 1
store i32 %191, i32* %22
br label %126
192: ; preds = %146
br label %193
193: ; preds = %192, %121, %53
%194 = load i32*, i32** %10
%195 = getelementptr inbounds i32, i32* %194, i64 2
store i32* %195, i32** %10
%196 = load double*, double** %11
%197 = getelementptr inbounds double, double* %196, i32 1
store double* %197, double** %11
br label %198
198: ; preds = %193
%199 = load i32, i32* %20
%200 = add nsw i32 %199, 1
store i32 %200, i32* %20
br label %25
201: ; preds = %96, %25
%202 = load double, double* %17
ret double %202
}

LLVM IR (-O2):
@M_PI = global double 0.000000e+00
define double @similarity_measure(i32 %0, i32* nocapture %1, double* nocapture %2, i32 %3, i32* nocapture %4, double* nocapture %5, double %6, double %7) {
%9 = icmp sgt i32 %0, 0
br i1 %9, label %10, label %108
10: ; preds = %8, %99
%11 = phi i32 [ %103, %99 ], [ 0, %8 ]
%12 = phi i32 [ %106, %99 ], [ 0, %8 ]
%13 = phi i32* [ %104, %99 ], [ %1, %8 ]
%14 = phi double* [ %105, %99 ], [ %2, %8 ]
%15 = phi double [ %102, %99 ], [ 0.000000e+00, %8 ]
%16 = phi i32* [ %101, %99 ], [ %4, %8 ]
%17 = phi double* [ %100, %99 ], [ %5, %8 ]
%18 = load i32, i32* %13
%19 = load i32, i32* %16
%20 = icmp eq i32 %18, %19
br i1 %20, label %21, label %27
21: ; preds = %10
%22 = getelementptr inbounds i32, i32* %13, i64 1
%23 = load i32, i32* %22
%24 = getelementptr inbounds i32, i32* %16, i64 1
%25 = load i32, i32* %24
%26 = icmp slt i32 %23, %25
br i1 %26, label %99, label %29
27: ; preds = %10
%28 = icmp slt i32 %18, %19
br i1 %28, label %99, label %29
29: ; preds = %27, %21
%30 = getelementptr inbounds i32, i32* %13, i64 1
br label %31
31: ; preds = %48, %29
%32 = phi i32 [ %19, %29 ], [ %52, %48 ]
%33 = phi double* [ %17, %29 ], [ %50, %48 ]
%34 = phi i32* [ %16, %29 ], [ %49, %48 ]
%35 = phi i32 [ %11, %29 ], [ %51, %48 ]
%36 = icmp eq i32 %18, %32
br i1 %36, label %37, label %44
37: ; preds = %31
%38 = load i32, i32* %30
%39 = getelementptr inbounds i32, i32* %34, i64 1
%40 = load i32, i32* %39
%41 = icmp sgt i32 %38, %40
%42 = icmp slt i32 %35, %3
%43 = select i1 %41, i1 %42, i1 false
br i1 %43, label %48, label %53
44: ; preds = %31
%45 = icmp sgt i32 %18, %32
%46 = icmp slt i32 %35, %3
%47 = select i1 %45, i1 %46, i1 false
br i1 %47, label %48, label %54
48: ; preds = %37, %44
%49 = getelementptr inbounds i32, i32* %34, i64 2
%50 = getelementptr inbounds double, double* %33, i64 1
%51 = add nsw i32 %35, 1
%52 = load i32, i32* %49
br label %31
53: ; preds = %37
br i1 %42, label %55, label %108
54: ; preds = %44
br i1 %46, label %99, label %108
55: ; preds = %53
%56 = icmp slt i32 %38, %40
br i1 %56, label %99, label %57
57: ; preds = %55, %91
%58 = phi i32 [ %92, %91 ], [ %18, %55 ]
%59 = phi double* [ %95, %91 ], [ %33, %55 ]
%60 = phi i32* [ %94, %91 ], [ %34, %55 ]
%61 = phi i32 [ %96, %91 ], [ %35, %55 ]
%62 = phi double [ %93, %91 ], [ %15, %55 ]
%63 = load i32, i32* %30
%64 = getelementptr inbounds i32, i32* %60, i64 1
%65 = load i32, i32* %64
%66 = icmp eq i32 %63, %65
%67 = icmp slt i32 %61, %3
%68 = select i1 %66, i1 %67, i1 false
br i1 %68, label %69, label %99
69: ; preds = %57
%70 = load double, double* %14
%71 = load double, double* %59
%72 = fadd double %70, %71
%73 = fmul double %72, 5.000000e-01
%74 = fcmp olt double %73, %7
br i1 %74, label %75, label %91
75: ; preds = %69
%76 = fsub double %70, %71
%77 = tail call double @llvm.fabs.f64(double %76)
%78 = fcmp olt double %77, %6
br i1 %78, label %79, label %91
79: ; preds = %75
%80 = fdiv double %73, %7
%81 = fsub double 1.000000e+00, %80
%82 = fmul double %81, 5.000000e-01
%83 = fdiv double %77, %6
%84 = load double, double* @M_PI
%85 = fdiv double %83, %84
%86 = tail call i32 @cos(double %85)
%87 = add nsw i32 %86, 1
%88 = sitofp i32 %87 to double
%89 = tail call double @llvm.fmuladd.f64(double %82, double %88, double %62)
%90 = load i32, i32* %13
br label %91
91: ; preds = %75, %79, %69
%92 = phi i32 [ %90, %79 ], [ %58, %75 ], [ %58, %69 ]
%93 = phi double [ %89, %79 ], [ %62, %75 ], [ %62, %69 ]
%94 = getelementptr inbounds i32, i32* %60, i64 2
%95 = getelementptr inbounds double, double* %59, i64 1
%96 = add nsw i32 %61, 1
%97 = load i32, i32* %94
%98 = icmp eq i32 %92, %97
br i1 %98, label %57, label %99
99: ; preds = %91, %57, %54, %55, %21, %27
%100 = phi double* [ %17, %21 ], [ %33, %55 ], [ %17, %27 ], [ %33, %54 ], [ %33, %57 ], [ %33, %91 ]
%101 = phi i32* [ %16, %21 ], [ %34, %55 ], [ %16, %27 ], [ %34, %54 ], [ %34, %57 ], [ %34, %91 ]
%102 = phi double [ %15, %21 ], [ %15, %55 ], [ %15, %27 ], [ %15, %54 ], [ %93, %91 ], [ %62, %57 ]
%103 = phi i32 [ %11, %21 ], [ %35, %55 ], [ %11, %27 ], [ %35, %54 ], [ %35, %57 ], [ %35, %91 ]
%104 = getelementptr inbounds i32, i32* %13, i64 2
%105 = getelementptr inbounds double, double* %14, i64 1
%106 = add nuw nsw i32 %12, 1
%107 = icmp eq i32 %106, %0
br i1 %107, label %108, label %10
108: ; preds = %99, %53, %54, %8
%109 = phi double [ 0.000000e+00, %8 ], [ %15, %54 ], [ %15, %53 ], [ %102, %99 ]
ret double %109
}