void decrypt(char *plain, const char *cipher, int len, int key) {
  int i, tmp;
  for (i = 0; i < len; i++) {
    if ('A' <= cipher[i] && cipher[i] <= 'Z') {
      tmp = cipher[i] - 'A' + 26;
      tmp = (tmp - key) % 26;
      plain[i] = tmp + 'A';
    } else if ('a' <= cipher[i] && cipher[i] <= 'z') {
      tmp = cipher[i] - 'a' + 26;
      tmp = (tmp - key) % 26;
      plain[i] = tmp + 'a';
    } else
      plain[i] = cipher[i];
  }
  return;
}


x86 assembly (clang, -O0):
<decrypt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    122b <decrypt+0x12b>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     1191 <decrypt+0x91>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jg     1191 <decrypt+0x91>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
add    $0x1a,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    $0x1a,%ecx
cltd
idiv   %ecx
mov    %edx,-0x20(%rbp)
mov    -0x20(%rbp),%eax
add    $0x41,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1218 <decrypt+0x118>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     11fd <decrypt+0xfd>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     11fd <decrypt+0xfd>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x61,%eax
add    $0x1a,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    $0x1a,%ecx
cltd
idiv   %ecx
mov    %edx,-0x20(%rbp)
mov    -0x20(%rbp),%eax
add    $0x61,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1213 <decrypt+0x113>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1218 <decrypt+0x118>
jmp    121d <decrypt+0x11d>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1119 <decrypt+0x19>
pop    %rbp
ret

x86 assembly (clang, -O2):
<decrypt>:
test   %edx,%edx
jle    18f1 <decrypt+0x7f1>
mov    $0xffffffb9,%r8d
sub    %ecx,%r8d
mov    $0xffffffd9,%r9d
sub    %ecx,%r9d
mov    %edx,%r10d
cmp    $0x8,%edx
jae    112a <decrypt+0x2a>
xor    %r11d,%r11d
jmp    1933 <decrypt+0x833>
lea    (%rsi,%r10,1),%rax
cmp    %rdi,%rax
jbe    1144 <decrypt+0x44>
lea    (%rdi,%r10,1),%rax
cmp    %rsi,%rax
jbe    1144 <decrypt+0x44>
xor    %r11d,%r11d
jmp    1933 <decrypt+0x833>
movd   %r8d,%xmm0
movd   %r9d,%xmm1
cmp    $0x10,%edx
jae    115b <decrypt+0x5b>
xor    %r11d,%r11d
jmp    162c <decrypt+0x52c>
mov    %r10d,%r11d
and    $0xfffffff0,%r11d
movdqa %xmm0,-0x28(%rsp)
pshufd $0x0,%xmm0,%xmm15
movdqa %xmm1,-0x38(%rsp)
pshufd $0x0,%xmm1,%xmm0
movdqa %xmm0,-0x18(%rsp)
xor    %eax,%eax
movdqa 0xea7(%rip),%xmm7
movdqa 0xeaf(%rip),%xmm0
movdqa 0xeb7(%rip),%xmm1
nopl   0x0(%rax)
movdqu (%rsi,%rax,1),%xmm4
punpcklbw %xmm4,%xmm2
punpcklwd %xmm2,%xmm6
psrad  $0x18,%xmm6
punpckhwd %xmm2,%xmm9
psrad  $0x18,%xmm9
punpckhbw %xmm4,%xmm2
punpcklwd %xmm2,%xmm10
psrad  $0x18,%xmm10
punpckhwd %xmm2,%xmm11
psrad  $0x18,%xmm11
movdqa %xmm4,%xmm5
paddb  0xe1d(%rip),%xmm5
movdqa %xmm5,%xmm2
movdqa 0xe21(%rip),%xmm3
pminub %xmm3,%xmm2
pcmpeqb %xmm5,%xmm2
movdqa %xmm4,%xmm5
paddb  0xe1d(%rip),%xmm5
movdqa %xmm5,%xmm8
pminub %xmm3,%xmm8
pcmpeqb %xmm5,%xmm8
pand   %xmm2,%xmm8
movdqa %xmm15,%xmm14
paddd  %xmm11,%xmm14
movdqa %xmm15,%xmm12
paddd  %xmm10,%xmm12
movdqa %xmm15,%xmm13
paddd  %xmm9,%xmm13
movdqa %xmm15,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm2,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
punpckldq %xmm3,%xmm5
pxor   %xmm3,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm7,%xmm3
psubd  %xmm3,%xmm5
movdqa %xmm5,%xmm3
psrld  $0x1f,%xmm3
psrld  $0x3,%xmm5
paddd  %xmm3,%xmm5
pshufd $0xf5,%xmm5,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm5
psubd  %xmm5,%xmm2
movdqa %xmm13,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm13,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm13,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm13
movdqa %xmm12,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm12,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm12,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm12
movdqa %xmm14,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm14,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm14,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm14
pand   %xmm1,%xmm14
pand   %xmm1,%xmm12
packuswb %xmm14,%xmm12
pand   %xmm1,%xmm13
pand   %xmm1,%xmm2
packuswb %xmm13,%xmm2
packuswb %xmm12,%xmm2
movdqa -0x18(%rsp),%xmm3
paddd  %xmm3,%xmm11
paddd  %xmm3,%xmm10
paddd  %xmm3,%xmm9
paddd  %xmm3,%xmm6
movdqa %xmm6,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm6,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm6,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm6
movdqa %xmm9,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm9,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm9,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm9
movdqa %xmm10,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm10,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm10,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm10
movdqa %xmm11,%xmm3
pmuludq %xmm7,%xmm3
pshufd $0xed,%xmm3,%xmm3
pshufd $0xf5,%xmm11,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xed,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
pxor   %xmm5,%xmm5
pcmpgtd %xmm11,%xmm5
pand   %xmm7,%xmm5
psubd  %xmm5,%xmm3
movdqa %xmm3,%xmm5
psrld  $0x1f,%xmm5
psrld  $0x3,%xmm3
paddd  %xmm5,%xmm3
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm0,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pmuludq %xmm0,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm3
psubd  %xmm3,%xmm11
pand   %xmm1,%xmm11
pand   %xmm1,%xmm10
packuswb %xmm11,%xmm10
pand   %xmm1,%xmm9
pand   %xmm1,%xmm6
packuswb %xmm9,%xmm6
packuswb %xmm10,%xmm6
movdqa %xmm4,%xmm3
paddb  0xac1(%rip),%xmm3
movdqa %xmm3,%xmm5
pminub 0xac5(%rip),%xmm5
pcmpeqb %xmm3,%xmm5
paddb  0xa89(%rip),%xmm2
paddb  0xa91(%rip),%xmm6
pand   %xmm5,%xmm2
pandn  %xmm6,%xmm5
por    %xmm2,%xmm5
pand   %xmm8,%xmm4
pandn  %xmm5,%xmm8
por    %xmm4,%xmm8
movdqu %xmm8,(%rdi,%rax,1)
add    $0x10,%rax
cmp    %rax,%r11
jne    11a0 <decrypt+0xa0>
cmp    %r10,%r11
movdqa -0x28(%rsp),%xmm0
movdqa -0x38(%rsp),%xmm1
je     18f1 <decrypt+0x7f1>
test   $0x8,%r10b
je     1933 <decrypt+0x833>
mov    %r11,%rax
mov    %r10d,%r11d
and    $0xfffffff8,%r11d
pshufd $0x0,%xmm0,%xmm10
pshufd $0x0,%xmm1,%xmm11
movdqa 0xa65(%rip),%xmm15
movdqa 0x9dd(%rip),%xmm6
movdqa 0x9e5(%rip),%xmm7
movdqa 0x9ec(%rip),%xmm13
movdqa 0xa93(%rip),%xmm14
nopl   (%rax)
movq   (%rsi,%rax,1),%xmm4
punpcklbw %xmm4,%xmm0
punpcklwd %xmm0,%xmm5
psrad  $0x18,%xmm5
punpckhwd %xmm0,%xmm8
psrad  $0x18,%xmm8
movdqa %xmm4,%xmm0
paddb  0xa07(%rip),%xmm0
movdqa %xmm0,%xmm3
pmaxub %xmm15,%xmm3
pcmpeqb %xmm0,%xmm3
movdqa %xmm4,%xmm1
paddb  0xa0e(%rip),%xmm1
movdqa %xmm1,%xmm0
pmaxub %xmm15,%xmm0
pcmpeqb %xmm1,%xmm0
pxor   0xa49(%rip),%xmm0
pandn  %xmm0,%xmm3
movdqa %xmm10,%xmm9
paddd  %xmm8,%xmm9
movdqa %xmm10,%xmm0
paddd  %xmm5,%xmm0
movdqa %xmm0,%xmm1
pmuludq %xmm6,%xmm1
pshufd $0xed,%xmm1,%xmm1
pshufd $0xf5,%xmm0,%xmm12
pmuludq %xmm6,%xmm12
pshufd $0xed,%xmm12,%xmm2
punpckldq %xmm2,%xmm1
pxor   %xmm2,%xmm2
pcmpgtd %xmm0,%xmm2
pand   %xmm6,%xmm2
psubd  %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrld  $0x1f,%xmm2
psrld  $0x3,%xmm1
paddd  %xmm2,%xmm1
pshufd $0xf5,%xmm1,%xmm2
pmuludq %xmm7,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm7,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
psubd  %xmm1,%xmm0
movdqa %xmm9,%xmm1
pmuludq %xmm6,%xmm1
pshufd $0xed,%xmm1,%xmm1
pshufd $0xf5,%xmm9,%xmm2
pmuludq %xmm6,%xmm2
pshufd $0xed,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
pxor   %xmm2,%xmm2
pcmpgtd %xmm9,%xmm2
pand   %xmm6,%xmm2
psubd  %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrld  $0x1f,%xmm2
psrld  $0x3,%xmm1
paddd  %xmm2,%xmm1
pshufd $0xf5,%xmm1,%xmm2
pmuludq %xmm7,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm7,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
psubd  %xmm1,%xmm9
pand   %xmm13,%xmm9
pand   %xmm13,%xmm0
packuswb %xmm9,%xmm0
paddd  %xmm11,%xmm8
paddd  %xmm11,%xmm5
movdqa %xmm5,%xmm1
pmuludq %xmm6,%xmm1
pshufd $0xed,%xmm1,%xmm1
pshufd $0xf5,%xmm5,%xmm2
pmuludq %xmm6,%xmm2
pshufd $0xed,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
pxor   %xmm2,%xmm2
pcmpgtd %xmm5,%xmm2
pand   %xmm6,%xmm2
psubd  %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrld  $0x1f,%xmm2
psrld  $0x3,%xmm1
paddd  %xmm2,%xmm1
pshufd $0xf5,%xmm1,%xmm2
pmuludq %xmm7,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm7,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
psubd  %xmm1,%xmm5
movdqa %xmm8,%xmm1
pmuludq %xmm6,%xmm1
pshufd $0xed,%xmm1,%xmm1
pshufd $0xf5,%xmm8,%xmm2
pmuludq %xmm6,%xmm2
pshufd $0xed,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
pxor   %xmm2,%xmm2
pcmpgtd %xmm8,%xmm2
pand   %xmm6,%xmm2
psubd  %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrld  $0x1f,%xmm2
psrld  $0x3,%xmm1
paddd  %xmm2,%xmm1
pshufd $0xf5,%xmm1,%xmm2
pmuludq %xmm7,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm7,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm1
psubd  %xmm1,%xmm8
pand   %xmm13,%xmm8
pand   %xmm13,%xmm5
packuswb %xmm8,%xmm5
movdqa %xmm4,%xmm1
paddb  0x853(%rip),%xmm1
movdqa %xmm1,%xmm2
pmaxub %xmm14,%xmm2
pcmpeqb %xmm1,%xmm2
packuswb %xmm0,%xmm0
paddb  0x81a(%rip),%xmm0
packuswb %xmm5,%xmm5
paddb  0x81e(%rip),%xmm5
pand   %xmm2,%xmm5
pandn  %xmm0,%xmm2
por    %xmm5,%xmm2
pand   %xmm3,%xmm4
pandn  %xmm2,%xmm3
por    %xmm4,%xmm3
movq   %xmm3,(%rdi,%rax,1)
add    $0x8,%rax
cmp    %rax,%r11
jne    1670 <decrypt+0x570>
cmp    %r10,%r11
jne    1933 <decrypt+0x833>
ret
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    %r9d,%ecx
movslq %ecx,%rax
imul   $0x4ec4ec4f,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x23,%rcx
add    %edx,%ecx
lea    (%rcx,%rcx,4),%edx
lea    (%rdx,%rdx,4),%edx
add    %ecx,%edx
sub    %edx,%eax
add    $0x41,%al
mov    %al,(%rdi,%r11,1)
add    $0x1,%r11
cmp    %r11,%r10
je     18f1 <decrypt+0x7f1>
movzbl (%rsi,%r11,1),%eax
movsbl %al,%ecx
lea    -0x41(%rcx),%edx
cmp    $0x19,%dl
jbe    1900 <decrypt+0x800>
lea    -0x61(%rax),%edx
cmp    $0x19,%dl
ja     1926 <decrypt+0x826>
add    %r8d,%ecx
movslq %ecx,%rax
imul   $0x4ec4ec4f,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x23,%rcx
add    %edx,%ecx
lea    (%rcx,%rcx,4),%edx
lea    (%rdx,%rdx,4),%edx
add    %ecx,%edx
sub    %edx,%eax
add    $0x61,%al
jmp    1926 <decrypt+0x826>

LLVM IR (-O0):
define void @decrypt(i8* %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 0, i32* %9
br label %11
11: ; preds = %99, %4
%12 = load i32, i32* %9
%13 = load i32, i32* %7
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %102
15: ; preds = %11
%16 = load i8*, i8** %6
%17 = load i32, i32* %9
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %16, i64 %18
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
%22 = icmp sle i32 65, %21
br i1 %22, label %23, label %51
23: ; preds = %15
%24 = load i8*, i8** %6
%25 = load i32, i32* %9
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i8, i8* %24, i64 %26
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = icmp sle i32 %29, 90
br i1 %30, label %31, label %51
31: ; preds = %23
%32 = load i8*, i8** %6
%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 = sub nsw i32 %37, 65
%39 = add nsw i32 %38, 26
store i32 %39, i32* %10
%40 = load i32, i32* %10
%41 = load i32, i32* %8
%42 = sub nsw i32 %40, %41
%43 = srem i32 %42, 26
store i32 %43, i32* %10
%44 = load i32, i32* %10
%45 = add nsw i32 %44, 65
%46 = trunc i32 %45 to i8
%47 = load i8*, i8** %5
%48 = load i32, i32* %9
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i8, i8* %47, i64 %49
store i8 %46, i8* %50
br label %98
51: ; preds = %23, %15
%52 = load i8*, i8** %6
%53 = load i32, i32* %9
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %52, i64 %54
%56 = load i8, i8* %55
%57 = sext i8 %56 to i32
%58 = icmp sle i32 97, %57
br i1 %58, label %59, label %87
59: ; preds = %51
%60 = load i8*, i8** %6
%61 = load i32, i32* %9
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i8, i8* %60, i64 %62
%64 = load i8, i8* %63
%65 = sext i8 %64 to i32
%66 = icmp sle i32 %65, 122
br i1 %66, label %67, label %87
67: ; preds = %59
%68 = load i8*, i8** %6
%69 = load i32, i32* %9
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i8, i8* %68, i64 %70
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = sub nsw i32 %73, 97
%75 = add nsw i32 %74, 26
store i32 %75, i32* %10
%76 = load i32, i32* %10
%77 = load i32, i32* %8
%78 = sub nsw i32 %76, %77
%79 = srem i32 %78, 26
store i32 %79, i32* %10
%80 = load i32, i32* %10
%81 = add nsw i32 %80, 97
%82 = trunc i32 %81 to i8
%83 = load i8*, i8** %5
%84 = load i32, i32* %9
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %83, i64 %85
store i8 %82, i8* %86
br label %97
87: ; preds = %59, %51
%88 = load i8*, i8** %6
%89 = load i32, i32* %9
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds i8, i8* %88, i64 %90
%92 = load i8, i8* %91
%93 = load i8*, i8** %5
%94 = load i32, i32* %9
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i8, i8* %93, i64 %95
store i8 %92, i8* %96
br label %97
97: ; preds = %87, %67
br label %98
98: ; preds = %97, %31
br label %99
99: ; preds = %98
%100 = load i32, i32* %9
%101 = add nsw i32 %100, 1
store i32 %101, i32* %9
br label %11
102: ; preds = %11
ret void
}

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