int redisliteGetVarint(const unsigned char *p, long long *v) {
  int a, b, s;
  a = *p;
  if (!(a & 0x80)) {
    *v = a;
    return 1;
  }
  p++;
  b = *p;
  if (!(b & 0x80)) {
    a &= 0x7f;
    a = a << 7;
    a |= b;
    *v = a;
    return 2;
  }
  p++;
  a = a << 14;
  a |= *p;
  if (!(a & 0x80)) {
    a &= 0x001fc07f;
    b &= 0x7f;
    b = b << 7;
    a |= b;
    *v = a;
    return 3;
  }
  a &= 0x001fc07f;
  p++;
  b = b << 14;
  b |= *p;
  if (!(b & 0x80)) {
    b &= 0x001fc07f;
    a = a << 7;
    a |= b;
    *v = a;
    return 4;
  }
  b &= 0x001fc07f;
  s = a;
  p++;
  a = a << 14;
  a |= *p;
  if (!(a & 0x80)) {
    b = b << 7;
    a |= b;
    s = s >> 18;
    *v = ((long long)s) << 32 | a;
    return 5;
  }
  s = s << 7;
  s |= b;
  p++;
  b = b << 14;
  b |= *p;
  if (!(b & 0x80)) {
    a &= 0x001fc07f;
    a = a << 7;
    a |= b;
    s = s >> 18;
    *v = ((long long)s) << 32 | a;
    return 6;
  }
  p++;
  a = a << 14;
  a |= *p;
  if (!(a & 0x80)) {
    a &= 0xf01fc07f;
    b &= 0x001fc07f;
    b = b << 7;
    a |= b;
    s = s >> 11;
    *v = ((long long)s) << 32 | a;
    return 7;
  }
  a &= 0x001fc07f;
  p++;
  b = b << 14;
  b |= *p;
  if (!(b & 0x80)) {
    b &= 0xf01fc07f;
    a = a << 7;
    a |= b;
    s = s >> 4;
    *v = ((long long)s) << 32 | a;
    return 8;
  }
  p++;
  a = a << 15;
  a |= *p;
  b &= 0x001fc07f;
  b = b << 8;
  a |= b;
  s = s << 4;
  b = p[-4];
  b &= 0x7f;
  b = b >> 3;
  s |= b;
  *v = ((long long)s) << 32 | a;
  return 9;
}


x86 assembly (clang, -O0):
<redisliteGetVarint>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    113e <redisliteGetVarint+0x3e>
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1197 <redisliteGetVarint+0x97>
mov    -0x1c(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0xe,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1207 <redisliteGetVarint+0x107>
mov    -0x1c(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x3,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x1c(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%eax
shl    $0xe,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1279 <redisliteGetVarint+0x179>
mov    -0x20(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movslq -0x1c(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x4,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x20(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0xe,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    12fa <redisliteGetVarint+0x1fa>
mov    -0x20(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
sar    $0x12,%eax
mov    %eax,-0x24(%rbp)
movslq -0x24(%rbp),%rcx
shl    $0x20,%rcx
movslq -0x1c(%rbp),%rax
or     %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x5,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x24(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
or     -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%eax
shl    $0xe,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1387 <redisliteGetVarint+0x287>
mov    -0x1c(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
sar    $0x12,%eax
mov    %eax,-0x24(%rbp)
movslq -0x24(%rbp),%rcx
shl    $0x20,%rcx
movslq -0x1c(%rbp),%rax
or     %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x6,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0xe,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    140d <redisliteGetVarint+0x30d>
mov    -0x1c(%rbp),%eax
and    $0xf01fc07f,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
sar    $0xb,%eax
mov    %eax,-0x24(%rbp)
movslq -0x24(%rbp),%rcx
shl    $0x20,%rcx
movslq -0x1c(%rbp),%rax
or     %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x7,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x1c(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%eax
shl    $0xe,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1493 <redisliteGetVarint+0x393>
mov    -0x20(%rbp),%eax
and    $0xf01fc07f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x7,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
sar    $0x4,%eax
mov    %eax,-0x24(%rbp)
movslq -0x24(%rbp),%rcx
shl    $0x20,%rcx
movslq -0x1c(%rbp),%rax
or     %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x8,-0x4(%rbp)
jmp    151e <redisliteGetVarint+0x41e>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0xf,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
and    $0x1fc07f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movzbl -0x4(%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
sar    $0x3,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
or     -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
movslq -0x24(%rbp),%rcx
shl    $0x20,%rcx
movslq -0x1c(%rbp),%rax
or     %rax,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x9,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<redisliteGetVarint>:
movzbl (%rdi),%edx
test   $0x80,%dl
jne    1113 <redisliteGetVarint+0x13>
mov    %edx,%edx
mov    $0x1,%eax
mov    %rdx,(%rsi)
ret
movzbl 0x1(%rdi),%ecx
test   $0x80,%cl
jne    112f <redisliteGetVarint+0x2f>
and    $0x7f,%edx
shl    $0x7,%rdx
or     %rcx,%rdx
mov    $0x2,%eax
mov    %rdx,(%rsi)
ret
shl    $0xe,%edx
movzbl 0x2(%rdi),%eax
or     %eax,%edx
and    $0x1fc07f,%edx
test   $0x80,%al
jne    1155 <redisliteGetVarint+0x55>
and    $0x7f,%ecx
shl    $0x7,%rcx
or     %rcx,%rdx
mov    $0x3,%eax
mov    %rdx,(%rsi)
ret
shl    $0xe,%ecx
movzbl 0x3(%rdi),%eax
or     %eax,%ecx
and    $0x1fc07f,%ecx
test   $0x80,%al
jne    117a <redisliteGetVarint+0x7a>
mov    %edx,%eax
shl    $0x7,%rax
or     %rax,%rcx
mov    $0x4,%eax
mov    %rcx,(%rsi)
ret
mov    %edx,%eax
shl    $0xe,%eax
movzbl 0x4(%rdi),%r9d
or     %r9d,%eax
test   $0x80,%r9b
jne    11a7 <redisliteGetVarint+0xa7>
shl    $0x7,%ecx
or     %ecx,%eax
shr    $0x12,%edx
shl    $0x20,%rdx
cltq
or     %rax,%rdx
mov    $0x5,%eax
mov    %rdx,(%rsi)
ret
mov    %edx,%edx
shl    $0x7,%rdx
mov    %ecx,%r8d
or     %rdx,%r8
shl    $0xe,%ecx
movzbl 0x5(%rdi),%edx
or     %edx,%ecx
test   $0x80,%dl
jne    11e2 <redisliteGetVarint+0xe2>
shl    $0x7,%eax
and    $0xfe03f80,%eax
or     %eax,%ecx
shr    $0x12,%r8d
shl    $0x20,%r8
movslq %ecx,%rdx
or     %r8,%rdx
mov    $0x6,%eax
mov    %rdx,(%rsi)
ret
shl    $0xe,%eax
movzbl 0x6(%rdi),%edx
or     %edx,%eax
test   $0x80,%dl
jne    1217 <redisliteGetVarint+0x117>
and    $0xf01fc07f,%eax
shl    $0x7,%ecx
and    $0xfe03f80,%ecx
or     %eax,%ecx
shr    $0xb,%r8d
shl    $0x20,%r8
movslq %ecx,%rdx
or     %r8,%rdx
mov    $0x7,%eax
mov    %rdx,(%rsi)
ret
and    $0x1fc07f,%eax
shl    $0xe,%ecx
movzbl 0x7(%rdi),%edx
or     %edx,%ecx
test   $0x80,%dl
jne    124c <redisliteGetVarint+0x14c>
and    $0xf01fc07f,%ecx
shl    $0x7,%eax
or     %ecx,%eax
shr    $0x4,%r8d
shl    $0x20,%r8
movslq %eax,%rdx
or     %r8,%rdx
mov    $0x8,%eax
mov    %rdx,(%rsi)
ret
shl    $0xf,%eax
movzbl 0x8(%rdi),%edx
or     %eax,%edx
shl    $0x8,%ecx
and    $0x1fc07f00,%ecx
or     %edx,%ecx
shl    $0x4,%r8d
shr    $0x3,%r9d
and    $0xf,%r9d
or     %r8d,%r9d
shl    $0x20,%r9
movslq %ecx,%rdx
or     %r9,%rdx
mov    $0x9,%eax
mov    %rdx,(%rsi)
ret

LLVM IR (-O0):
define i32 @redisliteGetVarint(i8* %0, i64* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i64*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %4
store i64* %1, i64** %5
%9 = load i8*, i8** %4
%10 = load i8, i8* %9
%11 = zext i8 %10 to i32
store i32 %11, i32* %6
%12 = load i32, i32* %6
%13 = and i32 %12, 128
%14 = icmp ne i32 %13, 0
br i1 %14, label %19, label %15
15: ; preds = %2
%16 = load i32, i32* %6
%17 = sext i32 %16 to i64
%18 = load i64*, i64** %5
store i64 %17, i64* %18
store i32 1, i32* %3
br label %258
19: ; preds = %2
%20 = load i8*, i8** %4
%21 = getelementptr inbounds i8, i8* %20, i32 1
store i8* %21, i8** %4
%22 = load i8*, i8** %4
%23 = load i8, i8* %22
%24 = zext i8 %23 to i32
store i32 %24, i32* %7
%25 = load i32, i32* %7
%26 = and i32 %25, 128
%27 = icmp ne i32 %26, 0
br i1 %27, label %39, label %28
28: ; preds = %19
%29 = load i32, i32* %6
%30 = and i32 %29, 127
store i32 %30, i32* %6
%31 = load i32, i32* %6
%32 = shl i32 %31, 7
store i32 %32, i32* %6
%33 = load i32, i32* %7
%34 = load i32, i32* %6
%35 = or i32 %34, %33
store i32 %35, i32* %6
%36 = load i32, i32* %6
%37 = sext i32 %36 to i64
%38 = load i64*, i64** %5
store i64 %37, i64* %38
store i32 2, i32* %3
br label %258
39: ; preds = %19
%40 = load i8*, i8** %4
%41 = getelementptr inbounds i8, i8* %40, i32 1
store i8* %41, i8** %4
%42 = load i32, i32* %6
%43 = shl i32 %42, 14
store i32 %43, i32* %6
%44 = load i8*, i8** %4
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = load i32, i32* %6
%48 = or i32 %47, %46
store i32 %48, i32* %6
%49 = load i32, i32* %6
%50 = and i32 %49, 128
%51 = icmp ne i32 %50, 0
br i1 %51, label %65, label %52
52: ; preds = %39
%53 = load i32, i32* %6
%54 = and i32 %53, 2080895
store i32 %54, i32* %6
%55 = load i32, i32* %7
%56 = and i32 %55, 127
store i32 %56, i32* %7
%57 = load i32, i32* %7
%58 = shl i32 %57, 7
store i32 %58, i32* %7
%59 = load i32, i32* %7
%60 = load i32, i32* %6
%61 = or i32 %60, %59
store i32 %61, i32* %6
%62 = load i32, i32* %6
%63 = sext i32 %62 to i64
%64 = load i64*, i64** %5
store i64 %63, i64* %64
store i32 3, i32* %3
br label %258
65: ; preds = %39
%66 = load i32, i32* %6
%67 = and i32 %66, 2080895
store i32 %67, i32* %6
%68 = load i8*, i8** %4
%69 = getelementptr inbounds i8, i8* %68, i32 1
store i8* %69, i8** %4
%70 = load i32, i32* %7
%71 = shl i32 %70, 14
store i32 %71, i32* %7
%72 = load i8*, i8** %4
%73 = load i8, i8* %72
%74 = zext i8 %73 to i32
%75 = load i32, i32* %7
%76 = or i32 %75, %74
store i32 %76, i32* %7
%77 = load i32, i32* %7
%78 = and i32 %77, 128
%79 = icmp ne i32 %78, 0
br i1 %79, label %91, label %80
80: ; preds = %65
%81 = load i32, i32* %7
%82 = and i32 %81, 2080895
store i32 %82, i32* %7
%83 = load i32, i32* %6
%84 = shl i32 %83, 7
store i32 %84, i32* %6
%85 = load i32, i32* %7
%86 = load i32, i32* %6
%87 = or i32 %86, %85
store i32 %87, i32* %6
%88 = load i32, i32* %6
%89 = sext i32 %88 to i64
%90 = load i64*, i64** %5
store i64 %89, i64* %90
store i32 4, i32* %3
br label %258
91: ; preds = %65
%92 = load i32, i32* %7
%93 = and i32 %92, 2080895
store i32 %93, i32* %7
%94 = load i32, i32* %6
store i32 %94, i32* %8
%95 = load i8*, i8** %4
%96 = getelementptr inbounds i8, i8* %95, i32 1
store i8* %96, i8** %4
%97 = load i32, i32* %6
%98 = shl i32 %97, 14
store i32 %98, i32* %6
%99 = load i8*, i8** %4
%100 = load i8, i8* %99
%101 = zext i8 %100 to i32
%102 = load i32, i32* %6
%103 = or i32 %102, %101
store i32 %103, i32* %6
%104 = load i32, i32* %6
%105 = and i32 %104, 128
%106 = icmp ne i32 %105, 0
br i1 %106, label %122, label %107
107: ; preds = %91
%108 = load i32, i32* %7
%109 = shl i32 %108, 7
store i32 %109, i32* %7
%110 = load i32, i32* %7
%111 = load i32, i32* %6
%112 = or i32 %111, %110
store i32 %112, i32* %6
%113 = load i32, i32* %8
%114 = ashr i32 %113, 18
store i32 %114, i32* %8
%115 = load i32, i32* %8
%116 = sext i32 %115 to i64
%117 = shl i64 %116, 32
%118 = load i32, i32* %6
%119 = sext i32 %118 to i64
%120 = or i64 %117, %119
%121 = load i64*, i64** %5
store i64 %120, i64* %121
store i32 5, i32* %3
br label %258
122: ; preds = %91
%123 = load i32, i32* %8
%124 = shl i32 %123, 7
store i32 %124, i32* %8
%125 = load i32, i32* %7
%126 = load i32, i32* %8
%127 = or i32 %126, %125
store i32 %127, i32* %8
%128 = load i8*, i8** %4
%129 = getelementptr inbounds i8, i8* %128, i32 1
store i8* %129, i8** %4
%130 = load i32, i32* %7
%131 = shl i32 %130, 14
store i32 %131, i32* %7
%132 = load i8*, i8** %4
%133 = load i8, i8* %132
%134 = zext i8 %133 to i32
%135 = load i32, i32* %7
%136 = or i32 %135, %134
store i32 %136, i32* %7
%137 = load i32, i32* %7
%138 = and i32 %137, 128
%139 = icmp ne i32 %138, 0
br i1 %139, label %157, label %140
140: ; preds = %122
%141 = load i32, i32* %6
%142 = and i32 %141, 2080895
store i32 %142, i32* %6
%143 = load i32, i32* %6
%144 = shl i32 %143, 7
store i32 %144, i32* %6
%145 = load i32, i32* %7
%146 = load i32, i32* %6
%147 = or i32 %146, %145
store i32 %147, i32* %6
%148 = load i32, i32* %8
%149 = ashr i32 %148, 18
store i32 %149, i32* %8
%150 = load i32, i32* %8
%151 = sext i32 %150 to i64
%152 = shl i64 %151, 32
%153 = load i32, i32* %6
%154 = sext i32 %153 to i64
%155 = or i64 %152, %154
%156 = load i64*, i64** %5
store i64 %155, i64* %156
store i32 6, i32* %3
br label %258
157: ; preds = %122
%158 = load i8*, i8** %4
%159 = getelementptr inbounds i8, i8* %158, i32 1
store i8* %159, i8** %4
%160 = load i32, i32* %6
%161 = shl i32 %160, 14
store i32 %161, i32* %6
%162 = load i8*, i8** %4
%163 = load i8, i8* %162
%164 = zext i8 %163 to i32
%165 = load i32, i32* %6
%166 = or i32 %165, %164
store i32 %166, i32* %6
%167 = load i32, i32* %6
%168 = and i32 %167, 128
%169 = icmp ne i32 %168, 0
br i1 %169, label %189, label %170
170: ; preds = %157
%171 = load i32, i32* %6
%172 = and i32 %171, -266354561
store i32 %172, i32* %6
%173 = load i32, i32* %7
%174 = and i32 %173, 2080895
store i32 %174, i32* %7
%175 = load i32, i32* %7
%176 = shl i32 %175, 7
store i32 %176, i32* %7
%177 = load i32, i32* %7
%178 = load i32, i32* %6
%179 = or i32 %178, %177
store i32 %179, i32* %6
%180 = load i32, i32* %8
%181 = ashr i32 %180, 11
store i32 %181, i32* %8
%182 = load i32, i32* %8
%183 = sext i32 %182 to i64
%184 = shl i64 %183, 32
%185 = load i32, i32* %6
%186 = sext i32 %185 to i64
%187 = or i64 %184, %186
%188 = load i64*, i64** %5
store i64 %187, i64* %188
store i32 7, i32* %3
br label %258
189: ; preds = %157
%190 = load i32, i32* %6
%191 = and i32 %190, 2080895
store i32 %191, i32* %6
%192 = load i8*, i8** %4
%193 = getelementptr inbounds i8, i8* %192, i32 1
store i8* %193, i8** %4
%194 = load i32, i32* %7
%195 = shl i32 %194, 14
store i32 %195, i32* %7
%196 = load i8*, i8** %4
%197 = load i8, i8* %196
%198 = zext i8 %197 to i32
%199 = load i32, i32* %7
%200 = or i32 %199, %198
store i32 %200, i32* %7
%201 = load i32, i32* %7
%202 = and i32 %201, 128
%203 = icmp ne i32 %202, 0
br i1 %203, label %221, label %204
204: ; preds = %189
%205 = load i32, i32* %7
%206 = and i32 %205, -266354561
store i32 %206, i32* %7
%207 = load i32, i32* %6
%208 = shl i32 %207, 7
store i32 %208, i32* %6
%209 = load i32, i32* %7
%210 = load i32, i32* %6
%211 = or i32 %210, %209
store i32 %211, i32* %6
%212 = load i32, i32* %8
%213 = ashr i32 %212, 4
store i32 %213, i32* %8
%214 = load i32, i32* %8
%215 = sext i32 %214 to i64
%216 = shl i64 %215, 32
%217 = load i32, i32* %6
%218 = sext i32 %217 to i64
%219 = or i64 %216, %218
%220 = load i64*, i64** %5
store i64 %219, i64* %220
store i32 8, i32* %3
br label %258
221: ; preds = %189
%222 = load i8*, i8** %4
%223 = getelementptr inbounds i8, i8* %222, i32 1
store i8* %223, i8** %4
%224 = load i32, i32* %6
%225 = shl i32 %224, 15
store i32 %225, i32* %6
%226 = load i8*, i8** %4
%227 = load i8, i8* %226
%228 = zext i8 %227 to i32
%229 = load i32, i32* %6
%230 = or i32 %229, %228
store i32 %230, i32* %6
%231 = load i32, i32* %7
%232 = and i32 %231, 2080895
store i32 %232, i32* %7
%233 = load i32, i32* %7
%234 = shl i32 %233, 8
store i32 %234, i32* %7
%235 = load i32, i32* %7
%236 = load i32, i32* %6
%237 = or i32 %236, %235
store i32 %237, i32* %6
%238 = load i32, i32* %8
%239 = shl i32 %238, 4
store i32 %239, i32* %8
%240 = load i8*, i8** %4
%241 = getelementptr inbounds i8, i8* %240, i64 -4
%242 = load i8, i8* %241
%243 = zext i8 %242 to i32
store i32 %243, i32* %7
%244 = load i32, i32* %7
%245 = and i32 %244, 127
store i32 %245, i32* %7
%246 = load i32, i32* %7
%247 = ashr i32 %246, 3
store i32 %247, i32* %7
%248 = load i32, i32* %7
%249 = load i32, i32* %8
%250 = or i32 %249, %248
store i32 %250, i32* %8
%251 = load i32, i32* %8
%252 = sext i32 %251 to i64
%253 = shl i64 %252, 32
%254 = load i32, i32* %6
%255 = sext i32 %254 to i64
%256 = or i64 %253, %255
%257 = load i64*, i64** %5
store i64 %256, i64* %257
store i32 9, i32* %3
br label %258
258: ; preds = %221, %204, %170, %140, %107, %80, %52, %28, %15
%259 = load i32, i32* %3
ret i32 %259
}

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