int parse_thousands(const char *string) {
  unsigned int in, fl;
  int i, j;
  in = fl = 0;
  i = 0;
  while (string[i] == ' ' || string[i] == '\t')
    i++;
  while (string[i] >= '0' && string[i] <= '9') {
    in = in * 10 + string[i] - '0';
    i++;
  }
  if (string[i] == '.') {
    i++;
    j = 0;
    while (string[i] >= '0' && string[i] <= '9') {
      fl = fl * 10 + string[i] - '0';
      i++;
      j++;
    }
    while (j > 3) {
      fl /= 10;
      j--;
    }
    while (j < 3) {
      fl *= 10;
      j++;
    }
  }
  while (string[i] == ' ' || string[i] == '\t')
    i++;
  if (string[i] == '\0')
    return in * 1000 + fl;
  return -1;
}


x86 assembly (clang, -O0):
<parse_thousands>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x21(%rbp)
je     114c <parse_thousands+0x4c>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    115c <parse_thousands+0x5c>
jmp    116a <parse_thousands+0x6a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    111d <parse_thousands+0x1d>
jmp    116f <parse_thousands+0x6f>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x22(%rbp)
jl     119e <parse_thousands+0x9e>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
test   $0x1,%al
jne    11ae <parse_thousands+0xae>
jmp    11d4 <parse_thousands+0xd4>
imul   $0xa,-0x14(%rbp),%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x14(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    116f <parse_thousands+0x6f>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    12bc <parse_thousands+0x1bc>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x23(%rbp)
jl     1228 <parse_thousands+0x128>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x23(%rbp)
mov    -0x23(%rbp),%al
test   $0x1,%al
jne    1238 <parse_thousands+0x138>
jmp    1267 <parse_thousands+0x167>
imul   $0xa,-0x18(%rbp),%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11f9 <parse_thousands+0xf9>
jmp    126c <parse_thousands+0x16c>
cmpl   $0x3,-0x20(%rbp)
jle    1293 <parse_thousands+0x193>
mov    -0x18(%rbp),%eax
mov    $0xa,%ecx
xor    %edx,%edx
div    %ecx
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    126c <parse_thousands+0x16c>
jmp    1298 <parse_thousands+0x198>
cmpl   $0x3,-0x20(%rbp)
jge    12b7 <parse_thousands+0x1b7>
imul   $0xa,-0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1298 <parse_thousands+0x198>
jmp    12bc <parse_thousands+0x1bc>
jmp    12c1 <parse_thousands+0x1c1>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x24(%rbp)
je     12f0 <parse_thousands+0x1f0>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x24(%rbp)
mov    -0x24(%rbp),%al
test   $0x1,%al
jne    1300 <parse_thousands+0x200>
jmp    130e <parse_thousands+0x20e>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12c1 <parse_thousands+0x1c1>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    1335 <parse_thousands+0x235>
imul   $0x3e8,-0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    133c <parse_thousands+0x23c>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_thousands>:
xor    %esi,%esi
jmp    1114 <parse_thousands+0x14>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rsi
movzbl (%rdi,%rsi,1),%eax
cmp    $0x9,%al
je     1110 <parse_thousands+0x10>
cmp    $0x20,%al
je     1110 <parse_thousands+0x10>
mov    %esi,%r11d
mov    (%rdi,%r11,1),%dl
lea    -0x30(%rdx),%r8d
xor    %eax,%eax
cmp    $0x9,%r8b
ja     116f <parse_thousands+0x6f>
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nop
movzbl %dl,%edx
lea    (%rsi,%rsi,4),%esi
lea    (%rdx,%rsi,2),%esi
add    $0xffffffd0,%esi
movzbl 0x1(%rdi,%r11,1),%edx
add    $0x1,%r11
lea    -0x30(%rdx),%ecx
cmp    $0xa,%cl
jb     1140 <parse_thousands+0x40>
imul   $0x3e8,%esi,%r8d
cmp    $0x2e,%dl
je     117e <parse_thousands+0x7e>
jmp    1349 <parse_thousands+0x249>
xor    %r8d,%r8d
mov    %rsi,%r11
cmp    $0x2e,%dl
jne    1349 <parse_thousands+0x249>
mov    %r11d,%r11d
mov    0x1(%rdi,%r11,1),%dl
add    $0x1,%r11
lea    -0x30(%rdx),%eax
cmp    $0x9,%al
ja     11f7 <parse_thousands+0xf7>
lea    (%r11,%rdi,1),%r9
add    $0x1,%r9
xor    %esi,%esi
xor    %eax,%eax
nopl   (%rax)
movzbl %dl,%ecx
lea    (%rax,%rax,4),%eax
lea    (%rcx,%rax,2),%eax
add    $0xffffffd0,%eax
movzbl (%r9,%rsi,1),%edx
lea    -0x30(%rdx),%ecx
add    $0x1,%rsi
cmp    $0xa,%cl
jb     11a0 <parse_thousands+0xa0>
add    %rsi,%r11
lea    -0x1(%rsi),%ecx
cmp    $0x3,%ecx
jb     1244 <parse_thousands+0x144>
add    $0x1,%rsi
mov    $0xcccccccd,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %eax,%eax
imul   %rdx,%rax
shr    $0x23,%rax
add    $0xffffffff,%esi
cmp    $0x4,%esi
ja     11e0 <parse_thousands+0xe0>
jmp    1349 <parse_thousands+0x249>
xor    %esi,%esi
xor    %eax,%eax
mov    $0x3,%r10d
sub    %esi,%r10d
cmp    $0x8,%r10d
jb     132f <parse_thousands+0x22f>
mov    %r10d,%r9d
and    $0xfffffff8,%r9d
movd   %eax,%xmm1
movaps 0xde0(%rip),%xmm0
movss  %xmm1,%xmm0
lea    -0x8(%r9),%ecx
mov    %ecx,%eax
shr    $0x3,%eax
add    $0x1,%eax
mov    %eax,%edx
and    $0x7,%edx
cmp    $0x38,%ecx
jae    124e <parse_thousands+0x14e>
movdqa 0xdce(%rip),%xmm1
jmp    12ab <parse_thousands+0x1ab>
cmp    $0x3,%esi
jne    11fb <parse_thousands+0xfb>
jmp    1349 <parse_thousands+0x249>
and    $0xfffffff8,%eax
movdqa 0xdb7(%rip),%xmm1
movdqa 0xdbf(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
add    $0xfffffff8,%eax
jne    1270 <parse_thousands+0x170>
test   %edx,%edx
je     12fb <parse_thousands+0x1fb>
movdqa 0xd79(%rip),%xmm2
nopw   0x0(%rax,%rax,1)
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
add    $0xffffffff,%edx
jne    12c0 <parse_thousands+0x1c0>
pshufd $0xf5,%xmm0,%xmm2
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm3
pmuludq %xmm0,%xmm1
pshufd $0xee,%xmm1,%xmm0
pmuludq %xmm1,%xmm0
pshufd $0xaa,%xmm3,%xmm1
pmuludq %xmm3,%xmm1
pmuludq %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r9d,%r10d
je     1349 <parse_thousands+0x249>
add    %r9d,%esi
add    $0xfffffffd,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    %eax,%eax
lea    (%rax,%rax,4),%eax
inc    %esi
jne    1340 <parse_thousands+0x240>
movslq %r11d,%rcx
add    %rcx,%rdi
jmp    1364 <parse_thousands+0x264>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdi
movzbl (%rdi),%ecx
cmp    $0x9,%cl
je     1360 <parse_thousands+0x260>
cmp    $0x20,%cl
je     1360 <parse_thousands+0x260>
test   %cl,%cl
jne    1379 <parse_thousands+0x279>
add    %r8d,%eax
ret
mov    $0xffffffff,%eax
ret

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

LLVM IR (-O2):
define i32 @parse_thousands(i8* nocapture %0) {
br label %2
2: ; preds = %12, %1
%3 = phi i64 [ %13, %12 ], [ 0, %1 ]
%4 = getelementptr inbounds i8, i8* %0, i64 %3
%5 = load i8, i8* %4
switch i8 %5, label %6 [
i8 32, label %12
i8 9, label %12
]
6: ; preds = %2
%7 = and i64 %3, 4294967295
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = load i8, i8* %8
%10 = add i8 %9, -48
%11 = icmp ult i8 %10, 10
br i1 %11, label %14, label %29
12: ; preds = %2, %2
%13 = add nuw i64 %3, 1
br label %2
14: ; preds = %6, %14
%15 = phi i64 [ %22, %14 ], [ %7, %6 ]
%16 = phi i8 [ %24, %14 ], [ %9, %6 ]
%17 = phi i32 [ %21, %14 ], [ 0, %6 ]
%18 = zext i8 %16 to i32
%19 = mul i32 %17, 10
%20 = add i32 %19, -48
%21 = add i32 %20, %18
%22 = add nuw i64 %15, 1
%23 = getelementptr inbounds i8, i8* %0, i64 %22
%24 = load i8, i8* %23
%25 = add i8 %24, -48
%26 = icmp ult i8 %25, 10
br i1 %26, label %14, label %27
27: ; preds = %14
%28 = mul i32 %21, 1000
br label %29
29: ; preds = %27, %6
%30 = phi i32 [ 0, %6 ], [ %28, %27 ]
%31 = phi i64 [ %3, %6 ], [ %22, %27 ]
%32 = phi i8 [ %9, %6 ], [ %24, %27 ]
%33 = trunc i64 %31 to i32
%34 = icmp eq i8 %32, 46
br i1 %34, label %35, label %122
35: ; preds = %29
%36 = add nuw nsw i32 %33, 1
%37 = zext i32 %36 to i64
%38 = getelementptr inbounds i8, i8* %0, i64 %37
%39 = load i8, i8* %38
%40 = add i8 %39, -48
%41 = icmp ult i8 %40, 10
br i1 %41, label %45, label %62
42: ; preds = %45
%43 = trunc i64 %55 to i32
%44 = icmp ugt i32 %48, 2
br i1 %44, label %110, label %60
45: ; preds = %35, %45
%46 = phi i64 [ %55, %45 ], [ %37, %35 ]
%47 = phi i8 [ %57, %45 ], [ %39, %35 ]
%48 = phi i32 [ %54, %45 ], [ 0, %35 ]
%49 = phi i32 [ %53, %45 ], [ 0, %35 ]
%50 = zext i8 %47 to i32
%51 = mul i32 %49, 10
%52 = add i32 %51, -48
%53 = add i32 %52, %50
%54 = add nuw nsw i32 %48, 1
%55 = add nuw i64 %46, 1
%56 = getelementptr inbounds i8, i8* %0, i64 %55
%57 = load i8, i8* %56
%58 = add i8 %57, -48
%59 = icmp ult i8 %58, 10
br i1 %59, label %45, label %42
60: ; preds = %42
%61 = icmp eq i32 %48, 2
br i1 %61, label %122, label %62
62: ; preds = %35, %60
%63 = phi i32 [ %54, %60 ], [ 0, %35 ]
%64 = phi i32 [ %53, %60 ], [ 0, %35 ]
%65 = phi i32 [ %43, %60 ], [ %36, %35 ]
%66 = sub i32 3, %63
%67 = icmp ult i32 %66, 8
br i1 %67, label %107, label %68
68: ; preds = %62
%69 = and i32 %66, -8
%70 = add i32 %63, %69
%71 = insertelement <4 x i32> <i32 poison, i32 1, i32 1, i32 1>, i32 %64, i64 0
%72 = add i32 %69, -8
%73 = lshr exact i32 %72, 3
%74 = add nuw nsw i32 %73, 1
%75 = and i32 %74, 7
%76 = icmp ult i32 %72, 56
br i1 %76, label %87, label %77
77: ; preds = %68
%78 = and i32 %74, 1073741816
br label %79
79: ; preds = %79, %77
%80 = phi <4 x i32> [ %71, %77 ], [ %83, %79 ]
%81 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %77 ], [ %84, %79 ]
%82 = phi i32 [ 0, %77 ], [ %85, %79 ]
%83 = mul <4 x i32> %80, <i32 100000000, i32 100000000, i32 100000000, i32 100000000>
%84 = mul <4 x i32> %81, <i32 100000000, i32 100000000, i32 100000000, i32 100000000>
%85 = add nuw i32 %82, 8
%86 = icmp eq i32 %85, %78
br i1 %86, label %87, label %79
87: ; preds = %79, %68
%88 = phi <4 x i32> [ undef, %68 ], [ %83, %79 ]
%89 = phi <4 x i32> [ undef, %68 ], [ %84, %79 ]
%90 = phi <4 x i32> [ %71, %68 ], [ %83, %79 ]
%91 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %68 ], [ %84, %79 ]
%92 = icmp eq i32 %75, 0
br i1 %92, label %101, label %93
93: ; preds = %87, %93
%94 = phi <4 x i32> [ %97, %93 ], [ %90, %87 ]
%95 = phi <4 x i32> [ %98, %93 ], [ %91, %87 ]
%96 = phi i32 [ %99, %93 ], [ 0, %87 ]
%97 = mul <4 x i32> %94, <i32 10, i32 10, i32 10, i32 10>
%98 = mul <4 x i32> %95, <i32 10, i32 10, i32 10, i32 10>
%99 = add i32 %96, 1
%100 = icmp eq i32 %99, %75
br i1 %100, label %101, label %93
101: ; preds = %93, %87
%102 = phi <4 x i32> [ %88, %87 ], [ %97, %93 ]
%103 = phi <4 x i32> [ %89, %87 ], [ %98, %93 ]
%104 = mul <4 x i32> %103, %102
%105 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %104)
%106 = icmp eq i32 %66, %69
br i1 %106, label %122, label %107
107: ; preds = %62, %101
%108 = phi i32 [ %63, %62 ], [ %70, %101 ]
%109 = phi i32 [ %64, %62 ], [ %105, %101 ]
br label %116
110: ; preds = %42, %110
%111 = phi i32 [ %114, %110 ], [ %54, %42 ]
%112 = phi i32 [ %113, %110 ], [ %53, %42 ]
%113 = udiv i32 %112, 10
%114 = add nsw i32 %111, -1
%115 = icmp ugt i32 %111, 4
br i1 %115, label %110, label %122
116: ; preds = %107, %116
%117 = phi i32 [ %120, %116 ], [ %108, %107 ]
%118 = phi i32 [ %119, %116 ], [ %109, %107 ]
%119 = mul i32 %118, 10
%120 = add i32 %117, 1
%121 = icmp eq i32 %120, 3
br i1 %121, label %122, label %116
122: ; preds = %116, %110, %101, %60, %29
%123 = phi i32 [ 0, %29 ], [ %53, %60 ], [ %105, %101 ], [ %113, %110 ], [ %119, %116 ]
%124 = phi i32 [ %33, %29 ], [ %43, %60 ], [ %65, %101 ], [ %43, %110 ], [ %65, %116 ]
%125 = sext i32 %124 to i64
br label %126
126: ; preds = %130, %122
%127 = phi i64 [ %131, %130 ], [ %125, %122 ]
%128 = getelementptr inbounds i8, i8* %0, i64 %127
%129 = load i8, i8* %128
switch i8 %129, label %134 [
i8 32, label %130
i8 9, label %130
i8 0, label %132
]
130: ; preds = %126, %126
%131 = add i64 %127, 1
br label %126
132: ; preds = %126
%133 = add i32 %123, %30
br label %134
134: ; preds = %126, %132
%135 = phi i32 [ %133, %132 ], [ -1, %126 ]
ret i32 %135
}