void casadi_decompress(const long long int *sp, long long int *nrow,
                       long long int *ncol, long long int *nnz,
                       long long int *numel, const long long int **colind,
                       const long long int **row) {
  if (sp == 0) {
    static const long long int scalar_colind[2] = {0, 1};
    *ncol = *nrow = 1;
    *nnz = *numel = 1;
    *colind = scalar_colind;
    *row = 0;
  } else {
    *nrow = *sp++;
    *ncol = *sp++;
    *colind = sp;
    *nnz = sp[*ncol];
    *numel = *nrow * *ncol;
    *row = *nnz == *numel ? 0 : sp + *ncol + 1;
  }
}


x86 assembly (clang, -O0):
<casadi_decompress>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
cmpq   $0x0,-0x8(%rbp)
jne    1175 <casadi_decompress+0x75>
mov    -0x10(%rbp),%rax
movq   $0x1,(%rax)
mov    -0x18(%rbp),%rax
movq   $0x1,(%rax)
mov    -0x28(%rbp),%rax
movq   $0x1,(%rax)
mov    -0x20(%rbp),%rax
movq   $0x1,(%rax)
mov    -0x30(%rbp),%rax
lea    0xe9e(%rip),%rcx
mov    %rcx,(%rax)
mov    0x10(%rbp),%rax
movq   $0x0,(%rax)
jmp    1222 <casadi_decompress+0x122>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
mov    (%rax),%rcx
mov    -0x18(%rbp),%rax
imul   (%rax),%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    -0x28(%rbp),%rcx
cmp    (%rcx),%rax
jne    11fd <casadi_decompress+0xfd>
xor    %eax,%eax
mov    %rax,-0x38(%rbp)
jmp    1217 <casadi_decompress+0x117>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rcx
mov    0x10(%rbp),%rax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<casadi_decompress>:
mov    0x8(%rsp),%r10
test   %rdi,%rdi
je     1144 <casadi_decompress+0x44>
mov    (%rdi),%rax
mov    %rax,(%rsi)
lea    0x10(%rdi),%r11
mov    0x8(%rdi),%rax
mov    %rax,(%rdx)
mov    %r11,(%r9)
mov    0x10(%rdi,%rax,8),%rax
mov    %rax,(%rcx)
mov    (%rdx),%rax
imul   (%rsi),%rax
mov    %rax,(%r8)
cmp    %rax,(%rcx)
je     116a <casadi_decompress+0x6a>
mov    (%rdx),%rax
lea    (%r11,%rax,8),%rax
add    $0x8,%rax
mov    %rax,(%r10)
ret
movq   $0x1,(%rsi)
movq   $0x1,(%rdx)
movq   $0x1,(%r8)
movq   $0x1,(%rcx)
lea    0xe99(%rip),%rax
mov    %rax,(%r9)
xor    %eax,%eax
mov    %rax,(%r10)
ret

LLVM IR (-O0):
@casadi_decompress.scalar_colind = internal constant [2 x i64] [i64 0, i64 1]
define void @casadi_decompress(i64* %0, i64* %1, i64* %2, i64* %3, i64* %4, i64** %5, i64** %6) {
%8 = alloca i64*
%9 = alloca i64*
%10 = alloca i64*
%11 = alloca i64*
%12 = alloca i64*
%13 = alloca i64**
%14 = alloca i64**
store i64* %0, i64** %8
store i64* %1, i64** %9
store i64* %2, i64** %10
store i64* %3, i64** %11
store i64* %4, i64** %12
store i64** %5, i64*** %13
store i64** %6, i64*** %14
%15 = load i64*, i64** %8
%16 = icmp eq i64* %15, null
br i1 %16, label %17, label %24
17: ; preds = %7
%18 = load i64*, i64** %9
store i64 1, i64* %18
%19 = load i64*, i64** %10
store i64 1, i64* %19
%20 = load i64*, i64** %12
store i64 1, i64* %20
%21 = load i64*, i64** %11
store i64 1, i64* %21
%22 = load i64**, i64*** %13
store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @casadi_decompress.scalar_colind, i64 0, i64 0), i64** %22
%23 = load i64**, i64*** %14
store i64* null, i64** %23
br label %62
24: ; preds = %7
%25 = load i64*, i64** %8
%26 = getelementptr inbounds i64, i64* %25, i32 1
store i64* %26, i64** %8
%27 = load i64, i64* %25
%28 = load i64*, i64** %9
store i64 %27, i64* %28
%29 = load i64*, i64** %8
%30 = getelementptr inbounds i64, i64* %29, i32 1
store i64* %30, i64** %8
%31 = load i64, i64* %29
%32 = load i64*, i64** %10
store i64 %31, i64* %32
%33 = load i64*, i64** %8
%34 = load i64**, i64*** %13
store i64* %33, i64** %34
%35 = load i64*, i64** %8
%36 = load i64*, i64** %10
%37 = load i64, i64* %36
%38 = getelementptr inbounds i64, i64* %35, i64 %37
%39 = load i64, i64* %38
%40 = load i64*, i64** %11
store i64 %39, i64* %40
%41 = load i64*, i64** %9
%42 = load i64, i64* %41
%43 = load i64*, i64** %10
%44 = load i64, i64* %43
%45 = mul nsw i64 %42, %44
%46 = load i64*, i64** %12
store i64 %45, i64* %46
%47 = load i64*, i64** %11
%48 = load i64, i64* %47
%49 = load i64*, i64** %12
%50 = load i64, i64* %49
%51 = icmp eq i64 %48, %50
br i1 %51, label %52, label %53
52: ; preds = %24
br label %59
53: ; preds = %24
%54 = load i64*, i64** %8
%55 = load i64*, i64** %10
%56 = load i64, i64* %55
%57 = getelementptr inbounds i64, i64* %54, i64 %56
%58 = getelementptr inbounds i64, i64* %57, i64 1
br label %59
59: ; preds = %53, %52
%60 = phi i64* [ null, %52 ], [ %58, %53 ]
%61 = load i64**, i64*** %14
store i64* %60, i64** %61
br label %62
62: ; preds = %59, %17
ret void
}

LLVM IR (-O2):
@casadi_decompress.scalar_colind = internal constant [2 x i64] [i64 0, i64 1]
define void @casadi_decompress(i64* %0, i64* nocapture %1, i64* nocapture %2, i64* nocapture %3, i64* nocapture writeonly %4, i64** nocapture writeonly %5, i64** nocapture writeonly %6) {
%8 = icmp eq i64* %0, null
br i1 %8, label %9, label %10
9: ; preds = %7
store i64 1, i64* %1
store i64 1, i64* %2
store i64 1, i64* %4
store i64 1, i64* %3
store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @casadi_decompress.scalar_colind, i64 0, i64 0), i64** %5
br label %26
10: ; preds = %7
%11 = getelementptr inbounds i64, i64* %0, i64 1
%12 = load i64, i64* %0
store i64 %12, i64* %1
%13 = getelementptr inbounds i64, i64* %0, i64 2
%14 = load i64, i64* %11
store i64 %14, i64* %2
store i64* %13, i64** %5
%15 = getelementptr inbounds i64, i64* %13, i64 %14
%16 = load i64, i64* %15
store i64 %16, i64* %3
%17 = load i64, i64* %1
%18 = load i64, i64* %2
%19 = mul nsw i64 %18, %17
store i64 %19, i64* %4
%20 = load i64, i64* %3
%21 = icmp eq i64 %20, %19
br i1 %21, label %26, label %22
22: ; preds = %10
%23 = load i64, i64* %2
%24 = getelementptr inbounds i64, i64* %13, i64 %23
%25 = getelementptr inbounds i64, i64* %24, i64 1
br label %26
26: ; preds = %22, %10, %9
%27 = phi i64* [ null, %9 ], [ %25, %22 ], [ null, %10 ]
store i64* %27, i64** %6
ret void
}