#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 i;
  int dr, dc;
  int r, c, w;
  int pos00, pos01, pos10, pos11;
  int w_offset;
  int mm;
  int xy_pos = 0;
  char ch;
  char *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 (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    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    1171 <align_W3+0x51>
mov    0x10(%rbp),%eax
mov    %eax,-0x84(%rbp)
jmp    117a <align_W3+0x5a>
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     1226 <align_W3+0x106>
cmpl   $0x0,-0x48(%rbp)
setg   %al
mov    %al,-0x85(%rbp)
mov    -0x85(%rbp),%al
test   $0x1,%al
jne    1239 <align_W3+0x119>
jmp    156a <align_W3+0x44a>
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,-0x44(%rbp)
jle    1300 <align_W3+0x1e0>
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     12fb <align_W3+0x1db>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    12fb <align_W3+0x1db>
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,-0x8c(%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    -0x8c(%rbp),%eax
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    12f6 <align_W3+0x1d6>
movl   $0xffffffff,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
jmp    12fb <align_W3+0x1db>
jmp    1300 <align_W3+0x1e0>
cmpl   $0x0,-0x48(%rbp)
jle    139b <align_W3+0x27b>
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     1396 <align_W3+0x276>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    1396 <align_W3+0x276>
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,-0x90(%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    -0x90(%rbp),%eax
add    %ecx,%eax
mov    -0x30(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    1391 <align_W3+0x271>
movl   $0x0,-0x3c(%rbp)
movl   $0xffffffff,-0x40(%rbp)
jmp    1396 <align_W3+0x276>
jmp    139b <align_W3+0x27b>
cmpl   $0x0,-0x44(%rbp)
jle    144f <align_W3+0x32f>
cmpl   $0x0,-0x48(%rbp)
jle    144f <align_W3+0x32f>
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     144a <align_W3+0x32a>
mov    -0x4c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    144a <align_W3+0x32a>
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    1445 <align_W3+0x325>
movl   $0xffffffff,-0x3c(%rbp)
movl   $0xffffffff,-0x40(%rbp)
jmp    144a <align_W3+0x32a>
jmp    144f <align_W3+0x32f>
cmpl   $0xffffffff,-0x3c(%rbp)
jne    149e <align_W3+0x37e>
cmpl   $0xffffffff,-0x40(%rbp)
jne    149e <align_W3+0x37e>
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    154a <align_W3+0x42a>
cmpl   $0xffffffff,-0x3c(%rbp)
jne    14e0 <align_W3+0x3c0>
cmpl   $0x0,-0x40(%rbp)
jne    14e0 <align_W3+0x3c0>
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    1545 <align_W3+0x425>
cmpl   $0x0,-0x3c(%rbp)
jne    1522 <align_W3+0x402>
cmpl   $0xffffffff,-0x40(%rbp)
jne    1522 <align_W3+0x402>
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    1540 <align_W3+0x420>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
mov    -0x80(%rbp),%rdi
call   1030 <free@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    165c <align_W3+0x53c>
jmp    1545 <align_W3+0x425>
jmp    154a <align_W3+0x42a>
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    1207 <align_W3+0xe7>
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,-0x94(%rbp)
mov    -0x68(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x94(%rbp),%eax
cmp    %ecx,%eax
jge    163f <align_W3+0x51f>
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    1589 <align_W3+0x469>
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    $0x58,%rsp
mov    %r9d,%ebp
mov    0x90(%rsp),%ebx
cmp    %r9d,%ebx
mov    %r9d,%r15d
cmovg  %ebx,%r15d
mov    %r8,0x38(%rsp)
mov    %rcx,0x18(%rsp)
mov    %rdx,0x10(%rsp)
mov    %rsi,%r14
mov    %rdi,%r12
movq   $0x0,(%rdi)
movq   $0x0,(%rsi)
add    %r15d,%r15d
mov    %r15d,%edi
call   1040 <malloc@plt>
mov    %rax,%r13
mov    %r15d,%edi
call   1040 <malloc@plt>
mov    %rbp,%r8
mov    %rbx,%r10
mov    %r13,%rdi
mov    %rax,%rsi
movslq %r15d,%rax
movb   $0x0,-0x1(%r13,%rax,1)
movb   $0x0,-0x1(%rsi,%rax,1)
cmp    $0x2,%r8d
setge  %dl
cmp    $0x2,%r10d
setge  %bl
cmp    $0x1,%r8d
jg     11ba <align_W3+0x9a>
cmp    $0x1,%r10d
jg     11ba <align_W3+0x9a>
movb   $0x0,(%rdi)
movb   $0x0,(%rsi)
jmp    14c9 <align_W3+0x3a9>
mov    %r12,0x48(%rsp)
mov    %r14,0x50(%rsp)
mov    0x98(%rsp),%r9d
mov    %r9d,%eax
shr    $0x1f,%eax
add    %r9d,%eax
sar    %eax
add    $0xffffffff,%r10d
add    $0xffffffff,%r8d
xor    %r11d,%r11d
mov    %rdi,0x30(%rsp)
mov    %rsi,0x28(%rsp)
mov    %eax,0x4(%rsp)
mov    %r8d,%ebp
sub    0x4(%rsp),%ebp
mov    %r10d,%r12d
sub    %ebp,%r12d
mov    %r8d,%r14d
imul   %r9d,%r14d
add    %r14d,%r12d
mov    $0x0,%r15d
test   $0x1,%dl
je     12af <align_W3+0x18f>
lea    -0x1(%r8),%ecx
mov    0x4(%rsp),%eax
sub    %ecx,%eax
add    %r10d,%eax
mov    $0x0,%r15d
js     12af <align_W3+0x18f>
mov    $0x0,%r15d
cmp    %r9d,%eax
jge    12af <align_W3+0x18f>
mov    %dl,0x3(%rsp)
mov    %ecx,%edx
imul   %r9d,%ecx
add    %ecx,%eax
cltq
mov    0x38(%rsp),%r13
mov    0x0(%r13,%rax,4),%eax
mov    %eax,0x44(%rsp)
mov    0x18(%rsp),%rax
movsbl (%rax,%rdx,1),%esi
xor    %edi,%edi
mov    %r10,%r15
mov    %r8,0x20(%rsp)
mov    %r11,0x8(%rsp)
call   *0xa0(%rsp)
movzbl 0x3(%rsp),%edx
mov    0x8(%rsp),%r11
mov    0x98(%rsp),%r9d
mov    0x20(%rsp),%r8
mov    %r15,%r10
mov    0x28(%rsp),%rsi
mov    0x30(%rsp),%rdi
add    0x44(%rsp),%eax
movslq %r12d,%rcx
xor    %r15d,%r15d
cmp    0x0(%r13,%rcx,4),%eax
sete   %r15b
neg    %r15d
xor    %r13d,%r13d
test   $0x1,%bl
je     13d0 <align_W3+0x2b0>
lea    -0x1(%r10),%ecx
xor    %r13d,%r13d
mov    %ecx,%eax
sub    %ebp,%eax
mov    %ecx,0x8(%rsp)
js     1342 <align_W3+0x222>
cmp    %r9d,%eax
jge    1342 <align_W3+0x222>
add    %r14d,%eax
cltq
mov    0x38(%rsp),%r14
mov    (%r14,%rax,4),%eax
mov    %eax,0x20(%rsp)
mov    %ecx,%eax
mov    0x10(%rsp),%rcx
movsbl (%rcx,%rax,1),%edi
xor    %esi,%esi
mov    %r10,%rbx
mov    %r8,%rbp
mov    %r11,%r13
mov    %dl,0x3(%rsp)
call   *0xa0(%rsp)
movzbl 0x3(%rsp),%edx
mov    %r13,%r11
mov    0x98(%rsp),%r9d
mov    %rbp,%r8
mov    %rbx,%r10
mov    0x28(%rsp),%rsi
mov    0x30(%rsp),%rdi
add    0x20(%rsp),%eax
movslq %r12d,%rcx
xor    %r13d,%r13d
cmp    (%r14,%rcx,4),%eax
sete   %r13b
mov    $0x0,%eax
cmove  %eax,%r15d
neg    %r13d
test   $0x1,%dl
je     13d0 <align_W3+0x2b0>
lea    -0x1(%r8),%eax
mov    0x4(%rsp),%ebp
sub    %eax,%ebp
mov    0x8(%rsp),%edx
add    %edx,%ebp
js     13d0 <align_W3+0x2b0>
cmp    %r9d,%ebp
jge    13d0 <align_W3+0x2b0>
mov    %eax,%ecx
imul   %r9d,%eax
add    %eax,%ebp
mov    %edx,%eax
mov    0x10(%rsp),%rdx
movsbl (%rdx,%rax,1),%edi
mov    0x18(%rsp),%rax
movsbl (%rax,%rcx,1),%esi
mov    %r10,%rbx
mov    %r8,%r14
mov    %r11,0x8(%rsp)
call   *0xa0(%rsp)
mov    0x8(%rsp),%r11
mov    0x98(%rsp),%r9d
mov    %r14,%r8
mov    %rbx,%r10
mov    0x28(%rsp),%rsi
mov    0x30(%rsp),%rdi
movslq %ebp,%rcx
mov    0x38(%rsp),%rdx
add    (%rdx,%rcx,4),%eax
movslq %r12d,%rcx
cmp    (%rdx,%rcx,4),%eax
mov    $0xffffffff,%eax
cmove  %eax,%r13d
cmove  %eax,%r15d
nopl   0x0(%rax,%rax,1)
mov    %r15d,%eax
and    %r13d,%eax
cmp    $0xffffffff,%eax
je     13f0 <align_W3+0x2d0>
test   %r13d,%r13d
jne    1410 <align_W3+0x2f0>
cmp    $0xffffffff,%r15d
jne    1410 <align_W3+0x2f0>
movzbl 0xa8(%rsp),%eax
jmp    13fd <align_W3+0x2dd>
movslq %r10d,%rax
mov    0x10(%rsp),%rcx
movzbl -0x1(%rax,%rcx,1),%eax
mov    %al,(%rdi,%r11,1)
movslq %r8d,%rax
mov    0x18(%rsp),%rcx
movzbl -0x1(%rax,%rcx,1),%ecx
jmp    143c <align_W3+0x31c>
cmp    $0xffffffff,%r13d
jne    14e1 <align_W3+0x3c1>
test   %r15d,%r15d
jne    14e1 <align_W3+0x3c1>
movslq %r10d,%rax
mov    0x10(%rsp),%rcx
movzbl -0x1(%rax,%rcx,1),%eax
mov    %al,(%rdi,%r11,1)
movzbl 0xa8(%rsp),%ecx
lea    0x1(%r11),%rax
lea    (%r15,%r8,1),%edx
test   %edx,%edx
setg   %dl
add    %r13d,%r10d
setg   %bl
mov    %cl,(%rsi,%r11,1)
mov    %rax,%r11
add    %r15d,%r8d
jg     11f0 <align_W3+0xd0>
mov    %rax,%r11
test   %r10d,%r10d
jg     11f0 <align_W3+0xd0>
mov    %eax,%ecx
movb   $0x0,(%rdi,%rcx,1)
movb   $0x0,(%rsi,%rcx,1)
test   $0xfffffffe,%eax
mov    0x50(%rsp),%r14
mov    0x48(%rsp),%r12
je     14c9 <align_W3+0x3a9>
movslq %eax,%rbp
lea    -0x1(%rbp),%rcx
shr    %ebp
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
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 (%rsi,%rdx,1),%eax
movzbl (%rsi,%rcx,1),%ebx
mov    %bl,(%rsi,%rdx,1)
mov    %al,(%rsi,%rcx,1)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rcx
cmp    %rdx,%rbp
jne    14a0 <align_W3+0x380>
mov    %rdi,(%r12)
mov    %rsi,(%r14)
xor    %eax,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rsi,%rbx
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    $0xffffffff,%eax
jmp    14d2 <align_W3+0x3b2>

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

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) {
%11 = icmp sgt i32 %6, %5
%12 = select i1 %11, i32 %6, i32 %5
store i8* null, i8** %0
store i8* null, i8** %1
%13 = shl i32 %12, 1
%14 = tail call i64 @malloc(i32 %13)
%15 = inttoptr i64 %14 to i8*
%16 = tail call i64 @malloc(i32 %13)
%17 = inttoptr i64 %16 to i8*
%18 = add nsw i32 %13, -1
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %15, i64 %19
store i8 0, i8* %20
%21 = getelementptr inbounds i8, i8* %17, i64 %19
store i8 0, i8* %21
%22 = sdiv i32 %7, 2
%23 = icmp sgt i32 %5, 1
%24 = icmp sgt i32 %6, 1
%25 = or i1 %23, %24
br i1 %25, label %27, label %26
26: ; preds = %10
store i8 0, i8* %15
store i8 0, i8* %17
br label %189
27: ; preds = %10
%28 = add nsw i32 %6, -1
%29 = add nsw i32 %5, -1
br label %30
30: ; preds = %27, %155
%31 = phi i64 [ 0, %27 ], [ %158, %155 ]
%32 = phi i1 [ %24, %27 ], [ %162, %155 ]
%33 = phi i1 [ %23, %27 ], [ %161, %155 ]
%34 = phi i32 [ %29, %27 ], [ %159, %155 ]
%35 = phi i32 [ %28, %27 ], [ %160, %155 ]
%36 = sub nsw i32 %34, %22
%37 = sub nsw i32 %35, %36
%38 = mul nsw i32 %34, %7
%39 = add nsw i32 %37, %38
br i1 %33, label %40, label %63
40: ; preds = %30
%41 = add nsw i32 %34, -1
%42 = sub i32 %22, %41
%43 = add i32 %42, %35
%44 = icmp sgt i32 %43, -1
%45 = icmp slt i32 %43, %7
%46 = and i1 %44, %45
br i1 %46, label %47, label %63
47: ; preds = %40
%48 = mul nsw i32 %41, %7
%49 = add nsw i32 %43, %48
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i32, i32* %4, i64 %50
%52 = load i32, i32* %51
%53 = zext i32 %41 to i64
%54 = getelementptr inbounds i8, i8* %3, i64 %53
%55 = load i8, i8* %54
%56 = tail call i32 %8(i8 signext 0, i8 signext %55)
%57 = add nsw i32 %56, %52
%58 = sext i32 %39 to i64
%59 = getelementptr inbounds i32, i32* %4, i64 %58
%60 = load i32, i32* %59
%61 = icmp eq i32 %57, %60
%62 = sext i1 %61 to i32
br label %63
63: ; preds = %47, %40, %30
%64 = phi i32 [ 0, %40 ], [ 0, %30 ], [ %62, %47 ]
br i1 %32, label %65, label %117
65: ; preds = %63
%66 = add nsw i32 %35, -1
%67 = sub nsw i32 %66, %36
%68 = icmp sgt i32 %67, -1
%69 = icmp slt i32 %67, %7
%70 = and i1 %68, %69
br i1 %70, label %71, label %87
71: ; preds = %65
%72 = add nsw i32 %67, %38
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i32, i32* %4, i64 %73
%75 = load i32, i32* %74
%76 = zext i32 %66 to i64
%77 = getelementptr inbounds i8, i8* %2, i64 %76
%78 = load i8, i8* %77
%79 = tail call i32 %8(i8 signext %78, i8 signext 0)
%80 = add nsw i32 %79, %75
%81 = sext i32 %39 to i64
%82 = getelementptr inbounds i32, i32* %4, i64 %81
%83 = load i32, i32* %82
%84 = icmp eq i32 %80, %83
%85 = sext i1 %84 to i32
%86 = select i1 %84, i32 0, i32 %64
br label %87
87: ; preds = %71, %65
%88 = phi i32 [ 0, %65 ], [ %85, %71 ]
%89 = phi i32 [ %64, %65 ], [ %86, %71 ]
br i1 %33, label %90, label %117
90: ; preds = %87
%91 = add nsw i32 %34, -1
%92 = sub i32 %22, %91
%93 = add i32 %92, %66
%94 = icmp sgt i32 %93, -1
%95 = icmp slt i32 %93, %7
%96 = and i1 %94, %95
br i1 %96, label %97, label %117
97: ; preds = %90
%98 = mul nsw i32 %91, %7
%99 = add nsw i32 %93, %98
%100 = zext i32 %66 to i64
%101 = getelementptr inbounds i8, i8* %2, i64 %100
%102 = load i8, i8* %101
%103 = zext i32 %91 to i64
%104 = getelementptr inbounds i8, i8* %3, i64 %103
%105 = load i8, i8* %104
%106 = tail call i32 %8(i8 signext %102, i8 signext %105)
%107 = sext i32 %99 to i64
%108 = getelementptr inbounds i32, i32* %4, i64 %107
%109 = load i32, i32* %108
%110 = add nsw i32 %109, %106
%111 = sext i32 %39 to i64
%112 = getelementptr inbounds i32, i32* %4, i64 %111
%113 = load i32, i32* %112
%114 = icmp eq i32 %110, %113
%115 = select i1 %114, i32 -1, i32 %88
%116 = select i1 %114, i32 -1, i32 %89
br label %117
117: ; preds = %63, %97, %90, %87
%118 = phi i32 [ %88, %90 ], [ %88, %87 ], [ %115, %97 ], [ 0, %63 ]
%119 = phi i32 [ %89, %90 ], [ %89, %87 ], [ %116, %97 ], [ %64, %63 ]
%120 = icmp eq i32 %118, -1
%121 = and i32 %119, %118
%122 = icmp eq i32 %121, -1
br i1 %122, label %123, label %133
123: ; preds = %117
%124 = add nsw i32 %35, -1
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i8, i8* %2, i64 %125
%127 = load i8, i8* %126
%128 = getelementptr inbounds i8, i8* %15, i64 %31
store i8 %127, i8* %128
%129 = add nsw i32 %34, -1
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds i8, i8* %3, i64 %130
%132 = load i8, i8* %131
br label %155
133: ; preds = %117
%134 = icmp eq i32 %119, -1
%135 = icmp eq i32 %118, 0
%136 = and i1 %135, %134
br i1 %136, label %137, label %143
137: ; preds = %133
%138 = getelementptr inbounds i8, i8* %15, i64 %31
store i8 %9, i8* %138
%139 = add nsw i32 %34, -1
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds i8, i8* %3, i64 %140
%142 = load i8, i8* %141
br label %155
143: ; preds = %133
%144 = icmp eq i32 %119, 0
%145 = and i1 %120, %144
br i1 %145, label %146, label %152
146: ; preds = %143
%147 = add nsw i32 %35, -1
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i8, i8* %2, i64 %148
%150 = load i8, i8* %149
%151 = getelementptr inbounds i8, i8* %15, i64 %31
store i8 %150, i8* %151
br label %155
152: ; preds = %143
%153 = tail call i32 @free(i8* %15)
%154 = tail call i32 @free(i8* %17)
br label %190
155: ; preds = %137, %146, %123
%156 = phi i8 [ %142, %137 ], [ %9, %146 ], [ %132, %123 ]
%157 = getelementptr inbounds i8, i8* %17, i64 %31
store i8 %156, i8* %157
%158 = add nuw i64 %31, 1
%159 = add nsw i32 %119, %34
%160 = add nsw i32 %118, %35
%161 = icmp sgt i32 %159, 0
%162 = icmp sgt i32 %160, 0
%163 = select i1 %161, i1 true, i1 %162
br i1 %163, label %30, label %164
164: ; preds = %155
%165 = and i64 %158, 4294967295
%166 = getelementptr inbounds i8, i8* %15, i64 %165
store i8 0, i8* %166
%167 = getelementptr inbounds i8, i8* %17, i64 %165
store i8 0, i8* %167
%168 = and i64 %158, 4294967294
%169 = icmp eq i64 %168, 0
br i1 %169, label %189, label %170
170: ; preds = %164
%171 = lshr i64 %158, 1
%172 = shl i64 %158, 32
%173 = ashr exact i64 %172, 32
%174 = and i64 %171, 2147483647
br label %175
175: ; preds = %170, %175
%176 = phi i64 [ 0, %170 ], [ %187, %175 ]
%177 = getelementptr inbounds i8, i8* %15, i64 %176
%178 = load i8, i8* %177
%179 = xor i64 %176, -1
%180 = add nsw i64 %173, %179
%181 = getelementptr inbounds i8, i8* %15, i64 %180
%182 = load i8, i8* %181
store i8 %182, i8* %177
store i8 %178, i8* %181
%183 = getelementptr inbounds i8, i8* %17, i64 %176
%184 = load i8, i8* %183
%185 = getelementptr inbounds i8, i8* %17, i64 %180
%186 = load i8, i8* %185
store i8 %186, i8* %183
store i8 %184, i8* %185
%187 = add nuw nsw i64 %176, 1
%188 = icmp eq i64 %187, %174
br i1 %188, label %189, label %175
189: ; preds = %175, %26, %164
store i8* %15, i8** %0
store i8* %17, i8** %1
br label %190
190: ; preds = %189, %152
%191 = phi i32 [ -1, %152 ], [ 0, %189 ]
ret i32 %191
}