#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 */
typedef int uint8_t;

/* Variables and functions */
int bin2hex(uint8_t *d, uint8_t *s, size_t len, int revert) {
  int i;
  int c = 0;
  if (revert == 1) {
    s += len - 1;
    for (i = 0; i < len; i++, s--) {
      uint8_t h = *s >> 4;
      uint8_t l = *s & 0x0f;
      *(d++) = (h < 10) ? h + '0' : h + 'A' - 10;
      *(d++) = (l < 10) ? l + '0' : l + 'A' - 10;
      c++;
    }
  } else {
    for (i = 0; i < len; i++, s++) {
      uint8_t h = *s >> 4;
      uint8_t l = *s & 0x0f;
      *(d++) = (h < 10) ? h + '0' : h + 'A' - 10;
      *(d++) = (l < 10) ? l + '0' : l + 'A' - 10;
      c++;
    }
  }
  *d = '\0';
  return 2 * c;
}


x86 assembly (clang, -O0):
<bin2hex>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jne    11fd <bin2hex+0xfd>
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
shl    $0x2,%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x20(%rbp)
movslq -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    11f8 <bin2hex+0xf8>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sar    $0x4,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
and    $0xf,%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0xa,-0x28(%rbp)
jge    117d <bin2hex+0x7d>
mov    -0x28(%rbp),%eax
add    $0x30,%eax
mov    %eax,-0x38(%rbp)
jmp    1189 <bin2hex+0x89>
mov    -0x28(%rbp),%eax
add    $0x41,%eax
sub    $0xa,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
cmpl   $0xa,-0x2c(%rbp)
jge    11b5 <bin2hex+0xb5>
mov    -0x2c(%rbp),%eax
add    $0x30,%eax
mov    %eax,-0x3c(%rbp)
jmp    11c1 <bin2hex+0xc1>
mov    -0x2c(%rbp),%eax
add    $0x41,%eax
sub    $0xa,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0xfffffffffffffffc,%rax
mov    %rax,-0x10(%rbp)
jmp    113f <bin2hex+0x3f>
jmp    12c2 <bin2hex+0x1c2>
movl   $0x0,-0x20(%rbp)
movslq -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    12bd <bin2hex+0x1bd>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
sar    $0x4,%eax
mov    %eax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
and    $0xf,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0xa,-0x30(%rbp)
jge    1242 <bin2hex+0x142>
mov    -0x30(%rbp),%eax
add    $0x30,%eax
mov    %eax,-0x40(%rbp)
jmp    124e <bin2hex+0x14e>
mov    -0x30(%rbp),%eax
add    $0x41,%eax
sub    $0xa,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
cmpl   $0xa,-0x34(%rbp)
jge    127a <bin2hex+0x17a>
mov    -0x34(%rbp),%eax
add    $0x30,%eax
mov    %eax,-0x44(%rbp)
jmp    1286 <bin2hex+0x186>
mov    -0x34(%rbp),%eax
add    $0x41,%eax
sub    $0xa,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    1204 <bin2hex+0x104>
jmp    12c2 <bin2hex+0x1c2>
mov    -0x8(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bin2hex>:
push   %r14
push   %rbx
mov    %rdx,%rax
cmp    $0x1,%ecx
jne    1224 <bin2hex+0x124>
test   %rax,%rax
je     1334 <bin2hex+0x234>
lea    (%rsi,%rax,4),%rdx
add    $0xfffffffffffffffc,%rdx
cmp    $0x1,%rax
je     1140 <bin2hex+0x40>
lea    (%rsi,%rax,4),%rcx
cmp    %rdi,%rcx
jbe    133b <bin2hex+0x23b>
lea    (%rdi,%rax,8),%rcx
cmp    %rsi,%rcx
jbe    133b <bin2hex+0x23b>
xor    %r8d,%r8d
mov    %rdi,%r14
mov    %rdx,%r9
mov    %r8,%rdx
not    %rdx
test   $0x1,%al
je     1195 <bin2hex+0x95>
mov    (%r9),%r10d
mov    %r10d,%edi
sar    $0x4,%edi
mov    %r10d,%esi
and    $0xf,%esi
lea    0x37(%rdi),%r11d
add    $0x30,%edi
cmp    $0xa0,%r10d
cmovge %r11d,%edi
mov    %edi,(%r14)
lea    0x30(%rsi),%r10d
lea    0x37(%rsi),%edi
cmp    $0xa,%esi
cmovb  %r10d,%edi
mov    %edi,0x4(%r14)
add    $0x8,%r14
or     $0x1,%r8
add    $0xfffffffffffffffc,%r9
add    %rax,%rdx
je     14d3 <bin2hex+0x3d3>
sub    %rax,%r8
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%r9,%rdx,4),%esi
mov    %esi,%edi
sar    $0x4,%edi
mov    %esi,%ecx
and    $0xf,%ecx
lea    0x37(%rdi),%ebx
add    $0x30,%edi
cmp    $0xa0,%esi
cmovge %ebx,%edi
lea    0x30(%rcx),%esi
lea    0x37(%rcx),%ebx
cmp    $0xa,%ecx
cmovb  %esi,%ebx
mov    %edi,(%r14)
mov    %ebx,0x4(%r14)
mov    -0x4(%r9,%rdx,4),%ecx
mov    %ecx,%esi
sar    $0x4,%esi
mov    %ecx,%edi
and    $0xf,%edi
lea    0x37(%rsi),%ebx
add    $0x30,%esi
cmp    $0xa0,%ecx
cmovge %ebx,%esi
mov    %esi,0x8(%r14)
lea    0x30(%rdi),%ecx
lea    0x37(%rdi),%esi
cmp    $0xa,%edi
cmovb  %ecx,%esi
mov    %esi,0xc(%r14)
add    $0x10,%r14
add    $0xfffffffffffffffe,%rdx
cmp    %rdx,%r8
jne    11b0 <bin2hex+0xb0>
jmp    14d3 <bin2hex+0x3d3>
test   %rax,%rax
je     1334 <bin2hex+0x234>
cmp    $0x1,%rax
je     124d <bin2hex+0x14d>
lea    (%rsi,%rax,4),%rcx
cmp    %rdi,%rcx
jbe    1410 <bin2hex+0x310>
lea    (%rdi,%rax,8),%rcx
cmp    %rsi,%rcx
jbe    1410 <bin2hex+0x310>
xor    %r8d,%r8d
mov    %rdi,%r14
mov    %rsi,%r9
mov    %r8,%rsi
not    %rsi
test   $0x1,%al
je     12a2 <bin2hex+0x1a2>
mov    (%r9),%r10d
mov    %r10d,%edi
sar    $0x4,%edi
mov    %r10d,%edx
and    $0xf,%edx
lea    0x37(%rdi),%r11d
add    $0x30,%edi
cmp    $0xa0,%r10d
cmovge %r11d,%edi
mov    %edi,(%r14)
lea    0x30(%rdx),%r10d
lea    0x37(%rdx),%edi
cmp    $0xa,%edx
cmovb  %r10d,%edi
mov    %edi,0x4(%r14)
add    $0x8,%r14
or     $0x1,%r8
add    $0x4,%r9
add    %rax,%rsi
je     14d3 <bin2hex+0x3d3>
mov    %rax,%r10
sub    %r8,%r10
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%r9,%rdi,4),%edx
mov    %edx,%ebx
sar    $0x4,%ebx
mov    %edx,%esi
and    $0xf,%esi
lea    0x37(%rbx),%ecx
add    $0x30,%ebx
cmp    $0xa0,%edx
cmovge %ecx,%ebx
lea    0x30(%rsi),%ecx
lea    0x37(%rsi),%edx
cmp    $0xa,%esi
cmovb  %ecx,%edx
mov    %ebx,(%r14)
mov    %edx,0x4(%r14)
mov    0x4(%r9,%rdi,4),%ecx
mov    %ecx,%edx
sar    $0x4,%edx
mov    %ecx,%esi
and    $0xf,%esi
lea    0x37(%rdx),%ebx
add    $0x30,%edx
cmp    $0xa0,%ecx
cmovge %ebx,%edx
mov    %edx,0x8(%r14)
lea    0x30(%rsi),%ecx
lea    0x37(%rsi),%edx
cmp    $0xa,%esi
cmovb  %ecx,%edx
mov    %edx,0xc(%r14)
add    $0x10,%r14
add    $0x2,%rdi
cmp    %rdi,%r10
jne    12c0 <bin2hex+0x1c0>
jmp    14d3 <bin2hex+0x3d3>
xor    %eax,%eax
jmp    14d6 <bin2hex+0x3d6>
mov    %rax,%r8
and    $0xfffffffffffffffe,%r8
lea    (%rdi,%r8,8),%r14
lea    0x0(,%r8,4),%rsi
mov    %rdx,%r9
sub    %rsi,%r9
add    $0xfffffffffffffffc,%rdx
xor    %esi,%esi
movdqa 0xc9d(%rip),%xmm8
movdqa 0xca4(%rip),%xmm9
movdqa 0xcac(%rip),%xmm2
movdqa 0xcb4(%rip),%xmm3
movdqa 0xcbc(%rip),%xmm4
movdqa 0xcc4(%rip),%xmm5
nopl   0x0(%rax)
movq   (%rdx),%xmm6
pshufd $0xe1,%xmm6,%xmm6
movdqa %xmm6,%xmm7
psrad  $0x4,%xmm7
movdqa %xmm9,%xmm1
pcmpgtd %xmm6,%xmm1
pand   %xmm8,%xmm6
movdqa %xmm1,%xmm0
pandn  %xmm2,%xmm0
pand   %xmm3,%xmm1
por    %xmm0,%xmm1
paddd  %xmm7,%xmm1
movdqa %xmm6,%xmm0
pxor   %xmm4,%xmm0
movdqa %xmm5,%xmm7
pcmpgtd %xmm0,%xmm7
movdqa %xmm6,%xmm0
por    %xmm3,%xmm0
paddd  %xmm2,%xmm6
pand   %xmm7,%xmm0
pandn  %xmm6,%xmm7
por    %xmm0,%xmm7
punpckldq %xmm7,%xmm1
movdqu %xmm1,(%rdi,%rsi,8)
add    $0x2,%rsi
add    $0xfffffffffffffff8,%rdx
cmp    %rsi,%r8
jne    1390 <bin2hex+0x290>
cmp    %rax,%r8
jne    1149 <bin2hex+0x49>
jmp    14d3 <bin2hex+0x3d3>
mov    %rax,%r8
and    $0xfffffffffffffffe,%r8
lea    (%rdi,%r8,8),%r14
lea    (%rsi,%r8,4),%r9
xor    %edx,%edx
movdqa 0xbd6(%rip),%xmm8
movdqa 0xbdd(%rip),%xmm9
movdqa 0xbe5(%rip),%xmm2
movdqa 0xbed(%rip),%xmm3
movdqa 0xbf5(%rip),%xmm4
movdqa 0xbfd(%rip),%xmm5
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movq   (%rsi,%rdx,4),%xmm6
movdqa %xmm6,%xmm7
psrad  $0x4,%xmm7
movdqa %xmm9,%xmm1
pcmpgtd %xmm6,%xmm1
pand   %xmm8,%xmm6
movdqa %xmm1,%xmm0
pandn  %xmm2,%xmm0
pand   %xmm3,%xmm1
por    %xmm0,%xmm1
paddd  %xmm7,%xmm1
movdqa %xmm6,%xmm0
pxor   %xmm4,%xmm0
movdqa %xmm5,%xmm7
pcmpgtd %xmm0,%xmm7
movdqa %xmm6,%xmm0
por    %xmm3,%xmm0
paddd  %xmm2,%xmm6
pand   %xmm7,%xmm0
pandn  %xmm6,%xmm7
por    %xmm0,%xmm7
punpckldq %xmm7,%xmm1
movdqu %xmm1,(%rdi,%rdx,8)
add    $0x2,%rdx
cmp    %rdx,%r8
jne    1460 <bin2hex+0x360>
cmp    %rax,%r8
jne    1256 <bin2hex+0x156>
mov    %r14,%rdi
movl   $0x0,(%rdi)
add    %eax,%eax
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define i32 @bin2hex(i32* %0, i32* %1, i64 %2, i32 %3) {
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i64
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i32* %0, i32** %5
store i32* %1, i32** %6
store i64 %2, i64* %7
store i32 %3, i32* %8
store i32 0, i32* %10
%15 = load i32, i32* %8
%16 = icmp eq i32 %15, 1
br i1 %16, label %17, label %68
17: ; preds = %4
%18 = load i64, i64* %7
%19 = sub i64 %18, 1
%20 = load i32*, i32** %6
%21 = getelementptr inbounds i32, i32* %20, i64 %19
store i32* %21, i32** %6
store i32 0, i32* %9
br label %22
22: ; preds = %62, %17
%23 = load i32, i32* %9
%24 = sext i32 %23 to i64
%25 = load i64, i64* %7
%26 = icmp ult i64 %24, %25
br i1 %26, label %27, label %67
27: ; preds = %22
%28 = load i32*, i32** %6
%29 = load i32, i32* %28
%30 = ashr i32 %29, 4
store i32 %30, i32* %11
%31 = load i32*, i32** %6
%32 = load i32, i32* %31
%33 = and i32 %32, 15
store i32 %33, i32* %12
%34 = load i32, i32* %11
%35 = icmp slt i32 %34, 10
br i1 %35, label %36, label %39
36: ; preds = %27
%37 = load i32, i32* %11
%38 = add nsw i32 %37, 48
br label %43
39: ; preds = %27
%40 = load i32, i32* %11
%41 = add nsw i32 %40, 65
%42 = sub nsw i32 %41, 10
br label %43
43: ; preds = %39, %36
%44 = phi i32 [ %38, %36 ], [ %42, %39 ]
%45 = load i32*, i32** %5
%46 = getelementptr inbounds i32, i32* %45, i32 1
store i32* %46, i32** %5
store i32 %44, i32* %45
%47 = load i32, i32* %12
%48 = icmp slt i32 %47, 10
br i1 %48, label %49, label %52
49: ; preds = %43
%50 = load i32, i32* %12
%51 = add nsw i32 %50, 48
br label %56
52: ; preds = %43
%53 = load i32, i32* %12
%54 = add nsw i32 %53, 65
%55 = sub nsw i32 %54, 10
br label %56
56: ; preds = %52, %49
%57 = phi i32 [ %51, %49 ], [ %55, %52 ]
%58 = load i32*, i32** %5
%59 = getelementptr inbounds i32, i32* %58, i32 1
store i32* %59, i32** %5
store i32 %57, i32* %58
%60 = load i32, i32* %10
%61 = add nsw i32 %60, 1
store i32 %61, i32* %10
br label %62
62: ; preds = %56
%63 = load i32, i32* %9
%64 = add nsw i32 %63, 1
store i32 %64, i32* %9
%65 = load i32*, i32** %6
%66 = getelementptr inbounds i32, i32* %65, i32 -1
store i32* %66, i32** %6
br label %22
67: ; preds = %22
br label %115
68: ; preds = %4
store i32 0, i32* %9
br label %69
69: ; preds = %109, %68
%70 = load i32, i32* %9
%71 = sext i32 %70 to i64
%72 = load i64, i64* %7
%73 = icmp ult i64 %71, %72
br i1 %73, label %74, label %114
74: ; preds = %69
%75 = load i32*, i32** %6
%76 = load i32, i32* %75
%77 = ashr i32 %76, 4
store i32 %77, i32* %13
%78 = load i32*, i32** %6
%79 = load i32, i32* %78
%80 = and i32 %79, 15
store i32 %80, i32* %14
%81 = load i32, i32* %13
%82 = icmp slt i32 %81, 10
br i1 %82, label %83, label %86
83: ; preds = %74
%84 = load i32, i32* %13
%85 = add nsw i32 %84, 48
br label %90
86: ; preds = %74
%87 = load i32, i32* %13
%88 = add nsw i32 %87, 65
%89 = sub nsw i32 %88, 10
br label %90
90: ; preds = %86, %83
%91 = phi i32 [ %85, %83 ], [ %89, %86 ]
%92 = load i32*, i32** %5
%93 = getelementptr inbounds i32, i32* %92, i32 1
store i32* %93, i32** %5
store i32 %91, i32* %92
%94 = load i32, i32* %14
%95 = icmp slt i32 %94, 10
br i1 %95, label %96, label %99
96: ; preds = %90
%97 = load i32, i32* %14
%98 = add nsw i32 %97, 48
br label %103
99: ; preds = %90
%100 = load i32, i32* %14
%101 = add nsw i32 %100, 65
%102 = sub nsw i32 %101, 10
br label %103
103: ; preds = %99, %96
%104 = phi i32 [ %98, %96 ], [ %102, %99 ]
%105 = load i32*, i32** %5
%106 = getelementptr inbounds i32, i32* %105, i32 1
store i32* %106, i32** %5
store i32 %104, i32* %105
%107 = load i32, i32* %10
%108 = add nsw i32 %107, 1
store i32 %108, i32* %10
br label %109
109: ; preds = %103
%110 = load i32, i32* %9
%111 = add nsw i32 %110, 1
store i32 %111, i32* %9
%112 = load i32*, i32** %6
%113 = getelementptr inbounds i32, i32* %112, i32 1
store i32* %113, i32** %6
br label %69
114: ; preds = %69
br label %115
115: ; preds = %114, %67
%116 = load i32*, i32** %5
store i32 0, i32* %116
%117 = load i32, i32* %10
%118 = mul nsw i32 2, %117
ret i32 %118
}

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