#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*/ sector;

/* Variables and functions */
int findFreeSector();
int /*<<< orphan*/ readSector(char *, int);
int /*<<< orphan*/ writeSector(char *, int);
int filePutSector(char *buffer, int file, int sector) {
  int indexFlags;
  char buf[512];
  char buf2[512];
  int i;
  int index;
  int newSector;
  readSector(buf, file);
  indexFlags = ((buf[0] & 0x80) >> 6) + ((buf[1] & 0x80) >> 7);
  if (indexFlags == 0) {
    if (sector > 1)
      return 1;
    if (sector == 0 && !buffer[504] && !buffer[505] && !buffer[506] &&
        !buffer[507] && !buffer[508] && !buffer[509] && !buffer[510] &&
        !buffer[511]) {
      for (i = 0; i < 504; i++)
        buf[i + 8] = buffer[i];
      writeSector(buf, file);
    } else {
      newSector = findFreeSector();
      for (i = 0; i < 504; i++)
        buf2[i] = buf[i + 8];
      for (i = 504; i < 512; i++)
        buf2[i] = 0;
      buf[1] |= 0x80;
      buf[8] = newSector >> 4;
      buf[9] = (newSector & 0xF) << 4;
      for (i = 10; i < 512; i++)
        buf[i] = 0;
      writeSector(buf, file);
      writeSector(buf2, newSector);
      return filePutSector(buffer, file, sector);
    }
  } else if (indexFlags == 1) {
    if (sector < 0 || sector >= 336)
      return 2;
    if ((sector - 1) & 1) {
      index = ((buf[9 + 3 * ((sector - 1) >> 1)] & 0x0F) << 8) +
              buf[10 + 3 * ((sector - 1) >> 1)];
    } else {
      index = (buf[8 + 3 * ((sector - 1) >> 1)] << 4) +
              ((buf[9 + 3 * ((sector - 1) >> 1)] & 0xF0) >> 4);
    }
    if (!index)
      return 1;
    if ((sector)&1) {
      index = ((buf[9 + 3 * (sector >> 1)] & 0x0F) << 8) +
              buf[10 + 3 * (sector >> 1)];
    } else {
      index = (buf[8 + 3 * (sector >> 1)] << 4) +
              ((buf[9 + 3 * (sector >> 1)] & 0xF0) >> 4);
    }
    if (!index) {
      index = findFreeSector();
      if ((sector)&1) {
        buf[9 + 3 * (sector >> 1)] |= index >> 8;
        buf[10 + 3 * (sector >> 1)] = index & 0xFF;
      } else {
        buf[8 + 3 * (sector >> 1)] = index >> 4;
        buf[9 + 3 * (sector >> 1)] |= (index & 0xF) << 4;
      }
    }
    writeSector(buffer, index);
  } else {
    return 2;
  }
  return 0;
}


x86 assembly (clang, -O0):
<filePutSector>:
push   %rbp
mov    %rsp,%rbp
sub    $0x430,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
lea    -0x220(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1040 <readSector@plt>
movsbl -0x220(%rbp),%eax
and    $0x80,%eax
sar    $0x6,%eax
movsbl -0x21f(%rbp),%ecx
and    $0x80,%ecx
sar    $0x7,%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    13e1 <filePutSector+0x2a1>
cmpl   $0x1,-0x18(%rbp)
jle    11a8 <filePutSector+0x68>
movl   $0x1,-0x4(%rbp)
jmp    164a <filePutSector+0x50a>
cmpl   $0x0,-0x18(%rbp)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1f8(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1f9(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1fa(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1fb(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1fc(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1fd(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1fe(%rax)
jne    129c <filePutSector+0x15c>
mov    -0x10(%rbp),%rax
cmpb   $0x0,0x1ff(%rax)
jne    129c <filePutSector+0x15c>
movl   $0x0,-0x424(%rbp)
cmpl   $0x1f8,-0x424(%rbp)
jge    1288 <filePutSector+0x148>
mov    -0x10(%rbp),%rax
movslq -0x424(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x424(%rbp),%eax
add    $0x8,%eax
cltq
mov    %cl,-0x220(%rbp,%rax,1)
mov    -0x424(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x424(%rbp)
jmp    1244 <filePutSector+0x104>
lea    -0x220(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1030 <writeSector@plt>
jmp    13dc <filePutSector+0x29c>
mov    $0x0,%al
call   1060 <findFreeSector@plt>
mov    %eax,-0x42c(%rbp)
movl   $0x0,-0x424(%rbp)
cmpl   $0x1f8,-0x424(%rbp)
jge    12f7 <filePutSector+0x1b7>
mov    -0x424(%rbp),%eax
add    $0x8,%eax
cltq
mov    -0x220(%rbp,%rax,1),%cl
movslq -0x424(%rbp),%rax
mov    %cl,-0x420(%rbp,%rax,1)
mov    -0x424(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x424(%rbp)
jmp    12b3 <filePutSector+0x173>
movl   $0x1f8,-0x424(%rbp)
cmpl   $0x200,-0x424(%rbp)
jge    1334 <filePutSector+0x1f4>
movslq -0x424(%rbp),%rax
movb   $0x0,-0x420(%rbp,%rax,1)
mov    -0x424(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x424(%rbp)
jmp    1301 <filePutSector+0x1c1>
movsbl -0x21f(%rbp),%eax
or     $0x80,%eax
mov    %al,-0x21f(%rbp)
mov    -0x42c(%rbp),%eax
sar    $0x4,%eax
mov    %al,-0x218(%rbp)
mov    -0x42c(%rbp),%eax
and    $0xf,%eax
shl    $0x4,%eax
mov    %al,-0x217(%rbp)
movl   $0xa,-0x424(%rbp)
cmpl   $0x200,-0x424(%rbp)
jge    13a4 <filePutSector+0x264>
movslq -0x424(%rbp),%rax
movb   $0x0,-0x220(%rbp,%rax,1)
mov    -0x424(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x424(%rbp)
jmp    1371 <filePutSector+0x231>
lea    -0x220(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1030 <writeSector@plt>
lea    -0x420(%rbp),%rdi
mov    -0x42c(%rbp),%esi
call   1030 <writeSector@plt>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
mov    -0x18(%rbp),%edx
call   1050 <filePutSector@plt>
mov    %eax,-0x4(%rbp)
jmp    164a <filePutSector+0x50a>
jmp    1643 <filePutSector+0x503>
cmpl   $0x1,-0x1c(%rbp)
jne    1632 <filePutSector+0x4f2>
cmpl   $0x0,-0x18(%rbp)
jl     1402 <filePutSector+0x2c2>
cmpl   $0x150,-0x18(%rbp)
jl     140e <filePutSector+0x2ce>
movl   $0x2,-0x4(%rbp)
jmp    164a <filePutSector+0x50a>
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1466 <filePutSector+0x326>
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x9,%eax
cltq
movsbl -0x220(%rbp,%rax,1),%eax
ff
and    $0xf,%eax
shl    $0x8,%eax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
sar    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0xa,%ecx
movslq %ecx,%rcx
movsbl -0x220(%rbp,%rcx,1),%ecx
ff
add    %ecx,%eax
mov    %eax,-0x428(%rbp)
jmp    14ad <filePutSector+0x36d>
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x8,%eax
cltq
movsbl -0x220(%rbp,%rax,1),%eax
ff
shl    $0x4,%eax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
sar    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x9,%ecx
movslq %ecx,%rcx
movsbl -0x220(%rbp,%rcx,1),%ecx
ff
and    $0xf0,%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    %eax,-0x428(%rbp)
cmpl   $0x0,-0x428(%rbp)
jne    14c6 <filePutSector+0x386>
movl   $0x1,-0x4(%rbp)
jmp    164a <filePutSector+0x50a>
mov    -0x18(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1515 <filePutSector+0x3d5>
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x9,%eax
cltq
movsbl -0x220(%rbp,%rax,1),%eax
ff
and    $0xf,%eax
shl    $0x8,%eax
mov    -0x18(%rbp),%ecx
sar    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0xa,%ecx
movslq %ecx,%rcx
movsbl -0x220(%rbp,%rcx,1),%ecx
ff
add    %ecx,%eax
mov    %eax,-0x428(%rbp)
jmp    1556 <filePutSector+0x416>
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x8,%eax
cltq
movsbl -0x220(%rbp,%rax,1),%eax
ff
shl    $0x4,%eax
mov    -0x18(%rbp),%ecx
sar    $0x1,%ecx
imul   $0x3,%ecx,%ecx
add    $0x9,%ecx
movslq %ecx,%rcx
movsbl -0x220(%rbp,%rcx,1),%ecx
ff
and    $0xf0,%ecx
sar    $0x4,%ecx
add    %ecx,%eax
mov    %eax,-0x428(%rbp)
cmpl   $0x0,-0x428(%rbp)
jne    161e <filePutSector+0x4de>
mov    $0x0,%al
call   1060 <findFreeSector@plt>
mov    %eax,-0x428(%rbp)
mov    -0x18(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     15ce <filePutSector+0x48e>
mov    -0x428(%rbp),%edx
sar    $0x8,%edx
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x9,%eax
cltq
movsbl -0x220(%rbp,%rax,1),%ecx
ff
or     %edx,%ecx
mov    %cl,-0x220(%rbp,%rax,1)
mov    -0x428(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0xa,%eax
cltq
mov    %cl,-0x220(%rbp,%rax,1)
jmp    1619 <filePutSector+0x4d9>
mov    -0x428(%rbp),%eax
sar    $0x4,%eax
mov    %al,%cl
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x8,%eax
cltq
mov    %cl,-0x220(%rbp,%rax,1)
mov    -0x428(%rbp),%edx
and    $0xf,%edx
shl    $0x4,%edx
mov    -0x18(%rbp),%eax
sar    $0x1,%eax
imul   $0x3,%eax,%eax
add    $0x9,%eax
cltq
movsbl -0x220(%rbp,%rax,1),%ecx
ff
or     %edx,%ecx
mov    %cl,-0x220(%rbp,%rax,1)
jmp    161e <filePutSector+0x4de>
mov    -0x10(%rbp),%rdi
mov    -0x428(%rbp),%esi
call   1030 <writeSector@plt>
jmp    163e <filePutSector+0x4fe>
movl   $0x2,-0x4(%rbp)
jmp    164a <filePutSector+0x50a>
jmp    1643 <filePutSector+0x503>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x430,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<filePutSector>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x400,%rsp
mov    %edx,%ebx
mov    %esi,%ebp
mov    %rdi,%r14
mov    %rsp,%r15
mov    %r15,%rdi
call   1060 <readSector@plt>
mov    (%rsp),%al
mov    0x1(%rsp),%cl
shr    $0x6,%al
and    $0x2,%al
shr    $0x7,%cl
or     %al,%cl
mov    $0x2,%eax
cmp    $0x1,%cl
je     128e <filePutSector+0x12e>
test   %cl,%cl
jne    1359 <filePutSector+0x1f9>
mov    $0x1,%eax
cmp    $0x1,%ebx
jg     1359 <filePutSector+0x1f9>
test   %ebx,%ebx
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1f8(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1f9(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1fa(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1fb(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1fc(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1fd(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1fe(%r14)
jne    120e <filePutSector+0xae>
cmpb   $0x0,0x1ff(%r14)
je     1369 <filePutSector+0x209>
xor    %eax,%eax
call   1080 <findFreeSector@plt>
mov    %eax,%r15d
lea    0x8(%rsp),%rsi
lea    0x200(%rsp),%r12
mov    $0x1f8,%edx
mov    %r12,%rdi
call   1050 <memcpy@plt>
movq   $0x0,0x3f8(%rsp)
orb    $0x80,0x1(%rsp)
mov    %r15d,%eax
shr    $0x4,%eax
mov    %al,0x8(%rsp)
mov    %r15d,%eax
shl    $0x4,%al
mov    %al,0x9(%rsp)
lea    0xa(%rsp),%rdi
mov    $0x1f6,%edx
xor    %esi,%esi
call   1040 <memset@plt>
mov    %rsp,%rdi
mov    %ebp,%esi
call   1030 <writeSector@plt>
mov    %r12,%rdi
mov    %r15d,%esi
call   1030 <writeSector@plt>
mov    %r14,%rdi
mov    %ebp,%esi
mov    %ebx,%edx
call   1070 <filePutSector@plt>
jmp    1359 <filePutSector+0x1f9>
cmp    $0x14f,%ebx
ja     1359 <filePutSector+0x1f9>
lea    -0x1(%rbx),%eax
test   $0x1,%al
jne    12fb <filePutSector+0x19b>
shr    %eax
lea    (%rax,%rax,2),%rax
movsbl 0x8(%rsp,%rax,1),%ecx
shl    $0x4,%ecx
movzbl 0x9(%rsp,%rax,1),%eax
shr    $0x4,%eax
or     %ecx,%eax
test   %eax,%eax
je     131d <filePutSector+0x1bd>
mov    %ebx,%eax
shr    %eax
lea    (%rax,%rax,2),%rbp
test   $0x1,%bl
jne    1324 <filePutSector+0x1c4>
movsbl 0x8(%rbp,%r15,1),%eax
shl    $0x4,%eax
movzbl 0x9(%rbp,%r15,1),%esi
shr    $0x4,%esi
or     %eax,%esi
jne    134f <filePutSector+0x1ef>
xor    %eax,%eax
call   1080 <findFreeSector@plt>
mov    %eax,%esi
shr    $0x4,%eax
mov    %al,0x8(%rsp,%rbp,1)
mov    %esi,%eax
shl    $0x4,%al
or     %al,0x9(%rsp,%rbp,1)
jmp    134f <filePutSector+0x1ef>
sar    %eax
lea    (%rax,%rax,2),%ecx
add    $0x9,%ecx
movzbl (%rsp,%rcx,1),%ecx
and    $0xf,%ecx
shl    $0x8,%ecx
lea    (%rax,%rax,2),%eax
add    $0xa,%eax
movsbl (%rsp,%rax,1),%eax
add    %ecx,%eax
test   %eax,%eax
jne    12bd <filePutSector+0x15d>
mov    $0x1,%eax
jmp    1359 <filePutSector+0x1f9>
movzbl 0x9(%rbp,%r15,1),%eax
and    $0xf,%eax
shl    $0x8,%eax
movsbl 0xa(%rbp,%r15,1),%esi
add    %eax,%esi
jne    134f <filePutSector+0x1ef>
xor    %eax,%eax
call   1080 <findFreeSector@plt>
mov    %eax,%esi
shr    $0x8,%eax
or     %al,0x9(%rsp,%rbp,1)
mov    %sil,0xa(%rsp,%rbp,1)
mov    %r14,%rdi
call   1030 <writeSector@plt>
xor    %eax,%eax
add    $0x400,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0x8(%rsp),%rdi
mov    $0x1f8,%edx
mov    %r14,%rsi
call   1050 <memcpy@plt>
mov    %rsp,%rdi
mov    %ebp,%esi
jmp    1352 <filePutSector+0x1f2>

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

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