char *cburldecode(const char *str, int *sp) {
  char *buf, *wp;
  unsigned char c;
  do {
    ((((buf)) = malloc((strlen(str)) + 1)) ? ((buf))
                                           : cbmyfatal("out of memory"));
    memcpy((buf), (str), (strlen(str)));
    (buf)[(strlen(str))] = '\0';
  } while (0);
  wp = buf;
  while (*str != '\0') {
    if (*str == '%') {
      str++;
      if (((str[0] >= '0' && str[0] <= '9') ||
           (str[0] >= 'A' && str[0] <= 'F') ||
           (str[0] >= 'a' && str[0] <= 'f')) &&
          ((str[1] >= '0' && str[1] <= '9') ||
           (str[1] >= 'A' && str[1] <= 'F') ||
           (str[1] >= 'a' && str[1] <= 'f'))) {
        c = *str;
        if (c >= 'A' && c <= 'Z')
          c += 'a' - 'A';
        if (c >= 'a' && c <= 'z') {
          *wp = c - 'a' + 10;
        } else {
          *wp = c - '0';
        }
        *wp *= 0x10;
        str++;
        c = *str;
        if (c >= 'A' && c <= 'Z')
          c += 'a' - 'A';
        if (c >= 'a' && c <= 'z') {
          *wp += c - 'a' + 10;
        } else {
          *wp += c - '0';
        }
        str++;
        wp++;
      } else {
        break;
      }
    } else if (*str == '+') {
      *wp = ' ';
      str++;
      wp++;
    } else {
      *wp = *str;
      str++;
      wp++;
    }
  }
  *wp = '\0';
  if (sp)
    *sp = wp - buf;
  return buf;
}


x86 assembly (clang, -O0):
<cburldecode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,%rdi
add    $0x1,%rdi
call   1050 <malloc@plt>
mov    %rax,-0x18(%rbp)
cmp    $0x0,%rax
je     117c <cburldecode+0x3c>
mov    -0x18(%rbp),%rax
jmp    118c <cburldecode+0x4c>
lea    0xe7d(%rip),%rdi
mov    $0x0,%al
call   1060 <cbmyfatal@plt>
cltq
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    -0x40(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    %rax,%rdx
call   1040 <memcpy@plt>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     144c <cburldecode+0x30c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x25,%eax
jne    13ea <cburldecode+0x2aa>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1225 <cburldecode+0xe5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    1265 <cburldecode+0x125>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     1245 <cburldecode+0x105>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x46,%eax
jle    1265 <cburldecode+0x125>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     13e0 <cburldecode+0x2a0>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     13e0 <cburldecode+0x2a0>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     1287 <cburldecode+0x147>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x39,%eax
jle    12cb <cburldecode+0x18b>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x41,%eax
jl     12a9 <cburldecode+0x169>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x46,%eax
jle    12cb <cburldecode+0x18b>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x61,%eax
jl     13e0 <cburldecode+0x2a0>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x66,%eax
jg     13e0 <cburldecode+0x2a0>
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x21(%rbp)
movzbl -0x21(%rbp),%eax
cmp    $0x41,%eax
jl     12f8 <cburldecode+0x1b8>
movzbl -0x21(%rbp),%eax
cmp    $0x5a,%eax
jg     12f8 <cburldecode+0x1b8>
movzbl -0x21(%rbp),%eax
add    $0x20,%eax
mov    %al,-0x21(%rbp)
movzbl -0x21(%rbp),%eax
cmp    $0x61,%eax
jl     1329 <cburldecode+0x1e9>
movzbl -0x21(%rbp),%eax
cmp    $0x7a,%eax
jg     1329 <cburldecode+0x1e9>
movzbl -0x21(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
jmp    1338 <cburldecode+0x1f8>
movzbl -0x21(%rbp),%eax
sub    $0x30,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
shl    $0x4,%ecx
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x21(%rbp)
movzbl -0x21(%rbp),%eax
cmp    $0x41,%eax
jl     137d <cburldecode+0x23d>
movzbl -0x21(%rbp),%eax
cmp    $0x5a,%eax
jg     137d <cburldecode+0x23d>
movzbl -0x21(%rbp),%eax
add    $0x20,%eax
mov    %al,-0x21(%rbp)
movzbl -0x21(%rbp),%eax
cmp    $0x61,%eax
jl     13b1 <cburldecode+0x271>
movzbl -0x21(%rbp),%eax
cmp    $0x7a,%eax
jg     13b1 <cburldecode+0x271>
movzbl -0x21(%rbp),%edx
sub    $0x61,%edx
add    $0xa,%edx
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
add    %edx,%ecx
mov    %cl,(%rax)
jmp    13c3 <cburldecode+0x283>
movzbl -0x21(%rbp),%edx
sub    $0x30,%edx
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
add    %edx,%ecx
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    13e5 <cburldecode+0x2a5>
jmp    144c <cburldecode+0x30c>
jmp    1447 <cburldecode+0x307>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    141e <cburldecode+0x2de>
mov    -0x20(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1442 <cburldecode+0x302>
mov    -0x8(%rbp),%rax
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1447 <cburldecode+0x307>
jmp    11d9 <cburldecode+0x99>
mov    -0x20(%rbp),%rax
movb   $0x0,(%rax)
cmpq   $0x0,-0x10(%rbp)
je     1471 <cburldecode+0x331>
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cburldecode>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
call   1030 <strlen@plt>
lea    0x1(%rax),%rdi
call   1050 <malloc@plt>
mov    %rax,%r15
test   %rax,%rax
jne    1172 <cburldecode+0x32>
lea    0xe95(%rip),%rdi
xor    %eax,%eax
call   1060 <cbmyfatal@plt>
mov    %rbx,%rdi
call   1030 <strlen@plt>
mov    %rax,%r12
mov    %r15,%rdi
mov    %rbx,%rsi
mov    %rax,%rdx
call   1040 <memcpy@plt>
movb   $0x0,(%r15,%r12,1)
xor    %eax,%eax
mov    $0xa9,%r8d
movabs $0x3f0000003f,%r9
jmp    11be <cburldecode+0x7e>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    $0x20,%dil
mov    %dil,(%r15,%rax,1)
add    %rsi,%rbx
add    $0x1,%rax
movzbl (%rbx),%edi
cmp    $0x25,%dil
je     11e0 <cburldecode+0xa0>
mov    $0x1,%esi
cmp    $0x2b,%dil
je     11b0 <cburldecode+0x70>
test   %dil,%dil
jne    11b3 <cburldecode+0x73>
jmp    127b <cburldecode+0x13b>
nopl   0x0(%rax)
movzbl 0x1(%rbx),%edi
lea    -0x30(%rdi),%ecx
cmp    $0xa,%cl
jb     1203 <cburldecode+0xc3>
lea    -0x41(%rdi),%esi
cmp    $0x25,%sil
ja     127b <cburldecode+0x13b>
movzbl %sil,%ecx
bt     %rcx,%r9
jae    127b <cburldecode+0x13b>
movzbl 0x2(%rbx),%esi
lea    -0x30(%rsi),%ecx
cmp    $0xa,%cl
jb     1220 <cburldecode+0xe0>
lea    -0x41(%rsi),%ecx
cmp    $0x25,%cl
ja     127b <cburldecode+0x13b>
movzbl %cl,%ecx
bt     %rcx,%r9
jae    127b <cburldecode+0x13b>
lea    -0x41(%rdi),%ecx
lea    0x20(%rdi),%edx
cmp    $0x1a,%cl
movzbl %dil,%ecx
movzbl %dl,%edx
cmovae %ecx,%edx
lea    -0x61(%rdx),%ecx
xor    %edi,%edi
cmp    $0x1a,%cl
setb   %dil
lea    (%rdi,%rdi,8),%edi
add    %dl,%dil
shl    $0x4,%dil
lea    -0x41(%rsi),%ecx
lea    0x20(%rsi),%edx
cmp    $0x1a,%cl
movzbl %sil,%ecx
movzbl %dl,%edx
cmovae %ecx,%edx
lea    -0x61(%rdx),%ecx
cmp    $0x1a,%cl
mov    $0xd0,%ecx
cmovb  %r8d,%ecx
add    %dl,%dil
add    %cl,%dil
mov    $0x3,%esi
jmp    11b3 <cburldecode+0x73>
movb   $0x0,(%r15,%rax,1)
test   %r14,%r14
je     1288 <cburldecode+0x148>
mov    %eax,(%r14)
mov    %r15,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
@.str = [14 x i8] c"out of memory\00"
define i8* @cburldecode(i8* nocapture %0, i32* writeonly %1) {
%3 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%4 = add i64 %3, 1
%5 = tail call i8* @malloc(i64 %4)
%6 = icmp eq i8* %5, null
br i1 %6, label %7, label %9
7: ; preds = %2
%8 = tail call i32 (i8*, ...) bitcast (i32 (...)* @cbmyfatal to i32 (i8*, ...)*)(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0))
br label %9
9: ; preds = %2, %7
%10 = tail call i64 @strlen(i8* dereferenceable(1) %0)
tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %5, i8* align 1 %0, i64 %10, i1 false)
%11 = getelementptr inbounds i8, i8* %5, i64 %10
store i8 0, i8* %11
br label %12
12: ; preds = %50, %9
%13 = phi i8* [ %0, %9 ], [ %53, %50 ]
%14 = phi i8* [ %5, %9 ], [ %54, %50 ]
%15 = load i8, i8* %13
switch i8 %15, label %49 [
i8 0, label %55
i8 37, label %16
i8 43, label %50
]
16: ; preds = %12
%17 = getelementptr inbounds i8, i8* %13, i64 1
%18 = load i8, i8* %17
%19 = freeze i8 %18
%20 = add i8 %19, -48
%21 = icmp ult i8 %20, 10
br i1 %21, label %23, label %22
22: ; preds = %16
switch i8 %19, label %55 [
i8 102, label %23
i8 101, label %23
i8 100, label %23
i8 99, label %23
i8 98, label %23
i8 97, label %23
i8 70, label %23
i8 69, label %23
i8 68, label %23
i8 67, label %23
i8 66, label %23
i8 65, label %23
]
23: ; preds = %22, %22, %22, %22, %22, %22, %22, %22, %22, %22, %22, %22, %16
%24 = getelementptr inbounds i8, i8* %13, i64 2
%25 = load i8, i8* %24
%26 = freeze i8 %25
%27 = add i8 %26, -48
%28 = icmp ult i8 %27, 10
br i1 %28, label %30, label %29
29: ; preds = %23
switch i8 %26, label %55 [
i8 102, label %30
i8 101, label %30
i8 100, label %30
i8 99, label %30
i8 98, label %30
i8 97, label %30
i8 70, label %30
i8 69, label %30
i8 68, label %30
i8 67, label %30
i8 66, label %30
i8 65, label %30
]
30: ; preds = %29, %29, %29, %29, %29, %29, %29, %29, %29, %29, %29, %29, %23
%31 = add nsw i8 %19, -65
%32 = icmp ult i8 %31, 26
%33 = add nuw i8 %19, 32
%34 = select i1 %32, i8 %33, i8 %19
%35 = add i8 %34, -97
%36 = icmp ult i8 %35, 26
%37 = select i1 %36, i8 9, i8 0
%38 = add nuw i8 %37, %34
%39 = shl i8 %38, 4
%40 = add nsw i8 %26, -65
%41 = icmp ult i8 %40, 26
%42 = add nuw i8 %26, 32
%43 = select i1 %41, i8 %42, i8 %26
%44 = add i8 %43, -97
%45 = icmp ult i8 %44, 26
%46 = select i1 %45, i8 -87, i8 -48
%47 = add i8 %43, %39
%48 = add i8 %47, %46
br label %50
49: ; preds = %12
br label %50
50: ; preds = %12, %49, %30
%51 = phi i8 [ %15, %49 ], [ %48, %30 ], [ 32, %12 ]
%52 = phi i64 [ 1, %49 ], [ 3, %30 ], [ 1, %12 ]
store i8 %51, i8* %14
%53 = getelementptr inbounds i8, i8* %13, i64 %52
%54 = getelementptr inbounds i8, i8* %14, i64 1
br label %12
55: ; preds = %29, %22, %12
store i8 0, i8* %14
%56 = icmp eq i32* %1, null
br i1 %56, label %62, label %57
57: ; preds = %55
%58 = ptrtoint i8* %14 to i64
%59 = ptrtoint i8* %5 to i64
%60 = sub i64 %58, %59
%61 = trunc i64 %60 to i32
store i32 %61, i32* %1
br label %62
62: ; preds = %57, %55
ret i8* %5
}