#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 fabs(double);
double sqrt(double);
int sturmcnt(double *alpha, double *beta, int j, double mu, double *p) {
  extern double DOUBLE_MAX;
  int i;
  int cnt;
  int sign;
  int last_sign;
  double *pntr_p;
  double *pntr_p1;
  double *pntr_p2;
  double *pntr_alpha;
  double *pntr_beta;
  double limit;
  double scale;
  if (j == 1) {
    if (alpha[1] > mu) {
      cnt = 1;
    } else {
      cnt = 0;
    }
  } else {
    limit = sqrt(DOUBLE_MAX);
    p[0] = 1;
    p[1] = alpha[1] - mu;
    pntr_p = &p[2];
    pntr_p1 = &p[1];
    pntr_p2 = &p[0];
    pntr_alpha = &alpha[2];
    pntr_beta = &beta[1];
    for (i = 2; i <= j; i++) {
      *pntr_p++ = (*pntr_alpha - mu) * (*pntr_p1) -
                  (*pntr_beta) * (*pntr_beta) * (*pntr_p2);
      pntr_alpha++;
      pntr_beta++;
      pntr_p1++;
      pntr_p2++;
      scale = fabs(*pntr_p1);
      if (scale > limit) {
        *pntr_p1 /= scale;
        *pntr_p2 /= scale;
      }
    }
    cnt = 0;
    last_sign = 1;
    pntr_p = &p[1];
    for (i = j; i; i--) {
      if (*pntr_p != *pntr_p || fabs(*pntr_p) > limit) {
        return (-1);
      }
      if (*pntr_p > 0) {
        sign = 1;
      } else if (*pntr_p < 0) {
        sign = -1;
      } else {
        sign = -last_sign;
      }
      if (sign == last_sign) {
        cnt++;
      }
      last_sign = sign;
      pntr_p++;
    }
  }
  return (j - cnt);
}


x86 assembly (clang, -O0):
<sturmcnt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movsd  %xmm0,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jne    1165 <sturmcnt+0x55>
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
ucomisd -0x28(%rbp),%xmm0
jbe    1159 <sturmcnt+0x49>
movl   $0x1,-0x38(%rbp)
jmp    1160 <sturmcnt+0x50>
movl   $0x0,-0x38(%rbp)
jmp    13d5 <sturmcnt+0x2c5>
mov    0x2e74(%rip),%rax
movsd  (%rax),%xmm0
call   1030 <sqrt@plt>
movsd  %xmm0,-0x70(%rbp)
mov    -0x30(%rbp),%rax
movsd  0xe7a(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x28(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x30(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x48(%rbp)
mov    -0x30(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x60(%rbp)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x68(%rbp)
movl   $0x2,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jg     12e0 <sturmcnt+0x1d0>
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
subsd  -0x28(%rbp),%xmm0
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm2
mov    -0x68(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x68(%rbp),%rax
mulsd  (%rax),%xmm1
mov    -0x58(%rbp),%rax
mulsd  (%rax),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x48(%rbp)
movsd  %xmm0,(%rax)
mov    -0x60(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x60(%rbp)
mov    -0x68(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x68(%rbp)
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x58(%rbp)
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movaps 0xd86(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
ucomisd -0x70(%rbp),%xmm0
jbe    12cd <sturmcnt+0x1bd>
movsd  -0x78(%rbp),%xmm1
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm1
mov    -0x58(%rbp),%rax
movsd  (%rax),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
jmp    12d2 <sturmcnt+0x1c2>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11e0 <sturmcnt+0xd0>
movl   $0x0,-0x38(%rbp)
movl   $0x1,-0x40(%rbp)
mov    -0x30(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
je     13d0 <sturmcnt+0x2c0>
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
ucomisd (%rax),%xmm0
jne    1344 <sturmcnt+0x234>
jp     1344 <sturmcnt+0x234>
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
movaps 0xcdb(%rip),%xmm1
pand   %xmm1,%xmm0
ucomisd -0x70(%rbp),%xmm0
jbe    1350 <sturmcnt+0x240>
movl   $0xffffffff,-0x4(%rbp)
jmp    13de <sturmcnt+0x2ce>
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1371 <sturmcnt+0x261>
movl   $0x1,-0x3c(%rbp)
jmp    139b <sturmcnt+0x28b>
mov    -0x48(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    138e <sturmcnt+0x27e>
movl   $0xffffffff,-0x3c(%rbp)
jmp    1396 <sturmcnt+0x286>
xor    %eax,%eax
sub    -0x40(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    139b <sturmcnt+0x28b>
mov    -0x3c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jne    13b0 <sturmcnt+0x2a0>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
jmp    1300 <sturmcnt+0x1f0>
jmp    13d5 <sturmcnt+0x2c5>
mov    -0x1c(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sturmcnt>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
movapd %xmm0,%xmm5
mov    %edx,%r14d
mov    %rdi,%r15
cmp    $0x1,%edx
jne    113b <sturmcnt+0x2b>
movsd  0x8(%r15),%xmm0
xor    %ecx,%ecx
ucomisd %xmm5,%xmm0
seta   %cl
jmp    1296 <sturmcnt+0x186>
mov    %rcx,%rbx
mov    %rsi,%r12
mov    0x2e98(%rip),%rax
movsd  (%rax),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     115c <sturmcnt+0x4c>
sqrtsd %xmm0,%xmm0
jmp    116b <sturmcnt+0x5b>
movsd  %xmm5,(%rsp)
call   1030 <sqrt@plt>
movsd  (%rsp),%xmm5
movabs $0x3ff0000000000000,%rax
mov    %rax,(%rbx)
movsd  0x8(%r15),%xmm1
subsd  %xmm5,%xmm1
movsd  %xmm1,0x8(%rbx)
cmp    $0x2,%r14d
jge    120b <sturmcnt+0xfb>
test   %r14d,%r14d
je     1294 <sturmcnt+0x184>
mov    %r14d,%r8d
xor    %esi,%esi
mov    $0x1,%edi
movapd 0xe68(%rip),%xmm1
xorpd  %xmm2,%xmm2
xor    %ecx,%ecx
jmp    11c8 <sturmcnt+0xb8>
xor    %edx,%edx
cmp    %edi,%eax
sete   %dl
add    %edx,%ecx
add    $0x1,%rsi
mov    %eax,%edi
cmp    %esi,%r8d
je     1296 <sturmcnt+0x186>
movsd  0x8(%rbx,%rsi,8),%xmm3
ucomisd %xmm3,%xmm3
mov    $0xffffffff,%eax
jp     129c <sturmcnt+0x18c>
movapd %xmm3,%xmm4
andpd  %xmm1,%xmm4
ucomisd %xmm0,%xmm4
ja     129c <sturmcnt+0x18c>
mov    $0x1,%eax
ucomisd %xmm2,%xmm3
ja     11b0 <sturmcnt+0xa0>
mov    $0xffffffff,%eax
ucomisd %xmm3,%xmm2
ja     11b0 <sturmcnt+0xa0>
mov    %edi,%eax
neg    %eax
jmp    11b0 <sturmcnt+0xa0>
lea    -0x2(%r14),%eax
movsd  0xde9(%rip),%xmm3
xor    %ecx,%ecx
movapd 0xdef(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  0x10(%r15,%rcx,8),%xmm4
subsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm1
movsd  0x8(%r12,%rcx,8),%xmm4
mulsd  %xmm4,%xmm4
mulsd  %xmm3,%xmm4
subsd  %xmm4,%xmm1
movsd  %xmm1,0x10(%rbx,%rcx,8)
movapd %xmm1,%xmm3
andpd  %xmm2,%xmm3
ucomisd %xmm0,%xmm3
jbe    1280 <sturmcnt+0x170>
divsd  %xmm3,%xmm1
movsd  %xmm1,0x10(%rbx,%rcx,8)
movsd  0x8(%rbx,%rcx,8),%xmm4
divsd  %xmm3,%xmm4
movsd  %xmm4,0x8(%rbx,%rcx,8)
cmp    %ecx,%eax
je     118d <sturmcnt+0x7d>
movsd  0x8(%rbx,%rcx,8),%xmm3
add    $0x1,%rcx
jmp    1230 <sturmcnt+0x120>
xor    %ecx,%ecx
sub    %ecx,%r14d
mov    %r14d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
@DOUBLE_MAX = external global double
define i32 @sturmcnt(double* nocapture %0, double* nocapture %1, i32 %2, double %3, double* nocapture %4) {
%6 = icmp eq i32 %2, 1
br i1 %6, label %7, label %12
7: ; preds = %5
%8 = getelementptr inbounds double, double* %0, i64 1
%9 = load double, double* %8
%10 = fcmp ogt double %9, %3
%11 = zext i1 %10 to i32
br label %83
12: ; preds = %5
%13 = load double, double* @DOUBLE_MAX
%14 = tail call double @sqrt(double %13)
store double 1.000000e+00, double* %4
%15 = getelementptr inbounds double, double* %0, i64 1
%16 = load double, double* %15
%17 = fsub double %16, %3
%18 = getelementptr inbounds double, double* %4, i64 1
store double %17, double* %18
%19 = icmp slt i32 %2, 2
br i1 %19, label %23, label %20
20: ; preds = %12
%21 = getelementptr inbounds double, double* %0, i64 2
%22 = getelementptr inbounds double, double* %4, i64 2
br label %25
23: ; preds = %53, %12
%24 = icmp eq i32 %2, 0
br i1 %24, label %83, label %59
25: ; preds = %56, %20
%26 = phi double [ %58, %56 ], [ 1.000000e+00, %20 ]
%27 = phi double [ %54, %56 ], [ %17, %20 ]
%28 = phi double* [ %34, %56 ], [ %1, %20 ]
%29 = phi i32 [ %57, %56 ], [ 2, %20 ]
%30 = phi double* [ %43, %56 ], [ %21, %20 ]
%31 = phi double* [ %45, %56 ], [ %4, %20 ]
%32 = phi double* [ %44, %56 ], [ %18, %20 ]
%33 = phi double* [ %42, %56 ], [ %22, %20 ]
%34 = getelementptr inbounds double, double* %28, i64 1
%35 = load double, double* %30
%36 = fsub double %35, %3
%37 = load double, double* %34
%38 = fneg double %37
%39 = fmul double %37, %38
%40 = fmul double %39, %26
%41 = tail call double @llvm.fmuladd.f64(double %36, double %27, double %40)
%42 = getelementptr inbounds double, double* %33, i64 1
store double %41, double* %33
%43 = getelementptr inbounds double, double* %30, i64 1
%44 = getelementptr inbounds double, double* %32, i64 1
%45 = getelementptr inbounds double, double* %31, i64 1
%46 = load double, double* %44
%47 = tail call double @llvm.fabs.f64(double %46)
%48 = fcmp ogt double %47, %14
br i1 %48, label %49, label %53
49: ; preds = %25
%50 = fdiv double %46, %47
store double %50, double* %44
%51 = load double, double* %45
%52 = fdiv double %51, %47
store double %52, double* %45
br label %53
53: ; preds = %25, %49
%54 = phi double [ %46, %25 ], [ %50, %49 ]
%55 = icmp eq i32 %29, %2
br i1 %55, label %23, label %56
56: ; preds = %53
%57 = add nuw i32 %29, 1
%58 = load double, double* %45
br label %25
59: ; preds = %23, %75
%60 = phi i32 [ %81, %75 ], [ %2, %23 ]
%61 = phi double* [ %80, %75 ], [ %18, %23 ]
%62 = phi i32 [ %76, %75 ], [ 1, %23 ]
%63 = phi i32 [ %79, %75 ], [ 0, %23 ]
%64 = load double, double* %61
%65 = fcmp uno double %64, 0.000000e+00
%66 = tail call double @llvm.fabs.f64(double %64)
%67 = fcmp ogt double %66, %14
%68 = select i1 %65, i1 true, i1 %67
br i1 %68, label %86, label %69
69: ; preds = %59
%70 = fcmp ogt double %64, 0.000000e+00
br i1 %70, label %75, label %71
71: ; preds = %69
%72 = fcmp olt double %64, 0.000000e+00
br i1 %72, label %75, label %73
73: ; preds = %71
%74 = sub nsw i32 0, %62
br label %75
75: ; preds = %71, %69, %73
%76 = phi i32 [ %74, %73 ], [ 1, %69 ], [ -1, %71 ]
%77 = icmp eq i32 %76, %62
%78 = zext i1 %77 to i32
%79 = add nuw nsw i32 %63, %78
%80 = getelementptr inbounds double, double* %61, i64 1
%81 = add nsw i32 %60, -1
%82 = icmp eq i32 %81, 0
br i1 %82, label %83, label %59
83: ; preds = %75, %23, %7
%84 = phi i32 [ %11, %7 ], [ 0, %23 ], [ %79, %75 ]
%85 = sub nsw i32 %2, %84
br label %86
86: ; preds = %59, %83
%87 = phi i32 [ %85, %83 ], [ -1, %59 ]
ret i32 %87
}