#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*/ free(unsigned char *);
unsigned char *malloc(size_t);
scalar_t__ strdup(char *);
unsigned char *base64_dec(const char *in, size_t insz, size_t *outsz) {
  static const int revalphabet[] = {
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57,
      58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0,  1,  2,  3,  4,  5,  6,
      7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
      25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
      37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1};
  size_t i, o;
  int tmp, digit;
  unsigned char *out;
  if (insz % 4)
    return NULL;
  if (insz == 0) {
    *outsz = 0;
    return (unsigned char *)strdup("");
  }
  if (in[insz - 2] == '=')
    *outsz = ((insz / 4) * 3) - 2;
  else if (in[insz - 1] == '=')
    *outsz = ((insz / 4) * 3) - 1;
  else
    *outsz = (insz / 4) * 3;
  if (!(out = malloc((*outsz) + 1))) {
    *outsz = 0;
    return NULL;
  }
  for (i = 0, o = 0; i < insz; i += 4, o += 3) {
    if ((digit = revalphabet[(unsigned char)in[i]]) == -1)
      goto leave;
    tmp = digit << 18;
    if ((digit = revalphabet[(unsigned char)in[i + 1]]) == -1)
      goto leave;
    tmp += digit << 12;
    if ((digit = revalphabet[(unsigned char)in[i + 2]]) == -1) {
      if ((i == insz - 4) && (in[i + 2] == '='))
        digit = 0;
      else
        goto leave;
    }
    tmp += digit << 6;
    if ((digit = revalphabet[(unsigned char)in[i + 3]]) == -1) {
      if ((i == insz - 4) && (in[i + 3] == '='))
        digit = 0;
      else
        goto leave;
    }
    tmp += digit;
    out[o] = (tmp >> 16) & 0xff;
    if (o + 1 < *outsz)
      out[o + 1] = (tmp >> 8) & 0xff;
    if (o + 2 < *outsz)
      out[o + 2] = tmp & 0xff;
  }
  out[*outsz] = '\0';
  return out;
leave:
  free(out);
  return NULL;
}


x86 assembly (clang, -O0):
<base64_dec>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x18(%rbp),%rax
and    $0x3,%rax
cmp    $0x0,%rax
je     1163 <base64_dec+0x33>
movq   $0x0,-0x8(%rbp)
jmp    146d <base64_dec+0x33d>
cmpq   $0x0,-0x18(%rbp)
jne    118e <base64_dec+0x5e>
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
lea    0x1280(%rip),%rdi
call   1050 <strdup@plt>
mov    %rax,-0x8(%rbp)
jmp    146d <base64_dec+0x33d>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x2,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3d,%eax
jne    11c3 <base64_dec+0x93>
mov    -0x18(%rbp),%rax
shr    $0x2,%rax
imul   $0x3,%rax,%rcx
sub    $0x2,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    1210 <base64_dec+0xe0>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3d,%eax
jne    11f8 <base64_dec+0xc8>
mov    -0x18(%rbp),%rax
shr    $0x2,%rax
imul   $0x3,%rax,%rcx
sub    $0x1,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    120b <base64_dec+0xdb>
mov    -0x18(%rbp),%rax
shr    $0x2,%rax
imul   $0x3,%rax,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    1210 <base64_dec+0xe0>
mov    -0x20(%rbp),%rax
mov    (%rax),%rdi
add    $0x1,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
jne    1246 <base64_dec+0x116>
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    146d <base64_dec+0x33d>
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1440 <base64_dec+0x310>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,%ecx
lea    0xd87(%rip),%rax
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
cmp    $0xffffffff,%eax
jne    128d <base64_dec+0x15d>
jmp    145c <base64_dec+0x32c>
mov    -0x38(%rbp),%eax
shl    $0x12,%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x1(%rax,%rcx,1),%eax
mov    %eax,%ecx
lea    0xd54(%rip),%rax
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
cmp    $0xffffffff,%eax
jne    12c0 <base64_dec+0x190>
jmp    145c <base64_dec+0x32c>
mov    -0x38(%rbp),%eax
shl    $0xc,%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x2(%rax,%rcx,1),%eax
mov    %eax,%ecx
lea    0xd1e(%rip),%rax
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
cmp    $0xffffffff,%eax
jne    1332 <base64_dec+0x202>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x4,%rcx
cmp    %rcx,%rax
jne    1328 <base64_dec+0x1f8>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl 0x2(%rax,%rcx,1),%eax
cmp    $0x3d,%eax
jne    1328 <base64_dec+0x1f8>
movl   $0x0,-0x38(%rbp)
jmp    132d <base64_dec+0x1fd>
jmp    145c <base64_dec+0x32c>
jmp    1332 <base64_dec+0x202>
mov    -0x38(%rbp),%eax
shl    $0x6,%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x3(%rax,%rcx,1),%eax
mov    %eax,%ecx
lea    0xcac(%rip),%rax
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
cmp    $0xffffffff,%eax
jne    13a4 <base64_dec+0x274>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x4,%rcx
cmp    %rcx,%rax
jne    139a <base64_dec+0x26a>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl 0x3(%rax,%rcx,1),%eax
cmp    $0x3d,%eax
jne    139a <base64_dec+0x26a>
movl   $0x0,-0x38(%rbp)
jmp    139f <base64_dec+0x26f>
jmp    145c <base64_dec+0x32c>
jmp    13a4 <base64_dec+0x274>
mov    -0x38(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
sar    $0x10,%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x40(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%rax
jae    13f3 <base64_dec+0x2c3>
mov    -0x34(%rbp),%eax
sar    $0x8,%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x40(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %dl,0x1(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
add    $0x2,%rax
mov    -0x20(%rbp),%rcx
cmp    (%rcx),%rax
jae    141e <base64_dec+0x2ee>
mov    -0x34(%rbp),%eax
and    $0xff,%eax
mov    %al,%dl
mov    -0x40(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %dl,0x2(%rax,%rcx,1)
jmp    1423 <base64_dec+0x2f3>
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x30(%rbp)
jmp    1256 <base64_dec+0x126>
mov    -0x40(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    146d <base64_dec+0x33d>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<base64_dec>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
test   $0x3,%r14b
je     1155 <base64_dec+0x25>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rdx,%r15
test   %r14,%r14
je     1179 <base64_dec+0x49>
mov    %rdi,%r13
cmpb   $0x3d,-0x2(%r14,%rdi,1)
jne    118e <base64_dec+0x5e>
mov    %r14,%rax
shr    $0x2,%rax
lea    (%rax,%rax,2),%r12
add    $0xfffffffffffffffe,%r12
jmp    11a7 <base64_dec+0x77>
movq   $0x0,(%r15)
lea    0x1279(%rip),%rdi
call   1050 <strdup@plt>
jmp    1146 <base64_dec+0x16>
xor    %eax,%eax
cmpb   $0x3d,-0x1(%r14,%r13,1)
sete   %al
mov    %r14,%rcx
shr    $0x2,%rcx
lea    (%rcx,%rcx,2),%r12
sub    %rax,%r12
mov    %r12,(%r15)
lea    0x1(%r12),%rdi
call   1040 <malloc@plt>
test   %rax,%rax
je     1289 <base64_dec+0x159>
lea    -0x4(%r14),%r8
mov    $0x2,%ebp
xor    %esi,%esi
lea    0xe31(%rip),%r9
jmp    11f1 <base64_dec+0xc1>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x4,%rsi
add    $0x3,%rbp
cmp    %r14,%rsi
jae    1295 <base64_dec+0x165>
movzbl 0x0(%r13,%rsi,1),%ecx
mov    (%r9,%rcx,4),%edi
cmp    $0xffffffff,%edi
je     127c <base64_dec+0x14c>
movzbl 0x1(%r13,%rsi,1),%ecx
mov    (%r9,%rcx,4),%ebx
cmp    $0xffffffff,%ebx
je     127c <base64_dec+0x14c>
movzbl 0x2(%r13,%rsi,1),%edx
mov    (%r9,%rdx,4),%ecx
cmp    $0xffffffff,%ecx
jne    122a <base64_dec+0xfa>
cmp    %rsi,%r8
jne    127c <base64_dec+0x14c>
xor    %ecx,%ecx
cmp    $0x3d,%dl
jne    127c <base64_dec+0x14c>
movzbl 0x3(%r13,%rsi,1),%r10d
mov    (%r9,%r10,4),%edx
cmp    $0xffffffff,%edx
jne    1246 <base64_dec+0x116>
cmp    %rsi,%r8
jne    127c <base64_dec+0x14c>
xor    %edx,%edx
cmp    $0x3d,%r10b
jne    127c <base64_dec+0x14c>
shl    $0x12,%edi
shl    $0xc,%ebx
add    %edi,%ebx
shl    $0x6,%ecx
add    %ebx,%ecx
add    %edx,%ecx
mov    %ecx,%edx
shr    $0x10,%edx
mov    %dl,-0x2(%rax,%rbp,1)
lea    -0x1(%rbp),%rdx
cmp    %r12,%rdx
jae    126b <base64_dec+0x13b>
mov    %ch,-0x1(%rax,%rbp,1)
cmp    %r12,%rbp
jae    11e0 <base64_dec+0xb0>
mov    %cl,(%rax,%rbp,1)
jmp    11e0 <base64_dec+0xb0>
mov    %rax,%rdi
call   1030 <free@plt>
jmp    1144 <base64_dec+0x14>
movq   $0x0,(%r15)
jmp    1144 <base64_dec+0x14>
movb   $0x0,(%rax,%r12,1)
jmp    1146 <base64_dec+0x16>

LLVM IR (-O0):
@base64_dec.revalphabet = internal constant [256 x i32] [i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 62, i32 -1, i32 -1, i32 -1, i32 63, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1]
@.str = [1 x i8] zeroinitializer
define i8* @base64_dec(i8* %0, i64 %1, i64* %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i64
%7 = alloca i64*
%8 = alloca i64
%9 = alloca i64
%10 = alloca i32
%11 = alloca i32
%12 = alloca i8*
store i8* %0, i8** %5
store i64 %1, i64* %6
store i64* %2, i64** %7
%13 = load i64, i64* %6
%14 = urem i64 %13, 4
%15 = icmp ne i64 %14, 0
br i1 %15, label %16, label %17
16: ; preds = %3
store i8* null, i8** %4
br label %208
17: ; preds = %3
%18 = load i64, i64* %6
%19 = icmp eq i64 %18, 0
br i1 %19, label %20, label %24
20: ; preds = %17
%21 = load i64*, i64** %7
store i64 0, i64* %21
%22 = call i64 @strdup(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0))
%23 = inttoptr i64 %22 to i8*
store i8* %23, i8** %4
br label %208
24: ; preds = %17
%25 = load i8*, i8** %5
%26 = load i64, i64* %6
%27 = sub i64 %26, 2
%28 = getelementptr inbounds i8, i8* %25, i64 %27
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp eq i32 %30, 61
br i1 %31, label %32, label %38
32: ; preds = %24
%33 = load i64, i64* %6
%34 = udiv i64 %33, 4
%35 = mul i64 %34, 3
%36 = sub i64 %35, 2
%37 = load i64*, i64** %7
store i64 %36, i64* %37
br label %58
38: ; preds = %24
%39 = load i8*, i8** %5
%40 = load i64, i64* %6
%41 = sub i64 %40, 1
%42 = getelementptr inbounds i8, i8* %39, i64 %41
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = icmp eq i32 %44, 61
br i1 %45, label %46, label %52
46: ; preds = %38
%47 = load i64, i64* %6
%48 = udiv i64 %47, 4
%49 = mul i64 %48, 3
%50 = sub i64 %49, 1
%51 = load i64*, i64** %7
store i64 %50, i64* %51
br label %57
52: ; preds = %38
%53 = load i64, i64* %6
%54 = udiv i64 %53, 4
%55 = mul i64 %54, 3
%56 = load i64*, i64** %7
store i64 %55, i64* %56
br label %57
57: ; preds = %52, %46
br label %58
58: ; preds = %57, %32
%59 = load i64*, i64** %7
%60 = load i64, i64* %59
%61 = add i64 %60, 1
%62 = call i8* @malloc(i64 %61)
store i8* %62, i8** %12
%63 = icmp ne i8* %62, null
br i1 %63, label %66, label %64
64: ; preds = %58
%65 = load i64*, i64** %7
store i64 0, i64* %65
store i8* null, i8** %4
br label %208
66: ; preds = %58
store i64 0, i64* %8
store i64 0, i64* %9
br label %67
67: ; preds = %194, %66
%68 = load i64, i64* %8
%69 = load i64, i64* %6
%70 = icmp ult i64 %68, %69
br i1 %70, label %71, label %199
71: ; preds = %67
%72 = load i8*, i8** %5
%73 = load i64, i64* %8
%74 = getelementptr inbounds i8, i8* %72, i64 %73
%75 = load i8, i8* %74
%76 = zext i8 %75 to i64
%77 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %76
%78 = load i32, i32* %77
store i32 %78, i32* %11
%79 = icmp eq i32 %78, -1
br i1 %79, label %80, label %81
80: ; preds = %71
br label %205
81: ; preds = %71
%82 = load i32, i32* %11
%83 = shl i32 %82, 18
store i32 %83, i32* %10
%84 = load i8*, i8** %5
%85 = load i64, i64* %8
%86 = add i64 %85, 1
%87 = getelementptr inbounds i8, i8* %84, i64 %86
%88 = load i8, i8* %87
%89 = zext i8 %88 to i64
%90 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %89
%91 = load i32, i32* %90
store i32 %91, i32* %11
%92 = icmp eq i32 %91, -1
br i1 %92, label %93, label %94
93: ; preds = %81
br label %205
94: ; preds = %81
%95 = load i32, i32* %11
%96 = shl i32 %95, 12
%97 = load i32, i32* %10
%98 = add nsw i32 %97, %96
store i32 %98, i32* %10
%99 = load i8*, i8** %5
%100 = load i64, i64* %8
%101 = add i64 %100, 2
%102 = getelementptr inbounds i8, i8* %99, i64 %101
%103 = load i8, i8* %102
%104 = zext i8 %103 to i64
%105 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %104
%106 = load i32, i32* %105
store i32 %106, i32* %11
%107 = icmp eq i32 %106, -1
br i1 %107, label %108, label %124
108: ; preds = %94
%109 = load i64, i64* %8
%110 = load i64, i64* %6
%111 = sub i64 %110, 4
%112 = icmp eq i64 %109, %111
br i1 %112, label %113, label %122
113: ; preds = %108
%114 = load i8*, i8** %5
%115 = load i64, i64* %8
%116 = add i64 %115, 2
%117 = getelementptr inbounds i8, i8* %114, i64 %116
%118 = load i8, i8* %117
%119 = sext i8 %118 to i32
%120 = icmp eq i32 %119, 61
br i1 %120, label %121, label %122
121: ; preds = %113
store i32 0, i32* %11
br label %123
122: ; preds = %113, %108
br label %205
123: ; preds = %121
br label %124
124: ; preds = %123, %94
%125 = load i32, i32* %11
%126 = shl i32 %125, 6
%127 = load i32, i32* %10
%128 = add nsw i32 %127, %126
store i32 %128, i32* %10
%129 = load i8*, i8** %5
%130 = load i64, i64* %8
%131 = add i64 %130, 3
%132 = getelementptr inbounds i8, i8* %129, i64 %131
%133 = load i8, i8* %132
%134 = zext i8 %133 to i64
%135 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %134
%136 = load i32, i32* %135
store i32 %136, i32* %11
%137 = icmp eq i32 %136, -1
br i1 %137, label %138, label %154
138: ; preds = %124
%139 = load i64, i64* %8
%140 = load i64, i64* %6
%141 = sub i64 %140, 4
%142 = icmp eq i64 %139, %141
br i1 %142, label %143, label %152
143: ; preds = %138
%144 = load i8*, i8** %5
%145 = load i64, i64* %8
%146 = add i64 %145, 3
%147 = getelementptr inbounds i8, i8* %144, i64 %146
%148 = load i8, i8* %147
%149 = sext i8 %148 to i32
%150 = icmp eq i32 %149, 61
br i1 %150, label %151, label %152
151: ; preds = %143
store i32 0, i32* %11
br label %153
152: ; preds = %143, %138
br label %205
153: ; preds = %151
br label %154
154: ; preds = %153, %124
%155 = load i32, i32* %11
%156 = load i32, i32* %10
%157 = add nsw i32 %156, %155
store i32 %157, i32* %10
%158 = load i32, i32* %10
%159 = ashr i32 %158, 16
%160 = and i32 %159, 255
%161 = trunc i32 %160 to i8
%162 = load i8*, i8** %12
%163 = load i64, i64* %9
%164 = getelementptr inbounds i8, i8* %162, i64 %163
store i8 %161, i8* %164
%165 = load i64, i64* %9
%166 = add i64 %165, 1
%167 = load i64*, i64** %7
%168 = load i64, i64* %167
%169 = icmp ult i64 %166, %168
br i1 %169, label %170, label %179
170: ; preds = %154
%171 = load i32, i32* %10
%172 = ashr i32 %171, 8
%173 = and i32 %172, 255
%174 = trunc i32 %173 to i8
%175 = load i8*, i8** %12
%176 = load i64, i64* %9
%177 = add i64 %176, 1
%178 = getelementptr inbounds i8, i8* %175, i64 %177
store i8 %174, i8* %178
br label %179
179: ; preds = %170, %154
%180 = load i64, i64* %9
%181 = add i64 %180, 2
%182 = load i64*, i64** %7
%183 = load i64, i64* %182
%184 = icmp ult i64 %181, %183
br i1 %184, label %185, label %193
185: ; preds = %179
%186 = load i32, i32* %10
%187 = and i32 %186, 255
%188 = trunc i32 %187 to i8
%189 = load i8*, i8** %12
%190 = load i64, i64* %9
%191 = add i64 %190, 2
%192 = getelementptr inbounds i8, i8* %189, i64 %191
store i8 %188, i8* %192
br label %193
193: ; preds = %185, %179
br label %194
194: ; preds = %193
%195 = load i64, i64* %8
%196 = add i64 %195, 4
store i64 %196, i64* %8
%197 = load i64, i64* %9
%198 = add i64 %197, 3
store i64 %198, i64* %9
br label %67
199: ; preds = %67
%200 = load i8*, i8** %12
%201 = load i64*, i64** %7
%202 = load i64, i64* %201
%203 = getelementptr inbounds i8, i8* %200, i64 %202
store i8 0, i8* %203
%204 = load i8*, i8** %12
store i8* %204, i8** %4
br label %208
205: ; preds = %152, %122, %93, %80
%206 = load i8*, i8** %12
%207 = call i32 @free(i8* %206)
store i8* null, i8** %4
br label %208
208: ; preds = %205, %199, %64, %20, %16
%209 = load i8*, i8** %4
ret i8* %209
}

LLVM IR (-O2):
@base64_dec.revalphabet = internal unnamed_addr constant [256 x i32] [i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 62, i32 -1, i32 -1, i32 -1, i32 63, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1]
@.str = [1 x i8] zeroinitializer
define i8* @base64_dec(i8* nocapture %0, i64 %1, i64* nocapture %2) {
%4 = and i64 %1, 3
%5 = icmp eq i64 %4, 0
br i1 %5, label %6, label %110
6: ; preds = %3
%7 = icmp eq i64 %1, 0
br i1 %7, label %8, label %11
8: ; preds = %6
store i64 0, i64* %2
%9 = tail call i64 @strdup(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0))
%10 = inttoptr i64 %9 to i8*
br label %110
11: ; preds = %6
%12 = add i64 %1, -2
%13 = getelementptr inbounds i8, i8* %0, i64 %12
%14 = load i8, i8* %13
%15 = icmp eq i8 %14, 61
br i1 %15, label %16, label %20
16: ; preds = %11
%17 = lshr i64 %1, 2
%18 = mul nuw i64 %17, 3
%19 = add i64 %18, -2
br label %29
20: ; preds = %11
%21 = add i64 %1, -1
%22 = getelementptr inbounds i8, i8* %0, i64 %21
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, 61
%25 = lshr i64 %1, 2
%26 = mul nuw i64 %25, 3
%27 = sext i1 %24 to i64
%28 = add i64 %26, %27
br label %29
29: ; preds = %20, %16
%30 = phi i64 [ %19, %16 ], [ %28, %20 ]
store i64 %30, i64* %2
%31 = add i64 %30, 1
%32 = tail call i8* @malloc(i64 %31)
%33 = icmp eq i8* %32, null
br i1 %33, label %36, label %34
34: ; preds = %29
%35 = add i64 %1, -4
br label %37
36: ; preds = %29
store i64 0, i64* %2
br label %110
37: ; preds = %34, %102
%38 = phi i64 [ 0, %34 ], [ %104, %102 ]
%39 = phi i64 [ 0, %34 ], [ %103, %102 ]
%40 = getelementptr inbounds i8, i8* %0, i64 %39
%41 = load i8, i8* %40
%42 = zext i8 %41 to i64
%43 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %42
%44 = load i32, i32* %43
%45 = icmp eq i32 %44, -1
br i1 %45, label %108, label %46
46: ; preds = %37
%47 = or i64 %39, 1
%48 = getelementptr inbounds i8, i8* %0, i64 %47
%49 = load i8, i8* %48
%50 = zext i8 %49 to i64
%51 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %50
%52 = load i32, i32* %51
%53 = icmp eq i32 %52, -1
br i1 %53, label %108, label %54
54: ; preds = %46
%55 = shl i32 %44, 18
%56 = shl i32 %52, 12
%57 = add nsw i32 %56, %55
%58 = or i64 %39, 2
%59 = getelementptr inbounds i8, i8* %0, i64 %58
%60 = load i8, i8* %59
%61 = zext i8 %60 to i64
%62 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %61
%63 = load i32, i32* %62
%64 = icmp eq i32 %63, -1
br i1 %64, label %65, label %69
65: ; preds = %54
%66 = icmp eq i64 %39, %35
%67 = icmp eq i8 %60, 61
%68 = select i1 %66, i1 %67, i1 false
br i1 %68, label %69, label %108
69: ; preds = %65, %54
%70 = phi i32 [ %63, %54 ], [ 0, %65 ]
%71 = shl i32 %70, 6
%72 = add nsw i32 %57, %71
%73 = or i64 %39, 3
%74 = getelementptr inbounds i8, i8* %0, i64 %73
%75 = load i8, i8* %74
%76 = zext i8 %75 to i64
%77 = getelementptr inbounds [256 x i32], [256 x i32]* @base64_dec.revalphabet, i64 0, i64 %76
%78 = load i32, i32* %77
%79 = icmp eq i32 %78, -1
br i1 %79, label %80, label %84
80: ; preds = %69
%81 = icmp eq i64 %39, %35
%82 = icmp eq i8 %75, 61
%83 = select i1 %81, i1 %82, i1 false
br i1 %83, label %84, label %108
84: ; preds = %80, %69
%85 = phi i32 [ %78, %69 ], [ 0, %80 ]
%86 = add nsw i32 %72, %85
%87 = lshr i32 %86, 16
%88 = trunc i32 %87 to i8
%89 = getelementptr inbounds i8, i8* %32, i64 %38
store i8 %88, i8* %89
%90 = add i64 %38, 1
%91 = icmp ult i64 %90, %30
br i1 %91, label %92, label %96
92: ; preds = %84
%93 = lshr i32 %86, 8
%94 = trunc i32 %93 to i8
%95 = getelementptr inbounds i8, i8* %32, i64 %90
store i8 %94, i8* %95
br label %96
96: ; preds = %92, %84
%97 = add i64 %38, 2
%98 = icmp ult i64 %97, %30
br i1 %98, label %99, label %102
99: ; preds = %96
%100 = trunc i32 %86 to i8
%101 = getelementptr inbounds i8, i8* %32, i64 %97
store i8 %100, i8* %101
br label %102
102: ; preds = %96, %99
%103 = add i64 %39, 4
%104 = add i64 %38, 3
%105 = icmp ult i64 %103, %1
br i1 %105, label %37, label %106
106: ; preds = %102
%107 = getelementptr inbounds i8, i8* %32, i64 %30
store i8 0, i8* %107
br label %110
108: ; preds = %80, %65, %46, %37
%109 = tail call i32 @free(i8* %32)
br label %110
110: ; preds = %3, %108, %106, %36, %8
%111 = phi i8* [ %10, %8 ], [ null, %108 ], [ %32, %106 ], [ null, %36 ], [ null, %3 ]
ret i8* %111
}