#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 fromxdigit(unsigned char const);
scalar_t__ isspace(unsigned char const);
scalar_t__ isxdigit(unsigned char const);
int parse_c_string(const unsigned char *in, unsigned char *out) {
  unsigned char *out_start = out;
  while (isspace(*in))
    ++in;
  if (*in != '\"')
    return -1;
  ++in;
  while (*in && *in != '\"') {
    if (*in != '\\') {
      *out++ = *in++;
      continue;
    }
    if (in[1] >= '0' && in[1] <= '3' && in[2] >= '0' && in[2] <= '7' &&
        in[3] >= '0' && in[3] <= '7') {
      *out++ = ((in[1] - '0') << 6) + ((in[2] - '0') << 3) + (in[3] - '0');
      in += 4;
      continue;
    }
    if (in[1] >= '0' && in[1] <= '7' && in[2] >= '0' && in[2] <= '7') {
      *out++ = ((in[1] - '0') << 3) + (in[2] - '0');
      in += 3;
      continue;
    }
    if (in[1] >= '0' && in[1] <= '7') {
      *out++ = (in[1] - '0');
      in += 2;
      continue;
    }
    if ((in[1] == 'x' || in[1] == 'X') && isxdigit(in[2]) && isxdigit(in[3])) {
      *out++ = (fromxdigit(in[2]) << 4) + fromxdigit(in[3]);
      in += 4;
      continue;
    }
    if ((in[1] == 'x' || in[1] == 'X') && isxdigit(in[2])) {
      *out++ = fromxdigit(in[2]);
      in += 3;
      continue;
    }
    switch (in[1]) {
    case '\\':
    case '\"':
    case '\'':
      *out++ = in[1];
      break;
    case 'a':
      *out++ = '\a';
      break;
    case 'b':
      *out++ = '\b';
      break;
    case 't':
      *out++ = '\t';
      break;
    case 'n':
      *out++ = '\n';
      break;
    case 'v':
      *out++ = '\v';
      break;
    case 'f':
      *out++ = '\f';
      break;
    case 'r':
      *out++ = '\r';
      break;
    default:
      *out++ = in[1];
      break;
    }
    in += 2;
  }
  if (*in != '\"')
    return -1;
  ++in;
  if (*in)
    return -1;
  *out = 0;
  return (int)(out - out_start);
}


x86 assembly (clang, -O0):
<parse_c_string>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%edi
call   1030 <isspace@plt>
cmp    $0x0,%rax
je     116f <parse_c_string+0x3f>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1148 <parse_c_string+0x18>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x22,%eax
je     118b <parse_c_string+0x5b>
movl   $0xffffffff,-0x4(%rbp)
jmp    15fc <parse_c_string+0x4cc>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x21(%rbp)
je     11bc <parse_c_string+0x8c>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x22,%eax
setne  %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    11cc <parse_c_string+0x9c>
jmp    15a6 <parse_c_string+0x476>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5c,%eax
je     1203 <parse_c_string+0xd3>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     12b8 <parse_c_string+0x188>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x33,%eax
jg     12b8 <parse_c_string+0x188>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     12b8 <parse_c_string+0x188>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x37,%eax
jg     12b8 <parse_c_string+0x188>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x30,%eax
jl     12b8 <parse_c_string+0x188>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x37,%eax
jg     12b8 <parse_c_string+0x188>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
sub    $0x30,%eax
shl    $0x6,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x3,%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     133b <parse_c_string+0x20b>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x37,%eax
jg     133b <parse_c_string+0x20b>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     133b <parse_c_string+0x20b>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x37,%eax
jg     133b <parse_c_string+0x20b>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
sub    $0x30,%eax
shl    $0x3,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x10(%rbp)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     138c <parse_c_string+0x25c>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x37,%eax
jg     138c <parse_c_string+0x25c>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
sub    $0x30,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x78,%eax
je     13ae <parse_c_string+0x27e>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x58,%eax
jne    1427 <parse_c_string+0x2f7>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%edi
call   1050 <isxdigit@plt>
cmp    $0x0,%rax
je     1427 <parse_c_string+0x2f7>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%edi
call   1050 <isxdigit@plt>
cmp    $0x0,%rax
je     1427 <parse_c_string+0x2f7>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%edi
call   1040 <fromxdigit@plt>
shl    $0x4,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%edi
call   1040 <fromxdigit@plt>
mov    %eax,%ecx
mov    -0x28(%rbp),%eax
add    %ecx,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x78,%eax
je     1449 <parse_c_string+0x319>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x58,%eax
jne    1491 <parse_c_string+0x361>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%edi
call   1050 <isxdigit@plt>
cmp    $0x0,%rax
je     1491 <parse_c_string+0x361>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%edi
call   1040 <fromxdigit@plt>
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x10(%rbp)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
add    $0xffffffde,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x54,%eax
ja     157d <parse_c_string+0x44d>
mov    -0x30(%rbp),%rax
lea    0xb4a(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x7,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x8,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x9,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0xa,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0xb,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0xc,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0xd,(%rax)
jmp    1595 <parse_c_string+0x465>
mov    -0x10(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    1197 <parse_c_string+0x67>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x22,%eax
je     15c2 <parse_c_string+0x492>
movl   $0xffffffff,-0x4(%rbp)
jmp    15fc <parse_c_string+0x4cc>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     15e7 <parse_c_string+0x4b7>
movl   $0xffffffff,-0x4(%rbp)
jmp    15fc <parse_c_string+0x4cc>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_c_string>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%rbx),%edi
call   1030 <isspace@plt>
add    $0x1,%rbx
test   %rax,%rax
jne    1150 <parse_c_string+0x20>
mov    $0xffffffff,%r15d
cmpb   $0x22,-0x1(%rbx)
jne    1307 <parse_c_string+0x1d7>
xor    %ebp,%ebp
lea    0xe86(%rip),%r13
jmp    1198 <parse_c_string+0x68>
add    $0x2,%rbx
add    $0xd0,%al
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %al,(%r14,%rbp,1)
add    $0x1,%rbp
movzbl (%rbx),%eax
cmp    $0x5c,%al
je     11c0 <parse_c_string+0x90>
test   %al,%al
je     1307 <parse_c_string+0x1d7>
cmp    $0x22,%al
je     12f9 <parse_c_string+0x1c9>
add    $0x1,%rbx
jmp    1190 <parse_c_string+0x60>
cs nopw 0x0(%rax,%rax,1)
nop
movzbl 0x1(%rbx),%eax
mov    %eax,%ecx
and    $0xfc,%cl
cmp    $0x30,%cl
jne    1200 <parse_c_string+0xd0>
movzbl 0x2(%rbx),%ecx
mov    %ecx,%edx
and    $0xf8,%dl
cmp    $0x30,%dl
jne    1200 <parse_c_string+0xd0>
movzbl 0x3(%rbx),%esi
mov    %esi,%edx
and    $0xf8,%dl
cmp    $0x30,%dl
jne    1200 <parse_c_string+0xd0>
shl    $0x6,%al
shl    $0x3,%cl
add    %al,%cl
add    %sil,%cl
add    $0x50,%cl
mov    %cl,(%r14,%rbp,1)
jmp    1272 <parse_c_string+0x142>
xchg   %ax,%ax
mov    %eax,%ecx
and    $0xf8,%cl
cmp    $0x30,%cl
jne    1230 <parse_c_string+0x100>
movzbl 0x2(%rbx),%ecx
mov    %ecx,%edx
and    $0xf8,%dl
cmp    $0x30,%dl
jne    117c <parse_c_string+0x4c>
shl    $0x3,%al
add    %cl,%al
add    $0x50,%al
mov    %al,(%r14,%rbp,1)
jmp    12a8 <parse_c_string+0x178>
nopl   0x0(%rax)
or     $0x20,%al
cmp    $0x78,%al
jne    127f <parse_c_string+0x14f>
movzbl 0x2(%rbx),%edi
call   1050 <isxdigit@plt>
test   %rax,%rax
je     127f <parse_c_string+0x14f>
movzbl 0x3(%rbx),%edi
call   1050 <isxdigit@plt>
test   %rax,%rax
je     127f <parse_c_string+0x14f>
movzbl 0x2(%rbx),%edi
call   1040 <fromxdigit@plt>
mov    %eax,%r12d
shl    $0x4,%r12d
movzbl 0x3(%rbx),%edi
call   1040 <fromxdigit@plt>
add    %r12d,%eax
mov    %al,(%r14,%rbp,1)
add    $0x4,%rbx
add    $0x1,%rbp
jmp    1198 <parse_c_string+0x68>
movzbl 0x1(%rbx),%eax
mov    %eax,%ecx
or     $0x20,%cl
cmp    $0x78,%cl
jne    12b9 <parse_c_string+0x189>
movzbl 0x2(%rbx),%edi
call   1050 <isxdigit@plt>
test   %rax,%rax
je     12b5 <parse_c_string+0x185>
movzbl 0x2(%rbx),%edi
call   1040 <fromxdigit@plt>
mov    %al,(%r14,%rbp,1)
add    $0x3,%rbx
add    $0x1,%rbp
jmp    1198 <parse_c_string+0x68>
movzbl 0x1(%rbx),%eax
lea    -0x61(%rax),%ecx
cmp    $0x15,%cl
ja     12e8 <parse_c_string+0x1b8>
movzbl %cl,%ecx
movslq 0x0(%r13,%rcx,4),%rcx
add    %r13,%rcx
jmp    *%rcx
mov    $0x7,%al
jmp    12e8 <parse_c_string+0x1b8>
mov    $0x8,%al
jmp    12e8 <parse_c_string+0x1b8>
mov    $0xc,%al
jmp    12e8 <parse_c_string+0x1b8>
mov    $0xa,%al
jmp    12e8 <parse_c_string+0x1b8>
mov    $0xd,%al
jmp    12e8 <parse_c_string+0x1b8>
mov    $0x9,%al
jmp    12e8 <parse_c_string+0x1b8>
mov    $0xb,%al
mov    %al,(%r14,%rbp,1)
add    $0x2,%rbx
add    $0x1,%rbp
jmp    1198 <parse_c_string+0x68>
cmpb   $0x0,0x1(%rbx)
jne    1307 <parse_c_string+0x1d7>
movb   $0x0,(%r14,%rbp,1)
mov    %ebp,%r15d
mov    %r15d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @parse_c_string(i8* %0, i8* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
store i8* %0, i8** %4
store i8* %1, i8** %5
%7 = load i8*, i8** %5
store i8* %7, i8** %6
br label %8
8: ; preds = %13, %2
%9 = load i8*, i8** %4
%10 = load i8, i8* %9
%11 = call i64 @isspace(i8 zeroext %10)
%12 = icmp ne i64 %11, 0
br i1 %12, label %13, label %16
13: ; preds = %8
%14 = load i8*, i8** %4
%15 = getelementptr inbounds i8, i8* %14, i32 1
store i8* %15, i8** %4
br label %8
16: ; preds = %8
%17 = load i8*, i8** %4
%18 = load i8, i8* %17
%19 = zext i8 %18 to i32
%20 = icmp ne i32 %19, 34
br i1 %20, label %21, label %22
21: ; preds = %16
store i32 -1, i32* %3
br label %304
22: ; preds = %16
%23 = load i8*, i8** %4
%24 = getelementptr inbounds i8, i8* %23, i32 1
store i8* %24, i8** %4
br label %25
25: ; preds = %280, %232, %198, %163, %133, %84, %42, %22
%26 = load i8*, i8** %4
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %35
30: ; preds = %25
%31 = load i8*, i8** %4
%32 = load i8, i8* %31
%33 = zext i8 %32 to i32
%34 = icmp ne i32 %33, 34
br label %35
35: ; preds = %30, %25
%36 = phi i1 [ false, %25 ], [ %34, %30 ]
br i1 %36, label %37, label %283
37: ; preds = %35
%38 = load i8*, i8** %4
%39 = load i8, i8* %38
%40 = zext i8 %39 to i32
%41 = icmp ne i32 %40, 92
br i1 %41, label %42, label %48
42: ; preds = %37
%43 = load i8*, i8** %4
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %4
%45 = load i8, i8* %43
%46 = load i8*, i8** %5
%47 = getelementptr inbounds i8, i8* %46, i32 1
store i8* %47, i8** %5
store i8 %45, i8* %46
br label %25
48: ; preds = %37
%49 = load i8*, i8** %4
%50 = getelementptr inbounds i8, i8* %49, i64 1
%51 = load i8, i8* %50
%52 = zext i8 %51 to i32
%53 = icmp sge i32 %52, 48
br i1 %53, label %54, label %109
54: ; preds = %48
%55 = load i8*, i8** %4
%56 = getelementptr inbounds i8, i8* %55, i64 1
%57 = load i8, i8* %56
%58 = zext i8 %57 to i32
%59 = icmp sle i32 %58, 51
br i1 %59, label %60, label %109
60: ; preds = %54
%61 = load i8*, i8** %4
%62 = getelementptr inbounds i8, i8* %61, i64 2
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = icmp sge i32 %64, 48
br i1 %65, label %66, label %109
66: ; preds = %60
%67 = load i8*, i8** %4
%68 = getelementptr inbounds i8, i8* %67, i64 2
%69 = load i8, i8* %68
%70 = zext i8 %69 to i32
%71 = icmp sle i32 %70, 55
br i1 %71, label %72, label %109
72: ; preds = %66
%73 = load i8*, i8** %4
%74 = getelementptr inbounds i8, i8* %73, i64 3
%75 = load i8, i8* %74
%76 = zext i8 %75 to i32
%77 = icmp sge i32 %76, 48
br i1 %77, label %78, label %109
78: ; preds = %72
%79 = load i8*, i8** %4
%80 = getelementptr inbounds i8, i8* %79, i64 3
%81 = load i8, i8* %80
%82 = zext i8 %81 to i32
%83 = icmp sle i32 %82, 55
br i1 %83, label %84, label %109
84: ; preds = %78
%85 = load i8*, i8** %4
%86 = getelementptr inbounds i8, i8* %85, i64 1
%87 = load i8, i8* %86
%88 = zext i8 %87 to i32
%89 = sub nsw i32 %88, 48
%90 = shl i32 %89, 6
%91 = load i8*, i8** %4
%92 = getelementptr inbounds i8, i8* %91, i64 2
%93 = load i8, i8* %92
%94 = zext i8 %93 to i32
%95 = sub nsw i32 %94, 48
%96 = shl i32 %95, 3
%97 = add nsw i32 %90, %96
%98 = load i8*, i8** %4
%99 = getelementptr inbounds i8, i8* %98, i64 3
%100 = load i8, i8* %99
%101 = zext i8 %100 to i32
%102 = sub nsw i32 %101, 48
%103 = add nsw i32 %97, %102
%104 = trunc i32 %103 to i8
%105 = load i8*, i8** %5
%106 = getelementptr inbounds i8, i8* %105, i32 1
store i8* %106, i8** %5
store i8 %104, i8* %105
%107 = load i8*, i8** %4
%108 = getelementptr inbounds i8, i8* %107, i64 4
store i8* %108, i8** %4
br label %25
109: ; preds = %78, %72, %66, %60, %54, %48
%110 = load i8*, i8** %4
%111 = getelementptr inbounds i8, i8* %110, i64 1
%112 = load i8, i8* %111
%113 = zext i8 %112 to i32
%114 = icmp sge i32 %113, 48
br i1 %114, label %115, label %151
115: ; preds = %109
%116 = load i8*, i8** %4
%117 = getelementptr inbounds i8, i8* %116, i64 1
%118 = load i8, i8* %117
%119 = zext i8 %118 to i32
%120 = icmp sle i32 %119, 55
br i1 %120, label %121, label %151
121: ; preds = %115
%122 = load i8*, i8** %4
%123 = getelementptr inbounds i8, i8* %122, i64 2
%124 = load i8, i8* %123
%125 = zext i8 %124 to i32
%126 = icmp sge i32 %125, 48
br i1 %126, label %127, label %151
127: ; preds = %121
%128 = load i8*, i8** %4
%129 = getelementptr inbounds i8, i8* %128, i64 2
%130 = load i8, i8* %129
%131 = zext i8 %130 to i32
%132 = icmp sle i32 %131, 55
br i1 %132, label %133, label %151
133: ; preds = %127
%134 = load i8*, i8** %4
%135 = getelementptr inbounds i8, i8* %134, i64 1
%136 = load i8, i8* %135
%137 = zext i8 %136 to i32
%138 = sub nsw i32 %137, 48
%139 = shl i32 %138, 3
%140 = load i8*, i8** %4
%141 = getelementptr inbounds i8, i8* %140, i64 2
%142 = load i8, i8* %141
%143 = zext i8 %142 to i32
%144 = sub nsw i32 %143, 48
%145 = add nsw i32 %139, %144
%146 = trunc i32 %145 to i8
%147 = load i8*, i8** %5
%148 = getelementptr inbounds i8, i8* %147, i32 1
store i8* %148, i8** %5
store i8 %146, i8* %147
%149 = load i8*, i8** %4
%150 = getelementptr inbounds i8, i8* %149, i64 3
store i8* %150, i8** %4
br label %25
151: ; preds = %127, %121, %115, %109
%152 = load i8*, i8** %4
%153 = getelementptr inbounds i8, i8* %152, i64 1
%154 = load i8, i8* %153
%155 = zext i8 %154 to i32
%156 = icmp sge i32 %155, 48
br i1 %156, label %157, label %174
157: ; preds = %151
%158 = load i8*, i8** %4
%159 = getelementptr inbounds i8, i8* %158, i64 1
%160 = load i8, i8* %159
%161 = zext i8 %160 to i32
%162 = icmp sle i32 %161, 55
br i1 %162, label %163, label %174
163: ; preds = %157
%164 = load i8*, i8** %4
%165 = getelementptr inbounds i8, i8* %164, i64 1
%166 = load i8, i8* %165
%167 = zext i8 %166 to i32
%168 = sub nsw i32 %167, 48
%169 = trunc i32 %168 to i8
%170 = load i8*, i8** %5
%171 = getelementptr inbounds i8, i8* %170, i32 1
store i8* %171, i8** %5
store i8 %169, i8* %170
%172 = load i8*, i8** %4
%173 = getelementptr inbounds i8, i8* %172, i64 2
store i8* %173, i8** %4
br label %25
174: ; preds = %157, %151
%175 = load i8*, i8** %4
%176 = getelementptr inbounds i8, i8* %175, i64 1
%177 = load i8, i8* %176
%178 = zext i8 %177 to i32
%179 = icmp eq i32 %178, 120
br i1 %179, label %186, label %180
180: ; preds = %174
%181 = load i8*, i8** %4
%182 = getelementptr inbounds i8, i8* %181, i64 1
%183 = load i8, i8* %182
%184 = zext i8 %183 to i32
%185 = icmp eq i32 %184, 88
br i1 %185, label %186, label %214
186: ; preds = %180, %174
%187 = load i8*, i8** %4
%188 = getelementptr inbounds i8, i8* %187, i64 2
%189 = load i8, i8* %188
%190 = call i64 @isxdigit(i8 zeroext %189)
%191 = icmp ne i64 %190, 0
br i1 %191, label %192, label %214
192: ; preds = %186
%193 = load i8*, i8** %4
%194 = getelementptr inbounds i8, i8* %193, i64 3
%195 = load i8, i8* %194
%196 = call i64 @isxdigit(i8 zeroext %195)
%197 = icmp ne i64 %196, 0
br i1 %197, label %198, label %214
198: ; preds = %192
%199 = load i8*, i8** %4
%200 = getelementptr inbounds i8, i8* %199, i64 2
%201 = load i8, i8* %200
%202 = call i32 @fromxdigit(i8 zeroext %201)
%203 = shl i32 %202, 4
%204 = load i8*, i8** %4
%205 = getelementptr inbounds i8, i8* %204, i64 3
%206 = load i8, i8* %205
%207 = call i32 @fromxdigit(i8 zeroext %206)
%208 = add nsw i32 %203, %207
%209 = trunc i32 %208 to i8
%210 = load i8*, i8** %5
%211 = getelementptr inbounds i8, i8* %210, i32 1
store i8* %211, i8** %5
store i8 %209, i8* %210
%212 = load i8*, i8** %4
%213 = getelementptr inbounds i8, i8* %212, i64 4
store i8* %213, i8** %4
br label %25
214: ; preds = %192, %186, %180
%215 = load i8*, i8** %4
%216 = getelementptr inbounds i8, i8* %215, i64 1
%217 = load i8, i8* %216
%218 = zext i8 %217 to i32
%219 = icmp eq i32 %218, 120
br i1 %219, label %226, label %220
220: ; preds = %214
%221 = load i8*, i8** %4
%222 = getelementptr inbounds i8, i8* %221, i64 1
%223 = load i8, i8* %222
%224 = zext i8 %223 to i32
%225 = icmp eq i32 %224, 88
br i1 %225, label %226, label %242
226: ; preds = %220, %214
%227 = load i8*, i8** %4
%228 = getelementptr inbounds i8, i8* %227, i64 2
%229 = load i8, i8* %228
%230 = call i64 @isxdigit(i8 zeroext %229)
%231 = icmp ne i64 %230, 0
br i1 %231, label %232, label %242
232: ; preds = %226
%233 = load i8*, i8** %4
%234 = getelementptr inbounds i8, i8* %233, i64 2
%235 = load i8, i8* %234
%236 = call i32 @fromxdigit(i8 zeroext %235)
%237 = trunc i32 %236 to i8
%238 = load i8*, i8** %5
%239 = getelementptr inbounds i8, i8* %238, i32 1
store i8* %239, i8** %5
store i8 %237, i8* %238
%240 = load i8*, i8** %4
%241 = getelementptr inbounds i8, i8* %240, i64 3
store i8* %241, i8** %4
br label %25
242: ; preds = %226, %220
%243 = load i8*, i8** %4
%244 = getelementptr inbounds i8, i8* %243, i64 1
%245 = load i8, i8* %244
%246 = zext i8 %245 to i32
switch i32 %246, label %274 [
i32 92, label %247
i32 34, label %247
i32 39, label %247
i32 97, label %253
i32 98, label %256
i32 116, label %259
i32 110, label %262
i32 118, label %265
i32 102, label %268
i32 114, label %271
]
247: ; preds = %242, %242, %242
%248 = load i8*, i8** %4
%249 = getelementptr inbounds i8, i8* %248, i64 1
%250 = load i8, i8* %249
%251 = load i8*, i8** %5
%252 = getelementptr inbounds i8, i8* %251, i32 1
store i8* %252, i8** %5
store i8 %250, i8* %251
br label %280
253: ; preds = %242
%254 = load i8*, i8** %5
%255 = getelementptr inbounds i8, i8* %254, i32 1
store i8* %255, i8** %5
store i8 7, i8* %254
br label %280
256: ; preds = %242
%257 = load i8*, i8** %5
%258 = getelementptr inbounds i8, i8* %257, i32 1
store i8* %258, i8** %5
store i8 8, i8* %257
br label %280
259: ; preds = %242
%260 = load i8*, i8** %5
%261 = getelementptr inbounds i8, i8* %260, i32 1
store i8* %261, i8** %5
store i8 9, i8* %260
br label %280
262: ; preds = %242
%263 = load i8*, i8** %5
%264 = getelementptr inbounds i8, i8* %263, i32 1
store i8* %264, i8** %5
store i8 10, i8* %263
br label %280
265: ; preds = %242
%266 = load i8*, i8** %5
%267 = getelementptr inbounds i8, i8* %266, i32 1
store i8* %267, i8** %5
store i8 11, i8* %266
br label %280
268: ; preds = %242
%269 = load i8*, i8** %5
%270 = getelementptr inbounds i8, i8* %269, i32 1
store i8* %270, i8** %5
store i8 12, i8* %269
br label %280
271: ; preds = %242
%272 = load i8*, i8** %5
%273 = getelementptr inbounds i8, i8* %272, i32 1
store i8* %273, i8** %5
store i8 13, i8* %272
br label %280
274: ; preds = %242
%275 = load i8*, i8** %4
%276 = getelementptr inbounds i8, i8* %275, i64 1
%277 = load i8, i8* %276
%278 = load i8*, i8** %5
%279 = getelementptr inbounds i8, i8* %278, i32 1
store i8* %279, i8** %5
store i8 %277, i8* %278
br label %280
280: ; preds = %274, %271, %268, %265, %262, %259, %256, %253, %247
%281 = load i8*, i8** %4
%282 = getelementptr inbounds i8, i8* %281, i64 2
store i8* %282, i8** %4
br label %25
283: ; preds = %35
%284 = load i8*, i8** %4
%285 = load i8, i8* %284
%286 = zext i8 %285 to i32
%287 = icmp ne i32 %286, 34
br i1 %287, label %288, label %289
288: ; preds = %283
store i32 -1, i32* %3
br label %304
289: ; preds = %283
%290 = load i8*, i8** %4
%291 = getelementptr inbounds i8, i8* %290, i32 1
store i8* %291, i8** %4
%292 = load i8*, i8** %4
%293 = load i8, i8* %292
%294 = icmp ne i8 %293, 0
br i1 %294, label %295, label %296
295: ; preds = %289
store i32 -1, i32* %3
br label %304
296: ; preds = %289
%297 = load i8*, i8** %5
store i8 0, i8* %297
%298 = load i8*, i8** %5
%299 = load i8*, i8** %6
%300 = ptrtoint i8* %298 to i64
%301 = ptrtoint i8* %299 to i64
%302 = sub i64 %300, %301
%303 = trunc i64 %302 to i32
store i32 %303, i32* %3
br label %304
304: ; preds = %296, %295, %288, %21
%305 = load i32, i32* %3
ret i32 %305
}

LLVM IR (-O2):
define i32 @parse_c_string(i8* nocapture %0, i8* %1) {
br label %3
3: ; preds = %3, %2
%4 = phi i8* [ %0, %2 ], [ %8, %3 ]
%5 = load i8, i8* %4
%6 = tail call i64 @isspace(i8 zeroext %5)
%7 = icmp eq i64 %6, 0
%8 = getelementptr inbounds i8, i8* %4, i64 1
br i1 %7, label %9, label %3
9: ; preds = %3
%10 = load i8, i8* %4
%11 = icmp eq i8 %10, 34
br i1 %11, label %12, label %113
12: ; preds = %9, %18
%13 = phi i8* [ %19, %18 ], [ %8, %9 ]
%14 = phi i8* [ %20, %18 ], [ %1, %9 ]
%15 = load i8, i8* %13
switch i8 %15, label %16 [
i8 92, label %21
i8 34, label %104
i8 0, label %113
]
16: ; preds = %12
%17 = getelementptr inbounds i8, i8* %13, i64 1
store i8 %15, i8* %14
br label %18
18: ; preds = %16, %36, %51, %56, %69, %85, %101
%19 = phi i8* [ %17, %16 ], [ %42, %36 ], [ %55, %51 ], [ %47, %56 ], [ %77, %69 ], [ %89, %85 ], [ %103, %101 ]
%20 = getelementptr inbounds i8, i8* %14, i64 1
br label %12
21: ; preds = %12
%22 = getelementptr inbounds i8, i8* %13, i64 1
%23 = load i8, i8* %22
%24 = and i8 %23, -4
%25 = icmp eq i8 %24, 48
br i1 %25, label %26, label %43
26: ; preds = %21
%27 = getelementptr inbounds i8, i8* %13, i64 2
%28 = load i8, i8* %27
%29 = and i8 %28, -8
%30 = icmp eq i8 %29, 48
br i1 %30, label %31, label %43
31: ; preds = %26
%32 = getelementptr inbounds i8, i8* %13, i64 3
%33 = load i8, i8* %32
%34 = and i8 %33, -8
%35 = icmp eq i8 %34, 48
br i1 %35, label %36, label %43
36: ; preds = %31
%37 = shl i8 %23, 6
%38 = shl i8 %28, 3
%39 = add i8 %37, 80
%40 = add i8 %39, %38
%41 = add i8 %40, %33
store i8 %41, i8* %14
%42 = getelementptr inbounds i8, i8* %13, i64 4
br label %18
43: ; preds = %31, %26, %21
%44 = and i8 %23, -8
%45 = icmp eq i8 %44, 48
br i1 %45, label %46, label %58
46: ; preds = %43
%47 = getelementptr inbounds i8, i8* %13, i64 2
%48 = load i8, i8* %47
%49 = and i8 %48, -8
%50 = icmp eq i8 %49, 48
br i1 %50, label %51, label %56
51: ; preds = %46
%52 = shl i8 %23, 3
%53 = add nsw i8 %52, 80
%54 = add nsw i8 %53, %48
store i8 %54, i8* %14
%55 = getelementptr inbounds i8, i8* %13, i64 3
br label %18
56: ; preds = %46
%57 = add nsw i8 %23, -48
store i8 %57, i8* %14
br label %18
58: ; preds = %43
switch i8 %23, label %78 [
i8 120, label %59
i8 88, label %59
]
59: ; preds = %58, %58
%60 = getelementptr inbounds i8, i8* %13, i64 2
%61 = load i8, i8* %60
%62 = tail call i64 @isxdigit(i8 zeroext %61)
%63 = icmp eq i64 %62, 0
br i1 %63, label %78, label %64
64: ; preds = %59
%65 = getelementptr inbounds i8, i8* %13, i64 3
%66 = load i8, i8* %65
%67 = tail call i64 @isxdigit(i8 zeroext %66)
%68 = icmp eq i64 %67, 0
br i1 %68, label %78, label %69
69: ; preds = %64
%70 = load i8, i8* %60
%71 = tail call i32 @fromxdigit(i8 zeroext %70)
%72 = shl i32 %71, 4
%73 = load i8, i8* %65
%74 = tail call i32 @fromxdigit(i8 zeroext %73)
%75 = add nsw i32 %74, %72
%76 = trunc i32 %75 to i8
store i8 %76, i8* %14
%77 = getelementptr inbounds i8, i8* %13, i64 4
br label %18
78: ; preds = %58, %64, %59
%79 = load i8, i8* %22
switch i8 %79, label %92 [
i8 120, label %80
i8 88, label %80
]
80: ; preds = %78, %78
%81 = getelementptr inbounds i8, i8* %13, i64 2
%82 = load i8, i8* %81
%83 = tail call i64 @isxdigit(i8 zeroext %82)
%84 = icmp eq i64 %83, 0
br i1 %84, label %90, label %85
85: ; preds = %80
%86 = load i8, i8* %81
%87 = tail call i32 @fromxdigit(i8 zeroext %86)
%88 = trunc i32 %87 to i8
store i8 %88, i8* %14
%89 = getelementptr inbounds i8, i8* %13, i64 3
br label %18
90: ; preds = %80
%91 = load i8, i8* %22
br label %92
92: ; preds = %90, %78
%93 = phi i8 [ %91, %90 ], [ %79, %78 ]
switch i8 %93, label %101 [
i8 114, label %100
i8 102, label %99
i8 118, label %98
i8 97, label %94
i8 98, label %95
i8 116, label %96
i8 110, label %97
]
94: ; preds = %92
br label %101
95: ; preds = %92
br label %101
96: ; preds = %92
br label %101
97: ; preds = %92
br label %101
98: ; preds = %92
br label %101
99: ; preds = %92
br label %101
100: ; preds = %92
br label %101
101: ; preds = %92, %100, %99, %98, %97, %96, %95, %94
%102 = phi i8 [ 13, %100 ], [ 12, %99 ], [ 11, %98 ], [ 10, %97 ], [ 9, %96 ], [ 8, %95 ], [ 7, %94 ], [ %93, %92 ]
store i8 %102, i8* %14
%103 = getelementptr inbounds i8, i8* %13, i64 2
br label %18
104: ; preds = %12
%105 = getelementptr inbounds i8, i8* %13, i64 1
%106 = load i8, i8* %105
%107 = icmp eq i8 %106, 0
br i1 %107, label %108, label %113
108: ; preds = %104
store i8 0, i8* %14
%109 = ptrtoint i8* %14 to i64
%110 = ptrtoint i8* %1 to i64
%111 = sub i64 %109, %110
%112 = trunc i64 %111 to i32
br label %113
113: ; preds = %12, %104, %9, %108
%114 = phi i32 [ %112, %108 ], [ -1, %9 ], [ -1, %104 ], [ -1, %12 ]
ret i32 %114
}