#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
char fgetc(int /*<<< orphan*/ *);
int /*<<< orphan*/ free(char *);
scalar_t__ malloc(int);
short readline(FILE *f, long comment_char, long sep_char, long **string,
               long *string_length, long *components, long maxcomponents,
               long maxstringlength, short *endoffile) {
  long i, j;
  char *c;
  *endoffile = 0;
  for (i = 0; i < maxcomponents; i++) {
    string_length[i] = 0;
    for (j = 0; j < maxstringlength; j++) {
      string[i][j] = 0;
    }
  }
  c = (char *)malloc(sizeof(char));
  do {
    c[0] = fgetc(f);
    if (c[0] == -1)
      *endoffile = 1;
  } while (
      *endoffile == 0 &&
      (c[0] <= 42 || (c[0] >= 58 && c[0] <= 64) || c[0] == 96 || c[0] >= 123) &&
      c[0] != comment_char);
  if (*endoffile == 1) {
    free(c);
    return -1;
  } else if (c[0] == comment_char) {
    do {
      c[0] = fgetc(f);
    } while (c[0] != 10 && c[0] != -1);
    if (c[0] == -1)
      *endoffile = 1;
    free(c);
    return -1;
  } else {
    j = 0;
    do {
      i = 0;
      if (j == 0) {
        string[j][i] = c[0];
        i++;
      }
      do {
        do {
          c[0] = fgetc(f);
          if (c[0] == -1)
            *endoffile = 1;
        } while (*endoffile == 0 &&
                 (c[0] <= 42 || (c[0] >= 58 && c[0] <= 64) || c[0] == 96 ||
                  c[0] >= 123) &&
                 c[0] != 10 && c[0] != sep_char);
        if (*endoffile == 0 && c[0] != 10 && c[0] != sep_char) {
          if (i < maxstringlength) {
            string[j][i] = c[0];
            i++;
          }
        }
      } while (*endoffile == 0 && c[0] != 10 && c[0] != sep_char);
      string_length[j] = i;
      j++;
    } while (*endoffile == 0 && c[0] != 10 && j < maxcomponents);
    *components = j;
    free(c);
    return 1;
  }
}


x86 assembly (clang, -O0):
<readline>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    0x20(%rbp),%rax
movw   $0x0,(%rax)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    0x10(%rbp),%rax
jge    11e0 <readline+0xb0>
mov    -0x30(%rbp),%rax
mov    -0x40(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    0x18(%rbp),%rax
jge    11ca <readline+0x9a>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1193 <readline+0x63>
jmp    11cf <readline+0x9f>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    116d <readline+0x3d>
mov    $0x1,%edi
call   1050 <malloc@plt>
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <fgetc@plt>
mov    %al,%cl
mov    -0x50(%rbp),%rax
mov    %cl,(%rax)
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffff,%eax
jne    1218 <readline+0xe8>
mov    0x20(%rbp),%rax
movw   $0x1,(%rax)
jmp    121d <readline+0xed>
mov    0x20(%rbp),%rax
movswl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x51(%rbp)
jne    1299 <readline+0x169>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jle    1287 <readline+0x157>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
jl     1262 <readline+0x132>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x40,%eax
jle    1287 <readline+0x157>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x60,%eax
je     1287 <readline+0x157>
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x7b,%ecx
mov    %al,-0x51(%rbp)
jl     1299 <readline+0x169>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rax
cmp    -0x18(%rbp),%rax
setne  %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    11ee <readline+0xbe>
mov    0x20(%rbp),%rax
movswl (%rax),%eax
cmp    $0x1,%eax
jne    12c8 <readline+0x198>
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
movw   $0xffff,-0x2(%rbp)
jmp    1597 <readline+0x467>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rax
cmp    -0x18(%rbp),%rax
jne    134d <readline+0x21d>
jmp    12df <readline+0x1af>
mov    -0x10(%rbp),%rdi
call   1040 <fgetc@plt>
mov    %al,%cl
mov    -0x50(%rbp),%rax
mov    %cl,(%rax)
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x52(%rbp)
je     1315 <readline+0x1e5>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffff,%eax
setne  %al
mov    %al,-0x52(%rbp)
mov    -0x52(%rbp),%al
test   $0x1,%al
jne    12df <readline+0x1af>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffff,%eax
jne    1339 <readline+0x209>
mov    0x20(%rbp),%rax
movw   $0x1,(%rax)
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
movw   $0xffff,-0x2(%rbp)
jmp    1597 <readline+0x467>
movq   $0x0,-0x48(%rbp)
movq   $0x0,-0x40(%rbp)
cmpq   $0x0,-0x48(%rbp)
jne    1390 <readline+0x260>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rdx
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x40(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1395 <readline+0x265>
jmp    139a <readline+0x26a>
mov    -0x10(%rbp),%rdi
call   1040 <fgetc@plt>
mov    %al,%cl
mov    -0x50(%rbp),%rax
mov    %cl,(%rax)
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xffffffff,%eax
jne    13c4 <readline+0x294>
mov    0x20(%rbp),%rax
movw   $0x1,(%rax)
jmp    13c9 <readline+0x299>
mov    0x20(%rbp),%rax
movswl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x53(%rbp)
jne    145a <readline+0x32a>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jle    1433 <readline+0x303>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
jl     140e <readline+0x2de>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x40,%eax
jle    1433 <readline+0x303>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x60,%eax
je     1433 <readline+0x303>
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x7b,%ecx
mov    %al,-0x53(%rbp)
jl     145a <readline+0x32a>
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x53(%rbp)
je     145a <readline+0x32a>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rax
cmp    -0x20(%rbp),%rax
setne  %al
mov    %al,-0x53(%rbp)
mov    -0x53(%rbp),%al
test   $0x1,%al
jne    139a <readline+0x26a>
mov    0x20(%rbp),%rax
movswl (%rax),%eax
cmp    $0x0,%eax
jne    14d2 <readline+0x3a2>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
je     14d2 <readline+0x3a2>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rax
cmp    -0x20(%rbp),%rax
je     14d2 <readline+0x3a2>
mov    -0x40(%rbp),%rax
cmp    0x18(%rbp),%rax
jge    14cd <readline+0x39d>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rdx
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x40(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    14d2 <readline+0x3a2>
jmp    14d7 <readline+0x3a7>
mov    0x20(%rbp),%rax
movswl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x54(%rbp)
jne    1513 <readline+0x3e3>
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x54(%rbp)
je     1513 <readline+0x3e3>
mov    -0x50(%rbp),%rax
movsbq (%rax),%rax
cmp    -0x20(%rbp),%rax
setne  %al
mov    %al,-0x54(%rbp)
mov    -0x54(%rbp),%al
test   $0x1,%al
jne    1395 <readline+0x265>
mov    -0x40(%rbp),%rdx
mov    -0x30(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    0x20(%rbp),%rax
movswl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x55(%rbp)
jne    1572 <readline+0x442>
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x55(%rbp)
je     1572 <readline+0x442>
mov    -0x48(%rbp),%rax
cmp    0x10(%rbp),%rax
setl   %al
mov    %al,-0x55(%rbp)
mov    -0x55(%rbp),%al
test   $0x1,%al
jne    1355 <readline+0x225>
mov    -0x48(%rbp),%rcx
mov    -0x38(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
movw   $0x1,-0x2(%rbp)
movswl -0x2(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<readline>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %r9,0x20(%rsp)
mov    %r8,%rbx
mov    %rcx,0x8(%rsp)
mov    %rdx,0x18(%rsp)
mov    %rsi,%r14
mov    %rdi,%r15
mov    0x70(%rsp),%r12
movw   $0x0,(%r12)
cmpq   $0x0,0x60(%rsp)
jle    11ca <readline+0x8a>
mov    0x68(%rsp),%rax
lea    0x0(,%rax,8),%rbp
mov    0x60(%rsp),%r12
cmp    $0x1,%r12
jne    1263 <readline+0x123>
xor    %r13d,%r13d
mov    0x60(%rsp),%rax
test   $0x1,%al
mov    0x70(%rsp),%r12
je     11ca <readline+0x8a>
movq   $0x0,(%rbx,%r13,8)
cmpq   $0x0,0x68(%rsp)
jle    11ca <readline+0x8a>
mov    0x8(%rsp),%rax
mov    (%rax,%r13,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
mov    $0x1,%edi
call   1060 <malloc@plt>
mov    %rax,%rbp
jmp    11e9 <readline+0xa9>
nopl   0x0(%rax)
movsbq %al,%rcx
cmp    %r14,%rcx
je     122b <readline+0xeb>
mov    %r15,%rdi
call   1050 <fgetc@plt>
mov    %al,0x0(%rbp)
cmp    $0xff,%al
je     1253 <readline+0x113>
movzwl (%r12),%ecx
test   %cx,%cx
jne    121c <readline+0xdc>
cmp    $0x2b,%al
jl     11e0 <readline+0xa0>
lea    -0x3a(%rax),%ecx
cmp    $0x7,%cl
jb     11e0 <readline+0xa0>
lea    -0x7b(%rax),%ecx
cmp    $0x5,%cl
jb     11e0 <readline+0xa0>
cmp    $0x60,%al
je     11e0 <readline+0xa0>
jmp    122b <readline+0xeb>
cmp    $0x1,%cx
jne    122b <readline+0xeb>
mov    $0xffff,%bx
jmp    13d2 <readline+0x292>
movsbq %al,%rcx
cmp    %r14,%rcx
jne    12c7 <readline+0x187>
nopl   0x0(%rax,%rax,1)
mov    %r15,%rdi
call   1050 <fgetc@plt>
mov    %al,0x0(%rbp)
cmp    $0xa,%al
je     1222 <readline+0xe2>
cmp    $0xff,%al
jne    1240 <readline+0x100>
movw   $0x1,(%r12)
mov    $0xffff,%bx
jmp    13d2 <readline+0x292>
and    $0xfffffffffffffffe,%r12
xor    %r13d,%r13d
jmp    127d <readline+0x13d>
nopl   0x0(%rax)
add    $0x2,%r13
cmp    %r13,%r12
je     1199 <readline+0x59>
movq   $0x0,(%rbx,%r13,8)
cmpq   $0x0,0x68(%rsp)
jle    12a0 <readline+0x160>
mov    0x8(%rsp),%rax
mov    (%rax,%r13,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
movq   $0x0,0x8(%rbx,%r13,8)
cmpq   $0x0,0x68(%rsp)
jle    1270 <readline+0x130>
mov    0x8(%rsp),%rax
mov    0x8(%rax,%r13,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
jmp    1270 <readline+0x130>
xor    %r14d,%r14d
mov    0x18(%rsp),%r13
test   %r14,%r14
je     12d8 <readline+0x198>
xor    %edx,%edx
jmp    12ec <readline+0x1ac>
movsbq %al,%rax
mov    0x8(%rsp),%rcx
mov    (%rcx),%rcx
mov    %rax,(%rcx)
mov    $0x1,%edx
mov    %rdx,0x10(%rsp)
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r15,%rdi
call   1050 <fgetc@plt>
mov    %al,0x0(%rbp)
cmp    $0xff,%al
je     13b2 <readline+0x272>
cmpw   $0x0,(%r12)
jne    13b9 <readline+0x279>
movsbq %al,%rcx
cmp    $0x2b,%al
jl     1337 <readline+0x1f7>
lea    -0x3a(%rax),%edx
cmp    $0x7,%dl
jb     1337 <readline+0x1f7>
lea    -0x7b(%rax),%edx
cmp    $0x5,%dl
jae    1342 <readline+0x202>
cmp    $0xa,%al
je     1348 <readline+0x208>
cmp    %r13,%rcx
jne    1300 <readline+0x1c0>
jmp    1348 <readline+0x208>
cmp    $0x60,%al
je     1337 <readline+0x1f7>
jmp    134c <readline+0x20c>
cmp    $0xa,%al
je     1391 <readline+0x251>
cmp    %r13,%rcx
je     1385 <readline+0x245>
mov    0x10(%rsp),%rdx
cmp    0x68(%rsp),%rdx
jge    1371 <readline+0x231>
mov    0x8(%rsp),%rax
mov    (%rax,%r14,8),%rax
mov    %rcx,(%rax,%rdx,8)
add    $0x1,%rdx
mov    0x0(%rbp),%cl
cmp    $0xa,%cl
je     1396 <readline+0x256>
movsbq %cl,%rax
cmp    %r13,%rax
jne    12ec <readline+0x1ac>
jmp    1396 <readline+0x256>
mov    0x10(%rsp),%rdx
cmp    $0xa,%cl
jne    1376 <readline+0x236>
jmp    1396 <readline+0x256>
mov    0x10(%rsp),%rdx
mov    %rdx,(%rbx,%r14,8)
add    $0x1,%r14
mov    0x0(%rbp),%al
cmp    $0xa,%al
je     13c6 <readline+0x286>
cmp    0x60(%rsp),%r14
jl     12cf <readline+0x18f>
jmp    13c6 <readline+0x286>
movw   $0x1,(%r12)
mov    0x10(%rsp),%rax
mov    %rax,(%rbx,%r14,8)
add    $0x1,%r14
mov    0x20(%rsp),%rax
mov    %r14,(%rax)
mov    $0x1,%bx
mov    %rbp,%rdi
call   1030 <free@plt>
mov    %ebx,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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