#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*/ MixColumns(unsigned char **);
int /*<<< orphan*/ ShiftRows(unsigned char **);
int /*<<< orphan*/ SubBytes(unsigned char **);
void aes_encrypt(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];
  AddRoundKey(state, &key[0]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[4]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[8]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[12]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[16]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[20]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[24]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[28]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[32]);
  SubBytes(state);
  ShiftRows(state);
  MixColumns(state);
  AddRoundKey(state, &key[36]);
  if (keysize != 128) {
    SubBytes(state);
    ShiftRows(state);
    MixColumns(state);
    AddRoundKey(state, &key[40]);
    SubBytes(state);
    ShiftRows(state);
    MixColumns(state);
    AddRoundKey(state, &key[44]);
    if (keysize != 192) {
      SubBytes(state);
      ShiftRows(state);
      MixColumns(state);
      AddRoundKey(state, &key[48]);
      SubBytes(state);
      ShiftRows(state);
      MixColumns(state);
      AddRoundKey(state, &key[52]);
      SubBytes(state);
      ShiftRows(state);
      AddRoundKey(state, &key[56]);
    } else {
      SubBytes(state);
      ShiftRows(state);
      AddRoundKey(state, &key[48]);
    }
  } else {
    SubBytes(state);
    ShiftRows(state);
    AddRoundKey(state, &key[40]);
  }
  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_encrypt>:
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)
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x20,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x40,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x60,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x80,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0xa0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0xc0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0xe0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x100,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x120,%rsi
call   1040 <AddRoundKey@plt>
cmpl   $0x80,-0x1c(%rbp)
je     14cd <aes_encrypt+0x38d>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x140,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x160,%rsi
call   1040 <AddRoundKey@plt>
cmpl   $0xc0,-0x1c(%rbp)
je     14a2 <aes_encrypt+0x362>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x180,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
call   1060 <MixColumns@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x1a0,%rsi
call   1040 <AddRoundKey@plt>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x1c0,%rsi
call   1040 <AddRoundKey@plt>
jmp    14c8 <aes_encrypt+0x388>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x180,%rsi
call   1040 <AddRoundKey@plt>
jmp    14f3 <aes_encrypt+0x3b3>
lea    -0x30(%rbp),%rdi
call   1050 <SubBytes@plt>
lea    -0x30(%rbp),%rdi
call   1030 <ShiftRows@plt>
lea    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x140,%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_encrypt>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %ecx,%r15d
mov    %rdx,%rbx
mov    %rsi,%r14
movdqu (%rdi),%xmm0
pxor   %xmm3,%xmm3
movdqa %xmm0,%xmm1
punpckhbw %xmm3,%xmm1
pshufd $0xe7,%xmm1,%xmm2
pshuflw $0x72,%xmm2,%xmm2
punpcklbw %xmm3,%xmm0
pshufd $0xe7,%xmm0,%xmm3
pshuflw $0x72,%xmm3,%xmm3
punpckldq %xmm2,%xmm3
pshufd $0xe8,%xmm1,%xmm1
pshuflw $0xd8,%xmm1,%xmm1
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xd8,%xmm0,%xmm0
punpckldq %xmm1,%xmm0
packuswb %xmm3,%xmm0
movdqa %xmm0,(%rsp)
mov    %rsp,%rbp
mov    %rbp,%rdi
mov    %rdx,%rsi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x20(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x40(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x60(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x80(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0xa0(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0xc0(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0xe0(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x100(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x120(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    $0x28,%eax
cmp    $0x80,%r15d
je     13db <aes_encrypt+0x29b>
mov    %rsp,%rbp
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x140(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x160(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    $0x30,%eax
cmp    $0xc0,%r15d
je     13db <aes_encrypt+0x29b>
mov    %rsp,%rbp
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x180(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    %rbp,%rdi
call   1060 <MixColumns@plt>
lea    0x1a0(%rbx),%rsi
mov    %rbp,%rdi
call   1040 <AddRoundKey@plt>
mov    %rbp,%rdi
call   1050 <SubBytes@plt>
mov    %rbp,%rdi
call   1030 <ShiftRows@plt>
mov    $0x38,%eax
lea    (%rbx,%rax,8),%rsi
mov    %rsp,%rdi
call   1040 <AddRoundKey@plt>
movdqa (%rsp),%xmm0
movdqa %xmm0,%xmm1
pxor   %xmm3,%xmm3
punpckhbw %xmm3,%xmm1
pshufd $0xe7,%xmm1,%xmm2
pshuflw $0x72,%xmm2,%xmm2
punpcklbw %xmm3,%xmm0
pshufd $0xe7,%xmm0,%xmm3
pshuflw $0x72,%xmm3,%xmm3
punpckldq %xmm2,%xmm3
pshufd $0xe8,%xmm1,%xmm1
pshuflw $0xd8,%xmm1,%xmm1
pshufd $0xe8,%xmm0,%xmm0
pshuflw $0xd8,%xmm0,%xmm0
punpckldq %xmm1,%xmm0
packuswb %xmm3,%xmm0
movdqu %xmm0,(%r14)
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @aes_encrypt(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 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%91 = bitcast [4 x i8]* %90 to i8**
%92 = load i64*, i64** %7
%93 = getelementptr inbounds i64, i64* %92, i64 0
%94 = call i32 @AddRoundKey(i8** %91, i64* %93)
%95 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%96 = bitcast [4 x i8]* %95 to i8**
%97 = call i32 @SubBytes(i8** %96)
%98 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%99 = bitcast [4 x i8]* %98 to i8**
%100 = call i32 @ShiftRows(i8** %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 @MixColumns(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 = load i64*, i64** %7
%107 = getelementptr inbounds i64, i64* %106, i64 4
%108 = call i32 @AddRoundKey(i8** %105, i64* %107)
%109 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%110 = bitcast [4 x i8]* %109 to i8**
%111 = call i32 @SubBytes(i8** %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 @ShiftRows(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 @MixColumns(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 = load i64*, i64** %7
%121 = getelementptr inbounds i64, i64* %120, i64 8
%122 = call i32 @AddRoundKey(i8** %119, i64* %121)
%123 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%124 = bitcast [4 x i8]* %123 to i8**
%125 = call i32 @SubBytes(i8** %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 @ShiftRows(i8** %127)
%129 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%130 = bitcast [4 x i8]* %129 to i8**
%131 = call i32 @MixColumns(i8** %130)
%132 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%133 = bitcast [4 x i8]* %132 to i8**
%134 = load i64*, i64** %7
%135 = getelementptr inbounds i64, i64* %134, i64 12
%136 = call i32 @AddRoundKey(i8** %133, i64* %135)
%137 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%138 = bitcast [4 x i8]* %137 to i8**
%139 = call i32 @SubBytes(i8** %138)
%140 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%141 = bitcast [4 x i8]* %140 to i8**
%142 = call i32 @ShiftRows(i8** %141)
%143 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%144 = bitcast [4 x i8]* %143 to i8**
%145 = call i32 @MixColumns(i8** %144)
%146 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%147 = bitcast [4 x i8]* %146 to i8**
%148 = load i64*, i64** %7
%149 = getelementptr inbounds i64, i64* %148, i64 16
%150 = call i32 @AddRoundKey(i8** %147, i64* %149)
%151 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%152 = bitcast [4 x i8]* %151 to i8**
%153 = call i32 @SubBytes(i8** %152)
%154 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%155 = bitcast [4 x i8]* %154 to i8**
%156 = call i32 @ShiftRows(i8** %155)
%157 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%158 = bitcast [4 x i8]* %157 to i8**
%159 = call i32 @MixColumns(i8** %158)
%160 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%161 = bitcast [4 x i8]* %160 to i8**
%162 = load i64*, i64** %7
%163 = getelementptr inbounds i64, i64* %162, i64 20
%164 = call i32 @AddRoundKey(i8** %161, i64* %163)
%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 = call i32 @SubBytes(i8** %166)
%168 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%169 = bitcast [4 x i8]* %168 to i8**
%170 = call i32 @ShiftRows(i8** %169)
%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 @MixColumns(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 = load i64*, i64** %7
%177 = getelementptr inbounds i64, i64* %176, i64 24
%178 = call i32 @AddRoundKey(i8** %175, i64* %177)
%179 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%180 = bitcast [4 x i8]* %179 to i8**
%181 = call i32 @SubBytes(i8** %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 @ShiftRows(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 @MixColumns(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 = load i64*, i64** %7
%191 = getelementptr inbounds i64, i64* %190, i64 28
%192 = call i32 @AddRoundKey(i8** %189, i64* %191)
%193 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%194 = bitcast [4 x i8]* %193 to i8**
%195 = call i32 @SubBytes(i8** %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 @ShiftRows(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 @MixColumns(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 = load i64*, i64** %7
%205 = getelementptr inbounds i64, i64* %204, i64 32
%206 = call i32 @AddRoundKey(i8** %203, i64* %205)
%207 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%208 = bitcast [4 x i8]* %207 to i8**
%209 = call i32 @SubBytes(i8** %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 @ShiftRows(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 @MixColumns(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 = load i64*, i64** %7
%219 = getelementptr inbounds i64, i64* %218, i64 36
%220 = call i32 @AddRoundKey(i8** %217, i64* %219)
%221 = load i32, i32* %8
%222 = icmp ne i32 %221, 128
br i1 %222, label %223, label %307
223: ; preds = %4
%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 @SubBytes(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 @ShiftRows(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 @MixColumns(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 40
%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 @SubBytes(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 @ShiftRows(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 @MixColumns(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 44
%251 = call i32 @AddRoundKey(i8** %248, i64* %250)
%252 = load i32, i32* %8
%253 = icmp ne i32 %252, 192
br i1 %253, label %254, label %294
254: ; preds = %223
%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 @SubBytes(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 @ShiftRows(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 = call i32 @MixColumns(i8** %262)
%264 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%265 = bitcast [4 x i8]* %264 to i8**
%266 = load i64*, i64** %7
%267 = getelementptr inbounds i64, i64* %266, i64 48
%268 = call i32 @AddRoundKey(i8** %265, i64* %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 @SubBytes(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 @ShiftRows(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 = call i32 @MixColumns(i8** %276)
%278 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%279 = bitcast [4 x i8]* %278 to i8**
%280 = load i64*, i64** %7
%281 = getelementptr inbounds i64, i64* %280, i64 52
%282 = call i32 @AddRoundKey(i8** %279, i64* %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 @SubBytes(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 @ShiftRows(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 56
%293 = call i32 @AddRoundKey(i8** %290, i64* %292)
br label %306
294: ; preds = %223
%295 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%296 = bitcast [4 x i8]* %295 to i8**
%297 = call i32 @SubBytes(i8** %296)
%298 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%299 = bitcast [4 x i8]* %298 to i8**
%300 = call i32 @ShiftRows(i8** %299)
%301 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%302 = bitcast [4 x i8]* %301 to i8**
%303 = load i64*, i64** %7
%304 = getelementptr inbounds i64, i64* %303, i64 48
%305 = call i32 @AddRoundKey(i8** %302, i64* %304)
br label %306
306: ; preds = %294, %254
br label %319
307: ; preds = %4
%308 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%309 = bitcast [4 x i8]* %308 to i8**
%310 = call i32 @SubBytes(i8** %309)
%311 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%312 = bitcast [4 x i8]* %311 to i8**
%313 = call i32 @ShiftRows(i8** %312)
%314 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%315 = bitcast [4 x i8]* %314 to i8**
%316 = load i64*, i64** %7
%317 = getelementptr inbounds i64, i64* %316, i64 40
%318 = call i32 @AddRoundKey(i8** %315, i64* %317)
br label %319
319: ; preds = %307, %306
%320 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%321 = getelementptr inbounds [4 x i8], [4 x i8]* %320, i64 0, i64 0
%322 = load i8, i8* %321
%323 = load i8*, i8** %6
%324 = getelementptr inbounds i8, i8* %323, i64 0
store i8 %322, i8* %324
%325 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%326 = getelementptr inbounds [4 x i8], [4 x i8]* %325, i64 0, i64 0
%327 = load i8, i8* %326
%328 = load i8*, i8** %6
%329 = getelementptr inbounds i8, i8* %328, i64 1
store i8 %327, i8* %329
%330 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%331 = getelementptr inbounds [4 x i8], [4 x i8]* %330, i64 0, i64 0
%332 = load i8, i8* %331
%333 = load i8*, i8** %6
%334 = getelementptr inbounds i8, i8* %333, i64 2
store i8 %332, i8* %334
%335 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%336 = getelementptr inbounds [4 x i8], [4 x i8]* %335, i64 0, i64 0
%337 = load i8, i8* %336
%338 = load i8*, i8** %6
%339 = getelementptr inbounds i8, i8* %338, i64 3
store i8 %337, i8* %339
%340 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%341 = getelementptr inbounds [4 x i8], [4 x i8]* %340, i64 0, i64 1
%342 = load i8, i8* %341
%343 = load i8*, i8** %6
%344 = getelementptr inbounds i8, i8* %343, i64 4
store i8 %342, i8* %344
%345 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%346 = getelementptr inbounds [4 x i8], [4 x i8]* %345, i64 0, i64 1
%347 = load i8, i8* %346
%348 = load i8*, i8** %6
%349 = getelementptr inbounds i8, i8* %348, i64 5
store i8 %347, i8* %349
%350 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%351 = getelementptr inbounds [4 x i8], [4 x i8]* %350, i64 0, i64 1
%352 = load i8, i8* %351
%353 = load i8*, i8** %6
%354 = getelementptr inbounds i8, i8* %353, i64 6
store i8 %352, i8* %354
%355 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%356 = getelementptr inbounds [4 x i8], [4 x i8]* %355, i64 0, i64 1
%357 = load i8, i8* %356
%358 = load i8*, i8** %6
%359 = getelementptr inbounds i8, i8* %358, i64 7
store i8 %357, i8* %359
%360 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%361 = getelementptr inbounds [4 x i8], [4 x i8]* %360, i64 0, i64 2
%362 = load i8, i8* %361
%363 = load i8*, i8** %6
%364 = getelementptr inbounds i8, i8* %363, i64 8
store i8 %362, i8* %364
%365 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%366 = getelementptr inbounds [4 x i8], [4 x i8]* %365, i64 0, i64 2
%367 = load i8, i8* %366
%368 = load i8*, i8** %6
%369 = getelementptr inbounds i8, i8* %368, i64 9
store i8 %367, i8* %369
%370 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%371 = getelementptr inbounds [4 x i8], [4 x i8]* %370, i64 0, i64 2
%372 = load i8, i8* %371
%373 = load i8*, i8** %6
%374 = getelementptr inbounds i8, i8* %373, i64 10
store i8 %372, i8* %374
%375 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%376 = getelementptr inbounds [4 x i8], [4 x i8]* %375, i64 0, i64 2
%377 = load i8, i8* %376
%378 = load i8*, i8** %6
%379 = getelementptr inbounds i8, i8* %378, i64 11
store i8 %377, i8* %379
%380 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 0
%381 = getelementptr inbounds [4 x i8], [4 x i8]* %380, i64 0, i64 3
%382 = load i8, i8* %381
%383 = load i8*, i8** %6
%384 = getelementptr inbounds i8, i8* %383, i64 12
store i8 %382, i8* %384
%385 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 1
%386 = getelementptr inbounds [4 x i8], [4 x i8]* %385, i64 0, i64 3
%387 = load i8, i8* %386
%388 = load i8*, i8** %6
%389 = getelementptr inbounds i8, i8* %388, i64 13
store i8 %387, i8* %389
%390 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 2
%391 = getelementptr inbounds [4 x i8], [4 x i8]* %390, i64 0, i64 3
%392 = load i8, i8* %391
%393 = load i8*, i8** %6
%394 = getelementptr inbounds i8, i8* %393, i64 14
store i8 %392, i8* %394
%395 = getelementptr inbounds [4 x [4 x i8]], [4 x [4 x i8]]* %9, i64 0, i64 3
%396 = getelementptr inbounds [4 x i8], [4 x i8]* %395, i64 0, i64 3
%397 = load i8, i8* %396
%398 = load i8*, i8** %6
%399 = getelementptr inbounds i8, i8* %398, i64 15
store i8 %397, i8* %399
ret void
}

LLVM IR (-O2):
define void @aes_encrypt(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 = bitcast <16 x i8>* %5 to i8**
%11 = call i32 @AddRoundKey(i8** %10, i64* %2)
%12 = call i32 @SubBytes(i8** %10)
%13 = call i32 @ShiftRows(i8** %10)
%14 = call i32 @MixColumns(i8** %10)
%15 = getelementptr inbounds i64, i64* %2, i64 4
%16 = call i32 @AddRoundKey(i8** %10, i64* %15)
%17 = call i32 @SubBytes(i8** %10)
%18 = call i32 @ShiftRows(i8** %10)
%19 = call i32 @MixColumns(i8** %10)
%20 = getelementptr inbounds i64, i64* %2, i64 8
%21 = call i32 @AddRoundKey(i8** %10, i64* %20)
%22 = call i32 @SubBytes(i8** %10)
%23 = call i32 @ShiftRows(i8** %10)
%24 = call i32 @MixColumns(i8** %10)
%25 = getelementptr inbounds i64, i64* %2, i64 12
%26 = call i32 @AddRoundKey(i8** %10, i64* %25)
%27 = call i32 @SubBytes(i8** %10)
%28 = call i32 @ShiftRows(i8** %10)
%29 = call i32 @MixColumns(i8** %10)
%30 = getelementptr inbounds i64, i64* %2, i64 16
%31 = call i32 @AddRoundKey(i8** %10, i64* %30)
%32 = call i32 @SubBytes(i8** %10)
%33 = call i32 @ShiftRows(i8** %10)
%34 = call i32 @MixColumns(i8** %10)
%35 = getelementptr inbounds i64, i64* %2, i64 20
%36 = call i32 @AddRoundKey(i8** %10, i64* %35)
%37 = call i32 @SubBytes(i8** %10)
%38 = call i32 @ShiftRows(i8** %10)
%39 = call i32 @MixColumns(i8** %10)
%40 = getelementptr inbounds i64, i64* %2, i64 24
%41 = call i32 @AddRoundKey(i8** %10, i64* %40)
%42 = call i32 @SubBytes(i8** %10)
%43 = call i32 @ShiftRows(i8** %10)
%44 = call i32 @MixColumns(i8** %10)
%45 = getelementptr inbounds i64, i64* %2, i64 28
%46 = call i32 @AddRoundKey(i8** %10, i64* %45)
%47 = call i32 @SubBytes(i8** %10)
%48 = call i32 @ShiftRows(i8** %10)
%49 = call i32 @MixColumns(i8** %10)
%50 = getelementptr inbounds i64, i64* %2, i64 32
%51 = call i32 @AddRoundKey(i8** %10, i64* %50)
%52 = call i32 @SubBytes(i8** %10)
%53 = call i32 @ShiftRows(i8** %10)
%54 = call i32 @MixColumns(i8** %10)
%55 = getelementptr inbounds i64, i64* %2, i64 36
%56 = call i32 @AddRoundKey(i8** %10, i64* %55)
%57 = icmp eq i32 %3, 128
%58 = call i32 @SubBytes(i8** %10)
%59 = call i32 @ShiftRows(i8** %10)
br i1 %57, label %83, label %60
60: ; preds = %4
%61 = call i32 @MixColumns(i8** %10)
%62 = getelementptr inbounds i64, i64* %2, i64 40
%63 = call i32 @AddRoundKey(i8** %10, i64* %62)
%64 = call i32 @SubBytes(i8** %10)
%65 = call i32 @ShiftRows(i8** %10)
%66 = call i32 @MixColumns(i8** %10)
%67 = getelementptr inbounds i64, i64* %2, i64 44
%68 = call i32 @AddRoundKey(i8** %10, i64* %67)
%69 = icmp eq i32 %3, 192
%70 = call i32 @SubBytes(i8** %10)
%71 = call i32 @ShiftRows(i8** %10)
br i1 %69, label %83, label %72
72: ; preds = %60
%73 = call i32 @MixColumns(i8** %10)
%74 = getelementptr inbounds i64, i64* %2, i64 48
%75 = call i32 @AddRoundKey(i8** %10, i64* %74)
%76 = call i32 @SubBytes(i8** %10)
%77 = call i32 @ShiftRows(i8** %10)
%78 = call i32 @MixColumns(i8** %10)
%79 = getelementptr inbounds i64, i64* %2, i64 52
%80 = call i32 @AddRoundKey(i8** %10, i64* %79)
%81 = call i32 @SubBytes(i8** %10)
%82 = call i32 @ShiftRows(i8** %10)
br label %83
83: ; preds = %4, %60, %72
%84 = phi i64 [ 56, %72 ], [ 48, %60 ], [ 40, %4 ]
%85 = getelementptr inbounds i64, i64* %2, i64 %84
%86 = call i32 @AddRoundKey(i8** %10, i64* %85)
%87 = load <16 x i8>, <16 x i8>* %5
%88 = shufflevector <16 x i8> %87, <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>
%89 = bitcast i8* %1 to <16 x i8>*
store <16 x i8> %88, <16 x i8>* %89
ret void
}