int EditDistanceDP(char X[], char Y[]) {
  int cost = 0;
  int leftCell, topCell, cornerCell;
  int m = strlen(X) + 1;
  int n = strlen(Y) + 1;
  int *T = (int *)malloc(m * n * sizeof(int));
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      *(T + i * n + j) = (-1);
  for (int i = 0; i < m; i++)
    *(T + i * n) = i;
  for (int j = 0; j < n; j++)
    *(T + j) = j;
  for (int i = 1; i < m; i++) {
    for (int j = 1; j < n; j++) {
      leftCell = *(T + i * n + j - 1);
      leftCell += (1);
      topCell = *(T + (i - 1) * n + j);
      topCell += (1);
      cornerCell = *(T + (i - 1) * n + (j - 1));
      cornerCell += (X[i - 1] != Y[j - 1]);
      *(T + (i)*n + (j)) = Minimum(leftCell, topCell, cornerCell);
    }
  }
  cost = *(T + m * n - 1);
  free(T);
  return cost;
}


x86 assembly (clang, -O0):
<EditDistanceDP>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x8(%rbp),%rdi
call   1050 <strlen@plt>
add    $0x1,%rax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rdi
call   1050 <strlen@plt>
add    $0x1,%rax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x28(%rbp),%eax
movslq %eax,%rdi
shl    $0x2,%rdi
call   1060 <malloc@plt>
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    11f5 <EditDistanceDP+0xb5>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    11e2 <EditDistanceDP+0xa2>
mov    -0x30(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x38(%rbp),%rcx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11a8 <EditDistanceDP+0x68>
jmp    11e7 <EditDistanceDP+0xa7>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1195 <EditDistanceDP+0x55>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    122a <EditDistanceDP+0xea>
mov    -0x3c(%rbp),%edx
mov    -0x30(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11fc <EditDistanceDP+0xbc>
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1259 <EditDistanceDP+0x119>
mov    -0x40(%rbp),%edx
mov    -0x30(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1231 <EditDistanceDP+0xf1>
movl   $0x1,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    137b <EditDistanceDP+0x23b>
movl   $0x1,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1368 <EditDistanceDP+0x228>
mov    -0x30(%rbp),%rax
mov    -0x44(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x48(%rbp),%rcx
mov    -0x4(%rax,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x48(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x48(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%edi
mov    -0x1c(%rbp),%esi
mov    -0x20(%rbp),%edx
mov    $0x0,%al
call   1030 <Minimum@plt>
mov    %eax,%edx
mov    -0x30(%rbp),%rax
mov    -0x44(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
movslq -0x48(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1273 <EditDistanceDP+0x133>
jmp    136d <EditDistanceDP+0x22d>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1260 <EditDistanceDP+0x120>
mov    -0x30(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x28(%rbp),%ecx
movslq %ecx,%rcx
mov    -0x4(%rax,%rcx,4),%eax
mov    %eax,-0x14(%rbp)
mov    -0x30(%rbp),%rdi
call   1040 <free@plt>
mov    -0x14(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<EditDistanceDP>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %rsi,%r15
mov    %rdi,%rbp
call   1050 <strlen@plt>
mov    %rax,%r14
lea    0x1(%rax),%r13d
mov    %r15,%rdi
call   1050 <strlen@plt>
mov    %rax,%rbx
add    $0x1,%eax
mov    %rax,0x8(%rsp)
imul   %r13d,%eax
cltq
mov    %rax,0x40(%rsp)
lea    0x0(,%rax,4),%rdi
call   1070 <malloc@plt>
mov    %rbx,%r10
mov    %rax,%rbx
mov    %r13d,%r12d
cmp    $0x7ffffffe,%r14d
mov    %rax,0x10(%rsp)
mov    %r12,0x38(%rsp)
mov    %r15,0x50(%rsp)
mov    %rbp,0x48(%rsp)
ja     135e <EditDistanceDP+0x20e>
mov    0x8(%rsp),%rax
cmp    $0x2,%eax
mov    $0x1,%ecx
cmovge %eax,%ecx
shl    $0x2,%rcx
mov    %rcx,0x20(%rsp)
test   %r14d,%r14d
je     128e <EditDistanceDP+0x13e>
mov    %r13d,0x34(%rsp)
lea    (%r10,%r10,1),%eax
add    $0x2,%eax
mov    %r12d,%r13d
and    $0xfffffffe,%r13d
neg    %r13
xor    %ebp,%ebp
xor    %r15d,%r15d
mov    %eax,0x28(%rsp)
mov    %r14,0x18(%rsp)
mov    0x10(%rsp),%rbx
mov    0x20(%rsp),%r12
jmp    122c <EditDistanceDP+0xdc>
nopw   0x0(%rax,%rax,1)
add    %eax,%r15d
add    $0xfffffffffffffffe,%rbp
cmp    %rbp,%r13
je     1275 <EditDistanceDP+0x125>
cmp    $0x7ffffffe,%r10d
ja     1220 <EditDistanceDP+0xd0>
movslq %r15d,%rax
lea    (%rbx,%rax,4),%rdi
mov    $0xff,%esi
mov    %r12,%rdx
mov    %r10,%r14
call   1060 <memset@plt>
mov    0x8(%rsp),%rax
add    %r15d,%eax
cltq
lea    (%rbx,%rax,4),%rdi
mov    $0xff,%esi
mov    %r12,%rdx
call   1060 <memset@plt>
mov    0x28(%rsp),%eax
mov    %r14,%r10
mov    0x18(%rsp),%r14
jmp    1220 <EditDistanceDP+0xd0>
neg    %ebp
mov    0x10(%rsp),%rbx
mov    0x38(%rsp),%r12
mov    0x34(%rsp),%r13d
test   $0x1,%r12b
jne    1296 <EditDistanceDP+0x146>
jmp    12c0 <EditDistanceDP+0x170>
xor    %ebp,%ebp
test   $0x1,%r12b
je     12c0 <EditDistanceDP+0x170>
cmp    $0x7ffffffe,%r10d
ja     12c0 <EditDistanceDP+0x170>
imul   0x8(%rsp),%ebp
movslq %ebp,%rax
lea    (%rbx,%rax,4),%rdi
mov    $0xff,%esi
mov    0x20(%rsp),%rdx
mov    %r10,%rbp
call   1060 <memset@plt>
mov    %rbp,%r10
cmp    $0x7ffffffe,%r14d
ja     135e <EditDistanceDP+0x20e>
movslq 0x8(%rsp),%rax
lea    -0x1(%r12),%rdx
mov    %r12d,%ecx
and    $0x3,%ecx
cmp    $0x3,%rdx
jae    12e7 <EditDistanceDP+0x197>
xor    %edx,%edx
jmp    1331 <EditDistanceDP+0x1e1>
mov    %r12d,%r8d
and    $0xfffffffc,%r8d
mov    %rax,%rdi
shl    $0x4,%rdi
lea    0x0(,%rax,4),%rdx
lea    (%rdx,%rdx,2),%r9
xor    %edx,%edx
mov    %rbx,%rsi
cs nopw 0x0(%rax,%rax,1)
mov    %edx,(%rsi)
lea    0x1(%rdx),%ebp
mov    %ebp,(%rsi,%rax,4)
lea    0x2(%rdx),%ebp
mov    %ebp,(%rsi,%rax,8)
lea    0x3(%rdx),%ebp
mov    %ebp,(%rsi,%r9,1)
add    $0x4,%rdx
add    %rdi,%rsi
cmp    %r8,%rdx
jne    1310 <EditDistanceDP+0x1c0>
test   %rcx,%rcx
je     135e <EditDistanceDP+0x20e>
mov    %rdx,%rsi
imul   %rax,%rsi
lea    (%rbx,%rsi,4),%rsi
shl    $0x2,%rax
cs nopw 0x0(%rax,%rax,1)
nop
mov    %edx,(%rsi)
add    $0x1,%edx
add    %rax,%rsi
add    $0xffffffffffffffff,%rcx
jne    1350 <EditDistanceDP+0x200>
mov    0x8(%rsp),%edi
cmp    $0x7ffffffe,%r10d
ja     14dc <EditDistanceDP+0x38c>
cmpl   $0x8,0x8(%rsp)
jae    137d <EditDistanceDP+0x22d>
xor    %eax,%eax
jmp    14d0 <EditDistanceDP+0x380>
mov    %edi,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%rsi
mov    %rsi,%rdx
shr    $0x3,%rdx
add    $0x1,%rdx
mov    %edx,%ecx
and    $0x3,%ecx
cmp    $0x18,%rsi
jae    13ab <EditDistanceDP+0x25b>
movdqa 0xc5c(%rip),%xmm0
xor    %esi,%esi
jmp    1478 <EditDistanceDP+0x328>
and    $0xfffffffffffffffc,%rdx
movdqa 0xc49(%rip),%xmm0
xor    %esi,%esi
movdqa 0xc4e(%rip),%xmm8
movdqa 0xc55(%rip),%xmm9
movdqa 0xc5c(%rip),%xmm10
movdqa 0xc64(%rip),%xmm4
movdqa 0xc6c(%rip),%xmm5
movdqa 0xc74(%rip),%xmm6
movdqa 0xc7c(%rip),%xmm7
movdqa 0xc84(%rip),%xmm1
nopl   0x0(%rax)
movdqa %xmm0,%xmm2
paddd  %xmm8,%xmm2
movdqu %xmm0,(%rbx,%rsi,4)
movdqu %xmm2,0x10(%rbx,%rsi,4)
movdqa %xmm0,%xmm2
paddd  %xmm9,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm10,%xmm3
movdqu %xmm2,0x20(%rbx,%rsi,4)
movdqu %xmm3,0x30(%rbx,%rsi,4)
movdqa %xmm0,%xmm2
paddd  %xmm4,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm5,%xmm3
movdqu %xmm2,0x40(%rbx,%rsi,4)
movdqu %xmm3,0x50(%rbx,%rsi,4)
movdqa %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm7,%xmm3
movdqu %xmm2,0x60(%rbx,%rsi,4)
movdqu %xmm3,0x70(%rbx,%rsi,4)
add    $0x20,%rsi
paddd  %xmm1,%xmm0
add    $0xfffffffffffffffc,%rdx
jne    1400 <EditDistanceDP+0x2b0>
test   %rcx,%rcx
je     14c0 <EditDistanceDP+0x370>
lea    (%rbx,%rsi,4),%rdx
add    $0x10,%rdx
shl    $0x5,%rcx
xor    %esi,%esi
movdqa 0xb7d(%rip),%xmm1
movdqa 0xb85(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm3
paddd  %xmm1,%xmm3
movdqu %xmm0,-0x10(%rdx,%rsi,1)
movdqu %xmm3,(%rdx,%rsi,1)
paddd  %xmm2,%xmm0
add    $0x20,%rsi
cmp    %rsi,%rcx
jne    14a0 <EditDistanceDP+0x350>
cmp    %rdi,%rax
je     14dc <EditDistanceDP+0x38c>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %eax,(%rbx,%rax,4)
add    $0x1,%rax
cmp    %rax,%rdi
jne    14d0 <EditDistanceDP+0x380>
cmp    $0x2,%r13d
jl     1594 <EditDistanceDP+0x444>
movslq 0x8(%rsp),%rax
mov    0x10(%rsp),%r12
add    $0x4,%r12
shl    $0x2,%rax
mov    %rax,0x18(%rsp)
add    $0xffffffffffffffff,%rdi
mov    $0x1,%ebx
mov    %rdi,0x28(%rsp)
mov    0x50(%rsp),%rbp
mov    0x48(%rsp),%r13
jmp    1530 <EditDistanceDP+0x3e0>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rbx
add    0x18(%rsp),%r12
cmp    0x38(%rsp),%rbx
je     1594 <EditDistanceDP+0x444>
cmpl   $0x2,0x8(%rsp)
jl     1520 <EditDistanceDP+0x3d0>
mov    0x18(%rsp),%rax
add    %r12,%rax
mov    %rax,0x20(%rsp)
xor    %r14d,%r14d
nopw   0x0(%rax,%rax,1)
mov    0x20(%rsp),%r15
mov    -0x4(%r15,%r14,4),%edi
add    $0x1,%edi
mov    (%r12,%r14,4),%esi
add    $0x1,%esi
movzbl -0x1(%r13,%rbx,1),%eax
xor    %edx,%edx
cmp    0x0(%rbp,%r14,1),%al
setne  %dl
add    -0x4(%r12,%r14,4),%edx
xor    %eax,%eax
call   1030 <Minimum@plt>
mov    0x28(%rsp),%rdi
mov    %eax,(%r15,%r14,4)
add    $0x1,%r14
cmp    %r14,%rdi
jne    1550 <EditDistanceDP+0x400>
jmp    1520 <EditDistanceDP+0x3d0>
mov    0x40(%rsp),%rax
mov    0x10(%rsp),%rdi
mov    -0x4(%rdi,%rax,4),%ebx
call   1040 <free@plt>
mov    %ebx,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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