#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 */
scalar_t__ malloc(size_t);
size_t strlen(unsigned char const *);
unsigned char *crypto_hex_to_bytes(const unsigned char *hex, size_t *olen) {
  size_t in_len, out_len, i;
  unsigned char *out, tmp;
  in_len = strlen(hex);
  out_len = in_len >> 1;
  if (in_len != out_len << 1)
    return NULL;
  out = (unsigned char *)malloc(out_len * sizeof(char));
  for (i = 0; i < out_len; i++) {
    tmp = hex[i << 1];
    if (tmp >= '0' && tmp <= '9')
      tmp -= '0';
    else if (tmp >= 'A' && tmp <= 'F')
      tmp -= 'A' + 10;
    else if (tmp >= 'a' && tmp <= 'f')
      tmp -= 'a' + 10;
    out[i] = tmp << 4;
    tmp = hex[(i << 1) + 1];
    if (tmp >= '0' && tmp <= '9')
      tmp -= '0';
    else if (tmp >= 'A' && tmp <= 'F')
      tmp -= 'A' + 10;
    else if (tmp >= 'a' && tmp <= 'f')
      tmp -= 'a' + 10;
    out[i] |= tmp;
  }
  if (olen != NULL)
    *olen = out_len;
  return out;
}


x86 assembly (clang, -O0):
<crypto_hex_to_bytes>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rcx
shl    $0x1,%rcx
cmp    %rcx,%rax
je     116b <crypto_hex_to_bytes+0x4b>
movq   $0x0,-0x8(%rbp)
jmp    130f <crypto_hex_to_bytes+0x1ef>
mov    -0x28(%rbp),%rdi
shl    $0x0,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x38(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    12f1 <crypto_hex_to_bytes+0x1d1>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
shl    $0x1,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x39(%rbp)
movzbl -0x39(%rbp),%eax
cmp    $0x30,%eax
jl     11cd <crypto_hex_to_bytes+0xad>
movzbl -0x39(%rbp),%eax
cmp    $0x39,%eax
jg     11cd <crypto_hex_to_bytes+0xad>
movzbl -0x39(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x39(%rbp)
jmp    1224 <crypto_hex_to_bytes+0x104>
movzbl -0x39(%rbp),%eax
cmp    $0x41,%eax
jl     11f6 <crypto_hex_to_bytes+0xd6>
movzbl -0x39(%rbp),%eax
cmp    $0x46,%eax
jg     11f6 <crypto_hex_to_bytes+0xd6>
movzbl -0x39(%rbp),%eax
sub    $0x4b,%eax
mov    %al,-0x39(%rbp)
jmp    121f <crypto_hex_to_bytes+0xff>
movzbl -0x39(%rbp),%eax
cmp    $0x61,%eax
jl     121a <crypto_hex_to_bytes+0xfa>
movzbl -0x39(%rbp),%eax
cmp    $0x66,%eax
jg     121a <crypto_hex_to_bytes+0xfa>
movzbl -0x39(%rbp),%eax
sub    $0x6b,%eax
mov    %al,-0x39(%rbp)
jmp    121f <crypto_hex_to_bytes+0xff>
jmp    1224 <crypto_hex_to_bytes+0x104>
movzbl -0x39(%rbp),%eax
shl    $0x4,%eax
mov    %al,%dl
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
shl    $0x1,%rcx
mov    0x1(%rax,%rcx,1),%al
mov    %al,-0x39(%rbp)
movzbl -0x39(%rbp),%eax
cmp    $0x30,%eax
jl     1274 <crypto_hex_to_bytes+0x154>
movzbl -0x39(%rbp),%eax
cmp    $0x39,%eax
jg     1274 <crypto_hex_to_bytes+0x154>
movzbl -0x39(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x39(%rbp)
jmp    12cb <crypto_hex_to_bytes+0x1ab>
movzbl -0x39(%rbp),%eax
cmp    $0x41,%eax
jl     129d <crypto_hex_to_bytes+0x17d>
movzbl -0x39(%rbp),%eax
cmp    $0x46,%eax
jg     129d <crypto_hex_to_bytes+0x17d>
movzbl -0x39(%rbp),%eax
sub    $0x4b,%eax
mov    %al,-0x39(%rbp)
jmp    12c6 <crypto_hex_to_bytes+0x1a6>
movzbl -0x39(%rbp),%eax
cmp    $0x61,%eax
jl     12c1 <crypto_hex_to_bytes+0x1a1>
movzbl -0x39(%rbp),%eax
cmp    $0x66,%eax
jg     12c1 <crypto_hex_to_bytes+0x1a1>
movzbl -0x39(%rbp),%eax
sub    $0x6b,%eax
mov    %al,-0x39(%rbp)
jmp    12c6 <crypto_hex_to_bytes+0x1a6>
jmp    12cb <crypto_hex_to_bytes+0x1ab>
movzbl -0x39(%rbp),%esi
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1184 <crypto_hex_to_bytes+0x64>
cmpq   $0x0,-0x18(%rbp)
je     1307 <crypto_hex_to_bytes+0x1e7>
mov    -0x28(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<crypto_hex_to_bytes>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%r12
call   1030 <strlen@plt>
mov    %rax,%rbx
test   $0x1,%bl
jne    1182 <crypto_hex_to_bytes+0x62>
mov    %rbx,%r15
shr    %r15
mov    %r15,%rdi
call   1040 <malloc@plt>
cmp    $0x2,%rbx
jb     1629 <crypto_hex_to_bytes+0x509>
cmp    $0x2,%r15
mov    $0x1,%r8d
cmovae %r15,%r8
cmp    $0x8,%r8
jb     117b <crypto_hex_to_bytes+0x5b>
lea    (%r12,%r8,2),%rdx
cmp    %rax,%rdx
jbe    1189 <crypto_hex_to_bytes+0x69>
mov    %rax,%rdx
add    %r8,%rdx
cmp    %r12,%rdx
jbe    1189 <crypto_hex_to_bytes+0x69>
xor    %edx,%edx
jmp    15b3 <crypto_hex_to_bytes+0x493>
xor    %eax,%eax
jmp    1631 <crypto_hex_to_bytes+0x511>
movabs $0x7ffffffffffffff0,%rdi
ff ff 7f
cmp    $0x10,%r8
jae    11a0 <crypto_hex_to_bytes+0x80>
xor    %edx,%edx
jmp    1392 <crypto_hex_to_bytes+0x272>
mov    %r8,%rdx
and    %rdi,%rdx
xor    %esi,%esi
movdqa 0xe4f(%rip),%xmm15
movdqa 0xe56(%rip),%xmm12
movdqa 0xe5d(%rip),%xmm13
movdqa 0xe64(%rip),%xmm14
movdqa 0xe8c(%rip),%xmm6
movdqa 0xe94(%rip),%xmm7
nopl   0x0(%rax)
movdqu (%r12,%rsi,2),%xmm10
movdqu 0x10(%r12,%rsi,2),%xmm0
movdqa %xmm0,%xmm4
pand   %xmm15,%xmm4
movdqa %xmm10,%xmm2
pand   %xmm15,%xmm2
packuswb %xmm4,%xmm2
psrlw  $0x8,%xmm0
psrlw  $0x8,%xmm10
packuswb %xmm0,%xmm10
movdqa %xmm2,%xmm0
paddb  %xmm12,%xmm0
movdqa %xmm0,%xmm8
pmaxub %xmm13,%xmm8
pcmpeqb %xmm0,%xmm8
movdqa %xmm0,%xmm4
pminub %xmm14,%xmm4
pcmpeqb %xmm0,%xmm4
movdqa %xmm2,%xmm1
paddb  0xdfb(%rip),%xmm1
movdqa %xmm1,%xmm9
pmaxub 0xdfd(%rip),%xmm9
pcmpeqb %xmm1,%xmm9
movdqa %xmm1,%xmm5
pminub %xmm6,%xmm5
pcmpeqb %xmm1,%xmm5
movdqa %xmm2,%xmm3
paddb  %xmm7,%xmm3
movdqa %xmm3,%xmm1
pminub %xmm6,%xmm1
pcmpeqb %xmm3,%xmm1
movdqa %xmm1,%xmm3
pandn  %xmm2,%xmm3
paddb  %xmm6,%xmm2
pand   %xmm2,%xmm1
por    %xmm3,%xmm1
por    %xmm4,%xmm5
pand   %xmm5,%xmm2
pandn  %xmm1,%xmm5
por    %xmm2,%xmm5
movdqa %xmm4,%xmm1
pandn  %xmm5,%xmm1
pand   %xmm4,%xmm0
por    %xmm1,%xmm0
movdqa %xmm10,%xmm5
paddb  %xmm12,%xmm5
movdqa %xmm5,%xmm1
pmaxub %xmm13,%xmm1
pcmpeqb %xmm5,%xmm1
movdqa %xmm10,%xmm2
paddb  0xdc0(%rip),%xmm2
movdqa %xmm2,%xmm11
pminub 0xdc2(%rip),%xmm11
pcmpeqb %xmm2,%xmm11
pand   %xmm1,%xmm11
movdqa %xmm10,%xmm1
paddb  %xmm7,%xmm1
movdqa %xmm1,%xmm2
pminub %xmm6,%xmm2
pcmpeqb %xmm1,%xmm2
movdqa %xmm10,%xmm1
paddb  0xda6(%rip),%xmm1
pand   %xmm2,%xmm1
pandn  %xmm10,%xmm2
por    %xmm1,%xmm2
por    %xmm8,%xmm4
por    %xmm9,%xmm4
movdqa %xmm5,%xmm1
pminub %xmm14,%xmm1
pcmpeqb %xmm5,%xmm1
pand   %xmm4,%xmm11
pand   %xmm1,%xmm4
paddb  0xd80(%rip),%xmm10
pand   %xmm11,%xmm2
pandn  %xmm10,%xmm11
por    %xmm2,%xmm11
pand   %xmm4,%xmm5
pandn  %xmm11,%xmm4
por    %xmm5,%xmm4
psllw  $0x4,%xmm0
pand   0xd17(%rip),%xmm0
por    %xmm0,%xmm4
movdqu %xmm4,(%rax,%rsi,1)
add    $0x10,%rsi
cmp    %rsi,%rdx
jne    11e0 <crypto_hex_to_bytes+0xc0>
cmp    %rdx,%r8
je     1629 <crypto_hex_to_bytes+0x509>
test   $0x8,%r8b
je     15b3 <crypto_hex_to_bytes+0x493>
mov    %rdx,%rsi
add    $0x8,%rdi
mov    %rdi,%rdx
and    %r8,%rdx
movdqa 0xc58(%rip),%xmm14
pcmpeqd %xmm11,%xmm11
movdqa 0xd4a(%rip),%xmm15
movdqa 0xd21(%rip),%xmm12
movdqa 0xd48(%rip),%xmm13
nopl   0x0(%rax,%rax,1)
movdqu (%r12,%rsi,2),%xmm4
movdqa %xmm4,%xmm2
pand   %xmm14,%xmm2
packuswb %xmm2,%xmm2
psrlw  $0x8,%xmm4
packuswb %xmm4,%xmm4
movdqa %xmm2,%xmm6
movdqa 0xcd7(%rip),%xmm10
paddb  %xmm10,%xmm6
movdqa %xmm6,%xmm1
pmaxub %xmm12,%xmm1
pcmpeqb %xmm6,%xmm1
punpcklbw %xmm1,%xmm7
movdqa %xmm1,%xmm0
pxor   %xmm11,%xmm0
punpcklbw %xmm0,%xmm5
por    %xmm7,%xmm5
movdqa %xmm2,%xmm3
paddb  0xcc4(%rip),%xmm3
movdqa %xmm3,%xmm7
pmaxub %xmm15,%xmm7
pcmpeqb %xmm3,%xmm7
punpcklbw %xmm7,%xmm8
por    %xmm5,%xmm8
pxor   %xmm11,%xmm7
movdqa %xmm2,%xmm3
paddb  %xmm13,%xmm3
movdqa %xmm3,%xmm5
pmaxub %xmm15,%xmm5
pcmpeqb %xmm3,%xmm5
movdqa %xmm5,%xmm3
pand   %xmm2,%xmm3
paddb  0xcb2(%rip),%xmm2
pandn  %xmm2,%xmm5
por    %xmm3,%xmm5
por    %xmm0,%xmm7
pand   %xmm7,%xmm2
pandn  %xmm5,%xmm7
por    %xmm2,%xmm7
pand   %xmm1,%xmm7
pandn  %xmm6,%xmm1
por    %xmm7,%xmm1
movdqa %xmm4,%xmm9
paddb  %xmm10,%xmm9
movdqa %xmm9,%xmm0
pmaxub %xmm12,%xmm0
pcmpeqb %xmm9,%xmm0
movdqa %xmm0,%xmm10
punpcklbw %xmm0,%xmm0
movdqa %xmm4,%xmm2
paddb  0xc70(%rip),%xmm2
movdqa %xmm2,%xmm6
pmaxub 0xc74(%rip),%xmm6
pcmpeqb %xmm2,%xmm6
pxor   %xmm11,%xmm6
punpcklbw %xmm6,%xmm6
pand   %xmm0,%xmm6
movdqa %xmm4,%xmm0
paddb  %xmm13,%xmm0
movdqa %xmm0,%xmm2
pmaxub %xmm15,%xmm2
pcmpeqb %xmm0,%xmm2
movdqa %xmm4,%xmm0
paddb  0xc51(%rip),%xmm0
movdqa %xmm2,%xmm3
pandn  %xmm0,%xmm2
pand   %xmm4,%xmm3
por    %xmm3,%xmm2
psraw  $0x8,%xmm8
pand   %xmm8,%xmm6
pand   %xmm14,%xmm6
packuswb %xmm6,%xmm6
psllw  $0x7,%xmm6
movdqa 0xc40(%rip),%xmm3
pand   %xmm3,%xmm6
pxor   %xmm0,%xmm0
pcmpgtb %xmm6,%xmm0
pxor   %xmm11,%xmm10
punpcklbw %xmm10,%xmm10
pand   %xmm14,%xmm10
pand   %xmm8,%xmm10
packuswb %xmm10,%xmm10
psllw  $0x7,%xmm10
pand   %xmm3,%xmm10
pxor   %xmm3,%xmm3
pcmpgtb %xmm10,%xmm3
paddb  0xbef(%rip),%xmm4
pand   %xmm0,%xmm2
pandn  %xmm4,%xmm0
por    %xmm2,%xmm0
pand   %xmm3,%xmm9
pandn  %xmm0,%xmm3
por    %xmm9,%xmm3
psllw  $0x4,%xmm1
pand   0xae8(%rip),%xmm1
por    %xmm1,%xmm3
movq   %xmm3,(%rax,%rsi,1)
add    $0x8,%rsi
cmp    %rsi,%rdx
jne    13d0 <crypto_hex_to_bytes+0x2b0>
cmp    %rdx,%r8
je     1629 <crypto_hex_to_bytes+0x509>
mov    (%r12,%rdx,2),%dil
lea    -0x30(%rdi),%esi
cmp    $0xa,%sil
jb     15e5 <crypto_hex_to_bytes+0x4c5>
lea    -0x41(%rdi),%esi
cmp    $0x5,%sil
ja     15d1 <crypto_hex_to_bytes+0x4b1>
add    $0xb5,%dil
mov    %edi,%esi
jmp    15e5 <crypto_hex_to_bytes+0x4c5>
lea    -0x61(%rdi),%esi
lea    -0x6b(%rdi),%ebx
cmp    $0x6,%sil
movzbl %dil,%edi
movzbl %bl,%esi
cmovae %edi,%esi
shl    $0x4,%sil
mov    %sil,(%rax,%rdx,1)
mov    0x1(%r12,%rdx,2),%dil
lea    -0x30(%rdi),%ebx
cmp    $0xa,%bl
jb     161d <crypto_hex_to_bytes+0x4fd>
lea    -0x41(%rdi),%ebx
cmp    $0x5,%bl
ja     160a <crypto_hex_to_bytes+0x4ea>
add    $0xb5,%dil
mov    %edi,%ebx
jmp    161d <crypto_hex_to_bytes+0x4fd>
lea    -0x61(%rdi),%ebx
lea    -0x6b(%rdi),%ecx
cmp    $0x6,%bl
movzbl %dil,%edi
movzbl %cl,%ebx
cmovae %edi,%ebx
or     %sil,%bl
mov    %bl,(%rax,%rdx,1)
add    $0x1,%rdx
jmp    15ae <crypto_hex_to_bytes+0x48e>
test   %r14,%r14
je     1631 <crypto_hex_to_bytes+0x511>
mov    %r15,(%r14)
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i8* @crypto_hex_to_bytes(i8* %0, i64* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i64*
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i8*
%10 = alloca i8
store i8* %0, i8** %4
store i64* %1, i64** %5
%11 = load i8*, i8** %4
%12 = call i64 @strlen(i8* %11)
store i64 %12, i64* %6
%13 = load i64, i64* %6
%14 = lshr i64 %13, 1
store i64 %14, i64* %7
%15 = load i64, i64* %6
%16 = load i64, i64* %7
%17 = shl i64 %16, 1
%18 = icmp ne i64 %15, %17
br i1 %18, label %19, label %20
19: ; preds = %2
store i8* null, i8** %3
br label %150
20: ; preds = %2
%21 = load i64, i64* %7
%22 = mul i64 %21, 1
%23 = call i64 @malloc(i64 %22)
%24 = inttoptr i64 %23 to i8*
store i8* %24, i8** %9
store i64 0, i64* %8
br label %25
25: ; preds = %139, %20
%26 = load i64, i64* %8
%27 = load i64, i64* %7
%28 = icmp ult i64 %26, %27
br i1 %28, label %29, label %142
29: ; preds = %25
%30 = load i8*, i8** %4
%31 = load i64, i64* %8
%32 = shl i64 %31, 1
%33 = getelementptr inbounds i8, i8* %30, i64 %32
%34 = load i8, i8* %33
store i8 %34, i8* %10
%35 = load i8, i8* %10
%36 = zext i8 %35 to i32
%37 = icmp sge i32 %36, 48
br i1 %37, label %38, label %47
38: ; preds = %29
%39 = load i8, i8* %10
%40 = zext i8 %39 to i32
%41 = icmp sle i32 %40, 57
br i1 %41, label %42, label %47
42: ; preds = %38
%43 = load i8, i8* %10
%44 = zext i8 %43 to i32
%45 = sub nsw i32 %44, 48
%46 = trunc i32 %45 to i8
store i8 %46, i8* %10
br label %75
47: ; preds = %38, %29
%48 = load i8, i8* %10
%49 = zext i8 %48 to i32
%50 = icmp sge i32 %49, 65
br i1 %50, label %51, label %60
51: ; preds = %47
%52 = load i8, i8* %10
%53 = zext i8 %52 to i32
%54 = icmp sle i32 %53, 70
br i1 %54, label %55, label %60
55: ; preds = %51
%56 = load i8, i8* %10
%57 = zext i8 %56 to i32
%58 = sub nsw i32 %57, 75
%59 = trunc i32 %58 to i8
store i8 %59, i8* %10
br label %74
60: ; preds = %51, %47
%61 = load i8, i8* %10
%62 = zext i8 %61 to i32
%63 = icmp sge i32 %62, 97
br i1 %63, label %64, label %73
64: ; preds = %60
%65 = load i8, i8* %10
%66 = zext i8 %65 to i32
%67 = icmp sle i32 %66, 102
br i1 %67, label %68, label %73
68: ; preds = %64
%69 = load i8, i8* %10
%70 = zext i8 %69 to i32
%71 = sub nsw i32 %70, 107
%72 = trunc i32 %71 to i8
store i8 %72, i8* %10
br label %73
73: ; preds = %68, %64, %60
br label %74
74: ; preds = %73, %55
br label %75
75: ; preds = %74, %42
%76 = load i8, i8* %10
%77 = zext i8 %76 to i32
%78 = shl i32 %77, 4
%79 = trunc i32 %78 to i8
%80 = load i8*, i8** %9
%81 = load i64, i64* %8
%82 = getelementptr inbounds i8, i8* %80, i64 %81
store i8 %79, i8* %82
%83 = load i8*, i8** %4
%84 = load i64, i64* %8
%85 = shl i64 %84, 1
%86 = add i64 %85, 1
%87 = getelementptr inbounds i8, i8* %83, i64 %86
%88 = load i8, i8* %87
store i8 %88, i8* %10
%89 = load i8, i8* %10
%90 = zext i8 %89 to i32
%91 = icmp sge i32 %90, 48
br i1 %91, label %92, label %101
92: ; preds = %75
%93 = load i8, i8* %10
%94 = zext i8 %93 to i32
%95 = icmp sle i32 %94, 57
br i1 %95, label %96, label %101
96: ; preds = %92
%97 = load i8, i8* %10
%98 = zext i8 %97 to i32
%99 = sub nsw i32 %98, 48
%100 = trunc i32 %99 to i8
store i8 %100, i8* %10
br label %129
101: ; preds = %92, %75
%102 = load i8, i8* %10
%103 = zext i8 %102 to i32
%104 = icmp sge i32 %103, 65
br i1 %104, label %105, label %114
105: ; preds = %101
%106 = load i8, i8* %10
%107 = zext i8 %106 to i32
%108 = icmp sle i32 %107, 70
br i1 %108, label %109, label %114
109: ; preds = %105
%110 = load i8, i8* %10
%111 = zext i8 %110 to i32
%112 = sub nsw i32 %111, 75
%113 = trunc i32 %112 to i8
store i8 %113, i8* %10
br label %128
114: ; preds = %105, %101
%115 = load i8, i8* %10
%116 = zext i8 %115 to i32
%117 = icmp sge i32 %116, 97
br i1 %117, label %118, label %127
118: ; preds = %114
%119 = load i8, i8* %10
%120 = zext i8 %119 to i32
%121 = icmp sle i32 %120, 102
br i1 %121, label %122, label %127
122: ; preds = %118
%123 = load i8, i8* %10
%124 = zext i8 %123 to i32
%125 = sub nsw i32 %124, 107
%126 = trunc i32 %125 to i8
store i8 %126, i8* %10
br label %127
127: ; preds = %122, %118, %114
br label %128
128: ; preds = %127, %109
br label %129
129: ; preds = %128, %96
%130 = load i8, i8* %10
%131 = zext i8 %130 to i32
%132 = load i8*, i8** %9
%133 = load i64, i64* %8
%134 = getelementptr inbounds i8, i8* %132, i64 %133
%135 = load i8, i8* %134
%136 = zext i8 %135 to i32
%137 = or i32 %136, %131
%138 = trunc i32 %137 to i8
store i8 %138, i8* %134
br label %139
139: ; preds = %129
%140 = load i64, i64* %8
%141 = add i64 %140, 1
store i64 %141, i64* %8
br label %25
142: ; preds = %25
%143 = load i64*, i64** %5
%144 = icmp ne i64* %143, null
br i1 %144, label %145, label %148
145: ; preds = %142
%146 = load i64, i64* %7
%147 = load i64*, i64** %5
store i64 %146, i64* %147
br label %148
148: ; preds = %145, %142
%149 = load i8*, i8** %9
store i8* %149, i8** %3
br label %150
150: ; preds = %148, %19
%151 = load i8*, i8** %3
ret i8* %151
}

LLVM IR (-O2):
define i8* @crypto_hex_to_bytes(i8* nocapture %0, i64* writeonly %1) {
%3 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%4 = lshr i64 %3, 1
%5 = and i64 %3, -2
%6 = icmp eq i64 %3, %5
br i1 %6, label %7, label %173
7: ; preds = %2
%8 = tail call i64 @malloc(i64 %4)
%9 = inttoptr i64 %8 to i8*
%10 = icmp ult i64 %3, 2
br i1 %10, label %170, label %11
11: ; preds = %7
%12 = call i64 @llvm.umax.i64(i64 %4, i64 1)
%13 = icmp ult i64 %12, 8
br i1 %13, label %127, label %14
14: ; preds = %11
%15 = getelementptr i8, i8* %9, i64 %12
%16 = shl nuw i64 %12, 1
%17 = getelementptr i8, i8* %0, i64 %16
%18 = icmp ugt i8* %17, %9
%19 = icmp ugt i8* %15, %0
%20 = and i1 %18, %19
br i1 %20, label %127, label %21
21: ; preds = %14
%22 = icmp ult i64 %12, 16
br i1 %22, label %76, label %23
23: ; preds = %21
%24 = and i64 %12, 9223372036854775792
br label %25
25: ; preds = %25, %23
%26 = phi i64 [ 0, %23 ], [ %69, %25 ]
%27 = shl nuw i64 %26, 1
%28 = getelementptr inbounds i8, i8* %0, i64 %27
%29 = bitcast i8* %28 to <32 x i8>*
%30 = load <32 x i8>, <32 x i8>* %29
%31 = shufflevector <32 x i8> %30, <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>
%32 = shufflevector <32 x i8> %30, <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>
%33 = 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>
%34 = icmp ult <16 x i8> %33, <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>
%35 = 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>
%36 = icmp ult <16 x i8> %35, <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>
%37 = 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>
%38 = icmp ult <16 x i8> %37, <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>
%39 = add <16 x i8> %31, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
%40 = select <16 x i1> %38, <16 x i8> %39, <16 x i8> %31
%41 = add <16 x i8> %31, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
%42 = xor <16 x i1> %34, <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>
%43 = or <16 x i1> %34, %36
%44 = select <16 x i1> %43, <16 x i8> %41, <16 x i8> %40
%45 = select <16 x i1> %34, <16 x i8> %33, <16 x i8> %44
%46 = shl <16 x i8> %45, <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>
%47 = getelementptr inbounds i8, i8* %9, i64 %26
%48 = bitcast i8* %47 to <16 x i8>*
store <16 x i8> %46, <16 x i8>* %48
%49 = add <16 x i8> %32, <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>
%50 = icmp ult <16 x i8> %49, <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>
%51 = add <16 x i8> %32, <i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71>
%52 = icmp ult <16 x i8> %51, <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>
%53 = add <16 x i8> %32, <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>
%54 = icmp ult <16 x i8> %53, <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>
%55 = add <16 x i8> %32, <i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107>
%56 = select <16 x i1> %54, <16 x i8> %55, <16 x i8> %32
%57 = add nuw nsw <16 x i8> %32, <i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75>
%58 = xor <16 x i1> %36, <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>
%59 = or <16 x i1> %34, %58
%60 = select <16 x i1> %42, <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> %59
%61 = xor <16 x i1> %50, <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>
%62 = select <16 x i1> %60, <16 x i1> %61, <16 x i1> zeroinitializer
%63 = select <16 x i1> %62, <16 x i1> %52, <16 x i1> zeroinitializer
%64 = select <16 x i1> %60, <16 x i1> %50, <16 x i1> zeroinitializer
%65 = select <16 x i1> %63, <16 x i8> %56, <16 x i8> %57
%66 = select <16 x i1> %64, <16 x i8> %49, <16 x i8> %65
%67 = or <16 x i8> %66, %46
%68 = bitcast i8* %47 to <16 x i8>*
store <16 x i8> %67, <16 x i8>* %68
%69 = add nuw i64 %26, 16
%70 = icmp eq i64 %69, %24
br i1 %70, label %71, label %25
71: ; preds = %25
%72 = icmp eq i64 %12, %24
br i1 %72, label %170, label %73
73: ; preds = %71
%74 = and i64 %12, 8
%75 = icmp eq i64 %74, 0
br i1 %75, label %127, label %76
76: ; preds = %21, %73
%77 = phi i64 [ %24, %73 ], [ 0, %21 ]
%78 = and i64 %12, 9223372036854775800
br label %79
79: ; preds = %79, %76
%80 = phi i64 [ %77, %76 ], [ %123, %79 ]
%81 = shl nuw i64 %80, 1
%82 = getelementptr inbounds i8, i8* %0, i64 %81
%83 = bitcast i8* %82 to <16 x i8>*
%84 = load <16 x i8>, <16 x i8>* %83
%85 = shufflevector <16 x i8> %84, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
%86 = shufflevector <16 x i8> %84, <16 x i8> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
%87 = add <8 x i8> %85, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
%88 = icmp ult <8 x i8> %87, <i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10>
%89 = add <8 x i8> %85, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%90 = icmp ult <8 x i8> %89, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%91 = add <8 x i8> %85, <i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97>
%92 = icmp ult <8 x i8> %91, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%93 = add <8 x i8> %85, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
%94 = select <8 x i1> %92, <8 x i8> %93, <8 x i8> %85
%95 = add <8 x i8> %85, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
%96 = xor <8 x i1> %88, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%97 = or <8 x i1> %88, %90
%98 = select <8 x i1> %97, <8 x i8> %95, <8 x i8> %94
%99 = select <8 x i1> %88, <8 x i8> %87, <8 x i8> %98
%100 = shl <8 x i8> %99, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
%101 = getelementptr inbounds i8, i8* %9, i64 %80
%102 = bitcast i8* %101 to <8 x i8>*
store <8 x i8> %100, <8 x i8>* %102
%103 = add <8 x i8> %86, <i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48, i8 -48>
%104 = icmp ult <8 x i8> %103, <i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10, i8 10>
%105 = add <8 x i8> %86, <i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71, i8 -71>
%106 = icmp ult <8 x i8> %105, <i8 -6, i8 -6, i8 -6, i8 -6, i8 -6, i8 -6, i8 -6, i8 -6>
%107 = add <8 x i8> %86, <i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97, i8 -97>
%108 = icmp ult <8 x i8> %107, <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>
%109 = add <8 x i8> %86, <i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107, i8 -107>
%110 = select <8 x i1> %108, <8 x i8> %109, <8 x i8> %86
%111 = add nuw nsw <8 x i8> %86, <i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75, i8 -75>
%112 = xor <8 x i1> %90, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%113 = or <8 x i1> %88, %112
%114 = select <8 x i1> %96, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i1> %113
%115 = xor <8 x i1> %104, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
%116 = select <8 x i1> %114, <8 x i1> %115, <8 x i1> zeroinitializer
%117 = select <8 x i1> %116, <8 x i1> %106, <8 x i1> zeroinitializer
%118 = select <8 x i1> %114, <8 x i1> %104, <8 x i1> zeroinitializer
%119 = select <8 x i1> %117, <8 x i8> %110, <8 x i8> %111
%120 = select <8 x i1> %118, <8 x i8> %103, <8 x i8> %119
%121 = or <8 x i8> %120, %100
%122 = bitcast i8* %101 to <8 x i8>*
store <8 x i8> %121, <8 x i8>* %122
%123 = add nuw i64 %80, 8
%124 = icmp eq i64 %123, %78
br i1 %124, label %125, label %79
125: ; preds = %79
%126 = icmp eq i64 %12, %78
br i1 %126, label %170, label %127
127: ; preds = %14, %11, %73, %125
%128 = phi i64 [ 0, %11 ], [ 0, %14 ], [ %24, %73 ], [ %78, %125 ]
br label %129
129: ; preds = %127, %165
%130 = phi i64 [ %168, %165 ], [ %128, %127 ]
%131 = shl nuw i64 %130, 1
%132 = getelementptr inbounds i8, i8* %0, i64 %131
%133 = load i8, i8* %132
%134 = add i8 %133, -48
%135 = icmp ult i8 %134, 10
br i1 %135, label %146, label %136
136: ; preds = %129
%137 = add i8 %133, -65
%138 = icmp ult i8 %137, 6
br i1 %138, label %139, label %141
139: ; preds = %136
%140 = add nuw nsw i8 %133, -75
br label %146
141: ; preds = %136
%142 = add i8 %133, -97
%143 = icmp ult i8 %142, 6
%144 = add i8 %133, -107
%145 = select i1 %143, i8 %144, i8 %133
br label %146
146: ; preds = %129, %141, %139
%147 = phi i8 [ %140, %139 ], [ %145, %141 ], [ %134, %129 ]
%148 = shl i8 %147, 4
%149 = getelementptr inbounds i8, i8* %9, i64 %130
store i8 %148, i8* %149
%150 = or i64 %131, 1
%151 = getelementptr inbounds i8, i8* %0, i64 %150
%152 = load i8, i8* %151
%153 = add i8 %152, -48
%154 = icmp ult i8 %153, 10
br i1 %154, label %165, label %155
155: ; preds = %146
%156 = add i8 %152, -65
%157 = icmp ult i8 %156, 6
br i1 %157, label %158, label %160
158: ; preds = %155
%159 = add nuw nsw i8 %152, -75
br label %165
160: ; preds = %155
%161 = add i8 %152, -97
%162 = icmp ult i8 %161, 6
%163 = add i8 %152, -107
%164 = select i1 %162, i8 %163, i8 %152
br label %165
165: ; preds = %146, %160, %158
%166 = phi i8 [ %159, %158 ], [ %164, %160 ], [ %153, %146 ]
%167 = or i8 %166, %148
store i8 %167, i8* %149
%168 = add nuw nsw i64 %130, 1
%169 = icmp eq i64 %168, %12
br i1 %169, label %170, label %129
170: ; preds = %165, %71, %125, %7
%171 = icmp eq i64* %1, null
br i1 %171, label %173, label %172
172: ; preds = %170
store i64 %4, i64* %1
br label %173
173: ; preds = %170, %172, %2
%174 = phi i8* [ null, %2 ], [ %9, %172 ], [ %9, %170 ]
ret i8* %174
}