#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*/ free(char *);
scalar_t__ malloc(int);
int align_W3(char **X, char **Y, char *a, char *b, int *W, int m_r, int n_c,
             int w_len, int (*score_func)(char, char), char gap_char,
             int row_pref) {
  int i, dr, dc, r, c, w;
  int pos00, pos01, pos10, pos11;
  int w_offset, mm, xy_pos = 0;
  char ch, *tx, *ty;
  i = ((n_c > m_r) ? n_c : m_r);
  *X = NULL;
  *Y = NULL;
  tx = (char *)malloc(sizeof(char) * 2 * i);
  ty = (char *)malloc(sizeof(char) * 2 * i);
  tx[2 * i - 1] = '\0';
  ty[2 * i - 1] = '\0';
  w_offset = w_len / 2;
  r = m_r - 1;
  c = n_c - 1;
  while ((r > 0) || (c > 0)) {
    dr = 0;
    dc = 0;
    w = c - (r - w_offset);
    pos11 = r * w_len + w;
    if (row_pref) {
      if (c > 0) {
        w = (c - 1) - (r - w_offset);
        if ((w >= 0) && (w < w_len)) {
          pos10 = r * w_len + w;
          if ((W[pos10] + score_func(a[c - 1], 0)) == W[pos11]) {
            dr = 0;
            dc = -1;
          }
        }
      }
      if (r > 0) {
        w = c - ((r - 1) - w_offset);
        if ((w >= 0) && (w < w_len)) {
          pos01 = (r - 1) * w_len + w;
          if ((W[pos01] + score_func(0, b[r - 1])) == W[pos11]) {
            dr = -1;
            dc = 0;
          }
        }
      }
    } else {
      if (r > 0) {
        w = c - ((r - 1) - w_offset);
        if ((w >= 0) && (w < w_len)) {
          pos01 = (r - 1) * w_len + w;
          if ((W[pos01] + score_func(0, b[r - 1])) == W[pos11]) {
            dr = -1;
            dc = 0;
          }
        }
      }
      if (c > 0) {
        w = (c - 1) - (r - w_offset);
        if ((w >= 0) && (w < w_len)) {
          pos10 = r * w_len + w;
          if ((W[pos10] + score_func(a[c - 1], 0)) == W[pos11]) {
            dr = 0;
            dc = -1;
          }
        }
      }
    }
    if ((r > 0) && (c > 0)) {
      w = (c - 1) - ((r - 1) - w_offset);
      if ((w >= 0) && (w < w_len)) {
        pos00 = (r - 1) * w_len + w;
        mm = score_func(a[c - 1], b[r - 1]);
        if ((W[pos00] + mm) == W[pos11]) {
          dr = -1;
          dc = -1;
        }
      }
    }
    if ((dr == -1) && (dc == -1)) {
      tx[xy_pos] = a[c - 1];
      ty[xy_pos] = b[r - 1];
    } else if ((dr == -1) && (dc == 0)) {
      tx[xy_pos] = gap_char;
      ty[xy_pos] = b[r - 1];
    } else if ((dr == 0) && (dc == -1)) {
      tx[xy_pos] = a[c - 1];
      ty[xy_pos] = gap_char;
    } else {
      free(tx);
      free(ty);
      return -1;
    }
    xy_pos++;
    r += dr;
    c += dc;
  }
  tx[xy_pos] = '\0';
  ty[xy_pos] = '\0';
  for (i = 0; i < (xy_pos / 2); i++) {
    ch = tx[i];
    tx[i] = tx[xy_pos - i - 1];
    tx[xy_pos - i - 1] = ch;
    ch = ty[i];
    ty[i] = ty[xy_pos - i - 1];
    ty[xy_pos - i - 1] = ch;
  }
  *X = tx;
  *Y = ty;
  return 0;
}


x86 assembly (clang, -O0):
<align_W3>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%al
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9d,-0x34(%rbp)
movl   $0x0,-0x68(%rbp)
mov    0x10(%rbp),%eax
cmp    -0x34(%rbp),%eax
jle    1174 <align_W3+0x54>
mov    0x10(%rbp),%eax
mov    %eax,-0x84(%rbp)
jmp    117d <align_W3+0x5d>
mov    -0x34(%rbp),%eax
mov    %eax,-0x84(%rbp)
mov    -0x84(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
movslq -0x38(%rbp),%rax
shl    $0x1,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,-0x78(%rbp)
movslq -0x38(%rbp),%rax
shl    $0x1,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,-0x80(%rbp)
mov    -0x78(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x80(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x60(%rbp)
mov    -0x34(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    $0x1,%al
cmpl   $0x0,-0x44(%rbp)
mov    %al,-0x85(%rbp)
jg     1229 <align_W3+0x109>
cmpl   $0x0,-0x48(%rbp)
setg   %al
mov    %al,-0x85(%rbp)
mov    -0x85(%rbp),%al
test   $0x1,%al
jne    123c <align_W3+0x11c>
jmp    16ba <align_W3+0x59a>
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x48(%rbp),%eax
mov    -0x44(%rbp),%ecx
sub    -0x60(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x44(%rbp),%eax
imul   0x18(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
cmpl   $0x0,0x30(%rbp)
je     13ad <align_W3+0x28d>
cmpl   $0x0,-0x48(%rbp)
jle    130a <align_W3+0x1ea>
mov    -0x48(%rbp),%eax
sub    $0x1,%eax
mov    -0x44(%rbp),%ecx
sub    -0x60(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jl     1305 <align_W3+0x1e5>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    1305 <align_W3+0x1e5>
mov    -0x44(%rbp),%eax
imul   0x18(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x8c(%rbp)
mov    0x20(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    -0x48(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
xor    %esi,%esi
movsbl (%rcx,%rdx,1),%edi
call   *%rax
mov    %eax,%ecx
mov    -0x8c(%rbp),%eax
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    1300 <align_W3+0x1e0>
movl   $0x0,-0x3c(%rbp)
movl   $0xffffffff,-0x40(%rbp)
jmp    1305 <align_W3+0x1e5>
jmp    130a <align_W3+0x1ea>
cmpl   $0x0,-0x44(%rbp)
jle    13a8 <align_W3+0x288>
mov    -0x48(%rbp),%eax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x60(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jl     13a3 <align_W3+0x283>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    13a3 <align_W3+0x283>
mov    -0x44(%rbp),%eax
sub    $0x1,%eax
imul   0x18(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x54(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x90(%rbp)
mov    0x20(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    -0x44(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
xor    %edi,%edi
movsbl (%rcx,%rdx,1),%esi
call   *%rax
mov    %eax,%ecx
mov    -0x90(%rbp),%eax
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    139e <align_W3+0x27e>
movl   $0xffffffff,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
jmp    13a3 <align_W3+0x283>
jmp    13a8 <align_W3+0x288>
jmp    14eb <align_W3+0x3cb>
cmpl   $0x0,-0x44(%rbp)
jle    144b <align_W3+0x32b>
mov    -0x48(%rbp),%eax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x60(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jl     1446 <align_W3+0x326>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    1446 <align_W3+0x326>
mov    -0x44(%rbp),%eax
sub    $0x1,%eax
imul   0x18(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x54(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x94(%rbp)
mov    0x20(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    -0x44(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
xor    %edi,%edi
movsbl (%rcx,%rdx,1),%esi
call   *%rax
mov    %eax,%ecx
mov    -0x94(%rbp),%eax
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    1441 <align_W3+0x321>
movl   $0xffffffff,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
jmp    1446 <align_W3+0x326>
jmp    144b <align_W3+0x32b>
cmpl   $0x0,-0x48(%rbp)
jle    14e6 <align_W3+0x3c6>
mov    -0x48(%rbp),%eax
sub    $0x1,%eax
mov    -0x44(%rbp),%ecx
sub    -0x60(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jl     14e1 <align_W3+0x3c1>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    14e1 <align_W3+0x3c1>
mov    -0x44(%rbp),%eax
imul   0x18(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x98(%rbp)
mov    0x20(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    -0x48(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
xor    %esi,%esi
movsbl (%rcx,%rdx,1),%edi
call   *%rax
mov    %eax,%ecx
mov    -0x98(%rbp),%eax
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    14dc <align_W3+0x3bc>
movl   $0x0,-0x3c(%rbp)
movl   $0xffffffff,-0x40(%rbp)
jmp    14e1 <align_W3+0x3c1>
jmp    14e6 <align_W3+0x3c6>
jmp    14eb <align_W3+0x3cb>
cmpl   $0x0,-0x44(%rbp)
jle    159f <align_W3+0x47f>
cmpl   $0x0,-0x48(%rbp)
jle    159f <align_W3+0x47f>
mov    -0x48(%rbp),%eax
sub    $0x1,%eax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x60(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jl     159a <align_W3+0x47a>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    159a <align_W3+0x47a>
mov    -0x44(%rbp),%eax
sub    $0x1,%eax
imul   0x18(%rbp),%eax
add    -0x4c(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    0x20(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    -0x48(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
mov    (%rcx,%rdx,1),%sil
mov    -0x28(%rbp),%rcx
mov    -0x44(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movsbl %sil,%edi
movsbl (%rcx,%rdx,1),%esi
call   *%rax
mov    %eax,-0x64(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x50(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
add    -0x64(%rbp),%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    1595 <align_W3+0x475>
movl   $0xffffffff,-0x3c(%rbp)
movl   $0xffffffff,-0x40(%rbp)
jmp    159a <align_W3+0x47a>
jmp    159f <align_W3+0x47f>
cmpl   $0xffffffff,-0x3c(%rbp)
jne    15ee <align_W3+0x4ce>
cmpl   $0xffffffff,-0x40(%rbp)
jne    15ee <align_W3+0x4ce>
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x78(%rbp),%rax
movslq -0x68(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x80(%rbp),%rax
movslq -0x68(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    169a <align_W3+0x57a>
cmpl   $0xffffffff,-0x3c(%rbp)
jne    1630 <align_W3+0x510>
cmpl   $0x0,-0x40(%rbp)
jne    1630 <align_W3+0x510>
mov    0x28(%rbp),%dl
mov    -0x78(%rbp),%rax
movslq -0x68(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x80(%rbp),%rax
movslq -0x68(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1695 <align_W3+0x575>
cmpl   $0x0,-0x3c(%rbp)
jne    1672 <align_W3+0x552>
cmpl   $0xffffffff,-0x40(%rbp)
jne    1672 <align_W3+0x552>
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x78(%rbp),%rax
movslq -0x68(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    0x28(%rbp),%dl
mov    -0x80(%rbp),%rax
movslq -0x68(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1690 <align_W3+0x570>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
mov    -0x80(%rbp),%rdi
call   1030 <free@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    17ac <align_W3+0x68c>
jmp    1695 <align_W3+0x575>
jmp    169a <align_W3+0x57a>
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x3c(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x40(%rbp),%eax
add    -0x48(%rbp),%eax
mov    %eax,-0x48(%rbp)
jmp    120a <align_W3+0xea>
mov    -0x78(%rbp),%rax
movslq -0x68(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x80(%rbp),%rax
movslq -0x68(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x9c(%rbp)
mov    -0x68(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x9c(%rbp),%eax
cmp    %ecx,%eax
jge    178f <align_W3+0x66f>
mov    -0x78(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x69(%rbp)
mov    -0x78(%rbp),%rax
mov    -0x68(%rbp),%ecx
sub    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x78(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x69(%rbp),%dl
mov    -0x78(%rbp),%rax
mov    -0x68(%rbp),%ecx
sub    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x80(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x69(%rbp)
mov    -0x80(%rbp),%rax
mov    -0x68(%rbp),%ecx
sub    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x80(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x69(%rbp),%dl
mov    -0x80(%rbp),%rax
mov    -0x68(%rbp),%ecx
sub    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    16d9 <align_W3+0x5b9>
mov    -0x78(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x80(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<align_W3>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %r9d,%ebx
mov    0xa0(%rsp),%r14d
cmp    %r9d,%r14d
mov    %r9d,%r15d
cmovg  %r14d,%r15d
mov    %r8,0x28(%rsp)
mov    %rcx,0x48(%rsp)
mov    %rdx,0x40(%rsp)
mov    %rdi,0x58(%rsp)
movq   $0x0,(%rdi)
mov    %rsi,0x60(%rsp)
movq   $0x0,(%rsi)
add    %r15d,%r15d
mov    %r15d,%edi
call   1040 <malloc@plt>
mov    %rax,%rbp
mov    %r15d,%edi
call   1040 <malloc@plt>
mov    %rbx,%r11
mov    %r14,%rsi
mov    %rbp,%rdi
mov    %rax,%r8
movslq %r15d,%rax
movb   $0x0,-0x1(%rbp,%rax,1)
movb   $0x0,-0x1(%r8,%rax,1)
cmp    $0x2,%r11d
setge  %dl
cmp    $0x2,%esi
setge  %al
cmp    $0x1,%r11d
jg     11be <align_W3+0x9e>
cmp    $0x1,%esi
jg     11be <align_W3+0x9e>
movb   $0x0,(%rdi)
movb   $0x0,(%r8)
jmp    160d <align_W3+0x4ed>
mov    %al,0xf(%rsp)
mov    0xa8(%rsp),%r9d
mov    %r9d,%eax
shr    $0x1f,%eax
add    %r9d,%eax
sar    %eax
add    $0xffffffff,%esi
add    $0xffffffff,%r11d
xor    %ebx,%ebx
mov    %rdi,0x38(%rsp)
mov    %r8,0x30(%rsp)
mov    %eax,0x1c(%rsp)
nopl   0x0(%rax)
mov    %r11d,%ebp
sub    0x1c(%rsp),%ebp
mov    %esi,%r15d
sub    %ebp,%r15d
mov    %r11d,%r14d
imul   %r9d,%r14d
add    %r14d,%r15d
cmpl   $0x0,0xc0(%rsp)
je     1340 <align_W3+0x220>
xor    %r13d,%r13d
mov    $0x0,%r12d
testb  $0x1,0xf(%rsp)
je     12a3 <align_W3+0x183>
lea    -0x1(%rsi),%eax
mov    %eax,%ecx
sub    %ebp,%ecx
mov    $0x0,%r12d
js     12a3 <align_W3+0x183>
mov    $0x0,%r12d
cmp    %r9d,%ecx
jge    12a3 <align_W3+0x183>
add    %r14d,%ecx
movslq %ecx,%rcx
mov    0x28(%rsp),%r14
mov    (%r14,%rcx,4),%ecx
mov    %ecx,0x10(%rsp)
mov    %eax,%eax
mov    0x40(%rsp),%rcx
movsbl (%rcx,%rax,1),%edi
mov    %rsi,%rbp
xor    %esi,%esi
mov    %r11,0x20(%rsp)
mov    %edx,%r12d
call   *0xb0(%rsp)
mov    %r12d,%edx
mov    0x20(%rsp),%r11
mov    0xa8(%rsp),%r9d
mov    %rbp,%rsi
mov    0x30(%rsp),%r8
mov    0x38(%rsp),%rdi
add    0x10(%rsp),%eax
movslq %r15d,%rcx
xor    %r12d,%r12d
cmp    (%r14,%rcx,4),%eax
sete   %r12b
neg    %r12d
test   $0x1,%dl
je     1518 <align_W3+0x3f8>
lea    -0x1(%r11),%eax
mov    0x1c(%rsp),%ecx
sub    %eax,%ecx
xor    %r13d,%r13d
add    %esi,%ecx
js     1470 <align_W3+0x350>
cmp    %r9d,%ecx
jge    1470 <align_W3+0x350>
mov    %dl,0x20(%rsp)
mov    %eax,%edx
imul   %r9d,%eax
add    %eax,%ecx
movslq %ecx,%rax
mov    0x28(%rsp),%r14
mov    (%r14,%rax,4),%eax
mov    %eax,0x10(%rsp)
mov    %rsi,%rbp
mov    0x48(%rsp),%rax
movsbl (%rax,%rdx,1),%esi
xor    %edi,%edi
mov    %r11,%r13
call   *0xb0(%rsp)
movzbl 0x20(%rsp),%edx
mov    %r13,%r11
mov    %rbp,%rsi
mov    0x30(%rsp),%r8
mov    0x38(%rsp),%rdi
add    0x10(%rsp),%eax
movslq %r15d,%rcx
xor    %r13d,%r13d
cmp    (%r14,%rcx,4),%eax
sete   %r13b
mov    $0x0,%eax
cmove  %eax,%r12d
neg    %r13d
jmp    1470 <align_W3+0x350>
cs nopw 0x0(%rax,%rax,1)
xor    %r12d,%r12d
mov    $0x0,%r13d
test   $0x1,%dl
je     13ec <align_W3+0x2cc>
lea    -0x1(%r11),%ecx
mov    0x1c(%rsp),%eax
sub    %ecx,%eax
add    %esi,%eax
mov    $0x0,%r13d
js     13ec <align_W3+0x2cc>
mov    $0x0,%r13d
cmp    %r9d,%eax
jge    13ec <align_W3+0x2cc>
mov    %dl,0x20(%rsp)
mov    %ecx,%edx
imul   %r9d,%ecx
add    %ecx,%eax
cltq
mov    0x28(%rsp),%rcx
mov    (%rcx,%rax,4),%eax
mov    %eax,0x50(%rsp)
mov    %rsi,0x10(%rsp)
mov    0x48(%rsp),%rax
movsbl (%rax,%rdx,1),%esi
xor    %edi,%edi
mov    %r11,%r13
call   *0xb0(%rsp)
movzbl 0x20(%rsp),%edx
mov    %r13,%r11
mov    0xa8(%rsp),%r9d
mov    0x10(%rsp),%rsi
mov    0x30(%rsp),%r8
mov    0x38(%rsp),%rdi
add    0x50(%rsp),%eax
movslq %r15d,%rcx
mov    %rcx,0x50(%rsp)
xor    %r13d,%r13d
mov    0x28(%rsp),%rcx
mov    0x50(%rsp),%r10
cmp    (%rcx,%r10,4),%eax
sete   %r13b
neg    %r13d
testb  $0x1,0xf(%rsp)
je     1518 <align_W3+0x3f8>
lea    -0x1(%rsi),%eax
xor    %r12d,%r12d
mov    %eax,%ecx
sub    %ebp,%ecx
js     1470 <align_W3+0x350>
cmp    %r9d,%ecx
jge    1470 <align_W3+0x350>
add    %r14d,%ecx
movslq %ecx,%rcx
mov    0x28(%rsp),%r14
mov    (%r14,%rcx,4),%ecx
mov    %ecx,0x10(%rsp)
mov    %eax,%eax
mov    0x40(%rsp),%rcx
movsbl (%rcx,%rax,1),%edi
mov    %rsi,%rbp
xor    %esi,%esi
mov    %r11,%r12
mov    %dl,0x20(%rsp)
call   *0xb0(%rsp)
movzbl 0x20(%rsp),%edx
mov    %r12,%r11
mov    %rbp,%rsi
mov    0x30(%rsp),%r8
mov    0x38(%rsp),%rdi
add    0x10(%rsp),%eax
movslq %r15d,%rcx
xor    %r12d,%r12d
cmp    (%r14,%rcx,4),%eax
sete   %r12b
mov    $0x0,%eax
cmove  %eax,%r13d
neg    %r12d
nopl   0x0(%rax)
movzbl 0xf(%rsp),%eax
and    %al,%dl
test   $0x1,%dl
je     1510 <align_W3+0x3f0>
lea    -0x1(%rsi),%eax
lea    -0x1(%r11),%ecx
mov    0x1c(%rsp),%ebp
sub    %ecx,%ebp
mov    0xa8(%rsp),%r9d
add    %eax,%ebp
js     1518 <align_W3+0x3f8>
cmp    %r9d,%ebp
jge    1518 <align_W3+0x3f8>
mov    %ecx,%edx
imul   %r9d,%ecx
add    %ecx,%ebp
mov    %eax,%eax
mov    0x40(%rsp),%rcx
movsbl (%rcx,%rax,1),%edi
mov    %rsi,0x10(%rsp)
mov    0x48(%rsp),%rax
movsbl (%rax,%rdx,1),%esi
mov    %r11,%r14
call   *0xb0(%rsp)
mov    %r14,%r11
mov    0xa8(%rsp),%r9d
mov    0x10(%rsp),%rsi
mov    0x30(%rsp),%r8
mov    0x38(%rsp),%rdi
movslq %ebp,%rcx
mov    0x28(%rsp),%rdx
add    (%rdx,%rcx,4),%eax
movslq %r15d,%rcx
cmp    (%rdx,%rcx,4),%eax
mov    $0xffffffff,%eax
cmove  %eax,%r12d
cmove  %eax,%r13d
jmp    1518 <align_W3+0x3f8>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    0xa8(%rsp),%r9d
mov    %r13d,%eax
and    %r12d,%eax
cmp    $0xffffffff,%eax
je     1540 <align_W3+0x420>
test   %r12d,%r12d
jne    1560 <align_W3+0x440>
cmp    $0xffffffff,%r13d
jne    1560 <align_W3+0x440>
movzbl 0xb8(%rsp),%eax
jmp    154d <align_W3+0x42d>
nopl   0x0(%rax,%rax,1)
movslq %esi,%rax
mov    0x40(%rsp),%rcx
movzbl -0x1(%rax,%rcx,1),%eax
mov    %al,(%rdi,%rbx,1)
movslq %r11d,%rax
mov    0x48(%rsp),%rcx
movzbl -0x1(%rax,%rcx,1),%ecx
jmp    158b <align_W3+0x46b>
nop
cmp    $0xffffffff,%r12d
jne    162e <align_W3+0x50e>
test   %r13d,%r13d
jne    162e <align_W3+0x50e>
movslq %esi,%rax
mov    0x40(%rsp),%rcx
movzbl -0x1(%rax,%rcx,1),%eax
mov    %al,(%rdi,%rbx,1)
movzbl 0xb8(%rsp),%ecx
lea    0x1(%rbx),%rax
lea    (%r11,%r13,1),%edx
test   %edx,%edx
setg   %dl
add    %r12d,%esi
setg   0xf(%rsp)
mov    %cl,(%r8,%rbx,1)
mov    %rax,%rbx
add    %r13d,%r11d
jg     11f0 <align_W3+0xd0>
mov    %rax,%rbx
test   %esi,%esi
jg     11f0 <align_W3+0xd0>
mov    %eax,%ecx
movb   $0x0,(%rdi,%rcx,1)
movb   $0x0,(%r8,%rcx,1)
test   $0xfffffffe,%eax
je     160d <align_W3+0x4ed>
movslq %eax,%rsi
lea    -0x1(%rsi),%rcx
shr    %esi
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movzbl (%rdi,%rdx,1),%ebx
movzbl (%rdi,%rcx,1),%eax
mov    %al,(%rdi,%rdx,1)
mov    %bl,(%rdi,%rcx,1)
movzbl (%r8,%rdx,1),%eax
movzbl (%r8,%rcx,1),%ebx
mov    %bl,(%r8,%rdx,1)
mov    %al,(%r8,%rcx,1)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rcx
cmp    %rdx,%rsi
jne    15e0 <align_W3+0x4c0>
mov    0x58(%rsp),%rax
mov    %rdi,(%rax)
mov    0x60(%rsp),%rax
mov    %r8,(%rax)
xor    %eax,%eax
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r8,%rbx
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    $0xffffffff,%eax
jmp    161f <align_W3+0x4ff>

LLVM IR (-O0):
define i32 @align_W3(i8** %0, i8** %1, i8* %2, i8* %3, i32* %4, i32 %5, i32 %6, i32 %7, i32 (i8, i8)* %8, i8 signext %9, i32 %10) {
%12 = alloca i32
%13 = alloca i8**
%14 = alloca i8**
%15 = alloca i8*
%16 = alloca i8*
%17 = alloca i32*
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32 (i8, i8)*
%22 = alloca i8
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
%31 = alloca i32
%32 = alloca i32
%33 = alloca i32
%34 = alloca i32
%35 = alloca i32
%36 = alloca i32
%37 = alloca i8
%38 = alloca i8*
%39 = alloca i8*
store i8** %0, i8*** %13
store i8** %1, i8*** %14
store i8* %2, i8** %15
store i8* %3, i8** %16
store i32* %4, i32** %17
store i32 %5, i32* %18
store i32 %6, i32* %19
store i32 %7, i32* %20
store i32 (i8, i8)* %8, i32 (i8, i8)** %21
store i8 %9, i8* %22
store i32 %10, i32* %23
store i32 0, i32* %36
%40 = load i32, i32* %19
%41 = load i32, i32* %18
%42 = icmp sgt i32 %40, %41
br i1 %42, label %43, label %45
43: ; preds = %11
%44 = load i32, i32* %19
br label %47
45: ; preds = %11
%46 = load i32, i32* %18
br label %47
47: ; preds = %45, %43
%48 = phi i32 [ %44, %43 ], [ %46, %45 ]
store i32 %48, i32* %24
%49 = load i8**, i8*** %13
store i8* null, i8** %49
%50 = load i8**, i8*** %14
store i8* null, i8** %50
%51 = load i32, i32* %24
%52 = sext i32 %51 to i64
%53 = mul i64 2, %52
%54 = trunc i64 %53 to i32
%55 = call i64 @malloc(i32 %54)
%56 = inttoptr i64 %55 to i8*
store i8* %56, i8** %38
%57 = load i32, i32* %24
%58 = sext i32 %57 to i64
%59 = mul i64 2, %58
%60 = trunc i64 %59 to i32
%61 = call i64 @malloc(i32 %60)
%62 = inttoptr i64 %61 to i8*
store i8* %62, i8** %39
%63 = load i8*, i8** %38
%64 = load i32, i32* %24
%65 = mul nsw i32 2, %64
%66 = sub nsw i32 %65, 1
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %63, i64 %67
store i8 0, i8* %68
%69 = load i8*, i8** %39
%70 = load i32, i32* %24
%71 = mul nsw i32 2, %70
%72 = sub nsw i32 %71, 1
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i8, i8* %69, i64 %73
store i8 0, i8* %74
%75 = load i32, i32* %20
%76 = sdiv i32 %75, 2
store i32 %76, i32* %34
%77 = load i32, i32* %18
%78 = sub nsw i32 %77, 1
store i32 %78, i32* %27
%79 = load i32, i32* %19
%80 = sub nsw i32 %79, 1
store i32 %80, i32* %28
br label %81
81: ; preds = %421, %47
%82 = load i32, i32* %27
%83 = icmp sgt i32 %82, 0
br i1 %83, label %87, label %84
84: ; preds = %81
%85 = load i32, i32* %28
%86 = icmp sgt i32 %85, 0
br label %87
87: ; preds = %84, %81
%88 = phi i1 [ true, %81 ], [ %86, %84 ]
br i1 %88, label %89, label %430
89: ; preds = %87
store i32 0, i32* %25
store i32 0, i32* %26
%90 = load i32, i32* %28
%91 = load i32, i32* %27
%92 = load i32, i32* %34
%93 = sub nsw i32 %91, %92
%94 = sub nsw i32 %90, %93
store i32 %94, i32* %29
%95 = load i32, i32* %27
%96 = load i32, i32* %20
%97 = mul nsw i32 %95, %96
%98 = load i32, i32* %29
%99 = add nsw i32 %97, %98
store i32 %99, i32* %33
%100 = load i32, i32* %23
%101 = icmp ne i32 %100, 0
br i1 %101, label %102, label %194
102: ; preds = %89
%103 = load i32, i32* %28
%104 = icmp sgt i32 %103, 0
br i1 %104, label %105, label %147
105: ; preds = %102
%106 = load i32, i32* %28
%107 = sub nsw i32 %106, 1
%108 = load i32, i32* %27
%109 = load i32, i32* %34
%110 = sub nsw i32 %108, %109
%111 = sub nsw i32 %107, %110
store i32 %111, i32* %29
%112 = load i32, i32* %29
%113 = icmp sge i32 %112, 0
br i1 %113, label %114, label %146
114: ; preds = %105
%115 = load i32, i32* %29
%116 = load i32, i32* %20
%117 = icmp slt i32 %115, %116
br i1 %117, label %118, label %146
118: ; preds = %114
%119 = load i32, i32* %27
%120 = load i32, i32* %20
%121 = mul nsw i32 %119, %120
%122 = load i32, i32* %29
%123 = add nsw i32 %121, %122
store i32 %123, i32* %32
%124 = load i32*, i32** %17
%125 = load i32, i32* %32
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i32, i32* %124, i64 %126
%128 = load i32, i32* %127
%129 = load i32 (i8, i8)*, i32 (i8, i8)** %21
%130 = load i8*, i8** %15
%131 = load i32, i32* %28
%132 = sub nsw i32 %131, 1
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds i8, i8* %130, i64 %133
%135 = load i8, i8* %134
%136 = call i32 %129(i8 signext %135, i8 signext 0)
%137 = add nsw i32 %128, %136
%138 = load i32*, i32** %17
%139 = load i32, i32* %33
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds i32, i32* %138, i64 %140
%142 = load i32, i32* %141
%143 = icmp eq i32 %137, %142
br i1 %143, label %144, label %145
144: ; preds = %118
store i32 0, i32* %25
store i32 -1, i32* %26
br label %145
145: ; preds = %144, %118
br label %146
146: ; preds = %145, %114, %105
br label %147
147: ; preds = %146, %102
%148 = load i32, i32* %27
%149 = icmp sgt i32 %148, 0
br i1 %149, label %150, label %193
150: ; preds = %147
%151 = load i32, i32* %28
%152 = load i32, i32* %27
%153 = sub nsw i32 %152, 1
%154 = load i32, i32* %34
%155 = sub nsw i32 %153, %154
%156 = sub nsw i32 %151, %155
store i32 %156, i32* %29
%157 = load i32, i32* %29
%158 = icmp sge i32 %157, 0
br i1 %158, label %159, label %192
159: ; preds = %150
%160 = load i32, i32* %29
%161 = load i32, i32* %20
%162 = icmp slt i32 %160, %161
br i1 %162, label %163, label %192
163: ; preds = %159
%164 = load i32, i32* %27
%165 = sub nsw i32 %164, 1
%166 = load i32, i32* %20
%167 = mul nsw i32 %165, %166
%168 = load i32, i32* %29
%169 = add nsw i32 %167, %168
store i32 %169, i32* %31
%170 = load i32*, i32** %17
%171 = load i32, i32* %31
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds i32, i32* %170, i64 %172
%174 = load i32, i32* %173
%175 = load i32 (i8, i8)*, i32 (i8, i8)** %21
%176 = load i8*, i8** %16
%177 = load i32, i32* %27
%178 = sub nsw i32 %177, 1
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds i8, i8* %176, i64 %179
%181 = load i8, i8* %180
%182 = call i32 %175(i8 signext 0, i8 signext %181)
%183 = add nsw i32 %174, %182
%184 = load i32*, i32** %17
%185 = load i32, i32* %33
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds i32, i32* %184, i64 %186
%188 = load i32, i32* %187
%189 = icmp eq i32 %183, %188
br i1 %189, label %190, label %191
190: ; preds = %163
store i32 -1, i32* %25
store i32 0, i32* %26
br label %191
191: ; preds = %190, %163
br label %192
192: ; preds = %191, %159, %150
br label %193
193: ; preds = %192, %147
br label %286
194: ; preds = %89
%195 = load i32, i32* %27
%196 = icmp sgt i32 %195, 0
br i1 %196, label %197, label %240
197: ; preds = %194
%198 = load i32, i32* %28
%199 = load i32, i32* %27
%200 = sub nsw i32 %199, 1
%201 = load i32, i32* %34
%202 = sub nsw i32 %200, %201
%203 = sub nsw i32 %198, %202
store i32 %203, i32* %29
%204 = load i32, i32* %29
%205 = icmp sge i32 %204, 0
br i1 %205, label %206, label %239
206: ; preds = %197
%207 = load i32, i32* %29
%208 = load i32, i32* %20
%209 = icmp slt i32 %207, %208
br i1 %209, label %210, label %239
210: ; preds = %206
%211 = load i32, i32* %27
%212 = sub nsw i32 %211, 1
%213 = load i32, i32* %20
%214 = mul nsw i32 %212, %213
%215 = load i32, i32* %29
%216 = add nsw i32 %214, %215
store i32 %216, i32* %31
%217 = load i32*, i32** %17
%218 = load i32, i32* %31
%219 = sext i32 %218 to i64
%220 = getelementptr inbounds i32, i32* %217, i64 %219
%221 = load i32, i32* %220
%222 = load i32 (i8, i8)*, i32 (i8, i8)** %21
%223 = load i8*, i8** %16
%224 = load i32, i32* %27
%225 = sub nsw i32 %224, 1
%226 = sext i32 %225 to i64
%227 = getelementptr inbounds i8, i8* %223, i64 %226
%228 = load i8, i8* %227
%229 = call i32 %222(i8 signext 0, i8 signext %228)
%230 = add nsw i32 %221, %229
%231 = load i32*, i32** %17
%232 = load i32, i32* %33
%233 = sext i32 %232 to i64
%234 = getelementptr inbounds i32, i32* %231, i64 %233
%235 = load i32, i32* %234
%236 = icmp eq i32 %230, %235
br i1 %236, label %237, label %238
237: ; preds = %210
store i32 -1, i32* %25
store i32 0, i32* %26
br label %238
238: ; preds = %237, %210
br label %239
239: ; preds = %238, %206, %197
br label %240
240: ; preds = %239, %194
%241 = load i32, i32* %28
%242 = icmp sgt i32 %241, 0
br i1 %242, label %243, label %285
243: ; preds = %240
%244 = load i32, i32* %28
%245 = sub nsw i32 %244, 1
%246 = load i32, i32* %27
%247 = load i32, i32* %34
%248 = sub nsw i32 %246, %247
%249 = sub nsw i32 %245, %248
store i32 %249, i32* %29
%250 = load i32, i32* %29
%251 = icmp sge i32 %250, 0
br i1 %251, label %252, label %284
252: ; preds = %243
%253 = load i32, i32* %29
%254 = load i32, i32* %20
%255 = icmp slt i32 %253, %254
br i1 %255, label %256, label %284
256: ; preds = %252
%257 = load i32, i32* %27
%258 = load i32, i32* %20
%259 = mul nsw i32 %257, %258
%260 = load i32, i32* %29
%261 = add nsw i32 %259, %260
store i32 %261, i32* %32
%262 = load i32*, i32** %17
%263 = load i32, i32* %32
%264 = sext i32 %263 to i64
%265 = getelementptr inbounds i32, i32* %262, i64 %264
%266 = load i32, i32* %265
%267 = load i32 (i8, i8)*, i32 (i8, i8)** %21
%268 = load i8*, i8** %15
%269 = load i32, i32* %28
%270 = sub nsw i32 %269, 1
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds i8, i8* %268, i64 %271
%273 = load i8, i8* %272
%274 = call i32 %267(i8 signext %273, i8 signext 0)
%275 = add nsw i32 %266, %274
%276 = load i32*, i32** %17
%277 = load i32, i32* %33
%278 = sext i32 %277 to i64
%279 = getelementptr inbounds i32, i32* %276, i64 %278
%280 = load i32, i32* %279
%281 = icmp eq i32 %275, %280
br i1 %281, label %282, label %283
282: ; preds = %256
store i32 0, i32* %25
store i32 -1, i32* %26
br label %283
283: ; preds = %282, %256
br label %284
284: ; preds = %283, %252, %243
br label %285
285: ; preds = %284, %240
br label %286
286: ; preds = %285, %193
%287 = load i32, i32* %27
%288 = icmp sgt i32 %287, 0
br i1 %288, label %289, label %343
289: ; preds = %286
%290 = load i32, i32* %28
%291 = icmp sgt i32 %290, 0
br i1 %291, label %292, label %343
292: ; preds = %289
%293 = load i32, i32* %28
%294 = sub nsw i32 %293, 1
%295 = load i32, i32* %27
%296 = sub nsw i32 %295, 1
%297 = load i32, i32* %34
%298 = sub nsw i32 %296, %297
%299 = sub nsw i32 %294, %298
store i32 %299, i32* %29
%300 = load i32, i32* %29
%301 = icmp sge i32 %300, 0
br i1 %301, label %302, label %342
302: ; preds = %292
%303 = load i32, i32* %29
%304 = load i32, i32* %20
%305 = icmp slt i32 %303, %304
br i1 %305, label %306, label %342
306: ; preds = %302
%307 = load i32, i32* %27
%308 = sub nsw i32 %307, 1
%309 = load i32, i32* %20
%310 = mul nsw i32 %308, %309
%311 = load i32, i32* %29
%312 = add nsw i32 %310, %311
store i32 %312, i32* %30
%313 = load i32 (i8, i8)*, i32 (i8, i8)** %21
%314 = load i8*, i8** %15
%315 = load i32, i32* %28
%316 = sub nsw i32 %315, 1
%317 = sext i32 %316 to i64
%318 = getelementptr inbounds i8, i8* %314, i64 %317
%319 = load i8, i8* %318
%320 = load i8*, i8** %16
%321 = load i32, i32* %27
%322 = sub nsw i32 %321, 1
%323 = sext i32 %322 to i64
%324 = getelementptr inbounds i8, i8* %320, i64 %323
%325 = load i8, i8* %324
%326 = call i32 %313(i8 signext %319, i8 signext %325)
store i32 %326, i32* %35
%327 = load i32*, i32** %17
%328 = load i32, i32* %30
%329 = sext i32 %328 to i64
%330 = getelementptr inbounds i32, i32* %327, i64 %329
%331 = load i32, i32* %330
%332 = load i32, i32* %35
%333 = add nsw i32 %331, %332
%334 = load i32*, i32** %17
%335 = load i32, i32* %33
%336 = sext i32 %335 to i64
%337 = getelementptr inbounds i32, i32* %334, i64 %336
%338 = load i32, i32* %337
%339 = icmp eq i32 %333, %338
br i1 %339, label %340, label %341
340: ; preds = %306
store i32 -1, i32* %25
store i32 -1, i32* %26
br label %341
341: ; preds = %340, %306
br label %342
342: ; preds = %341, %302, %292
br label %343
343: ; preds = %342, %289, %286
%344 = load i32, i32* %25
%345 = icmp eq i32 %344, -1
br i1 %345, label %346, label %370
346: ; preds = %343
%347 = load i32, i32* %26
%348 = icmp eq i32 %347, -1
br i1 %348, label %349, label %370
349: ; preds = %346
%350 = load i8*, i8** %15
%351 = load i32, i32* %28
%352 = sub nsw i32 %351, 1
%353 = sext i32 %352 to i64
%354 = getelementptr inbounds i8, i8* %350, i64 %353
%355 = load i8, i8* %354
%356 = load i8*, i8** %38
%357 = load i32, i32* %36
%358 = sext i32 %357 to i64
%359 = getelementptr inbounds i8, i8* %356, i64 %358
store i8 %355, i8* %359
%360 = load i8*, i8** %16
%361 = load i32, i32* %27
%362 = sub nsw i32 %361, 1
%363 = sext i32 %362 to i64
%364 = getelementptr inbounds i8, i8* %360, i64 %363
%365 = load i8, i8* %364
%366 = load i8*, i8** %39
%367 = load i32, i32* %36
%368 = sext i32 %367 to i64
%369 = getelementptr inbounds i8, i8* %366, i64 %368
store i8 %365, i8* %369
br label %421
370: ; preds = %346, %343
%371 = load i32, i32* %25
%372 = icmp eq i32 %371, -1
br i1 %372, label %373, label %392
373: ; preds = %370
%374 = load i32, i32* %26
%375 = icmp eq i32 %374, 0
br i1 %375, label %376, label %392
376: ; preds = %373
%377 = load i8, i8* %22
%378 = load i8*, i8** %38
%379 = load i32, i32* %36
%380 = sext i32 %379 to i64
%381 = getelementptr inbounds i8, i8* %378, i64 %380
store i8 %377, i8* %381
%382 = load i8*, i8** %16
%383 = load i32, i32* %27
%384 = sub nsw i32 %383, 1
%385 = sext i32 %384 to i64
%386 = getelementptr inbounds i8, i8* %382, i64 %385
%387 = load i8, i8* %386
%388 = load i8*, i8** %39
%389 = load i32, i32* %36
%390 = sext i32 %389 to i64
%391 = getelementptr inbounds i8, i8* %388, i64 %390
store i8 %387, i8* %391
br label %420
392: ; preds = %373, %370
%393 = load i32, i32* %25
%394 = icmp eq i32 %393, 0
br i1 %394, label %395, label %414
395: ; preds = %392
%396 = load i32, i32* %26
%397 = icmp eq i32 %396, -1
br i1 %397, label %398, label %414
398: ; preds = %395
%399 = load i8*, i8** %15
%400 = load i32, i32* %28
%401 = sub nsw i32 %400, 1
%402 = sext i32 %401 to i64
%403 = getelementptr inbounds i8, i8* %399, i64 %402
%404 = load i8, i8* %403
%405 = load i8*, i8** %38
%406 = load i32, i32* %36
%407 = sext i32 %406 to i64
%408 = getelementptr inbounds i8, i8* %405, i64 %407
store i8 %404, i8* %408
%409 = load i8, i8* %22
%410 = load i8*, i8** %39
%411 = load i32, i32* %36
%412 = sext i32 %411 to i64
%413 = getelementptr inbounds i8, i8* %410, i64 %412
store i8 %409, i8* %413
br label %419
414: ; preds = %395, %392
%415 = load i8*, i8** %38
%416 = call i32 @free(i8* %415)
%417 = load i8*, i8** %39
%418 = call i32 @free(i8* %417)
store i32 -1, i32* %12
br label %503
419: ; preds = %398
br label %420
420: ; preds = %419, %376
br label %421
421: ; preds = %420, %349
%422 = load i32, i32* %36
%423 = add nsw i32 %422, 1
store i32 %423, i32* %36
%424 = load i32, i32* %25
%425 = load i32, i32* %27
%426 = add nsw i32 %425, %424
store i32 %426, i32* %27
%427 = load i32, i32* %26
%428 = load i32, i32* %28
%429 = add nsw i32 %428, %427
store i32 %429, i32* %28
br label %81
430: ; preds = %87
%431 = load i8*, i8** %38
%432 = load i32, i32* %36
%433 = sext i32 %432 to i64
%434 = getelementptr inbounds i8, i8* %431, i64 %433
store i8 0, i8* %434
%435 = load i8*, i8** %39
%436 = load i32, i32* %36
%437 = sext i32 %436 to i64
%438 = getelementptr inbounds i8, i8* %435, i64 %437
store i8 0, i8* %438
store i32 0, i32* %24
br label %439
439: ; preds = %495, %430
%440 = load i32, i32* %24
%441 = load i32, i32* %36
%442 = sdiv i32 %441, 2
%443 = icmp slt i32 %440, %442
br i1 %443, label %444, label %498
444: ; preds = %439
%445 = load i8*, i8** %38
%446 = load i32, i32* %24
%447 = sext i32 %446 to i64
%448 = getelementptr inbounds i8, i8* %445, i64 %447
%449 = load i8, i8* %448
store i8 %449, i8* %37
%450 = load i8*, i8** %38
%451 = load i32, i32* %36
%452 = load i32, i32* %24
%453 = sub nsw i32 %451, %452
%454 = sub nsw i32 %453, 1
%455 = sext i32 %454 to i64
%456 = getelementptr inbounds i8, i8* %450, i64 %455
%457 = load i8, i8* %456
%458 = load i8*, i8** %38
%459 = load i32, i32* %24
%460 = sext i32 %459 to i64
%461 = getelementptr inbounds i8, i8* %458, i64 %460
store i8 %457, i8* %461
%462 = load i8, i8* %37
%463 = load i8*, i8** %38
%464 = load i32, i32* %36
%465 = load i32, i32* %24
%466 = sub nsw i32 %464, %465
%467 = sub nsw i32 %466, 1
%468 = sext i32 %467 to i64
%469 = getelementptr inbounds i8, i8* %463, i64 %468
store i8 %462, i8* %469
%470 = load i8*, i8** %39
%471 = load i32, i32* %24
%472 = sext i32 %471 to i64
%473 = getelementptr inbounds i8, i8* %470, i64 %472
%474 = load i8, i8* %473
store i8 %474, i8* %37
%475 = load i8*, i8** %39
%476 = load i32, i32* %36
%477 = load i32, i32* %24
%478 = sub nsw i32 %476, %477
%479 = sub nsw i32 %478, 1
%480 = sext i32 %479 to i64
%481 = getelementptr inbounds i8, i8* %475, i64 %480
%482 = load i8, i8* %481
%483 = load i8*, i8** %39
%484 = load i32, i32* %24
%485 = sext i32 %484 to i64
%486 = getelementptr inbounds i8, i8* %483, i64 %485
store i8 %482, i8* %486
%487 = load i8, i8* %37
%488 = load i8*, i8** %39
%489 = load i32, i32* %36
%490 = load i32, i32* %24
%491 = sub nsw i32 %489, %490
%492 = sub nsw i32 %491, 1
%493 = sext i32 %492 to i64
%494 = getelementptr inbounds i8, i8* %488, i64 %493
store i8 %487, i8* %494
br label %495
495: ; preds = %444
%496 = load i32, i32* %24
%497 = add nsw i32 %496, 1
store i32 %497, i32* %24
br label %439
498: ; preds = %439
%499 = load i8*, i8** %38
%500 = load i8**, i8*** %13
store i8* %499, i8** %500
%501 = load i8*, i8** %39
%502 = load i8**, i8*** %14
store i8* %501, i8** %502
store i32 0, i32* %12
br label %503
503: ; preds = %498, %414
%504 = load i32, i32* %12
ret i32 %504
}

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