#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 */
typedef int /*<<< orphan*/ mStack;
typedef int /*<<< orphan*/ m;

/* Variables and functions */
int /*<<< orphan*/ assert(int);
int insertOrDeleteCost(char, char, char const);
int /*<<< orphan*/ sqlite3_free(int *);
int *sqlite3_malloc(int);
int substituteCost(char, char, char);
int editdist1(const char *zA, const char *zB, int *pnMatch) {
  int nA, nB;
  int xA, xB;
  char cA, cB;
  char cAprev, cBprev;
  char cAnext, cBnext;
  int d;
  int dc = 0;
  int res;
  int *m;
  char *cx;
  int *toFree = 0;
  int mStack[60 + 15];
  int nMatch = 0;
  if (zA == 0 || zB == 0)
    return -1;
  while (zA[0] && zA[0] == zB[0]) {
    dc = zA[0];
    zA++;
    zB++;
    nMatch++;
  }
  if (pnMatch)
    *pnMatch = nMatch;
  if (zA[0] == 0 && zB[0] == 0)
    return 0;
  for (nA = 0; zA[nA]; nA++) {
    if (zA[nA] & 0x80)
      return -2;
  }
  for (nB = 0; zB[nB]; nB++) {
    if (zB[nB] & 0x80)
      return -2;
  }
  if (nA == 0) {
    cBprev = dc;
    for (xB = res = 0; (cB = zB[xB]) != 0; xB++) {
      res += insertOrDeleteCost(cBprev, cB, zB[xB + 1]) / 4;
      cBprev = cB;
    }
    return res;
  }
  if (nB == 0) {
    cAprev = dc;
    for (xA = res = 0; (cA = zA[xA]) != 0; xA++) {
      res += insertOrDeleteCost(cAprev, cA, zA[xA + 1]);
      cAprev = cA;
    }
    return res;
  }
  if (zA[0] == '*' && zA[1] == 0)
    return 0;
  if (nB < (sizeof(mStack) * 4) / (sizeof(mStack[0]) * 5)) {
    m = mStack;
  } else {
    m = toFree = sqlite3_malloc((nB + 1) * 5 * sizeof(m[0]) / 4);
    if (m == 0)
      return -3;
  }
  cx = (char *)&m[nB + 1];
  m[0] = 0;
  cx[0] = dc;
  cBprev = dc;
  for (xB = 1; xB <= nB; xB++) {
    cBnext = zB[xB];
    cB = zB[xB - 1];
    cx[xB] = cB;
    m[xB] = m[xB - 1] + insertOrDeleteCost(cBprev, cB, cBnext);
    cBprev = cB;
  }
  cAprev = dc;
  for (xA = 1; xA <= nA; xA++) {
    int lastA = (xA == nA);
    cA = zA[xA - 1];
    cAnext = zA[xA];
    if (cA == '*' && lastA)
      break;
    d = m[0];
    dc = cx[0];
    m[0] = d + insertOrDeleteCost(cAprev, cA, cAnext);
    cBprev = 0;
    for (xB = 1; xB <= nB; xB++) {
      int totalCost, insCost, delCost, subCost, ncx;
      cB = zB[xB - 1];
      cBnext = zB[xB];
      insCost = insertOrDeleteCost(cx[xB - 1], cB, cBnext);
      if (lastA)
        insCost /= 4;
      delCost = insertOrDeleteCost(cx[xB], cA, cBnext);
      subCost = substituteCost(cx[xB - 1], cA, cB);
      totalCost = insCost + m[xB - 1];
      ncx = cB;
      if ((delCost + m[xB]) < totalCost) {
        totalCost = delCost + m[xB];
        ncx = cA;
      }
      if ((subCost + d) < totalCost) {
        totalCost = subCost + d;
      }
      d = m[xB];
      dc = cx[xB];
      m[xB] = totalCost;
      cx[xB] = ncx;
      cBprev = cB;
    }
    cAprev = cA;
  }
  if (cA == '*') {
    res = m[1];
    for (xB = 1; xB <= nB; xB++) {
      if (m[xB] < res) {
        res = m[xB];
        if (pnMatch)
          *pnMatch = xB + nMatch;
      }
    }
  } else {
    res = m[nB];
    assert(pnMatch == 0);
  }
  sqlite3_free(toFree);
  return res;
}


x86 assembly (clang, -O0):
<editdist1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1c0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x40(%rbp)
movq   $0x0,-0x60(%rbp)
movl   $0x0,-0x194(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1196 <editdist1+0x46>
cmpq   $0x0,-0x18(%rbp)
jne    11a2 <editdist1+0x52>
movl   $0xffffffff,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
jmp    11a7 <editdist1+0x57>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1ad(%rbp)
je     11d8 <editdist1+0x88>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x1ad(%rbp)
mov    -0x1ad(%rbp),%al
test   $0x1,%al
jne    11eb <editdist1+0x9b>
jmp    1221 <editdist1+0xd1>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x194(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x194(%rbp)
jmp    11a7 <editdist1+0x57>
cmpq   $0x0,-0x20(%rbp)
je     1238 <editdist1+0xe8>
mov    -0x194(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1264 <editdist1+0x114>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1264 <editdist1+0x114>
movl   $0x0,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     12b6 <editdist1+0x166>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12a3 <editdist1+0x153>
movl   $0xfffffffe,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
jmp    12a8 <editdist1+0x158>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    126b <editdist1+0x11b>
movl   $0x0,-0x28(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     1308 <editdist1+0x1b8>
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12f5 <editdist1+0x1a5>
movl   $0xfffffffe,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
jmp    12fa <editdist1+0x1aa>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    12bd <editdist1+0x16d>
cmpl   $0x0,-0x24(%rbp)
jne    1391 <editdist1+0x241>
mov    -0x40(%rbp),%eax
mov    %al,-0x34(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x32(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
je     1386 <editdist1+0x236>
mov    -0x34(%rbp),%sil
mov    -0x32(%rbp),%dl
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl %sil,%edi
movsbl %dl,%esi
movsbl (%rax,%rcx,1),%edx
call   1050 <insertOrDeleteCost@plt>
mov    $0x4,%ecx
cltd
idiv   %ecx
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x32(%rbp),%al
mov    %al,-0x34(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1326 <editdist1+0x1d6>
mov    -0x44(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
cmpl   $0x0,-0x28(%rbp)
jne    1412 <editdist1+0x2c2>
mov    -0x40(%rbp),%eax
mov    %al,-0x33(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x31(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
je     1407 <editdist1+0x2b7>
mov    -0x33(%rbp),%sil
mov    -0x31(%rbp),%dl
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl %sil,%edi
movsbl %dl,%esi
movsbl (%rax,%rcx,1),%edx
call   1050 <insertOrDeleteCost@plt>
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x31(%rbp),%al
mov    %al,-0x33(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13af <editdist1+0x25f>
mov    -0x44(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    143f <editdist1+0x2ef>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
jne    143f <editdist1+0x2ef>
movl   $0x0,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
movslq -0x28(%rbp),%rax
cmp    $0x3c,%rax
jae    145d <editdist1+0x30d>
lea    -0x190(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    149b <editdist1+0x34b>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
imul   $0x5,%eax,%eax
cltq
shl    $0x2,%rax
shr    $0x2,%rax
mov    %eax,%edi
call   1070 <sqlite3_malloc@plt>
mov    %rax,-0x60(%rbp)
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jne    1496 <editdist1+0x346>
movl   $0xfffffffd,-0x4(%rbp)
jmp    187d <editdist1+0x72d>
jmp    149b <editdist1+0x34b>
mov    -0x50(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x50(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x40(%rbp),%eax
mov    %al,%cl
mov    -0x58(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%eax
mov    %al,-0x34(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     1562 <editdist1+0x412>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x36(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x32(%rbp)
mov    -0x32(%rbp),%dl
mov    -0x58(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x50(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x1b4(%rbp)
mov    -0x34(%rbp),%cl
mov    -0x32(%rbp),%al
movsbl %cl,%edi
movsbl %al,%esi
movsbl -0x36(%rbp),%edx
call   1050 <insertOrDeleteCost@plt>
mov    -0x1b4(%rbp),%edx
add    %eax,%edx
mov    -0x50(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x32(%rbp),%al
mov    %al,-0x34(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    14d5 <editdist1+0x385>
mov    -0x40(%rbp),%eax
mov    %al,-0x33(%rbp)
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jg     17cb <editdist1+0x67b>
mov    -0x2c(%rbp),%eax
cmp    -0x24(%rbp),%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x198(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x31(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x35(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x2a,%eax
jne    15cf <editdist1+0x47f>
cmpl   $0x0,-0x198(%rbp)
je     15cf <editdist1+0x47f>
jmp    17cb <editdist1+0x67b>
mov    -0x50(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x1b8(%rbp)
mov    -0x33(%rbp),%cl
mov    -0x31(%rbp),%al
movsbl %cl,%edi
movsbl %al,%esi
movsbl -0x35(%rbp),%edx
call   1050 <insertOrDeleteCost@plt>
mov    -0x1b8(%rbp),%ecx
add    %eax,%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
movb   $0x0,-0x34(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     17b7 <editdist1+0x667>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x32(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x36(%rbp)
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x32(%rbp),%al
movsbl %cl,%edi
movsbl %al,%esi
movsbl -0x36(%rbp),%edx
call   1050 <insertOrDeleteCost@plt>
mov    %eax,-0x1a0(%rbp)
cmpl   $0x0,-0x198(%rbp)
je     168f <editdist1+0x53f>
mov    -0x1a0(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1a0(%rbp)
mov    -0x58(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x31(%rbp),%al
movsbl %cl,%edi
movsbl %al,%esi
movsbl -0x36(%rbp),%edx
call   1050 <insertOrDeleteCost@plt>
mov    %eax,-0x1a4(%rbp)
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x31(%rbp),%al
movsbl %cl,%edi
movsbl %al,%esi
movsbl -0x32(%rbp),%edx
call   1040 <substituteCost@plt>
mov    %eax,-0x1a8(%rbp)
mov    -0x1a0(%rbp),%eax
mov    -0x50(%rbp),%rcx
mov    -0x30(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x19c(%rbp)
movsbl -0x32(%rbp),%eax
mov    %eax,-0x1ac(%rbp)
mov    -0x1a4(%rbp),%eax
mov    -0x50(%rbp),%rcx
movslq -0x30(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
cmp    -0x19c(%rbp),%eax
jge    173e <editdist1+0x5ee>
mov    -0x1a4(%rbp),%eax
mov    -0x50(%rbp),%rcx
movslq -0x30(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x19c(%rbp)
movsbl -0x31(%rbp),%eax
mov    %eax,-0x1ac(%rbp)
mov    -0x1a8(%rbp),%eax
add    -0x3c(%rbp),%eax
cmp    -0x19c(%rbp),%eax
jge    1762 <editdist1+0x612>
mov    -0x1a8(%rbp),%eax
add    -0x3c(%rbp),%eax
mov    %eax,-0x19c(%rbp)
mov    -0x50(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x58(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x40(%rbp)
mov    -0x19c(%rbp),%edx
mov    -0x50(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1ac(%rbp),%eax
mov    %al,%dl
mov    -0x58(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x32(%rbp),%al
mov    %al,-0x34(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1619 <editdist1+0x4c9>
mov    -0x31(%rbp),%al
mov    %al,-0x33(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    156f <editdist1+0x41f>
movsbl -0x31(%rbp),%eax
cmp    $0x2a,%eax
jne    184e <editdist1+0x6fe>
mov    -0x50(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x44(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     1849 <editdist1+0x6f9>
mov    -0x50(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x44(%rbp),%eax
jge    1836 <editdist1+0x6e6>
mov    -0x50(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x44(%rbp)
cmpq   $0x0,-0x20(%rbp)
je     1831 <editdist1+0x6e1>
mov    -0x30(%rbp),%ecx
add    -0x194(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
jmp    1836 <editdist1+0x6e6>
jmp    183b <editdist1+0x6eb>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    17e9 <editdist1+0x699>
jmp    186e <editdist1+0x71e>
mov    -0x50(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x44(%rbp)
cmpq   $0x0,-0x20(%rbp)
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x60(%rbp),%rdi
call   1060 <sqlite3_free@plt>
mov    -0x44(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1c0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<editdist1>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x1c8,%rsp
mov    $0xffffffff,%ebp
test   %rdi,%rdi
je     1277 <editdist1+0x127>
mov    %rsi,%r15
test   %rsi,%rsi
je     1277 <editdist1+0x127>
mov    %rdx,%r13
mov    %rdi,%r12
mov    (%rdi),%al
test   %al,%al
je     11c2 <editdist1+0x72>
xor    %r14d,%r14d
cmp    (%r15),%al
jne    11c7 <editdist1+0x77>
mov    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %eax,%r14d
mov    %rcx,%rsi
movzbl (%r12,%rcx,1),%eax
test   %al,%al
je     128b <editdist1+0x13b>
lea    0x1(%rsi),%rcx
cmp    (%r15,%rsi,1),%al
je     11a0 <editdist1+0x50>
jmp    128d <editdist1+0x13d>
xor    %eax,%eax
xor    %r14d,%r14d
xor    %esi,%esi
test   %r13,%r13
je     11d6 <editdist1+0x86>
mov    %esi,0x0(%r13)
mov    (%r12),%al
test   %al,%al
je     1205 <editdist1+0xb5>
xor    %edx,%edx
mov    %eax,%ecx
xchg   %ax,%ax
test   %cl,%cl
js     1272 <editdist1+0x122>
movzbl 0x1(%r12,%rdx,1),%ecx
add    $0x1,%rdx
test   %cl,%cl
jne    11e0 <editdist1+0x90>
mov    (%r15),%cl
test   %cl,%cl
je     12a1 <editdist1+0x151>
mov    %edx,%ebp
jmp    120e <editdist1+0xbe>
mov    (%r15),%cl
xor    %ebp,%ebp
test   %cl,%cl
je     1277 <editdist1+0x127>
mov    $0x5,%edi
xor    %ebx,%ebx
mov    %ecx,%edx
nopw   0x0(%rax,%rax,1)
test   %dl,%dl
js     1272 <editdist1+0x122>
movzbl 0x1(%r15,%rbx,1),%edx
add    $0x1,%rbx
add    $0x5,%edi
test   %dl,%dl
jne    1220 <editdist1+0xd0>
test   %ebp,%ebp
je     12ad <editdist1+0x15d>
test   %ebx,%ebx
je     12f0 <editdist1+0x1a0>
cmp    $0x2a,%al
jne    1251 <editdist1+0x101>
cmpb   $0x0,0x1(%r12)
je     158d <editdist1+0x43d>
mov    %rsi,0x40(%rsp)
cmp    $0x3b,%ebx
ja     132a <editdist1+0x1da>
lea    0x90(%rsp),%rax
mov    %rax,(%rsp)
xor    %ecx,%ecx
jmp    133f <editdist1+0x1ef>
mov    $0xfffffffe,%ebp
mov    %ebp,%eax
add    $0x1c8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %eax,%eax
add    %rsi,%r15
add    %rsi,%r12
test   %r13,%r13
jne    11ce <editdist1+0x7e>
jmp    11d6 <editdist1+0x86>
xor    %ebp,%ebp
test   %edx,%edx
je     1277 <editdist1+0x127>
test   %al,%al
jne    12f8 <editdist1+0x1a8>
jmp    1277 <editdist1+0x127>
add    $0x1,%r15
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %ecx,%ebx
movsbl (%r15),%edx
movsbl %r14b,%edi
movsbl %cl,%esi
call   1050 <insertOrDeleteCost@plt>
lea    0x3(%rax),%ecx
test   %eax,%eax
cmovns %eax,%ecx
sar    $0x2,%ecx
add    %ecx,%ebp
movzbl (%r15),%ecx
add    $0x1,%r15
mov    %ebx,%r14d
test   %cl,%cl
jne    12c0 <editdist1+0x170>
jmp    1277 <editdist1+0x127>
test   %al,%al
je     158d <editdist1+0x43d>
add    $0x1,%r12
xor    %ebp,%ebp
xchg   %ax,%ax
mov    %eax,%ebx
movsbl (%r12),%edx
movsbl %r14b,%edi
movsbl %al,%esi
call   1050 <insertOrDeleteCost@plt>
add    %eax,%ebp
movzbl (%r12),%eax
add    $0x1,%r12
mov    %ebx,%r14d
test   %al,%al
jne    1300 <editdist1+0x1b0>
jmp    1277 <editdist1+0x127>
call   1070 <sqlite3_malloc@plt>
mov    %rax,%rcx
mov    %rax,(%rsp)
test   %rax,%rax
je     15ea <editdist1+0x49a>
mov    %rcx,0x58(%rsp)
mov    %rbp,0x10(%rsp)
mov    %r12,0x68(%rsp)
mov    %r13,0x38(%rsp)
mov    %ebx,%eax
mov    %rax,0x50(%rsp)
lea    0x1(%rbx),%rdx
mov    %rbx,0x30(%rsp)
lea    0x1(%rbx),%eax
mov    (%rsp),%rcx
movl   $0x0,(%rcx)
mov    %rax,0x60(%rsp)
mov    %r14b,(%rcx,%rax,4)
mov    %rdx,0x8(%rsp)
mov    %edx,%eax
mov    %rax,0x20(%rsp)
lea    (%rcx,%rax,4),%rax
mov    %rax,0x18(%rsp)
mov    $0x1,%ebp
mov    %r14d,%eax
mov    (%rsp),%r12
nopw   0x0(%rax,%rax,1)
movsbl (%r15,%rbp,1),%edx
movzbl -0x1(%r15,%rbp,1),%ebx
mov    0x18(%rsp),%rcx
mov    %bl,(%rcx,%rbp,1)
mov    -0x4(%r12,%rbp,4),%r13d
movsbl %bl,%esi
movsbl %al,%edi
call   1050 <insertOrDeleteCost@plt>
add    %r13d,%eax
mov    %eax,(%r12,%rbp,4)
add    $0x1,%rbp
mov    %ebx,%eax
cmp    %rbp,0x20(%rsp)
jne    13a0 <editdist1+0x250>
mov    0x10(%rsp),%rbp
mov    %ebp,%eax
mov    %rax,0x48(%rsp)
cmp    $0x2,%ebp
mov    $0x1,%esi
cmovb  %esi,%ebp
add    $0x1,%ebp
mov    0x8(%rsp),%eax
mov    (%rsp),%r12
lea    (%r12,%rax,4),%rax
mov    %rax,0x70(%rsp)
mov    0x30(%rsp),%rdx
cmp    $0x2,%edx
cmovae %edx,%esi
add    $0x1,%esi
mov    %rsi,0x78(%rsp)
mov    $0x1,%r13d
mov    0x38(%rsp),%r8
mov    0x40(%rsp),%rdi
mov    %r15,0x80(%rsp)
mov    %rbp,0x10(%rsp)
mov    %r12,(%rsp)
jmp    1468 <editdist1+0x318>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r13
mov    0x8(%rsp),%al
mov    %eax,%r14d
mov    0x10(%rsp),%rbp
cmp    %rbp,%r13
mov    0x38(%rsp),%r8
mov    0x40(%rsp),%rdi
mov    0x30(%rsp),%rdx
je     1594 <editdist1+0x444>
mov    0x68(%rsp),%rax
mov    -0x1(%r13,%rax,1),%cl
cmp    $0x2a,%cl
jne    1482 <editdist1+0x332>
cmp    0x48(%rsp),%r13
je     1598 <editdist1+0x448>
movsbl (%rax,%r13,1),%edx
mov    (%r12),%ebx
movsbl %r14b,%edi
mov    %cl,0x8(%rsp)
movsbl %cl,%esi
mov    %esi,0x2c(%rsp)
call   1050 <insertOrDeleteCost@plt>
add    %ebx,%eax
mov    %eax,(%r12)
mov    0x60(%rsp),%rax
mov    (%r12,%rax,4),%cl
mov    $0x1,%ebp
mov    %r13,0x88(%rsp)
jmp    1548 <editdist1+0x3f8>
mov    0x70(%rsp),%r13
movsbl 0x0(%r13,%rbp,1),%edi
mov    0x2c(%rsp),%r14d
mov    %r14d,%esi
mov    %r12d,%edx
call   1050 <insertOrDeleteCost@plt>
mov    %eax,%ebx
movsbl -0x1(%r13,%rbp,1),%edi
mov    %r14d,%esi
mov    0x18(%rsp),%r14d
mov    %r14d,%edx
call   1040 <substituteCost@plt>
mov    (%rsp),%r12
add    -0x4(%r12,%rbp,4),%r15d
mov    (%r12,%rbp,4),%edx
add    %edx,%ebx
cmp    %r15d,%ebx
cmovge %r15d,%ebx
movzbl 0x8(%rsp),%esi
movzbl %r14b,%ecx
cmovl  %esi,%ecx
add    0x20(%rsp),%eax
cmp    %ebx,%eax
cmovge %ebx,%eax
mov    %eax,(%r12,%rbp,4)
mov    %cl,0x0(%r13,%rbp,1)
add    $0x1,%rbp
mov    %edx,%ebx
cmp    %rbp,0x78(%rsp)
mov    0x80(%rsp),%r15
mov    0x88(%rsp),%r13
je     1440 <editdist1+0x2f0>
mov    %ebx,0x20(%rsp)
movzbl -0x1(%r15,%rbp,1),%eax
movsbl %al,%esi
movsbl (%r15,%rbp,1),%r12d
movsbl %cl,%edi
mov    %esi,0x18(%rsp)
mov    %r12d,%edx
call   1050 <insertOrDeleteCost@plt>
mov    %eax,%r15d
cmp    0x48(%rsp),%r13
jne    14c0 <editdist1+0x370>
lea    0x3(%r15),%eax
test   %r15d,%r15d
cmovns %r15d,%eax
sar    $0x2,%eax
mov    %eax,%r15d
jmp    14c0 <editdist1+0x370>
xor    %ebp,%ebp
jmp    1277 <editdist1+0x127>
cmp    $0x2a,%al
jne    15f4 <editdist1+0x4a4>
add    $0x1,%edi
cmp    $0x2,%edx
mov    $0x1,%eax
cmovae %edx,%eax
mov    0x4(%r12),%edx
add    $0x1,%eax
add    $0xfffffffffffffffe,%rax
xor    %ecx,%ecx
mov    %edx,%esi
cs nopw 0x0(%rax,%rax,1)
cmp    %esi,%edx
mov    %edx,%ebp
cmovge %esi,%ebp
test   %r8,%r8
je     15d8 <editdist1+0x488>
cmp    %esi,%edx
jge    15d8 <editdist1+0x488>
lea    (%rdi,%rcx,1),%esi
mov    %esi,(%r8)
mov    %edx,%ebp
cmp    %rcx,%rax
je     160b <editdist1+0x4bb>
mov    0x8(%r12,%rcx,4),%edx
add    $0x1,%rcx
mov    %ebp,%esi
jmp    15c0 <editdist1+0x470>
mov    $0xfffffffd,%ebp
jmp    1277 <editdist1+0x127>
xor    %edi,%edi
test   %r8,%r8
sete   %dil
mov    0x50(%rsp),%rax
mov    (%r12,%rax,4),%ebp
call   1030 <assert@plt>
mov    0x58(%rsp),%rdi
call   1060 <sqlite3_free@plt>
jmp    1277 <editdist1+0x127>

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

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