void extract(char *instring, int inlength, int fieldno, int valueno,
             int subvalueno, int *outstart, int *outlength) {
  int start_pos;
  int fieldn2;
  int field_end_pos;
  int valuen2;
  int value_end_pos;
  int subvaluen2;
  int subvalue_end_pos;
  *outstart = 0;
  *outlength = 0;
  if (fieldno <= 0) {
    if (fieldno < 0)
      return;
    if (valueno || subvalueno)
      fieldno = 1;
    else {
      *outlength = inlength;
      return;
    }
  }
  start_pos = 0;
  fieldn2 = 1;
  while (fieldn2 < fieldno) {
    for (; start_pos < inlength && instring[start_pos] != '\x1E'; start_pos++) {
    };
    if (start_pos >= inlength)
      return;
    start_pos++;
    fieldn2++;
  }
  for (field_end_pos = start_pos;
       field_end_pos < inlength && instring[field_end_pos] != '\x1E';
       field_end_pos++) {
  };
  if (valueno <= 0) {
    if (valueno < 0)
      return;
    if (subvalueno)
      valueno = 1;
    else {
      *outstart = start_pos;
      *outlength = field_end_pos - start_pos;
      return;
    }
  }
  valuen2 = 1;
  while (valuen2 < valueno) {
    for (; start_pos < inlength && instring[start_pos] != '\x1D'; start_pos++) {
    };
    if (start_pos >= inlength)
      return;
    start_pos++;
    if (start_pos > field_end_pos)
      return;
    valuen2++;
  }
  for (value_end_pos = start_pos;
       value_end_pos < field_end_pos && instring[value_end_pos] != '\x1D';
       value_end_pos++) {
  }
  if (subvalueno <= 0) {
    if (subvalueno < 0)
      return;
    *outstart = start_pos;
    *outlength = value_end_pos - start_pos;
  }
  subvaluen2 = 1;
  while (subvaluen2 < subvalueno) {
    for (; start_pos < field_end_pos && instring[start_pos] != '\x1C';
         start_pos++) {
    };
    if (start_pos >= inlength)
      return;
    start_pos++;
    if (start_pos > value_end_pos)
      return;
    subvaluen2++;
  }
  for (subvalue_end_pos = start_pos;
       subvalue_end_pos < value_end_pos && instring[subvalue_end_pos] != '\x1C';
       subvalue_end_pos++) {
  };
  if (subvalue_end_pos >= value_end_pos) {
    *outstart = start_pos;
    *outlength = value_end_pos - start_pos;
    return;
  }
  *outstart = start_pos;
  *outlength = subvalue_end_pos - start_pos;
  return;
}


x86 assembly (clang, -O0):
<extract>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    0x10(%rbp),%rax
movl   $0x0,(%rax)
cmpl   $0x0,-0x10(%rbp)
jg     117d <extract+0x7d>
cmpl   $0x0,-0x10(%rbp)
jge    114a <extract+0x4a>
jmp    14e5 <extract+0x3e5>
cmpl   $0x0,-0x14(%rbp)
jne    115e <extract+0x5e>
cmpl   $0x0,-0x18(%rbp)
je     116a <extract+0x6a>
movl   $0x1,-0x10(%rbp)
jmp    1178 <extract+0x78>
mov    -0xc(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    14e5 <extract+0x3e5>
jmp    117d <extract+0x7d>
movl   $0x0,-0x24(%rbp)
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    120d <extract+0x10d>
jmp    119c <extract+0x9c>
mov    -0x24(%rbp),%ecx
xor    %eax,%eax
cmp    -0xc(%rbp),%ecx
mov    %al,-0x3d(%rbp)
jge    11c2 <extract+0xc2>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1e,%eax
setne  %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    11d2 <extract+0xd2>
jmp    11e5 <extract+0xe5>
jmp    11d7 <extract+0xd7>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    119c <extract+0x9c>
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     11f6 <extract+0xf6>
jmp    14e5 <extract+0x3e5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    118b <extract+0x8b>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
xor    %eax,%eax
cmp    -0xc(%rbp),%ecx
mov    %al,-0x3e(%rbp)
jge    1239 <extract+0x139>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1e,%eax
setne  %al
mov    %al,-0x3e(%rbp)
mov    -0x3e(%rbp),%al
test   $0x1,%al
jne    1249 <extract+0x149>
jmp    125c <extract+0x15c>
jmp    124e <extract+0x14e>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1213 <extract+0x113>
cmpl   $0x0,-0x14(%rbp)
jg     12aa <extract+0x1aa>
cmpl   $0x0,-0x14(%rbp)
jge    1275 <extract+0x175>
jmp    14e5 <extract+0x3e5>
cmpl   $0x0,-0x18(%rbp)
je     128b <extract+0x18b>
movl   $0x1,-0x14(%rbp)
jmp    12a5 <extract+0x1a5>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x2c(%rbp),%ecx
sub    -0x24(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    14e5 <extract+0x3e5>
jmp    12aa <extract+0x1aa>
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1344 <extract+0x244>
jmp    12c2 <extract+0x1c2>
mov    -0x24(%rbp),%ecx
xor    %eax,%eax
cmp    -0xc(%rbp),%ecx
mov    %al,-0x3f(%rbp)
jge    12e8 <extract+0x1e8>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1d,%eax
setne  %al
mov    %al,-0x3f(%rbp)
mov    -0x3f(%rbp),%al
test   $0x1,%al
jne    12f8 <extract+0x1f8>
jmp    130b <extract+0x20b>
jmp    12fd <extract+0x1fd>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12c2 <extract+0x1c2>
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     131c <extract+0x21c>
jmp    14e5 <extract+0x3e5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    1336 <extract+0x236>
jmp    14e5 <extract+0x3e5>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    12b1 <extract+0x1b1>
mov    -0x24(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%ecx
xor    %eax,%eax
cmp    -0x2c(%rbp),%ecx
mov    %al,-0x40(%rbp)
jge    1370 <extract+0x270>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1d,%eax
setne  %al
mov    %al,-0x40(%rbp)
mov    -0x40(%rbp),%al
test   $0x1,%al
jne    1380 <extract+0x280>
jmp    1393 <extract+0x293>
jmp    1385 <extract+0x285>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    134a <extract+0x24a>
cmpl   $0x0,-0x18(%rbp)
jg     13c1 <extract+0x2c1>
cmpl   $0x0,-0x18(%rbp)
jge    13ac <extract+0x2ac>
jmp    14e5 <extract+0x3e5>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x34(%rbp),%ecx
sub    -0x24(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    145b <extract+0x35b>
jmp    13d9 <extract+0x2d9>
mov    -0x24(%rbp),%ecx
xor    %eax,%eax
cmp    -0x2c(%rbp),%ecx
mov    %al,-0x41(%rbp)
jge    13ff <extract+0x2ff>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1c,%eax
setne  %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    140f <extract+0x30f>
jmp    1422 <extract+0x322>
jmp    1414 <extract+0x314>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13d9 <extract+0x2d9>
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     1433 <extract+0x333>
jmp    14e5 <extract+0x3e5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x34(%rbp),%eax
jle    144d <extract+0x34d>
jmp    14e5 <extract+0x3e5>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    13c8 <extract+0x2c8>
mov    -0x24(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x34(%rbp),%ecx
mov    %al,-0x42(%rbp)
jge    1487 <extract+0x387>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x1c,%eax
setne  %al
mov    %al,-0x42(%rbp)
mov    -0x42(%rbp),%al
test   $0x1,%al
jne    1497 <extract+0x397>
jmp    14aa <extract+0x3aa>
jmp    149c <extract+0x39c>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1461 <extract+0x361>
mov    -0x3c(%rbp),%eax
cmp    -0x34(%rbp),%eax
jl     14d0 <extract+0x3d0>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x34(%rbp),%ecx
sub    -0x24(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    14e5 <extract+0x3e5>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x3c(%rbp),%ecx
sub    -0x24(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<extract>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    0x28(%rsp),%r10
movl   $0x0,(%r9)
movl   $0x0,(%r10)
test   %edx,%edx
jle    117b <extract+0x7b>
xor    %ebx,%ebx
cmp    $0x1,%edx
je     118e <extract+0x8e>
mov    %esi,%r14d
neg    %r14d
xor    %ebx,%ebx
mov    $0x1,%r11d
cmp    %esi,%ebx
jge    1305 <extract+0x205>
movslq %ebx,%rax
add    $0x1,%ebx
add    %rdi,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmpb   $0x1e,(%rax)
je     1170 <extract+0x70>
add    $0x1,%rax
lea    (%r14,%rbx,1),%ebp
add    $0x1,%ebp
add    $0x1,%ebx
cmp    $0x1,%ebp
jne    1150 <extract+0x50>
jmp    1305 <extract+0x205>
nopl   (%rax)
add    $0x1,%r11d
cmp    %edx,%r11d
jne    1132 <extract+0x32>
jmp    118e <extract+0x8e>
js     1305 <extract+0x205>
xor    %ebx,%ebx
mov    %r8d,%eax
or     %ecx,%eax
je     1302 <extract+0x202>
mov    %ebx,%ebp
cmp    %esi,%ebx
jge    11b2 <extract+0xb2>
movslq %ebx,%rax
add    %rdi,%rax
mov    %ebx,%ebp
nopl   0x0(%rax)
cmpb   $0x1e,(%rax)
je     11b2 <extract+0xb2>
add    $0x1,%ebp
add    $0x1,%rax
cmp    %ebp,%esi
jne    11a0 <extract+0xa0>
mov    %esi,%ebp
test   %ecx,%ecx
jle    1210 <extract+0x110>
cmp    $0x1,%ecx
je     121f <extract+0x11f>
mov    $0x1,%r11d
cmp    %esi,%ebx
jge    1305 <extract+0x205>
movslq %ebx,%rdx
add    %rdi,%rdx
mov    %ebx,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmpb   $0x1d,(%rdx)
je     11f5 <extract+0xf5>
add    $0x1,%eax
add    $0x1,%rdx
cmp    %eax,%esi
jne    11e0 <extract+0xe0>
jmp    1305 <extract+0x205>
cmp    %eax,%ebp
jle    1305 <extract+0x205>
lea    0x1(%rax),%ebx
add    $0x1,%r11d
cmp    %ecx,%r11d
jne    11c1 <extract+0xc1>
add    $0x1,%eax
mov    %eax,%ebx
jmp    121f <extract+0x11f>
js     1305 <extract+0x205>
test   %r8d,%r8d
je     12f4 <extract+0x1f4>
mov    %ebx,%r15d
cmp    %ebp,%ebx
jge    1245 <extract+0x145>
movslq %ebx,%rax
add    %rdi,%rax
mov    %ebx,%r15d
nop
cmpb   $0x1d,(%rax)
je     1245 <extract+0x145>
add    $0x1,%r15d
add    $0x1,%rax
cmp    %r15d,%ebp
jne    1230 <extract+0x130>
mov    %ebp,%r15d
test   %r8d,%r8d
jle    12b9 <extract+0x1b9>
cmp    $0x1,%r8d
je     12c6 <extract+0x1c6>
movslq %ebp,%r11
mov    $0x1,%r14d
nopl   0x0(%rax)
cmp    %ebp,%ebx
jge    12a2 <extract+0x1a2>
movslq %ebx,%rax
lea    (%rdi,%rax,1),%rdx
mov    %r11,%rcx
sub    %rax,%rcx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmpb   $0x1c,(%rdx,%rax,1)
je     12a0 <extract+0x1a0>
add    $0x1,%rax
cmp    %rax,%rcx
jne    1280 <extract+0x180>
mov    %ebp,%ebx
jmp    12a2 <extract+0x1a2>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    %eax,%ebx
cmp    %esi,%ebx
jge    1305 <extract+0x205>
cmp    %r15d,%ebx
jge    1305 <extract+0x205>
add    $0x1,%ebx
add    $0x1,%r14d
cmp    %r8d,%r14d
jne    1260 <extract+0x160>
jmp    12c6 <extract+0x1c6>
js     1305 <extract+0x205>
mov    %ebx,(%r9)
mov    %r15d,%eax
sub    %ebx,%eax
mov    %eax,(%r10)
mov    %r15d,%esi
sub    %ebx,%esi
jle    12ef <extract+0x1ef>
movslq %ebx,%rax
add    %rax,%rdi
sub    %ebx,%r15d
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
cmpb   $0x1c,(%rdi,%rax,1)
je     12fd <extract+0x1fd>
add    $0x1,%rax
cmp    %eax,%r15d
jne    12e0 <extract+0x1e0>
mov    %ebx,(%r9)
jmp    1302 <extract+0x202>
mov    %ebx,(%r9)
sub    %ebx,%ebp
mov    %ebp,%esi
jmp    1302 <extract+0x202>
mov    %ebx,(%r9)
mov    %eax,%esi
mov    %esi,(%r10)
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

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