#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 /*<<< orphan*/ AddRoundKey(unsigned char **, unsigned long *);
int /*<<< orphan*/ InvMixColumns(unsigned char **);
int /*<<< orphan*/ InvShiftRows(unsigned char **);
int /*<<< orphan*/ InvSubBytes(unsigned char **);
void aes_decrypt(unsigned char in[], unsigned char out[], unsigned long key[],
                 int keysize) {
  unsigned char state[4][4];
  state[0][0] = in[0];
  state[1][0] = in[1];
  state[2][0] = in[2];
  state[3][0] = in[3];
  state[0][1] = in[4];
  state[1][1] = in[5];
  state[2][1] = in[6];
  state[3][1] = in[7];
  state[0][2] = in[8];
  state[1][2] = in[9];
  state[2][2] = in[10];
  state[3][2] = in[11];
  state[0][3] = in[12];
  state[1][3] = in[13];
  state[2][3] = in[14];
  state[3][3] = in[15];
  if (keysize > 128) {
    if (keysize > 192) {
      AddRoundKey(state, &key[56]);
      InvShiftRows(state);
      InvSubBytes(state);
      AddRoundKey(state, &key[52]);
      InvMixColumns(state);
      InvShiftRows(state);
      InvSubBytes(state);
      AddRoundKey(state, &key[48]);
      InvMixColumns(state);
    } else {
      AddRoundKey(state, &key[48]);
    }
    InvShiftRows(state);
    InvSubBytes(state);
    AddRoundKey(state, &key[44]);
    InvMixColumns(state);
    InvShiftRows(state);
    InvSubBytes(state);
    AddRoundKey(state, &key[40]);
    InvMixColumns(state);
  } else {
    AddRoundKey(state, &key[40]);
  }
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[36]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[32]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[28]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[24]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[20]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[16]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[12]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[8]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[4]);
  InvMixColumns(state);
  InvShiftRows(state);
  InvSubBytes(state);
  AddRoundKey(state, &key[0]);
  out[0] = state[0][0];
  out[1] = state[1][0];
  out[2] = state[2][0];
  out[3] = state[3][0];
  out[4] = state[0][1];
  out[5] = state[1][1];
  out[6] = state[2][1];
  out[7] = state[3][1];
  out[8] = state[0][2];
  out[9] = state[1][2];
  out[10] = state[2][2];
  out[11] = state[3][2];
  out[12] = state[0][3];
  out[13] = state[1][3];
  out[14] = state[2][3];
  out[15] = state[3][3];
}


x86 assembly (clang, -O0):
<aes_decrypt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    0x3(%rax),%al
mov    %al,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%al
mov    %al,-0x2f(%rbp)
mov    -0x8(%rbp),%rax
mov    0x5(%rax),%al
mov    %al,-0x2b(%rbp)
mov    -0x8(%rbp),%rax
mov    0x6(%rax),%al
mov    %al,-0x27(%rbp)
mov    -0x8(%rbp),%rax
mov    0x7(%rax),%al
mov    %al,-0x23(%rbp)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%al
mov    %al,-0x2e(%rbp)
mov    -0x8(%rbp),%rax
mov    0x9(%rax),%al
mov    %al,-0x2a(%rbp)
mov    -0x8(%rbp),%rax
mov    0xa(%rax),%al
mov    %al,-0x26(%rbp)
mov    -0x8(%rbp),%rax
mov    0xb(%rax),%al
mov    %al,-0x22(%rbp)
mov    -0x8(%rbp),%rax
mov    0xc(%rax),%al
mov    %al,-0x2d(%rbp)
mov    -0x8(%rbp),%rax
mov    0xd(%rax),%al
mov    %al,-0x29(%rbp)
mov    -0x8(%rbp),%rax
mov    0xe(%rax),%al
mov    %al,-0x25(%rbp)
mov    -0x8(%rbp),%rax
mov    0xf(%rax),%al
mov    %al,-0x21(%rbp)
cmpl   $0x80,-0x1c(%rbp)
jle    12fe <aes_decrypt+0x1be>
cmpl   $0xc0,-0x1c(%rbp)
jle    1287 <aes_decrypt+0x147>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x1c0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x1a0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x180,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
jmp    129b <aes_decrypt+0x15b>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x180,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x160,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x140,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
jmp    1312 <aes_decrypt+0x1d2>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x140,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x120,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x100,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0xe0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0xc0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0xa0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x80,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x60,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x40,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x20,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1030 <InvMixColumns@plt>
lea    -0x30(%rbp),%rdi
call   1050 <InvShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <InvSubBytes@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <AddRoundKey@plt>
mov    -0x30(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x2c(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x28(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x24(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x2f(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x2b(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x27(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x23(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x7(%rax)
mov    -0x2e(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x8(%rax)
mov    -0x2a(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x9(%rax)
mov    -0x26(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0xa(%rax)
mov    -0x22(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0xb(%rax)
mov    -0x2d(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0xc(%rax)
mov    -0x29(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0xd(%rax)
mov    -0x25(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0xe(%rax)
mov    -0x21(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,0xf(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<aes_decrypt>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
mov    %rdx,%r15
mov    %rsi,%r14
movdqu (%rdi),%xmm0
pxor   %xmm1,%xmm1
movdqa %xmm0,%xmm2
punpckhbw %xmm1,%xmm2
pshufd $0xe7,%xmm2,%xmm3
pshuflw $0x72,%xmm3,%xmm3
punpcklbw %xmm1,%xmm0
pshufd $0xe7,%xmm0,%xmm1
pshuflw $0x72,%xmm1,%xmm1
punpckldq %xmm3,%xmm1
pshufd $0xe8,%xmm2,%xmm2
pshuflw $0xd8,%xmm2,%xmm2
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xd8,%xmm0,%xmm0
punpckldq %xmm2,%xmm0
packuswb %xmm1,%xmm0
movdqa %xmm0,(%rsp)
cmp    $0x81,%ecx
jl     120e <aes_decrypt+0xce>
cmp    $0xc1,%ecx
jb     121f <aes_decrypt+0xdf>
lea    0x1c0(%r15),%rsi
mov    %rsp,%rbx
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x1a0(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x180(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
jmp    122e <aes_decrypt+0xee>
lea    0x140(%r15),%rsi
mov    %rsp,%rdi
call   1040 <AddRoundKey@plt>
jmp    127f <aes_decrypt+0x13f>
lea    0x180(%r15),%rsi
mov    %rsp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rsp,%rbx
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x160(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x140(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rsp,%rbx
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x120(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x100(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0xe0(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0xc0(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0xa0(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x80(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x60(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x40(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
lea    0x20(%r15),%rsi
mov    %rbx,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbx,%rdi
call   1030 <InvMixColumns@plt>
mov    %rbx,%rdi
call   1050 <InvShiftRows@plt>
mov    %rbx,%rdi
call   1060 <InvSubBytes@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
call   1040 <AddRoundKey@plt>
movdqa (%rsp),%xmm0
pxor   %xmm1,%xmm1
movdqa %xmm0,%xmm2
punpckhbw %xmm1,%xmm2
pshufd $0xe7,%xmm2,%xmm3
pshuflw $0x72,%xmm3,%xmm3
punpcklbw %xmm1,%xmm0
pshufd $0xe7,%xmm0,%xmm1
pshuflw $0x72,%xmm1,%xmm1
punpckldq %xmm3,%xmm1
pshufd $0xe8,%xmm2,%xmm2
pshuflw $0xd8,%xmm2,%xmm2
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xd8,%xmm0,%xmm0
punpckldq %xmm2,%xmm0
packuswb %xmm1,%xmm0
movdqu %xmm0,(%r14)
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @aes_decrypt(i8* %0, i8* %1, i64* %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i64*
%8 = alloca i32
%9 = alloca [4 x [4 x i8]]
store i8* %0, i8** %5
store i8* %1, i8** %6
store i64* %2, i64** %7
store i32 %3, i32* %8
%10 = load i8*, i8** %5
%11 = getelementptr inbounds i8, i8* %10, i64 0
%12 = load i8, i8* %11
%13 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%14 = getelementptr inbounds [4 x i8], [4 x i8]* %13, i64 0, i64 0
store i8 %12, i8* %14
%15 = load i8*, i8** %5
%16 = getelementptr inbounds i8, i8* %15, i64 1
%17 = load i8, i8* %16
%18 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%19 = getelementptr inbounds [4 x i8], [4 x i8]* %18, i64 0, i64 0
store i8 %17, i8* %19
%20 = load i8*, i8** %5
%21 = getelementptr inbounds i8, i8* %20, i64 2
%22 = load i8, i8* %21
%23 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%24 = getelementptr inbounds [4 x i8], [4 x i8]* %23, i64 0, i64 0
store i8 %22, i8* %24
%25 = load i8*, i8** %5
%26 = getelementptr inbounds i8, i8* %25, i64 3
%27 = load i8, i8* %26
%28 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%29 = getelementptr inbounds [4 x i8], [4 x i8]* %28, i64 0, i64 0
store i8 %27, i8* %29
%30 = load i8*, i8** %5
%31 = getelementptr inbounds i8, i8* %30, i64 4
%32 = load i8, i8* %31
%33 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%34 = getelementptr inbounds [4 x i8], [4 x i8]* %33, i64 0, i64 1
store i8 %32, i8* %34
%35 = load i8*, i8** %5
%36 = getelementptr inbounds i8, i8* %35, i64 5
%37 = load i8, i8* %36
%38 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%39 = getelementptr inbounds [4 x i8], [4 x i8]* %38, i64 0, i64 1
store i8 %37, i8* %39
%40 = load i8*, i8** %5
%41 = getelementptr inbounds i8, i8* %40, i64 6
%42 = load i8, i8* %41
%43 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%44 = getelementptr inbounds [4 x i8], [4 x i8]* %43, i64 0, i64 1
store i8 %42, i8* %44
%45 = load i8*, i8** %5
%46 = getelementptr inbounds i8, i8* %45, i64 7
%47 = load i8, i8* %46
%48 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%49 = getelementptr inbounds [4 x i8], [4 x i8]* %48, i64 0, i64 1
store i8 %47, i8* %49
%50 = load i8*, i8** %5
%51 = getelementptr inbounds i8, i8* %50, i64 8
%52 = load i8, i8* %51
%53 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%54 = getelementptr inbounds [4 x i8], [4 x i8]* %53, i64 0, i64 2
store i8 %52, i8* %54
%55 = load i8*, i8** %5
%56 = getelementptr inbounds i8, i8* %55, i64 9
%57 = load i8, i8* %56
%58 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%59 = getelementptr inbounds [4 x i8], [4 x i8]* %58, i64 0, i64 2
store i8 %57, i8* %59
%60 = load i8*, i8** %5
%61 = getelementptr inbounds i8, i8* %60, i64 10
%62 = load i8, i8* %61
%63 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%64 = getelementptr inbounds [4 x i8], [4 x i8]* %63, i64 0, i64 2
store i8 %62, i8* %64
%65 = load i8*, i8** %5
%66 = getelementptr inbounds i8, i8* %65, i64 11
%67 = load i8, i8* %66
%68 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%69 = getelementptr inbounds [4 x i8], [4 x i8]* %68, i64 0, i64 2
store i8 %67, i8* %69
%70 = load i8*, i8** %5
%71 = getelementptr inbounds i8, i8* %70, i64 12
%72 = load i8, i8* %71
%73 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%74 = getelementptr inbounds [4 x i8], [4 x i8]* %73, i64 0, i64 3
store i8 %72, i8* %74
%75 = load i8*, i8** %5
%76 = getelementptr inbounds i8, i8* %75, i64 13
%77 = load i8, i8* %76
%78 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%79 = getelementptr inbounds [4 x i8], [4 x i8]* %78, i64 0, i64 3
store i8 %77, i8* %79
%80 = load i8*, i8** %5
%81 = getelementptr inbounds i8, i8* %80, i64 14
%82 = load i8, i8* %81
%83 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%84 = getelementptr inbounds [4 x i8], [4 x i8]* %83, i64 0, i64 3
store i8 %82, i8* %84
%85 = load i8*, i8** %5
%86 = getelementptr inbounds i8, i8* %85, i64 15
%87 = load i8, i8* %86
%88 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%89 = getelementptr inbounds [4 x i8], [4 x i8]* %88, i64 0, i64 3
store i8 %87, i8* %89
%90 = load i32, i32* %8
%91 = icmp sgt i32 %90, 128
br i1 %91, label %92, label %164
92: ; preds = %4
%93 = load i32, i32* %8
%94 = icmp sgt i32 %93, 192
br i1 %94, label %95, label %129
95: ; preds = %92
%96 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%97 = bitcast [4 x i8]* %96 to i8**
%98 = load i64*, i64** %7
%99 = getelementptr inbounds i64, i64* %98, i64 56
%100 = call i32 @AddRoundKey(i8** %97, i64* %99)
%101 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%102 = bitcast [4 x i8]* %101 to i8**
%103 = call i32 @InvShiftRows(i8** %102)
%104 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%105 = bitcast [4 x i8]* %104 to i8**
%106 = call i32 @InvSubBytes(i8** %105)
%107 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%108 = bitcast [4 x i8]* %107 to i8**
%109 = load i64*, i64** %7
%110 = getelementptr inbounds i64, i64* %109, i64 52
%111 = call i32 @AddRoundKey(i8** %108, i64* %110)
%112 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%113 = bitcast [4 x i8]* %112 to i8**
%114 = call i32 @InvMixColumns(i8** %113)
%115 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%116 = bitcast [4 x i8]* %115 to i8**
%117 = call i32 @InvShiftRows(i8** %116)
%118 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%119 = bitcast [4 x i8]* %118 to i8**
%120 = call i32 @InvSubBytes(i8** %119)
%121 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%122 = bitcast [4 x i8]* %121 to i8**
%123 = load i64*, i64** %7
%124 = getelementptr inbounds i64, i64* %123, i64 48
%125 = call i32 @AddRoundKey(i8** %122, i64* %124)
%126 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%127 = bitcast [4 x i8]* %126 to i8**
%128 = call i32 @InvMixColumns(i8** %127)
br label %135
129: ; preds = %92
%130 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%131 = bitcast [4 x i8]* %130 to i8**
%132 = load i64*, i64** %7
%133 = getelementptr inbounds i64, i64* %132, i64 48
%134 = call i32 @AddRoundKey(i8** %131, i64* %133)
br label %135
135: ; preds = %129, %95
%136 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%137 = bitcast [4 x i8]* %136 to i8**
%138 = call i32 @InvShiftRows(i8** %137)
%139 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%140 = bitcast [4 x i8]* %139 to i8**
%141 = call i32 @InvSubBytes(i8** %140)
%142 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%143 = bitcast [4 x i8]* %142 to i8**
%144 = load i64*, i64** %7
%145 = getelementptr inbounds i64, i64* %144, i64 44
%146 = call i32 @AddRoundKey(i8** %143, i64* %145)
%147 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%148 = bitcast [4 x i8]* %147 to i8**
%149 = call i32 @InvMixColumns(i8** %148)
%150 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%151 = bitcast [4 x i8]* %150 to i8**
%152 = call i32 @InvShiftRows(i8** %151)
%153 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%154 = bitcast [4 x i8]* %153 to i8**
%155 = call i32 @InvSubBytes(i8** %154)
%156 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%157 = bitcast [4 x i8]* %156 to i8**
%158 = load i64*, i64** %7
%159 = getelementptr inbounds i64, i64* %158, i64 40
%160 = call i32 @AddRoundKey(i8** %157, i64* %159)
%161 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%162 = bitcast [4 x i8]* %161 to i8**
%163 = call i32 @InvMixColumns(i8** %162)
br label %170
164: ; preds = %4
%165 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%166 = bitcast [4 x i8]* %165 to i8**
%167 = load i64*, i64** %7
%168 = getelementptr inbounds i64, i64* %167, i64 40
%169 = call i32 @AddRoundKey(i8** %166, i64* %168)
br label %170
170: ; preds = %164, %135
%171 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%172 = bitcast [4 x i8]* %171 to i8**
%173 = call i32 @InvShiftRows(i8** %172)
%174 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%175 = bitcast [4 x i8]* %174 to i8**
%176 = call i32 @InvSubBytes(i8** %175)
%177 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%178 = bitcast [4 x i8]* %177 to i8**
%179 = load i64*, i64** %7
%180 = getelementptr inbounds i64, i64* %179, i64 36
%181 = call i32 @AddRoundKey(i8** %178, i64* %180)
%182 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%183 = bitcast [4 x i8]* %182 to i8**
%184 = call i32 @InvMixColumns(i8** %183)
%185 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%186 = bitcast [4 x i8]* %185 to i8**
%187 = call i32 @InvShiftRows(i8** %186)
%188 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%189 = bitcast [4 x i8]* %188 to i8**
%190 = call i32 @InvSubBytes(i8** %189)
%191 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%192 = bitcast [4 x i8]* %191 to i8**
%193 = load i64*, i64** %7
%194 = getelementptr inbounds i64, i64* %193, i64 32
%195 = call i32 @AddRoundKey(i8** %192, i64* %194)
%196 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%197 = bitcast [4 x i8]* %196 to i8**
%198 = call i32 @InvMixColumns(i8** %197)
%199 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%200 = bitcast [4 x i8]* %199 to i8**
%201 = call i32 @InvShiftRows(i8** %200)
%202 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%203 = bitcast [4 x i8]* %202 to i8**
%204 = call i32 @InvSubBytes(i8** %203)
%205 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%206 = bitcast [4 x i8]* %205 to i8**
%207 = load i64*, i64** %7
%208 = getelementptr inbounds i64, i64* %207, i64 28
%209 = call i32 @AddRoundKey(i8** %206, i64* %208)
%210 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%211 = bitcast [4 x i8]* %210 to i8**
%212 = call i32 @InvMixColumns(i8** %211)
%213 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%214 = bitcast [4 x i8]* %213 to i8**
%215 = call i32 @InvShiftRows(i8** %214)
%216 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%217 = bitcast [4 x i8]* %216 to i8**
%218 = call i32 @InvSubBytes(i8** %217)
%219 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%220 = bitcast [4 x i8]* %219 to i8**
%221 = load i64*, i64** %7
%222 = getelementptr inbounds i64, i64* %221, i64 24
%223 = call i32 @AddRoundKey(i8** %220, i64* %222)
%224 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%225 = bitcast [4 x i8]* %224 to i8**
%226 = call i32 @InvMixColumns(i8** %225)
%227 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%228 = bitcast [4 x i8]* %227 to i8**
%229 = call i32 @InvShiftRows(i8** %228)
%230 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%231 = bitcast [4 x i8]* %230 to i8**
%232 = call i32 @InvSubBytes(i8** %231)
%233 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%234 = bitcast [4 x i8]* %233 to i8**
%235 = load i64*, i64** %7
%236 = getelementptr inbounds i64, i64* %235, i64 20
%237 = call i32 @AddRoundKey(i8** %234, i64* %236)
%238 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%239 = bitcast [4 x i8]* %238 to i8**
%240 = call i32 @InvMixColumns(i8** %239)
%241 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%242 = bitcast [4 x i8]* %241 to i8**
%243 = call i32 @InvShiftRows(i8** %242)
%244 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%245 = bitcast [4 x i8]* %244 to i8**
%246 = call i32 @InvSubBytes(i8** %245)
%247 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%248 = bitcast [4 x i8]* %247 to i8**
%249 = load i64*, i64** %7
%250 = getelementptr inbounds i64, i64* %249, i64 16
%251 = call i32 @AddRoundKey(i8** %248, i64* %250)
%252 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%253 = bitcast [4 x i8]* %252 to i8**
%254 = call i32 @InvMixColumns(i8** %253)
%255 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%256 = bitcast [4 x i8]* %255 to i8**
%257 = call i32 @InvShiftRows(i8** %256)
%258 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%259 = bitcast [4 x i8]* %258 to i8**
%260 = call i32 @InvSubBytes(i8** %259)
%261 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%262 = bitcast [4 x i8]* %261 to i8**
%263 = load i64*, i64** %7
%264 = getelementptr inbounds i64, i64* %263, i64 12
%265 = call i32 @AddRoundKey(i8** %262, i64* %264)
%266 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%267 = bitcast [4 x i8]* %266 to i8**
%268 = call i32 @InvMixColumns(i8** %267)
%269 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%270 = bitcast [4 x i8]* %269 to i8**
%271 = call i32 @InvShiftRows(i8** %270)
%272 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%273 = bitcast [4 x i8]* %272 to i8**
%274 = call i32 @InvSubBytes(i8** %273)
%275 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%276 = bitcast [4 x i8]* %275 to i8**
%277 = load i64*, i64** %7
%278 = getelementptr inbounds i64, i64* %277, i64 8
%279 = call i32 @AddRoundKey(i8** %276, i64* %278)
%280 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%281 = bitcast [4 x i8]* %280 to i8**
%282 = call i32 @InvMixColumns(i8** %281)
%283 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%284 = bitcast [4 x i8]* %283 to i8**
%285 = call i32 @InvShiftRows(i8** %284)
%286 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%287 = bitcast [4 x i8]* %286 to i8**
%288 = call i32 @InvSubBytes(i8** %287)
%289 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%290 = bitcast [4 x i8]* %289 to i8**
%291 = load i64*, i64** %7
%292 = getelementptr inbounds i64, i64* %291, i64 4
%293 = call i32 @AddRoundKey(i8** %290, i64* %292)
%294 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%295 = bitcast [4 x i8]* %294 to i8**
%296 = call i32 @InvMixColumns(i8** %295)
%297 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%298 = bitcast [4 x i8]* %297 to i8**
%299 = call i32 @InvShiftRows(i8** %298)
%300 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%301 = bitcast [4 x i8]* %300 to i8**
%302 = call i32 @InvSubBytes(i8** %301)
%303 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%304 = bitcast [4 x i8]* %303 to i8**
%305 = load i64*, i64** %7
%306 = getelementptr inbounds i64, i64* %305, i64 0
%307 = call i32 @AddRoundKey(i8** %304, i64* %306)
%308 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%309 = getelementptr inbounds [4 x i8], [4 x i8]* %308, i64 0, i64 0
%310 = load i8, i8* %309
%311 = load i8*, i8** %6
%312 = getelementptr inbounds i8, i8* %311, i64 0
store i8 %310, i8* %312
%313 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%314 = getelementptr inbounds [4 x i8], [4 x i8]* %313, i64 0, i64 0
%315 = load i8, i8* %314
%316 = load i8*, i8** %6
%317 = getelementptr inbounds i8, i8* %316, i64 1
store i8 %315, i8* %317
%318 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%319 = getelementptr inbounds [4 x i8], [4 x i8]* %318, i64 0, i64 0
%320 = load i8, i8* %319
%321 = load i8*, i8** %6
%322 = getelementptr inbounds i8, i8* %321, i64 2
store i8 %320, i8* %322
%323 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%324 = getelementptr inbounds [4 x i8], [4 x i8]* %323, i64 0, i64 0
%325 = load i8, i8* %324
%326 = load i8*, i8** %6
%327 = getelementptr inbounds i8, i8* %326, i64 3
store i8 %325, i8* %327
%328 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%329 = getelementptr inbounds [4 x i8], [4 x i8]* %328, i64 0, i64 1
%330 = load i8, i8* %329
%331 = load i8*, i8** %6
%332 = getelementptr inbounds i8, i8* %331, i64 4
store i8 %330, i8* %332
%333 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%334 = getelementptr inbounds [4 x i8], [4 x i8]* %333, i64 0, i64 1
%335 = load i8, i8* %334
%336 = load i8*, i8** %6
%337 = getelementptr inbounds i8, i8* %336, i64 5
store i8 %335, i8* %337
%338 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%339 = getelementptr inbounds [4 x i8], [4 x i8]* %338, i64 0, i64 1
%340 = load i8, i8* %339
%341 = load i8*, i8** %6
%342 = getelementptr inbounds i8, i8* %341, i64 6
store i8 %340, i8* %342
%343 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%344 = getelementptr inbounds [4 x i8], [4 x i8]* %343, i64 0, i64 1
%345 = load i8, i8* %344
%346 = load i8*, i8** %6
%347 = getelementptr inbounds i8, i8* %346, i64 7
store i8 %345, i8* %347
%348 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%349 = getelementptr inbounds [4 x i8], [4 x i8]* %348, i64 0, i64 2
%350 = load i8, i8* %349
%351 = load i8*, i8** %6
%352 = getelementptr inbounds i8, i8* %351, i64 8
store i8 %350, i8* %352
%353 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%354 = getelementptr inbounds [4 x i8], [4 x i8]* %353, i64 0, i64 2
%355 = load i8, i8* %354
%356 = load i8*, i8** %6
%357 = getelementptr inbounds i8, i8* %356, i64 9
store i8 %355, i8* %357
%358 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%359 = getelementptr inbounds [4 x i8], [4 x i8]* %358, i64 0, i64 2
%360 = load i8, i8* %359
%361 = load i8*, i8** %6
%362 = getelementptr inbounds i8, i8* %361, i64 10
store i8 %360, i8* %362
%363 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%364 = getelementptr inbounds [4 x i8], [4 x i8]* %363, i64 0, i64 2
%365 = load i8, i8* %364
%366 = load i8*, i8** %6
%367 = getelementptr inbounds i8, i8* %366, i64 11
store i8 %365, i8* %367
%368 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%369 = getelementptr inbounds [4 x i8], [4 x i8]* %368, i64 0, i64 3
%370 = load i8, i8* %369
%371 = load i8*, i8** %6
%372 = getelementptr inbounds i8, i8* %371, i64 12
store i8 %370, i8* %372
%373 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%374 = getelementptr inbounds [4 x i8], [4 x i8]* %373, i64 0, i64 3
%375 = load i8, i8* %374
%376 = load i8*, i8** %6
%377 = getelementptr inbounds i8, i8* %376, i64 13
store i8 %375, i8* %377
%378 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%379 = getelementptr inbounds [4 x i8], [4 x i8]* %378, i64 0, i64 3
%380 = load i8, i8* %379
%381 = load i8*, i8** %6
%382 = getelementptr inbounds i8, i8* %381, i64 14
store i8 %380, i8* %382
%383 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%384 = getelementptr inbounds [4 x i8], [4 x i8]* %383, i64 0, i64 3
%385 = load i8, i8* %384
%386 = load i8*, i8** %6
%387 = getelementptr inbounds i8, i8* %386, i64 15
store i8 %385, i8* %387
ret void
}

LLVM IR (-O2):
define void @aes_decrypt(i8* nocapture %0, i8* nocapture writeonly %1, i64* %2, i32 %3) {
%5 = alloca <16 x i8>
%6 = getelementptr inbounds <16 x i8>, <16 x i8>* %5, i64 0, i64 0
%7 = bitcast i8* %0 to <16 x i8>*
%8 = load <16 x i8>, <16 x i8>* %7
%9 = shufflevector <16 x i8> %8, <16 x i8> poison, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>
store <16 x i8> %9, <16 x i8>* %5
%10 = icmp sgt i32 %3, 128
br i1 %10, label %11, label %42
11: ; preds = %4
%12 = icmp ugt i32 %3, 192
%13 = bitcast <16 x i8>* %5 to i8**
br i1 %12, label %14, label %27
14: ; preds = %11
%15 = getelementptr inbounds i64, i64* %2, i64 56
%16 = call i32 @AddRoundKey(i8** %13, i64* %15)
%17 = call i32 @InvShiftRows(i8** %13)
%18 = call i32 @InvSubBytes(i8** %13)
%19 = getelementptr inbounds i64, i64* %2, i64 52
%20 = call i32 @AddRoundKey(i8** %13, i64* %19)
%21 = call i32 @InvMixColumns(i8** %13)
%22 = call i32 @InvShiftRows(i8** %13)
%23 = call i32 @InvSubBytes(i8** %13)
%24 = getelementptr inbounds i64, i64* %2, i64 48
%25 = call i32 @AddRoundKey(i8** %13, i64* %24)
%26 = call i32 @InvMixColumns(i8** %13)
br label %30
27: ; preds = %11
%28 = getelementptr inbounds i64, i64* %2, i64 48
%29 = call i32 @AddRoundKey(i8** %13, i64* %28)
br label %30
30: ; preds = %27, %14
%31 = bitcast <16 x i8>* %5 to i8**
%32 = call i32 @InvShiftRows(i8** %31)
%33 = call i32 @InvSubBytes(i8** %31)
%34 = getelementptr inbounds i64, i64* %2, i64 44
%35 = call i32 @AddRoundKey(i8** %31, i64* %34)
%36 = call i32 @InvMixColumns(i8** %31)
%37 = call i32 @InvShiftRows(i8** %31)
%38 = call i32 @InvSubBytes(i8** %31)
%39 = getelementptr inbounds i64, i64* %2, i64 40
%40 = call i32 @AddRoundKey(i8** %31, i64* %39)
%41 = call i32 @InvMixColumns(i8** %31)
br label %46
42: ; preds = %4
%43 = bitcast <16 x i8>* %5 to i8**
%44 = getelementptr inbounds i64, i64* %2, i64 40
%45 = call i32 @AddRoundKey(i8** %43, i64* %44)
br label %46
46: ; preds = %42, %30
%47 = bitcast <16 x i8>* %5 to i8**
%48 = call i32 @InvShiftRows(i8** %47)
%49 = call i32 @InvSubBytes(i8** %47)
%50 = getelementptr inbounds i64, i64* %2, i64 36
%51 = call i32 @AddRoundKey(i8** %47, i64* %50)
%52 = call i32 @InvMixColumns(i8** %47)
%53 = call i32 @InvShiftRows(i8** %47)
%54 = call i32 @InvSubBytes(i8** %47)
%55 = getelementptr inbounds i64, i64* %2, i64 32
%56 = call i32 @AddRoundKey(i8** %47, i64* %55)
%57 = call i32 @InvMixColumns(i8** %47)
%58 = call i32 @InvShiftRows(i8** %47)
%59 = call i32 @InvSubBytes(i8** %47)
%60 = getelementptr inbounds i64, i64* %2, i64 28
%61 = call i32 @AddRoundKey(i8** %47, i64* %60)
%62 = call i32 @InvMixColumns(i8** %47)
%63 = call i32 @InvShiftRows(i8** %47)
%64 = call i32 @InvSubBytes(i8** %47)
%65 = getelementptr inbounds i64, i64* %2, i64 24
%66 = call i32 @AddRoundKey(i8** %47, i64* %65)
%67 = call i32 @InvMixColumns(i8** %47)
%68 = call i32 @InvShiftRows(i8** %47)
%69 = call i32 @InvSubBytes(i8** %47)
%70 = getelementptr inbounds i64, i64* %2, i64 20
%71 = call i32 @AddRoundKey(i8** %47, i64* %70)
%72 = call i32 @InvMixColumns(i8** %47)
%73 = call i32 @InvShiftRows(i8** %47)
%74 = call i32 @InvSubBytes(i8** %47)
%75 = getelementptr inbounds i64, i64* %2, i64 16
%76 = call i32 @AddRoundKey(i8** %47, i64* %75)
%77 = call i32 @InvMixColumns(i8** %47)
%78 = call i32 @InvShiftRows(i8** %47)
%79 = call i32 @InvSubBytes(i8** %47)
%80 = getelementptr inbounds i64, i64* %2, i64 12
%81 = call i32 @AddRoundKey(i8** %47, i64* %80)
%82 = call i32 @InvMixColumns(i8** %47)
%83 = call i32 @InvShiftRows(i8** %47)
%84 = call i32 @InvSubBytes(i8** %47)
%85 = getelementptr inbounds i64, i64* %2, i64 8
%86 = call i32 @AddRoundKey(i8** %47, i64* %85)
%87 = call i32 @InvMixColumns(i8** %47)
%88 = call i32 @InvShiftRows(i8** %47)
%89 = call i32 @InvSubBytes(i8** %47)
%90 = getelementptr inbounds i64, i64* %2, i64 4
%91 = call i32 @AddRoundKey(i8** %47, i64* %90)
%92 = call i32 @InvMixColumns(i8** %47)
%93 = call i32 @InvShiftRows(i8** %47)
%94 = call i32 @InvSubBytes(i8** %47)
%95 = call i32 @AddRoundKey(i8** %47, i64* %2)
%96 = load <16 x i8>, <16 x i8>* %5
%97 = shufflevector <16 x i8> %96, <16 x i8> poison, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>
%98 = bitcast i8* %1 to <16 x i8>*
store <16 x i8> %97, <16 x i8>* %98
ret void
}