#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 uCharToHex(unsigned char *src, unsigned char *dst, int MaxLen) {
  int i, j;
  unsigned char high, low;
  if ((src == NULL) || (dst == NULL))
    return -1;
  i = 0;
  j = 0;
  while (i < MaxLen) {
    if ((src[i] >= 0) && (src[i] <= 9)) {
      high = src[i];
    } else if ((src[i] >= 0x30) && (src[i] <= 0x39)) {
      high = src[i] - 0x30;
    } else if ((src[i] >= 'a') && (src[i] <= 'f')) {
      high = src[i] - 'a' + 10;
    } else if ((src[i] >= 'A') && (src[i] <= 'F')) {
      high = src[i] - 'A' + 10;
    }
    i++;
    if ((src[i] >= 0) && (src[i] <= 9)) {
      low = src[i];
    } else if ((src[i] >= 0x30) && (src[i] <= 0x39)) {
      low = src[i] - 0x30;
    } else if ((src[i] >= 'a') && (src[i] <= 'f')) {
      low = src[i] - 'a' + 10;
    } else if ((src[i] >= 'A') && (src[i] <= 'F')) {
      low = src[i] - 'A' + 10;
    }
    dst[j] = ((high & 0xF) << 4) + (low & 0xF);
    j++;
    i++;
  }
  return j;
}


x86 assembly (clang, -O0):
<uCharToHex>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1125 <uCharToHex+0x25>
cmpq   $0x0,-0x18(%rbp)
jne    1131 <uCharToHex+0x31>
movl   $0xffffffff,-0x4(%rbp)
jmp    13b1 <uCharToHex+0x2b1>
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    13ab <uCharToHex+0x2ab>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jl     1188 <uCharToHex+0x88>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
jg     1188 <uCharToHex+0x88>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x25(%rbp)
jmp    125b <uCharToHex+0x15b>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11c9 <uCharToHex+0xc9>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     11c9 <uCharToHex+0xc9>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %al,-0x25(%rbp)
jmp    1256 <uCharToHex+0x156>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     120d <uCharToHex+0x10d>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     120d <uCharToHex+0x10d>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,-0x25(%rbp)
jmp    1251 <uCharToHex+0x151>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     124c <uCharToHex+0x14c>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     124c <uCharToHex+0x14c>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %al,-0x25(%rbp)
jmp    1251 <uCharToHex+0x151>
jmp    1256 <uCharToHex+0x156>
jmp    125b <uCharToHex+0x15b>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jl     12a1 <uCharToHex+0x1a1>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
jg     12a1 <uCharToHex+0x1a1>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
jmp    1374 <uCharToHex+0x274>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12e2 <uCharToHex+0x1e2>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     12e2 <uCharToHex+0x1e2>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %al,-0x26(%rbp)
jmp    136f <uCharToHex+0x26f>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1326 <uCharToHex+0x226>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     1326 <uCharToHex+0x226>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,-0x26(%rbp)
jmp    136a <uCharToHex+0x26a>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1365 <uCharToHex+0x265>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     1365 <uCharToHex+0x265>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %al,-0x26(%rbp)
jmp    136a <uCharToHex+0x26a>
jmp    136f <uCharToHex+0x26f>
jmp    1374 <uCharToHex+0x274>
movzbl -0x25(%rbp),%eax
and    $0xf,%eax
shl    $0x4,%eax
movzbl -0x26(%rbp),%ecx
and    $0xf,%ecx
add    %ecx,%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    113f <uCharToHex+0x3f>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<uCharToHex>:
mov    $0xffffffff,%eax
test   %rdi,%rdi
je     1209 <uCharToHex+0x109>
test   %rsi,%rsi
je     1209 <uCharToHex+0x109>
test   %edx,%edx
jle    120a <uCharToHex+0x10a>
push   %r14
push   %rbx
add    $0xffffffff,%edx
shr    %edx
mov    %edx,%eax
add    $0x1,%eax
xor    %r14d,%r14d
jmp    1164 <uCharToHex+0x64>
add    $0xa9,%r10b
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r10d,%edx
mov    %r9d,%ecx
shl    $0x4,%cl
mov    %edx,%ebx
and    $0xf,%bl
or     %cl,%bl
mov    %bl,(%rsi,%r14,1)
add    $0x1,%r14
mov    %edx,%r8d
cmp    %r14,%rax
je     1206 <uCharToHex+0x106>
movzbl (%rdi,%r14,2),%r11d
cmp    $0xa,%r11b
jae    1180 <uCharToHex+0x80>
mov    %r11d,%r9d
jmp    11c0 <uCharToHex+0xc0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r9d,%r10d
lea    -0x30(%r11),%r9d
cmp    $0xa,%r9b
jb     11c0 <uCharToHex+0xc0>
lea    -0x61(%r11),%edx
cmp    $0x5,%dl
ja     119f <uCharToHex+0x9f>
add    $0xa9,%r11b
mov    %r11d,%r9d
jmp    11c0 <uCharToHex+0xc0>
lea    -0x41(%r11),%edx
add    $0xc9,%r11b
cmp    $0x6,%dl
movzbl %r10b,%edx
movzbl %r11b,%r9d
cmovae %edx,%r9d
cs nopw 0x0(%rax,%rax,1)
movzbl 0x1(%rdi,%r14,2),%r10d
cmp    $0xa,%r10b
jb     1140 <uCharToHex+0x40>
lea    -0x30(%r10),%edx
cmp    $0xa,%dl
jb     1143 <uCharToHex+0x43>
lea    -0x61(%r10),%edx
cmp    $0x5,%dl
jbe    1131 <uCharToHex+0x31>
lea    -0x41(%r10),%edx
add    $0xc9,%r10b
cmp    $0x6,%dl
movzbl %r8b,%r8d
movzbl %r10b,%edx
cmovae %r8d,%edx
jmp    1143 <uCharToHex+0x43>
pop    %rbx
pop    %r14
ret
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @uCharToHex(i8* %0, i8* writeonly %1, i32 %2) {
%4 = icmp eq i8* %0, null
%5 = icmp eq i8* %1, null
%6 = or i1 %4, %5
br i1 %6, label %63, label %7
7: ; preds = %3
%8 = icmp sgt i32 %2, 0
br i1 %8, label %9, label %63
9: ; preds = %7
%10 = add nsw i32 %2, -1
%11 = lshr i32 %10, 1
%12 = add nuw nsw i32 %11, 1
%13 = zext i32 %12 to i64
br label %14
14: ; preds = %9, %54
%15 = phi i64 [ 0, %9 ], [ %61, %54 ]
%16 = phi i64 [ 0, %9 ], [ %60, %54 ]
%17 = phi i8 [ undef, %9 ], [ %55, %54 ]
%18 = phi i8 [ undef, %9 ], [ %36, %54 ]
%19 = getelementptr inbounds i8, i8* %0, i64 %15
%20 = load i8, i8* %19
%21 = icmp ult i8 %20, 10
br i1 %21, label %35, label %22
22: ; preds = %14
%23 = add i8 %20, -48
%24 = icmp ult i8 %23, 10
br i1 %24, label %35, label %25
25: ; preds = %22
%26 = add i8 %20, -97
%27 = icmp ult i8 %26, 6
br i1 %27, label %28, label %30
28: ; preds = %25
%29 = add nsw i8 %20, -87
br label %35
30: ; preds = %25
%31 = add i8 %20, -65
%32 = icmp ult i8 %31, 6
%33 = add i8 %20, -55
%34 = select i1 %32, i8 %33, i8 %18
br label %35
35: ; preds = %22, %30, %14, %28
%36 = phi i8 [ %29, %28 ], [ %20, %14 ], [ %34, %30 ], [ %23, %22 ]
%37 = or i64 %15, 1
%38 = getelementptr inbounds i8, i8* %0, i64 %37
%39 = load i8, i8* %38
%40 = icmp ult i8 %39, 10
br i1 %40, label %54, label %41
41: ; preds = %35
%42 = add i8 %39, -48
%43 = icmp ult i8 %42, 10
br i1 %43, label %54, label %44
44: ; preds = %41
%45 = add i8 %39, -97
%46 = icmp ult i8 %45, 6
br i1 %46, label %47, label %49
47: ; preds = %44
%48 = add nsw i8 %39, -87
br label %54
49: ; preds = %44
%50 = add i8 %39, -65
%51 = icmp ult i8 %50, 6
%52 = add i8 %39, -55
%53 = select i1 %51, i8 %52, i8 %17
br label %54
54: ; preds = %41, %49, %35, %47
%55 = phi i8 [ %48, %47 ], [ %39, %35 ], [ %53, %49 ], [ %42, %41 ]
%56 = shl i8 %36, 4
%57 = and i8 %55, 15
%58 = or i8 %57, %56
%59 = getelementptr inbounds i8, i8* %1, i64 %16
store i8 %58, i8* %59
%60 = add nuw nsw i64 %16, 1
%61 = add nuw nsw i64 %15, 2
%62 = icmp eq i64 %60, %13
br i1 %62, label %63, label %14
63: ; preds = %54, %7, %3
%64 = phi i32 [ -1, %3 ], [ 0, %7 ], [ %12, %54 ]
ret i32 %64
}