#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 strlen(char const *);
int string_decode_base16(const char *from, char *to) {
  int length, to_length, i, pos;
  unsigned char *ptr_to, value;
  if (!from || !to)
    return 0;
  length = strlen(from) / 2;
  ptr_to = (unsigned char *)to;
  ptr_to[0] = '\0';
  to_length = 0;
  for (i = 0; i < length; i++) {
    pos = i * 2;
    value = 0;
    if ((from[pos] >= '0') && (from[pos] <= '9'))
      value |= (from[pos] - '0') << 4;
    else if ((from[pos] >= 'a') && (from[pos] <= 'f'))
      value |= (from[pos] - 'a' + 10) << 4;
    else if ((from[pos] >= 'A') && (from[pos] <= 'F'))
      value |= (from[pos] - 'A' + 10) << 4;
    pos++;
    if ((from[pos] >= '0') && (from[pos] <= '9'))
      value |= from[pos] - '0';
    else if ((from[pos] >= 'a') && (from[pos] <= 'f'))
      value |= from[pos] - 'a' + 10;
    else if ((from[pos] >= 'A') && (from[pos] <= 'F'))
      value |= from[pos] - 'A' + 10;
    ptr_to[0] = value;
    ptr_to++;
    to_length++;
  }
  ptr_to[0] = '\0';
  return to_length;
}


x86 assembly (clang, -O0):
<string_decode_base16>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1136 <string_decode_base16+0x26>
cmpq   $0x0,-0x18(%rbp)
jne    1142 <string_decode_base16+0x32>
movl   $0x0,-0x4(%rbp)
jmp    1397 <string_decode_base16+0x287>
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    138a <string_decode_base16+0x27a>
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
movb   $0x0,-0x31(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11d6 <string_decode_base16+0xc6>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     11d6 <string_decode_base16+0xc6>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x30,%ecx
shl    $0x4,%ecx
movzbl -0x31(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x31(%rbp)
jmp    1275 <string_decode_base16+0x165>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1223 <string_decode_base16+0x113>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     1223 <string_decode_base16+0x113>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
shl    $0x4,%ecx
movzbl -0x31(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x31(%rbp)
jmp    1270 <string_decode_base16+0x160>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     126b <string_decode_base16+0x15b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     126b <string_decode_base16+0x15b>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
shl    $0x4,%ecx
movzbl -0x31(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x31(%rbp)
jmp    1270 <string_decode_base16+0x160>
jmp    1275 <string_decode_base16+0x165>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12c5 <string_decode_base16+0x1b5>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     12c5 <string_decode_base16+0x1b5>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x30,%ecx
movzbl -0x31(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x31(%rbp)
jmp    135e <string_decode_base16+0x24e>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     130f <string_decode_base16+0x1ff>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     130f <string_decode_base16+0x1ff>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
movzbl -0x31(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x31(%rbp)
jmp    1359 <string_decode_base16+0x249>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1354 <string_decode_base16+0x244>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1354 <string_decode_base16+0x244>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
movzbl -0x31(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x31(%rbp)
jmp    1359 <string_decode_base16+0x249>
jmp    135e <string_decode_base16+0x24e>
mov    -0x31(%rbp),%cl
mov    -0x30(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1173 <string_decode_base16+0x63>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_decode_base16>:
push   %r14
push   %rbx
push   %rax
xor    %eax,%eax
test   %rdi,%rdi
je     121d <string_decode_base16+0x10d>
mov    %rsi,%r14
test   %rsi,%rsi
je     121d <string_decode_base16+0x10d>
mov    %rdi,%rbx
call   1030 <strlen@plt>
mov    %eax,%ecx
movb   $0x0,(%r14)
xor    %eax,%eax
cmp    $0x2,%ecx
jl     1211 <string_decode_base16+0x101>
mov    %ecx,%eax
shr    $0x1f,%eax
add    %ecx,%eax
sar    %eax
mov    %eax,%r8d
cmp    $0x10,%eax
jb     116f <string_decode_base16+0x5f>
lea    (%rbx,%r8,2),%rcx
cmp    %r14,%rcx
jbe    1225 <string_decode_base16+0x115>
lea    (%r14,%r8,1),%rcx
cmp    %rbx,%rcx
jbe    1225 <string_decode_base16+0x115>
xor    %esi,%esi
mov    %r14,%r9
lea    (%rbx,%rsi,2),%rdi
add    $0x1,%rdi
sub    %rsi,%r8
xor    %esi,%esi
jmp    11a1 <string_decode_base16+0x91>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
or     %cl,%dl
mov    %edx,%ecx
mov    %cl,(%r9,%rsi,1)
add    $0x1,%rsi
cmp    %rsi,%r8
je     1216 <string_decode_base16+0x106>
movzbl -0x1(%rdi,%rsi,2),%ecx
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
ja     11c0 <string_decode_base16+0xb0>
shl    $0x4,%cl
jmp    11e0 <string_decode_base16+0xd0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
jbe    11d0 <string_decode_base16+0xc0>
lea    -0x41(%rcx),%edx
cmp    $0x5,%dl
ja     11d8 <string_decode_base16+0xc8>
shl    $0x4,%cl
add    $0x90,%cl
jmp    11e0 <string_decode_base16+0xd0>
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movzbl (%rdi,%rsi,2),%ebx
lea    -0x30(%rbx),%edx
cmp    $0x9,%dl
jbe    1190 <string_decode_base16+0x80>
lea    -0x61(%rbx),%edx
cmp    $0x5,%dl
ja     1200 <string_decode_base16+0xf0>
add    $0xa9,%bl
jmp    120b <string_decode_base16+0xfb>
nopl   0x0(%rax)
lea    -0x41(%rbx),%edx
cmp    $0x5,%dl
ja     1194 <string_decode_base16+0x84>
add    $0xc9,%bl
or     %cl,%bl
mov    %ebx,%ecx
jmp    1194 <string_decode_base16+0x84>
mov    %r14,%r9
jmp    1219 <string_decode_base16+0x109>
add    %rsi,%r9
movb   $0x0,(%r9)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
mov    %r8d,%esi
and    $0xfffffff0,%esi
lea    (%r14,%rsi,1),%r9
xor    %edi,%edi
movdqa 0xe17(%rip),%xmm0
nopl   0x0(%rax)
movdqu (%rbx,%rdi,2),%xmm12
movdqu 0x10(%rbx,%rdi,2),%xmm3
movdqa %xmm3,%xmm4
movdqa 0xda8(%rip),%xmm2
pand   %xmm2,%xmm4
movdqa %xmm12,%xmm1
pand   %xmm2,%xmm1
packuswb %xmm4,%xmm1
psrlw  $0x8,%xmm3
psrlw  $0x8,%xmm12
packuswb %xmm3,%xmm12
movdqa %xmm1,%xmm3
movdqa 0xd8b(%rip),%xmm2
paddb  %xmm2,%xmm3
movdqa %xmm3,%xmm8
pminub 0xd89(%rip),%xmm8
pcmpeqb %xmm3,%xmm8
movdqa %xmm3,%xmm9
movdqa 0xd87(%rip),%xmm7
pmaxub %xmm7,%xmm9
pcmpeqb %xmm3,%xmm9
movdqa %xmm1,%xmm3
movdqa 0xd81(%rip),%xmm5
paddb  %xmm5,%xmm3
movdqa %xmm3,%xmm10
pminub %xmm0,%xmm10
pcmpeqb %xmm3,%xmm10
movdqa %xmm1,%xmm3
movdqa 0xd91(%rip),%xmm11
paddb  %xmm11,%xmm3
movdqa %xmm3,%xmm4
pminub %xmm0,%xmm4
pcmpeqb %xmm3,%xmm4
psllw  $0x4,%xmm1
pand   0xd83(%rip),%xmm1
pand   %xmm10,%xmm9
por    %xmm8,%xmm10
movdqa %xmm10,%xmm13
movdqa 0xd8c(%rip),%xmm7
pxor   %xmm7,%xmm13
pand   %xmm4,%xmm13
movdqa %xmm13,%xmm6
psllw  $0x7,%xmm6
movdqa 0xd80(%rip),%xmm2
pand   %xmm2,%xmm6
pxor   %xmm3,%xmm3
pcmpgtb %xmm6,%xmm3
por    %xmm4,%xmm10
movdqa %xmm9,%xmm4
pandn  %xmm1,%xmm4
paddb  0xd3e(%rip),%xmm1
movdqa %xmm1,%xmm6
pand   %xmm9,%xmm6
por    %xmm4,%xmm6
pand   %xmm3,%xmm1
pandn  %xmm6,%xmm3
por    %xmm1,%xmm3
movdqa %xmm12,%xmm4
paddb  %xmm5,%xmm4
movdqa %xmm4,%xmm1
movdqa 0xce0(%rip),%xmm5
pmaxub %xmm5,%xmm1
pcmpeqb %xmm4,%xmm1
movdqa %xmm4,%xmm15
pminub %xmm0,%xmm15
pcmpeqb %xmm4,%xmm15
movdqa %xmm12,%xmm4
paddb  %xmm11,%xmm4
movdqa %xmm4,%xmm11
pmaxub %xmm5,%xmm11
pcmpeqb %xmm4,%xmm11
movdqa %xmm4,%xmm14
pminub %xmm0,%xmm14
pcmpeqb %xmm4,%xmm14
por    %xmm9,%xmm13
pand   %xmm10,%xmm3
pxor   %xmm7,%xmm10
por    %xmm8,%xmm10
movdqa %xmm12,%xmm4
paddb  0xc30(%rip),%xmm4
por    %xmm13,%xmm10
movdqa %xmm4,%xmm6
pmaxub 0xc3f(%rip),%xmm6
pcmpeqb %xmm4,%xmm6
pand   %xmm6,%xmm10
pand   %xmm10,%xmm15
psllw  $0x7,%xmm15
pand   %xmm2,%xmm15
pxor   %xmm6,%xmm6
pcmpgtb %xmm15,%xmm6
pand   %xmm1,%xmm10
pand   %xmm10,%xmm14
psllw  $0x7,%xmm14
pand   %xmm2,%xmm14
pxor   %xmm1,%xmm1
pcmpgtb %xmm14,%xmm1
pand   %xmm11,%xmm10
psllw  $0x7,%xmm10
pand   %xmm2,%xmm10
pxor   %xmm7,%xmm7
pcmpgtb %xmm10,%xmm7
movdqa %xmm12,%xmm2
paddb  0xc78(%rip),%xmm12
pand   %xmm6,%xmm12
pandn  %xmm4,%xmm6
por    %xmm12,%xmm6
paddb  0xc52(%rip),%xmm2
pand   %xmm1,%xmm2
pandn  %xmm6,%xmm1
por    %xmm2,%xmm1
pandn  %xmm1,%xmm7
por    %xmm3,%xmm7
movdqu %xmm7,(%r14,%rdi,1)
add    $0x10,%rdi
cmp    %rdi,%rsi
jne    1240 <string_decode_base16+0x130>
cmp    %r8,%rsi
jne    1174 <string_decode_base16+0x64>
jmp    1219 <string_decode_base16+0x109>

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

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