int shiftleft(unsigned char *a, int a_len) {
  int i, j, front, lastfront;
  if (a_len == 0) {
    if ((a[0] & 0x80) == 0) {
      a[0] <<= 1;
      return 0;
    } else {
      a[1] = a[0];
      a[0] = 0;
      a_len++;
    }
  }
  if (a[a_len] & 0x80)
    lastfront = 1;
  else
    lastfront = 0;
  a[a_len] <<= 1;
  for (i = a_len - 1; i >= 0; i--) {
    if (a[i] & 0x80)
      front = 1;
    else
      front = 0;
    a[i] <<= 1;
    if (lastfront)
      a[i] |= 0x1;
    lastfront = front;
  }
  if (front) {
    a_len++;
    for (i = a_len, j = a_len - 1; j >= 0; i--, j--)
      a[i] = a[j];
    a[0] = 1;
  }
  return a_len;
}


x86 assembly (clang, -O0):
<shiftleft>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1164 <shiftleft+0x64>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1142 <shiftleft+0x42>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
shl    $0x1,%ecx
mov    %cl,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    128b <shiftleft+0x18b>
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1164 <shiftleft+0x64>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     118a <shiftleft+0x8a>
movl   $0x1,-0x24(%rbp)
jmp    1191 <shiftleft+0x91>
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%edx
shl    $0x1,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jl     1225 <shiftleft+0x125>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     11dc <shiftleft+0xdc>
movl   $0x1,-0x20(%rbp)
jmp    11e3 <shiftleft+0xe3>
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%edx
shl    $0x1,%edx
mov    %dl,(%rax,%rcx,1)
cmpl   $0x0,-0x24(%rbp)
je     1211 <shiftleft+0x111>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%edx
or     $0x1,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    11ac <shiftleft+0xac>
cmpl   $0x0,-0x20(%rbp)
je     1285 <shiftleft+0x185>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jl     127e <shiftleft+0x17e>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
jmp    1247 <shiftleft+0x147>
mov    -0x10(%rbp),%rax
movb   $0x1,(%rax)
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<shiftleft>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %esi,%esi
je     1131 <shiftleft+0x31>
mov    %esi,%eax
movslq %esi,%rdx
mov    (%rdi,%rdx,1),%r13b
lea    0x0(%r13,%r13,1),%esi
mov    %sil,(%rdi,%rdx,1)
test   %eax,%eax
jg     1154 <shiftleft+0x54>
add    $0x1,%eax
mov    $0x1,%r13b
mov    %eax,%r8d
jmp    139b <shiftleft+0x29b>
mov    (%rdi),%r13b
test   %r13b,%r13b
js     1144 <shiftleft+0x44>
add    %r13b,%r13b
xor    %r8d,%r8d
jmp    139b <shiftleft+0x29b>
movb   $0x0,(%rdi)
lea    0x0(%r13,%r13,1),%eax
mov    %al,0x1(%rdi)
mov    $0x1,%eax
mov    %eax,%r11d
cmp    $0x10,%eax
jb     1269 <shiftleft+0x169>
lea    -0x1(%r11),%rdx
lea    -0x1(%rax),%esi
cmp    %edx,%esi
jb     1269 <shiftleft+0x169>
mov    %rdx,%rsi
shr    $0x20,%rsi
jne    1269 <shiftleft+0x169>
mov    %r11d,%r8d
and    $0xfffffff0,%r8d
mov    %r11d,%esi
and    $0xf,%esi
movzbl %r13b,%ecx
movd   %ecx,%xmm2
pslldq $0xf,%xmm2
pxor   %xmm0,%xmm0
movdqa 0xe5e(%rip),%xmm1
mov    %r8,%rcx
cs nopw 0x0(%rax,%rax,1)
nop
mov    %edx,%r9d
movdqu -0xf(%rdi,%r9,1),%xmm3
movdqa %xmm3,%xmm4
punpcklbw %xmm0,%xmm4
pshufd $0x4e,%xmm4,%xmm4
pshuflw $0x1b,%xmm4,%xmm4
pshufhw $0x1b,%xmm4,%xmm5
movdqa %xmm3,%xmm4
punpckhbw %xmm0,%xmm4
pshufd $0x4e,%xmm4,%xmm4
pshuflw $0x1b,%xmm4,%xmm4
pshufhw $0x1b,%xmm4,%xmm4
packuswb %xmm5,%xmm4
movdqa %xmm4,%xmm5
pslldq $0x1,%xmm5
psrldq $0xf,%xmm2
por    %xmm5,%xmm2
movdqa %xmm4,%xmm5
paddb  %xmm4,%xmm5
psrlw  $0x7,%xmm2
pand   %xmm1,%xmm2
por    %xmm5,%xmm2
movdqa %xmm2,%xmm5
punpcklbw %xmm0,%xmm5
pshufd $0x4e,%xmm5,%xmm5
pshuflw $0x1b,%xmm5,%xmm5
pshufhw $0x1b,%xmm5,%xmm5
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm5,%xmm2
movdqu %xmm2,-0xf(%rdi,%r9,1)
add    $0xfffffffffffffff0,%rdx
movdqa %xmm4,%xmm2
add    $0xfffffffffffffff0,%rcx
jne    11b0 <shiftleft+0xb0>
movd   %xmm3,%r13d
mov    %r13d,%edx
cmp    %r11,%r8
jne    126c <shiftleft+0x16c>
jmp    1292 <shiftleft+0x192>
mov    %r11,%rsi
add    $0x1,%rsi
lea    -0x2(%rsi),%ebx
movzbl (%rdi,%rbx,1),%edx
lea    (%rdx,%rdx,1),%ecx
shr    $0x7,%r13b
or     %cl,%r13b
mov    %r13b,(%rdi,%rbx,1)
add    $0xffffffffffffffff,%rsi
mov    %edx,%r13d
cmp    $0x1,%rsi
ja     1270 <shiftleft+0x170>
test   %dl,%dl
jns    13a1 <shiftleft+0x2a1>
lea    0x1(%rax),%r8d
mov    $0x1,%r13b
test   %eax,%eax
js     139b <shiftleft+0x29b>
movslq %r8d,%rsi
cmp    $0x3,%eax
jae    12f9 <shiftleft+0x1f9>
mov    %r11,%r14
lea    0x1(%r14),%eax
and    $0x3,%rax
je     1352 <shiftleft+0x252>
xor    %ebx,%ebx
mov    %rdi,%rdx
nopw   0x0(%rax,%rax,1)
movzbl (%rdx,%r14,1),%ecx
mov    %cl,(%rdx,%rsi,1)
add    $0x1,%rbx
add    $0xffffffffffffffff,%rdx
cmp    %rbx,%rax
jne    12d0 <shiftleft+0x1d0>
sub    %rbx,%rsi
mov    %r14,%rax
sub    %rbx,%rax
cmp    $0x3,%r14
jae    135b <shiftleft+0x25b>
jmp    139b <shiftleft+0x29b>
lea    (%rdi,%rsi,1),%rcx
mov    %rcx,%rdx
sub    %r11,%rdx
cmp    %rcx,%rdx
ja     12b1 <shiftleft+0x1b1>
lea    (%rdi,%r11,1),%rcx
cmp    %rdi,%rcx
jb     12b1 <shiftleft+0x1b1>
mov    %rsi,%rcx
sub    %r11,%rcx
add    %rdi,%rcx
lea    (%r11,%rdi,1),%rdx
add    $0x1,%rdx
cmp    %rdx,%rcx
jae    1338 <shiftleft+0x238>
lea    (%rsi,%rdi,1),%rcx
add    $0x1,%rcx
cmp    %rdi,%rcx
ja     12b1 <shiftleft+0x1b1>
lea    0x1(%r11),%r9
movabs $0x1fffffff0,%r10
cmp    $0xf,%eax
jae    13ab <shiftleft+0x2ab>
xor    %eax,%eax
jmp    1471 <shiftleft+0x371>
mov    %r14,%rax
cmp    $0x3,%r14
jb     139b <shiftleft+0x29b>
add    %rdi,%rsi
lea    (%rdi,%rax,1),%rdx
not    %rax
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movzbl (%rdx,%rbx,1),%ecx
mov    %cl,(%rsi,%rbx,1)
movzbl -0x1(%rdx,%rbx,1),%ecx
mov    %cl,-0x1(%rsi,%rbx,1)
movzbl -0x2(%rdx,%rbx,1),%ecx
mov    %cl,-0x2(%rsi,%rbx,1)
movzbl -0x3(%rdx,%rbx,1),%ecx
mov    %cl,-0x3(%rsi,%rbx,1)
add    $0xfffffffffffffffc,%rbx
cmp    %rbx,%rax
jne    1370 <shiftleft+0x270>
mov    %r13b,(%rdi)
mov    %r8d,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
mov    %r9,%rax
and    %r10,%rax
lea    -0x10(%rax),%rcx
mov    %rcx,%rdx
shr    $0x4,%rdx
add    $0x1,%rdx
mov    %edx,%r14d
and    $0x3,%r14d
cmp    $0x30,%rcx
jae    13d1 <shiftleft+0x2d1>
xor    %ebx,%ebx
jmp    1424 <shiftleft+0x324>
and    $0xfffffffffffffffc,%rdx
lea    (%rsi,%rdi,1),%r15
add    $0xfffffffffffffff1,%r15
lea    (%r11,%rdi,1),%r12
add    $0xfffffffffffffff1,%r12
xor    %ebx,%ebx
movups (%r12,%rbx,1),%xmm0
movups %xmm0,(%r15,%rbx,1)
movups -0x10(%r12,%rbx,1),%xmm0
movups %xmm0,-0x10(%r15,%rbx,1)
movups -0x20(%r12,%rbx,1),%xmm0
movups %xmm0,-0x20(%r15,%rbx,1)
movdqu -0x30(%r12,%rbx,1),%xmm0
movdqu %xmm0,-0x30(%r15,%rbx,1)
add    $0xffffffffffffffc0,%rbx
add    $0xfffffffffffffffc,%rdx
jne    13e7 <shiftleft+0x2e7>
neg    %rbx
test   %r14,%r14
je     1462 <shiftleft+0x362>
mov    %r11,%rcx
sub    %rbx,%rcx
lea    (%rcx,%rdi,1),%r15
add    $0xfffffffffffffff1,%r15
mov    %rsi,%rcx
sub    %rbx,%rcx
lea    (%rcx,%rdi,1),%rbx
add    $0xfffffffffffffff1,%rbx
shl    $0x4,%r14
xor    %edx,%edx
movdqu (%r15,%rdx,1),%xmm0
movdqu %xmm0,(%rbx,%rdx,1)
add    $0xfffffffffffffff0,%rdx
mov    %r14,%rcx
add    %rdx,%rcx
jne    144b <shiftleft+0x34b>
cmp    %rax,%r9
je     139b <shiftleft+0x29b>
test   $0xc,%r9b
je     14bd <shiftleft+0x3bd>
add    $0xc,%r10
and    %r9,%r10
mov    %r11,%r14
sub    %r10,%r14
mov    %r9,%r15
and    $0xfffffffffffffffc,%r15
neg    %r15
neg    %rax
lea    (%r11,%rdi,1),%rdx
add    $0xfffffffffffffffd,%rdx
lea    (%rsi,%rdi,1),%rbx
add    $0xfffffffffffffffd,%rbx
sub    %r10,%rsi
xchg   %ax,%ax
mov    (%rdx,%rax,1),%ecx
mov    %ecx,(%rbx,%rax,1)
add    $0xfffffffffffffffc,%rax
cmp    %rax,%r15
jne    14a0 <shiftleft+0x3a0>
cmp    %r10,%r9
jne    12b4 <shiftleft+0x1b4>
jmp    139b <shiftleft+0x29b>
sub    %rax,%r11
sub    %rax,%rsi
jmp    12b1 <shiftleft+0x1b1>

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

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