#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 firstIndexOf(char *, char, int /*<<< orphan*/);
char pow(int, int);
int strlen(char *);
double str2dbl(char *str) {
  int j = 0, i, n = firstIndexOf(str, '.', 0), neg = 0;
  double result = 0;
  if (str[0] == '-') {
    neg = 1;
    j = 1;
  }
  if (n == -1) {
    n = strlen(str);
    for (i = n - 1 - neg; i >= 0; i--) {
      result += pow(10, i) * (str[j] - 48);
      j++;
    }
  } else {
    j = n - 1 - neg;
    for (i = neg ? 1 : 0; i < n; i++) {
      result += pow(10, j) * (str[i] - 48);
      j--;
    }
    i++;
    j = -1;
    for (i = i; i < strlen(str); i++) {
      result += pow(10, j) * (str[i] - 48);
      j--;
    }
  }
  if (neg)
    result *= -1;
  return result;
}


x86 assembly (clang, -O0):
<str2dbl>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%rdi
mov    $0x2e,%esi
xor    %edx,%edx
call   1040 <firstIndexOf@plt>
mov    %eax,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1183 <str2dbl+0x53>
movl   $0x1,-0x18(%rbp)
movl   $0x1,-0xc(%rbp)
cmpl   $0xffffffff,-0x14(%rbp)
jne    11fb <str2dbl+0xcb>
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x10(%rbp)
cmpl   $0x0,-0x10(%rbp)
jl     11f6 <str2dbl+0xc6>
mov    -0x10(%rbp),%esi
mov    $0xa,%edi
call   1050 <pow@plt>
movsbl %al,%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x30,%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x10(%rbp)
jmp    11a5 <str2dbl+0x75>
jmp    12eb <str2dbl+0x1bb>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x18(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    126d <str2dbl+0x13d>
mov    -0xc(%rbp),%esi
mov    $0xa,%edi
call   1050 <pow@plt>
movsbl %al,%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x30,%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    121a <str2dbl+0xea>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
movl   $0xffffffff,-0xc(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    -0x24(%rbp),%eax
cmp    %ecx,%eax
jge    12e6 <str2dbl+0x1b6>
mov    -0xc(%rbp),%esi
mov    $0xa,%edi
call   1050 <pow@plt>
movsbl %al,%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x30,%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1283 <str2dbl+0x153>
jmp    12eb <str2dbl+0x1bb>
cmpl   $0x0,-0x18(%rbp)
je     1307 <str2dbl+0x1d7>
movsd  0xd03(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<str2dbl>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rdi,%r15
mov    $0x2e,%esi
xor    %edx,%edx
call   1040 <firstIndexOf@plt>
mov    (%r15),%r13b
xor    %r14d,%r14d
cmp    $0x2d,%r13b
sete   %r14b
cmp    $0xffffffff,%eax
je     11a0 <str2dbl+0x70>
cmp    %r14d,%eax
jle    11d8 <str2dbl+0xa8>
not    %r14d
add    %eax,%r14d
xor    %ebp,%ebp
cmp    $0x2d,%r13b
sete   %bpl
mov    %eax,%r12d
sub    %ebp,%eax
mov    %r13d,%ecx
mov    %rbp,%r13
not    %r13
test   $0x1,%al
mov    %cl,0xf(%rsp)
jne    11e7 <str2dbl+0xb7>
xorpd  %xmm0,%xmm0
mov    %r14d,%ebx
add    %r12,%r13
jne    1230 <str2dbl+0x100>
jmp    1298 <str2dbl+0x168>
mov    %r15,%rdi
call   1030 <strlen@plt>
mov    %r14d,%r12d
not    %r12d
add    %eax,%r12d
js     1329 <str2dbl+0x1f9>
xor    %ebp,%ebp
cmp    $0x2d,%r13b
sete   %bpl
sub    %r14d,%eax
test   $0x1,%al
jne    1338 <str2dbl+0x208>
xorpd  %xmm0,%xmm0
mov    %r12d,%ebx
jmp    136e <str2dbl+0x23e>
xorpd  %xmm0,%xmm0
movapd %xmm0,0x10(%rsp)
jmp    12b3 <str2dbl+0x183>
xor    %eax,%eax
cmp    $0x2d,%cl
sete   %al
mov    %rax,0x10(%rsp)
mov    $0xa,%edi
mov    %r14d,%esi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl (%r15,%rbp,1),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
cvtsi2sd %ecx,%xmm0
lea    -0x1(%r14),%ebx
mov    0x10(%rsp),%rbp
add    $0x1,%rbp
add    %r12,%r13
je     1298 <str2dbl+0x168>
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm0,0x10(%rsp)
mov    $0xa,%edi
mov    %ebx,%esi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl (%r15,%rbp,1),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
addsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x10(%rsp)
lea    -0x1(%rbx),%esi
mov    $0xa,%edi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl 0x1(%r15,%rbp,1),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
addsd  0x10(%rsp),%xmm0
add    $0x2,%rbp
add    $0xfffffffe,%ebx
cmp    %rbp,%r12
jne    1230 <str2dbl+0x100>
movapd %xmm0,0x10(%rsp)
xor    %eax,%eax
mov    0xf(%rsp),%r13b
cmp    $0x2d,%r13b
sete   %al
add    %eax,%r14d
add    $0x1,%r14d
lea    0x1(%r14),%ebx
mov    %r15,%rdi
call   1030 <strlen@plt>
cmp    %eax,%ebx
jge    13e4 <str2dbl+0x2b4>
mov    %r14d,%ebp
add    $0x1,%rbp
mov    $0xffffffff,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    $0xa,%edi
mov    %ebx,%esi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl (%r15,%rbp,1),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
movapd 0x10(%rsp),%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,0x10(%rsp)
add    $0xffffffff,%ebx
add    $0x1,%rbp
mov    %r15,%rdi
call   1030 <strlen@plt>
cmp    %ebp,%eax
jg     12e0 <str2dbl+0x1b0>
jmp    13e4 <str2dbl+0x2b4>
xorpd  %xmm0,%xmm0
movapd %xmm0,0x10(%rsp)
jmp    13e4 <str2dbl+0x2b4>
xor    %r14d,%r14d
cmp    $0x2d,%r13b
sete   %r14b
mov    $0xa,%edi
mov    %r12d,%esi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl (%r15,%rbp,1),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
cvtsi2sd %ecx,%xmm0
add    $0x1,%r14
lea    -0x1(%r12),%ebx
mov    %r14,%rbp
movapd %xmm0,0x10(%rsp)
test   %r12d,%r12d
je     13e4 <str2dbl+0x2b4>
add    %r15,%rbp
add    $0x1,%rbp
mov    $0xa,%edi
mov    %ebx,%esi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl -0x1(%rbp),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
addsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x10(%rsp)
add    $0xffffffff,%ebx
mov    $0xa,%edi
mov    %ebx,%esi
call   1050 <pow@plt>
movsbl %al,%eax
movsbl 0x0(%rbp),%ecx
add    $0xffffffd0,%ecx
imul   %eax,%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
addsd  0x10(%rsp),%xmm0
movapd %xmm0,0x10(%rsp)
add    $0x2,%rbp
sub    $0x1,%ebx
jae    1380 <str2dbl+0x250>
movaps 0x10(%rsp),%xmm0
cmp    $0x2d,%r13b
jne    13f6 <str2dbl+0x2c6>
xorps  0xc0a(%rip),%xmm0
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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