#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__ isdigit(int);
double atof(const char *s) {
  double a = 0.0;
  int e = 0;
  int c;
  while ((c = *s++) != '\0' && isdigit(c)) {
    a = a * 10.0 + (c - '0');
  }
  if (c == '.') {
    while ((c = *s++) != '\0' && isdigit(c)) {
      a = a * 10.0 + (c - '0');
      e = e - 1;
    }
  }
  if (c == 'e' || c == 'E') {
    int sign = 1;
    int i = 0;
    c = *s++;
    if (c == '+')
      c = *s++;
    else if (c == '-') {
      c = *s++;
      sign = -1;
    }
    while (isdigit(c)) {
      i = i * 10 + (c - '0');
      c = *s++;
    }
    e += i * sign;
  }
  while (e > 0) {
    a *= 10.0;
    e--;
  }
  while (e < 0) {
    a *= 0.1;
    e++;
  }
  return a;
}


x86 assembly (clang, -O0):
<atof>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl (%rax),%ecx
mov    %ecx,-0x18(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x21(%rbp)
je     1160 <atof+0x50>
mov    -0x18(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    1170 <atof+0x60>
jmp    1199 <atof+0x89>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe81(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    112b <atof+0x1b>
cmpl   $0x2e,-0x18(%rbp)
jne    1224 <atof+0x114>
jmp    11a8 <atof+0x98>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl (%rax),%ecx
mov    %ecx,-0x18(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x22(%rbp)
je     11dd <atof+0xcd>
mov    -0x18(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
test   $0x1,%al
jne    11ed <atof+0xdd>
jmp    121f <atof+0x10f>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%eax
sub    $0x30,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe04(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11a8 <atof+0x98>
jmp    1224 <atof+0x114>
cmpl   $0x65,-0x18(%rbp)
je     1238 <atof+0x128>
cmpl   $0x45,-0x18(%rbp)
jne    12f7 <atof+0x1e7>
movl   $0x1,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x2b,-0x18(%rbp)
jne    127f <atof+0x16f>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
jmp    12aa <atof+0x19a>
cmpl   $0x2d,-0x18(%rbp)
jne    12a5 <atof+0x195>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
movl   $0xffffffff,-0x1c(%rbp)
jmp    12aa <atof+0x19a>
jmp    12af <atof+0x19f>
mov    -0x18(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     12ea <atof+0x1da>
imul   $0xa,-0x20(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
jmp    12af <atof+0x19f>
mov    -0x20(%rbp),%eax
imul   -0x1c(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    12fc <atof+0x1ec>
cmpl   $0x0,-0x14(%rbp)
jle    1326 <atof+0x216>
movsd  0xcfa(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    12fc <atof+0x1ec>
jmp    132b <atof+0x21b>
cmpl   $0x0,-0x14(%rbp)
jge    1355 <atof+0x245>
movsd  0xcc3(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    132b <atof+0x21b>
movsd  -0x10(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<atof>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    (%rdi),%bl
test   %bl,%bl
je     1174 <atof+0x64>
mov    %rdi,%r12
add    $0x1,%r12
xorpd  %xmm0,%xmm0
nopl   (%rax)
movsd  %xmm0,0x8(%rsp)
movsbl %bl,%ebp
mov    %ebp,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     1185 <atof+0x75>
add    $0xffffffd0,%ebp
xorps  %xmm1,%xmm1
cvtsi2sd %ebp,%xmm1
movsd  0x8(%rsp),%xmm0
movsd  0xea3(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movzbl (%r12),%ebx
add    $0x1,%r12
test   %bl,%bl
jne    1130 <atof+0x20>
jmp    1178 <atof+0x68>
xorpd  %xmm0,%xmm0
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %r15d,%r15d
cmp    $0x2e,%bl
jne    126f <atof+0x15f>
mov    (%r12),%bl
test   %bl,%bl
movsd  0x8(%rsp),%xmm0
je     1178 <atof+0x68>
add    $0x1,%r12
xor    %r15d,%r15d
cs nopw 0x0(%rax,%rax,1)
movsd  %xmm0,0x8(%rsp)
movsbl %bl,%ebp
mov    %ebp,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     126f <atof+0x15f>
add    $0xffffffd0,%ebp
xorps  %xmm1,%xmm1
cvtsi2sd %ebp,%xmm1
movsd  0x8(%rsp),%xmm0
movsd  0xe1f(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
add    $0xffffffff,%r15d
movzbl (%r12),%ebx
add    $0x1,%r12
test   %bl,%bl
jne    11b0 <atof+0xa0>
test   %r15d,%r15d
jle    12f1 <atof+0x1e1>
lea    -0x1(%r15),%eax
mov    %r15d,%ecx
and    $0x7,%ecx
je     122e <atof+0x11e>
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm0
add    $0x1,%edx
cmp    %edx,%ecx
jne    1220 <atof+0x110>
sub    %edx,%r15d
cmp    $0x7,%eax
jb     1178 <atof+0x68>
add    $0xffffffff,%r15d
nopl   0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
mulsd  %xmm2,%xmm0
add    $0xfffffff8,%r15d
cmp    $0xfffffffe,%r15d
jb     1240 <atof+0x130>
jmp    1178 <atof+0x68>
and    $0xdf,%bl
cmp    $0x45,%bl
jne    12da <atof+0x1ca>
mov    (%r12),%al
mov    $0x1,%ebx
cmp    $0x2b,%al
je     128d <atof+0x17d>
cmp    $0x2d,%al
jne    1298 <atof+0x188>
mov    $0xffffffff,%ebx
mov    0x1(%r12),%al
add    $0x2,%r12
jmp    129c <atof+0x18c>
add    $0x1,%r12
movsbl %al,%r14d
mov    %r14d,%edi
call   1030 <isdigit@plt>
xor    %ebp,%ebp
test   %rax,%rax
je     12d1 <atof+0x1c1>
nop
lea    0x0(%rbp,%rbp,4),%eax
lea    (%r14,%rax,2),%ebp
add    $0xffffffd0,%ebp
movsbl (%r12),%r14d
add    $0x1,%r12
mov    %r14d,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
jne    12b0 <atof+0x1a0>
imul   %ebx,%ebp
add    %r15d,%ebp
mov    %ebp,%r15d
movsd  0x8(%rsp),%xmm0
movsd  0xd18(%rip),%xmm2
test   %r15d,%r15d
jg     1203 <atof+0xf3>
jns    1178 <atof+0x68>
mov    %r15d,%eax
neg    %eax
and    $0x7,%eax
je     1322 <atof+0x212>
neg    %eax
xor    %ecx,%ecx
movsd  0xcfb(%rip),%xmm1
nopl   (%rax)
mulsd  %xmm1,%xmm0
add    $0xffffffff,%ecx
cmp    %ecx,%eax
jne    1310 <atof+0x200>
mov    %r15d,%eax
sub    %ecx,%eax
jmp    1325 <atof+0x215>
mov    %r15d,%eax
cmp    $0xfffffff8,%r15d
ja     1178 <atof+0x68>
movsd  0xcd1(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0x8,%eax
jne    1340 <atof+0x230>
jmp    1178 <atof+0x68>

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

LLVM IR (-O2):
define double @atof(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %146, label %4
4: ; preds = %1, %12
%5 = phi i8 [ %16, %12 ], [ %2, %1 ]
%6 = phi i8* [ %8, %12 ], [ %0, %1 ]
%7 = phi double [ %15, %12 ], [ 0.000000e+00, %1 ]
%8 = getelementptr inbounds i8, i8* %6, i64 1
%9 = sext i8 %5 to i32
%10 = tail call i64 @isdigit(i32 %9)
%11 = icmp eq i64 %10, 0
br i1 %11, label %18, label %12
12: ; preds = %4
%13 = add nsw i32 %9, -48
%14 = sitofp i32 %13 to double
%15 = tail call double @llvm.fmuladd.f64(double %7, double 1.000000e+01, double %14)
%16 = load i8, i8* %8
%17 = icmp eq i8 %16, 0
br i1 %17, label %146, label %4
18: ; preds = %4
%19 = icmp eq i8 %5, 46
br i1 %19, label %20, label %41
20: ; preds = %18
%21 = load i8, i8* %8
%22 = icmp eq i8 %21, 0
br i1 %22, label %146, label %23
23: ; preds = %20
%24 = getelementptr inbounds i8, i8* %6, i64 2
br label %25
25: ; preds = %23, %33
%26 = phi i8 [ %39, %33 ], [ %21, %23 ]
%27 = phi i8* [ %38, %33 ], [ %24, %23 ]
%28 = phi i32 [ %37, %33 ], [ 0, %23 ]
%29 = phi double [ %36, %33 ], [ %7, %23 ]
%30 = sext i8 %26 to i32
%31 = tail call i64 @isdigit(i32 %30)
%32 = icmp eq i64 %31, 0
br i1 %32, label %41, label %33
33: ; preds = %25
%34 = add nsw i32 %30, -48
%35 = sitofp i32 %34 to double
%36 = tail call double @llvm.fmuladd.f64(double %29, double 1.000000e+01, double %35)
%37 = add nsw i32 %28, -1
%38 = getelementptr inbounds i8, i8* %27, i64 1
%39 = load i8, i8* %27
%40 = icmp eq i8 %39, 0
br i1 %40, label %79, label %25
41: ; preds = %25, %18
%42 = phi i8* [ %8, %18 ], [ %27, %25 ]
%43 = phi double [ %7, %18 ], [ %29, %25 ]
%44 = phi i32 [ 0, %18 ], [ %28, %25 ]
%45 = phi i8 [ %5, %18 ], [ %26, %25 ]
%46 = and i8 %45, -33
%47 = icmp eq i8 %46, 69
br i1 %47, label %48, label %79
48: ; preds = %41
%49 = getelementptr inbounds i8, i8* %42, i64 1
%50 = load i8, i8* %42
switch i8 %50, label %56 [
i8 43, label %52
i8 45, label %51
]
51: ; preds = %48
br label %52
52: ; preds = %48, %51
%53 = phi i32 [ -1, %51 ], [ 1, %48 ]
%54 = getelementptr inbounds i8, i8* %42, i64 2
%55 = load i8, i8* %49
br label %56
56: ; preds = %52, %48
%57 = phi i8* [ %49, %48 ], [ %54, %52 ]
%58 = phi i8 [ %50, %48 ], [ %55, %52 ]
%59 = phi i32 [ 1, %48 ], [ %53, %52 ]
%60 = sext i8 %58 to i32
%61 = tail call i64 @isdigit(i32 %60)
%62 = icmp eq i64 %61, 0
br i1 %62, label %75, label %63
63: ; preds = %56, %63
%64 = phi i32 [ %72, %63 ], [ %60, %56 ]
%65 = phi i32 [ %69, %63 ], [ 0, %56 ]
%66 = phi i8* [ %70, %63 ], [ %57, %56 ]
%67 = mul nsw i32 %65, 10
%68 = add nsw i32 %64, -48
%69 = add nsw i32 %68, %67
%70 = getelementptr inbounds i8, i8* %66, i64 1
%71 = load i8, i8* %66
%72 = sext i8 %71 to i32
%73 = tail call i64 @isdigit(i32 %72)
%74 = icmp eq i64 %73, 0
br i1 %74, label %75, label %63
75: ; preds = %63, %56
%76 = phi i32 [ 0, %56 ], [ %69, %63 ]
%77 = mul nsw i32 %76, %59
%78 = add nsw i32 %77, %44
br label %79
79: ; preds = %33, %41, %75
%80 = phi double [ %43, %75 ], [ %43, %41 ], [ %36, %33 ]
%81 = phi i32 [ %78, %75 ], [ %44, %41 ], [ %37, %33 ]
%82 = icmp sgt i32 %81, 0
br i1 %82, label %83, label %100
83: ; preds = %79
%84 = add i32 %81, -1
%85 = and i32 %81, 7
%86 = icmp eq i32 %85, 0
br i1 %86, label %95, label %87
87: ; preds = %83, %87
%88 = phi i32 [ %92, %87 ], [ %81, %83 ]
%89 = phi double [ %91, %87 ], [ %80, %83 ]
%90 = phi i32 [ %93, %87 ], [ 0, %83 ]
%91 = fmul double %89, 1.000000e+01
%92 = add nsw i32 %88, -1
%93 = add i32 %90, 1
%94 = icmp eq i32 %93, %85
br i1 %94, label %95, label %87
95: ; preds = %87, %83
%96 = phi i32 [ %81, %83 ], [ %92, %87 ]
%97 = phi double [ %80, %83 ], [ %91, %87 ]
%98 = phi double [ undef, %83 ], [ %91, %87 ]
%99 = icmp ult i32 %84, 7
br i1 %99, label %146, label %119
100: ; preds = %79
%101 = icmp slt i32 %81, 0
br i1 %101, label %102, label %146
102: ; preds = %100
%103 = sub i32 0, %81
%104 = and i32 %103, 7
%105 = icmp eq i32 %104, 0
br i1 %105, label %114, label %106
106: ; preds = %102, %106
%107 = phi i32 [ %111, %106 ], [ %81, %102 ]
%108 = phi double [ %110, %106 ], [ %80, %102 ]
%109 = phi i32 [ %112, %106 ], [ 0, %102 ]
%110 = fmul double %108, 1.000000e-01
%111 = add i32 %107, 1
%112 = add i32 %109, 1
%113 = icmp eq i32 %112, %104
br i1 %113, label %114, label %106
114: ; preds = %106, %102
%115 = phi double [ undef, %102 ], [ %110, %106 ]
%116 = phi i32 [ %81, %102 ], [ %111, %106 ]
%117 = phi double [ %80, %102 ], [ %110, %106 ]
%118 = icmp ugt i32 %81, -8
br i1 %118, label %146, label %133
119: ; preds = %95, %119
%120 = phi i32 [ %130, %119 ], [ %96, %95 ]
%121 = phi double [ %129, %119 ], [ %97, %95 ]
%122 = fmul double %121, 1.000000e+01
%123 = fmul double %122, 1.000000e+01
%124 = fmul double %123, 1.000000e+01
%125 = fmul double %124, 1.000000e+01
%126 = fmul double %125, 1.000000e+01
%127 = fmul double %126, 1.000000e+01
%128 = fmul double %127, 1.000000e+01
%129 = fmul double %128, 1.000000e+01
%130 = add nsw i32 %120, -8
%131 = add i32 %120, -9
%132 = icmp ult i32 %131, -2
br i1 %132, label %119, label %146
133: ; preds = %114, %133
%134 = phi i32 [ %144, %133 ], [ %116, %114 ]
%135 = phi double [ %143, %133 ], [ %117, %114 ]
%136 = fmul double %135, 1.000000e-01
%137 = fmul double %136, 1.000000e-01
%138 = fmul double %137, 1.000000e-01
%139 = fmul double %138, 1.000000e-01
%140 = fmul double %139, 1.000000e-01
%141 = fmul double %140, 1.000000e-01
%142 = fmul double %141, 1.000000e-01
%143 = fmul double %142, 1.000000e-01
%144 = add i32 %134, 8
%145 = icmp eq i32 %144, 0
br i1 %145, label %146, label %133
146: ; preds = %12, %114, %133, %95, %119, %1, %20, %100
%147 = phi double [ %80, %100 ], [ 0.000000e+00, %1 ], [ %7, %20 ], [ %98, %95 ], [ %129, %119 ], [ %115, %114 ], [ %143, %133 ], [ %15, %12 ]
ret double %147
}