#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 /*<<< orphan*/ printf(char *, ...);
int /*<<< orphan*/ sscanf(char *, char *, double *);
int filereadd(int n, double *x, char *datastr, int *current, int end) {
  int i, a, b;
  double y;
  a = *current;
  for (i = 0; i < n; i++) {
    if (datastr[a] > 57 || datastr[a] < 45 || datastr[a] == 47) {
      printf("input is not a number\n");
      return -1;
    }
    b = a;
    while ((datastr[b] >= 48 && datastr[b] <= 57) || datastr[b] == 46 ||
           datastr[b] == 45) {
      b++;
      if (b >= end) {
        printf("not enough numbers in file\n");
        return -1;
      }
    }
    if (b == end - 1)
      if (i == n - 1) {
        sscanf(datastr + a, "%lf", &y);
        x[i] = y;
        printf("(%lf)\n", x[i]);
        return 0;
      } else
        return -1;
    if (datastr[b] != 0) {
      datastr[b] = 0;
      sscanf(datastr + a, "%lf", &y);
      x[i] = y;
      b++;
      while (datastr[b] == 32 && b < end)
        b++;
      printf("(%lf) \"%s\"\n", x[i], datastr + b);
    } else {
      sscanf(datastr + a, "%lf", &y);
      x[i] = y;
      printf("(%lf)\n", x[i]);
    }
    while (datastr[b] != 0) {
      b++;
      if (b >= end)
        return -1;
    }
    while (datastr[b] == 0) {
      b++;
      if (b >= end)
        if (i < n - 1)
          return -1;
        else {
          *current = b;
          return 0;
        }
    }
    a = b;
    if (i == n - 1) {
      *current = a;
      return 0;
    }
  }
  return -1;
}


x86 assembly (clang, -O0):
<filereadd>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    14cd <filereadd+0x3ad>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     1196 <filereadd+0x76>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jl     1196 <filereadd+0x76>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    11b0 <filereadd+0x90>
lea    0xe63(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11e5 <filereadd+0xc5>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x39,%ecx
mov    %al,-0x39(%rbp)
jle    1214 <filereadd+0xf4>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x2e,%ecx
mov    %al,-0x39(%rbp)
je     1214 <filereadd+0xf4>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
sete   %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    1224 <filereadd+0x104>
jmp    1258 <filereadd+0x138>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     1253 <filereadd+0x133>
lea    0xdd7(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
jmp    11b6 <filereadd+0x96>
mov    -0x30(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    12da <filereadd+0x1ba>
mov    -0x28(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    12ce <filereadd+0x1ae>
mov    -0x18(%rbp),%rdi
movslq -0x2c(%rbp),%rax
add    %rax,%rdi
lea    0xda7(%rip),%rsi
lea    -0x38(%rbp),%rdx
call   1040 <sscanf@plt>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
lea    0xd7c(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movl   $0x0,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
movl   $0xffffffff,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     13a0 <filereadd+0x280>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%rdi
movslq -0x2c(%rbp),%rax
add    %rax,%rdi
lea    0xd26(%rip),%rsi
lea    -0x38(%rbp),%rdx
call   1040 <sscanf@plt>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x3a(%rbp)
jne    1357 <filereadd+0x237>
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
setl   %al
mov    %al,-0x3a(%rbp)
mov    -0x3a(%rbp),%al
test   $0x1,%al
jne    1367 <filereadd+0x247>
jmp    1375 <filereadd+0x255>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1331 <filereadd+0x211>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rsi
movslq -0x30(%rbp),%rax
add    %rax,%rsi
lea    0xcaa(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
jmp    13e8 <filereadd+0x2c8>
mov    -0x18(%rbp),%rdi
movslq -0x2c(%rbp),%rax
add    %rax,%rdi
lea    0xc81(%rip),%rsi
lea    -0x38(%rbp),%rdx
call   1040 <sscanf@plt>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
lea    0xc56(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
jmp    13ed <filereadd+0x2cd>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1428 <filereadd+0x308>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     1423 <filereadd+0x303>
movl   $0xffffffff,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
jmp    13ed <filereadd+0x2cd>
jmp    142d <filereadd+0x30d>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    148e <filereadd+0x36e>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jl     1489 <filereadd+0x369>
mov    -0x28(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1474 <filereadd+0x354>
movl   $0xffffffff,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
mov    -0x30(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
jmp    142d <filereadd+0x30d>
mov    -0x30(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    14ba <filereadd+0x39a>
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    14d4 <filereadd+0x3b4>
jmp    14bf <filereadd+0x39f>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    114b <filereadd+0x2b>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<filereadd>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    $0xffffffff,%r12d
test   %edi,%edi
jle    1336 <filereadd+0x206>
mov    %rdx,%r13
movslq (%rcx),%rax
mov    (%rdx,%rax,1),%bl
cmp    $0x2f,%bl
je     1316 <filereadd+0x1e6>
lea    -0x3a(%rbx),%edx
cmp    $0xf3,%dl
jb     1316 <filereadd+0x1e6>
mov    %edi,%ebp
add    $0xffffffff,%ebp
movslq %r8d,%r14
add    $0xffffffff,%r8d
lea    (%rax,%r13,1),%rdi
xor    %edx,%edx
mov    %rdx,(%rsp)
lea    0xe79(%rip),%r9
lea    0x8(%rsp),%rdx
movabs $0x100000000,%r15
mov    %rsi,0x10(%rsp)
mov    %rcx,0x20(%rsp)
lea    -0x30(%rbx),%ecx
cmp    $0xa,%cl
jb     11c0 <filereadd+0x90>
lea    -0x2d(%rbx),%ecx
mov    %rax,%r12
cmp    $0x1,%cl
ja     11e9 <filereadd+0xb9>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0x1(%rax),%r12
cmp    %r14,%r12
jge    1324 <filereadd+0x1f4>
movzbl 0x1(%r13,%rax,1),%ebx
lea    -0x30(%rbx),%ecx
mov    %r12,%rax
cmp    $0xa,%cl
jb     11c0 <filereadd+0x90>
lea    -0x2d(%rbx),%ecx
mov    %r12,%rax
cmp    $0x2,%cl
jb     11c0 <filereadd+0x90>
cmp    %r12d,%r8d
je     1354 <filereadd+0x224>
mov    %r8d,0x1c(%rsp)
test   %bl,%bl
je     1258 <filereadd+0x128>
movb   $0x0,0x0(%r13,%r12,1)
mov    %r9,%rsi
mov    %rdx,%rbx
call   1050 <sscanf@plt>
movsd  0x8(%rsp),%xmm0
mov    0x10(%rsp),%rax
mov    (%rsp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movslq %r12d,%r12
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmpb   $0x20,0x1(%r13,%r12,1)
lea    0x1(%r12),%r12
jne    1242 <filereadd+0x112>
cmp    %r14,%r12
jl     1230 <filereadd+0x100>
mov    %r12,%rsi
add    %r13,%rsi
lea    0xdbc(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
jmp    1285 <filereadd+0x155>
mov    %r9,%rsi
mov    %rdx,%rbx
call   1050 <sscanf@plt>
movsd  0x8(%rsp),%xmm0
mov    0x10(%rsp),%rax
mov    (%rsp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
lea    0xd86(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
mov    %r12,%rdi
shl    $0x20,%rdi
movslq %r12d,%rax
mov    0x1c(%rsp),%r8d
lea    0xd65(%rip),%r9
mov    %rbx,%rdx
xchg   %ax,%ax
cmpb   $0x0,0x0(%r13,%rax,1)
je     12ba <filereadd+0x18a>
add    $0x1,%rax
add    %r15,%rdi
add    $0x1,%r12d
cmp    %r14,%rax
jl     12a0 <filereadd+0x170>
jmp    1330 <filereadd+0x200>
sar    $0x20,%rdi
shl    $0x20,%r12
mov    %r12,%rax
mov    $0xffffffff,%r12d
mov    0x20(%rsp),%rcx
cmpb   $0x0,0x0(%r13,%rdi,1)
jne    12e6 <filereadd+0x1b6>
add    $0x1,%rdi
add    %r15,%rax
cmp    %r14,%rdi
jl     12d0 <filereadd+0x1a0>
jmp    1348 <filereadd+0x218>
cmp    %rbp,(%rsp)
je     134d <filereadd+0x21d>
sar    $0x20,%rax
mov    0x0(%r13,%rax,1),%bl
cmp    $0x2f,%bl
je     1316 <filereadd+0x1e6>
addq   $0x1,(%rsp)
lea    (%rax,%r13,1),%rdi
mov    %rbp,%r10
lea    -0x3a(%rbx),%ebp
cmp    $0xf3,%bpl
mov    %r10,%rbp
jae    11a0 <filereadd+0x70>
lea    0xd15(%rip),%rdi
call   1030 <puts@plt>
jmp    1336 <filereadd+0x206>
lea    0xcec(%rip),%rdi
call   1030 <puts@plt>
mov    $0xffffffff,%r12d
mov    %r12d,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
cmp    (%rsp),%ebp
jg     1336 <filereadd+0x206>
mov    %edi,(%rcx)
xor    %r12d,%r12d
jmp    1336 <filereadd+0x206>
cmp    (%rsp),%ebp
mov    $0xffffffff,%r12d
jne    1336 <filereadd+0x206>
lea    0xc9a(%rip),%rsi
lea    0x8(%rsp),%rdx
call   1050 <sscanf@plt>
movsd  0x8(%rsp),%xmm0
mov    0x10(%rsp),%rax
movsd  %xmm0,(%rax,%rbp,8)
lea    0xc7d(%rip),%rdi
mov    $0x1,%al
call   1040 <printf@plt>
jmp    134f <filereadd+0x21f>

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

LLVM IR (-O2):
@.str.2 = [4 x i8] c"%lf\00"
@.str.3 = [7 x i8] c"(%lf)\0A\00"
@.str.4 = [12 x i8] c"(%lf) \22%s\22\0A\00"
@str = [27 x i8] c"not enough numbers in file\00"
@str.5 = [22 x i8] c"input is not a number\00"
define i32 @filereadd(i32 %0, double* nocapture %1, i8* %2, i32* nocapture %3, i32 %4) {
%6 = alloca double
%7 = bitcast double* %6 to i8*
%8 = icmp sgt i32 %0, 0
br i1 %8, label %9, label %128
9: ; preds = %5
%10 = load i32, i32* %3
%11 = add nsw i32 %4, -1
%12 = add nsw i32 %0, -1
%13 = sext i32 %4 to i64
%14 = zext i32 %12 to i64
%15 = sext i32 %10 to i64
%16 = getelementptr inbounds i8, i8* %2, i64 %15
%17 = load i8, i8* %16
%18 = add i8 %17, -58
%19 = icmp ult i8 %18, -13
%20 = icmp eq i8 %17, 47
%21 = or i1 %20, %19
br i1 %21, label %32, label %22
22: ; preds = %9, %118
%23 = phi i8 [ %123, %118 ], [ %17, %9 ]
%24 = phi i8* [ %122, %118 ], [ %16, %9 ]
%25 = phi i64 [ %121, %118 ], [ %15, %9 ]
%26 = phi i64 [ %119, %118 ], [ 0, %9 ]
%27 = add i8 %23, -48
%28 = icmp ult i8 %27, 10
%29 = add i8 %23, -45
%30 = icmp ult i8 %29, 2
%31 = or i1 %28, %30
br i1 %31, label %34, label %48
32: ; preds = %118, %9
%33 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([22 x i8], [22 x i8]* @str.5, i64 0, i64 0))
br label %128
34: ; preds = %22, %38
%35 = phi i64 [ %36, %38 ], [ %25, %22 ]
%36 = add nsw i64 %35, 1
%37 = icmp slt i64 %36, %13
br i1 %37, label %38, label %46
38: ; preds = %34
%39 = getelementptr inbounds i8, i8* %2, i64 %36
%40 = load i8, i8* %39
%41 = add i8 %40, -48
%42 = icmp ult i8 %41, 10
%43 = add i8 %40, -45
%44 = icmp ult i8 %43, 2
%45 = or i1 %42, %44
br i1 %45, label %34, label %48
46: ; preds = %34
%47 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @str, i64 0, i64 0))
br label %128
48: ; preds = %38, %22
%49 = phi i8 [ %23, %22 ], [ %40, %38 ]
%50 = phi i64 [ %25, %22 ], [ %36, %38 ]
%51 = getelementptr inbounds i8, i8* %2, i64 %50
%52 = trunc i64 %50 to i32
%53 = icmp eq i32 %11, %52
br i1 %53, label %54, label %62
54: ; preds = %48
%55 = trunc i64 %26 to i32
%56 = icmp eq i32 %12, %55
br i1 %56, label %57, label %128
57: ; preds = %54
%58 = call i32 @sscanf(i8* %24, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0), double* %6)
%59 = load double, double* %6
%60 = getelementptr inbounds double, double* %1, i64 %14
store double %59, double* %60
%61 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i64 0, i64 0), double %59)
br label %128
62: ; preds = %48
%63 = icmp eq i8 %49, 0
br i1 %63, label %81, label %64
64: ; preds = %62
store i8 0, i8* %51
%65 = call i32 @sscanf(i8* %24, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0), double* %6)
%66 = load double, double* %6
%67 = getelementptr inbounds double, double* %1, i64 %26
store double %66, double* %67
%68 = shl i64 %50, 32
%69 = ashr exact i64 %68, 32
br label %70
70: ; preds = %70, %64
%71 = phi i64 [ %72, %70 ], [ %69, %64 ]
%72 = add nsw i64 %71, 1
%73 = getelementptr inbounds i8, i8* %2, i64 %72
%74 = load i8, i8* %73
%75 = icmp eq i8 %74, 32
%76 = icmp slt i64 %72, %13
%77 = select i1 %75, i1 %76, i1 false
br i1 %77, label %70, label %78
78: ; preds = %70
%79 = getelementptr inbounds i8, i8* %2, i64 %72
%80 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i64 0, i64 0), double %66, i8* %79)
br label %86
81: ; preds = %62
%82 = call i32 @sscanf(i8* %24, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0), double* %6)
%83 = load double, double* %6
%84 = getelementptr inbounds double, double* %1, i64 %26
store double %83, double* %84
%85 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i64 0, i64 0), double %83)
br label %86
86: ; preds = %81, %78
%87 = phi i64 [ %72, %78 ], [ %50, %81 ]
%88 = shl i64 %87, 32
%89 = ashr exact i64 %88, 32
br label %90
90: ; preds = %98, %86
%91 = phi i64 [ %99, %98 ], [ %89, %86 ]
%92 = getelementptr inbounds i8, i8* %2, i64 %91
%93 = load i8, i8* %92
%94 = icmp eq i8 %93, 0
br i1 %94, label %95, label %98
95: ; preds = %90
%96 = shl i64 %91, 32
%97 = ashr exact i64 %96, 32
br label %101
98: ; preds = %90
%99 = add nsw i64 %91, 1
%100 = icmp slt i64 %99, %13
br i1 %100, label %90, label %128
101: ; preds = %95, %106
%102 = phi i64 [ %97, %95 ], [ %107, %106 ]
%103 = getelementptr inbounds i8, i8* %2, i64 %102
%104 = load i8, i8* %103
%105 = icmp eq i8 %104, 0
br i1 %105, label %106, label %114
106: ; preds = %101
%107 = add nsw i64 %102, 1
%108 = icmp slt i64 %107, %13
br i1 %108, label %101, label %109
109: ; preds = %106
%110 = trunc i64 %26 to i32
%111 = icmp sgt i32 %12, %110
br i1 %111, label %128, label %112
112: ; preds = %109
%113 = trunc i64 %107 to i32
store i32 %113, i32* %3
br label %128
114: ; preds = %101
%115 = icmp eq i64 %26, %14
br i1 %115, label %116, label %118
116: ; preds = %114
%117 = trunc i64 %102 to i32
store i32 %117, i32* %3
br label %128
118: ; preds = %114
%119 = add nuw nsw i64 %26, 1
%120 = shl i64 %102, 32
%121 = ashr exact i64 %120, 32
%122 = getelementptr inbounds i8, i8* %2, i64 %121
%123 = load i8, i8* %122
%124 = add i8 %123, -58
%125 = icmp ult i8 %124, -13
%126 = icmp eq i8 %123, 47
%127 = or i1 %126, %125
br i1 %127, label %32, label %22
128: ; preds = %98, %5, %109, %54, %116, %112, %57, %46, %32
%129 = phi i32 [ -1, %32 ], [ -1, %46 ], [ 0, %57 ], [ 0, %112 ], [ 0, %116 ], [ -1, %54 ], [ -1, %109 ], [ -1, %5 ], [ -1, %98 ]
ret i32 %129
}