char *_get_from_sar_array(long size) {
  long i;
  long last_element;
  long *sar_array_element;
  long old_value;
  last_element = *(long *)(0x300003000);
  for (sar_array_element = (long *)(0x300003008);
       (long)sar_array_element <= last_element;
       sar_array_element = sar_array_element + 24) {
    if (((*(sar_array_element + 8)) - (*(sar_array_element + 16))) >= size) {
      old_value = *(sar_array_element + 16);
      *(sar_array_element + 16) = *(sar_array_element + 16) + size;
      return (char *)old_value;
    }
  }
  return (char *)0;
}


x86 assembly (clang, -O0):
<_get_from_sar_array>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movabs $0x300003000,%rax
mov    (%rax),%rax
mov    %rax,-0x20(%rbp)
movabs $0x300003008,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jg     11a0 <_get_from_sar_array+0xa0>
mov    -0x28(%rbp),%rax
mov    0x40(%rax),%rax
mov    -0x28(%rbp),%rcx
sub    0x80(%rcx),%rax
cmp    -0x10(%rbp),%rax
jl     1188 <_get_from_sar_array+0x88>
mov    -0x28(%rbp),%rax
mov    0x80(%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    0x80(%rax),%rcx
add    -0x10(%rbp),%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,0x80(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    11a8 <_get_from_sar_array+0xa8>
jmp    118d <_get_from_sar_array+0x8d>
mov    -0x28(%rbp),%rax
add    $0xc0,%rax
mov    %rax,-0x28(%rbp)
jmp    1127 <_get_from_sar_array+0x27>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_get_from_sar_array>:
movabs $0x300003008,%rcx
mov    -0x8(%rcx),%r8
cmp    %rcx,%r8
jl     1142 <_get_from_sar_array+0x42>
lea    0x80(%rcx),%rsi
nopw   0x0(%rax,%rax,1)
mov    -0x40(%rsi),%rdx
mov    (%rsi),%rax
sub    %rax,%rdx
cmp    %rdi,%rdx
jge    1145 <_get_from_sar_array+0x45>
add    $0xc0,%rsi
add    $0xc0,%rcx
cmp    %rcx,%r8
jge    1120 <_get_from_sar_array+0x20>
xor    %eax,%eax
ret
add    %rax,%rdi
mov    %rdi,(%rsi)
ret

LLVM IR (-O0):
define i8* @_get_from_sar_array(i64 %0) {
%2 = alloca i8*
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64*
%7 = alloca i64
store i64 %0, i64* %3
%8 = load i64, i64* inttoptr (i64 12884914176 to i64*)
store i64 %8, i64* %5
store i64* inttoptr (i64 12884914184 to i64*), i64** %6
br label %9
9: ; preds = %38, %1
%10 = load i64*, i64** %6
%11 = ptrtoint i64* %10 to i64
%12 = load i64, i64* %5
%13 = icmp sle i64 %11, %12
br i1 %13, label %14, label %41
14: ; preds = %9
%15 = load i64*, i64** %6
%16 = getelementptr inbounds i64, i64* %15, i64 8
%17 = load i64, i64* %16
%18 = load i64*, i64** %6
%19 = getelementptr inbounds i64, i64* %18, i64 16
%20 = load i64, i64* %19
%21 = sub nsw i64 %17, %20
%22 = load i64, i64* %3
%23 = icmp sge i64 %21, %22
br i1 %23, label %24, label %37
24: ; preds = %14
%25 = load i64*, i64** %6
%26 = getelementptr inbounds i64, i64* %25, i64 16
%27 = load i64, i64* %26
store i64 %27, i64* %7
%28 = load i64*, i64** %6
%29 = getelementptr inbounds i64, i64* %28, i64 16
%30 = load i64, i64* %29
%31 = load i64, i64* %3
%32 = add nsw i64 %30, %31
%33 = load i64*, i64** %6
%34 = getelementptr inbounds i64, i64* %33, i64 16
store i64 %32, i64* %34
%35 = load i64, i64* %7
%36 = inttoptr i64 %35 to i8*
store i8* %36, i8** %2
br label %42
37: ; preds = %14
br label %38
38: ; preds = %37
%39 = load i64*, i64** %6
%40 = getelementptr inbounds i64, i64* %39, i64 24
store i64* %40, i64** %6
br label %9
41: ; preds = %9
store i8* null, i8** %2
br label %42
42: ; preds = %41, %24
%43 = load i8*, i8** %2
ret i8* %43
}

LLVM IR (-O2):
define i8* @_get_from_sar_array(i64 %0) {
%2 = load i64, i64* inttoptr (i64 12884914176 to i64*)
%3 = icmp slt i64 %2, 12884914184
br i1 %3, label %20, label %4
4: ; preds = %1, %16
%5 = phi i64* [ %17, %16 ], [ inttoptr (i64 12884914184 to i64*), %1 ]
%6 = getelementptr inbounds i64, i64* %5, i64 8
%7 = load i64, i64* %6
%8 = getelementptr inbounds i64, i64* %5, i64 16
%9 = load i64, i64* %8
%10 = sub nsw i64 %7, %9
%11 = icmp slt i64 %10, %0
br i1 %11, label %16, label %12
12: ; preds = %4
%13 = getelementptr inbounds i64, i64* %5, i64 16
%14 = add nsw i64 %9, %0
store i64 %14, i64* %13
%15 = inttoptr i64 %9 to i8*
br label %20
16: ; preds = %4
%17 = getelementptr inbounds i64, i64* %5, i64 24
%18 = ptrtoint i64* %17 to i64
%19 = icmp slt i64 %2, %18
br i1 %19, label %20, label %4
20: ; preds = %16, %1, %12
%21 = phi i8* [ %15, %12 ], [ null, %1 ], [ null, %16 ]
ret i8* %21
}