#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*/ EXIT_FAILURE;
int /*<<< orphan*/ exit(int /*<<< orphan*/);
short getMin(short, short, short);
void *malloc(int);
int /*<<< orphan*/ printf(char *);
short **getEditDistanceMatrix(char *str1, short len1, char *str2, short len2) {
  short **ED = malloc(sizeof(short *) * (len1 + 1));
  if (ED == NULL) {
    printf("ERROR: Could not allocate memory.\n");
    exit(EXIT_FAILURE);
  }
  short i, j;
  for (i = 0; i <= len1; i++) {
    ED[i] = malloc(sizeof(short) * (len2 + 1));
    if (ED[i] == NULL) {
      printf("ERROR: Could not allocate memory.\n");
      exit(EXIT_FAILURE);
    }
    ED[i][0] = i;
  }
  for (j = 0; j <= len2; j++) {
    ED[0][j] = j;
  }
  for (i = 1; i <= len1; i++) {
    for (j = 1; j <= len2; j++) {
      if (str1[i - 1] == str2[j - 1]) {
        ED[i][j] = ED[i - 1][j - 1];
      } else {
        ED[i][j] =
            getMin(ED[i - 1][j] + 1, ED[i][j - 1] + 1, ED[i - 1][j - 1] + 1);
      }
    }
  }
  return ED;
}


x86 assembly (clang, -O0):
<getEditDistanceMatrix>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %cx,%ax
mov    %si,%cx
mov    %rdi,-0x8(%rbp)
mov    %cx,-0xa(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ax,-0x1a(%rbp)
movswl -0xa(%rbp),%eax
add    $0x1,%eax
cltq
shl    $0x3,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x28(%rbp)
jne    119b <getEditDistanceMatrix+0x5b>
lea    0xe78(%rip),%rdi
call   1030 <printf@plt>
mov    0x2e4c(%rip),%rax
mov    (%rax),%edi
call   1060 <exit@plt>
movw   $0x0,-0x2a(%rbp)
movswl -0x2a(%rbp),%eax
movswl -0xa(%rbp),%ecx
cmp    %ecx,%eax
jg     1228 <getEditDistanceMatrix+0xe8>
movswl -0x1a(%rbp),%eax
add    $0x1,%eax
cltq
shl    $0x1,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,%rdx
mov    -0x28(%rbp),%rax
movswq -0x2a(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
movswq -0x2a(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    1203 <getEditDistanceMatrix+0xc3>
lea    0xe10(%rip),%rdi
call   1030 <printf@plt>
mov    0x2de4(%rip),%rax
mov    (%rax),%edi
call   1060 <exit@plt>
mov    -0x2a(%rbp),%cx
mov    -0x28(%rbp),%rax
movswq -0x2a(%rbp),%rdx
mov    (%rax,%rdx,8),%rax
mov    %cx,(%rax)
mov    -0x2a(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x2a(%rbp)
jmp    11a1 <getEditDistanceMatrix+0x61>
movw   $0x0,-0x2c(%rbp)
movswl -0x2c(%rbp),%eax
movswl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jg     1263 <getEditDistanceMatrix+0x123>
mov    -0x2c(%rbp),%dx
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movswq -0x2c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x2c(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x2c(%rbp)
jmp    122e <getEditDistanceMatrix+0xee>
movw   $0x1,-0x2a(%rbp)
movswl -0x2a(%rbp),%eax
movswl -0xa(%rbp),%ecx
cmp    %ecx,%eax
jg     13ae <getEditDistanceMatrix+0x26e>
movw   $0x1,-0x2c(%rbp)
movswl -0x2c(%rbp),%eax
movswl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jg     1398 <getEditDistanceMatrix+0x258>
mov    -0x8(%rbp),%rax
movswl -0x2a(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%rcx
movswl -0x2c(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    12f6 <getEditDistanceMatrix+0x1b6>
mov    -0x28(%rbp),%rax
movswl -0x2a(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movswl -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x28(%rbp),%rax
movswq -0x2a(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movswq -0x2c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1382 <getEditDistanceMatrix+0x242>
mov    -0x28(%rbp),%rax
movswl -0x2a(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movswq -0x2c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
add    $0x1,%eax
mov    %ax,%dx
mov    -0x28(%rbp),%rax
movswq -0x2a(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movswl -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
add    $0x1,%eax
mov    %ax,%cx
mov    -0x28(%rbp),%rax
movswl -0x2a(%rbp),%esi
sub    $0x1,%esi
movslq %esi,%rsi
mov    (%rax,%rsi,8),%rax
movswl -0x2c(%rbp),%esi
sub    $0x1,%esi
movslq %esi,%rsi
movswl (%rax,%rsi,2),%eax
add    $0x1,%eax
movswl %dx,%edi
movswl %cx,%esi
movswl %ax,%edx
call   1050 <getMin@plt>
mov    %ax,%dx
mov    -0x28(%rbp),%rax
movswq -0x2a(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movswq -0x2c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1387 <getEditDistanceMatrix+0x247>
mov    -0x2c(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x2c(%rbp)
jmp    127f <getEditDistanceMatrix+0x13f>
jmp    139d <getEditDistanceMatrix+0x25d>
mov    -0x2a(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x2a(%rbp)
jmp    1269 <getEditDistanceMatrix+0x129>
mov    -0x28(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<getEditDistanceMatrix>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %ecx,%r13d
mov    %rdx,0x10(%rsp)
mov    %esi,%r15d
mov    %rdi,0x8(%rsp)
lea    0x8(,%r15,8),%edi
call   1040 <malloc@plt>
test   %rax,%rax
je     1403 <getEditDistanceMatrix+0x2c3>
mov    %rax,%rbx
test   %r15w,%r15w
js     11b5 <getEditDistanceMatrix+0x75>
movswl %r13w,%eax
lea    (%rax,%rax,1),%r14d
add    $0x2,%r14d
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
mov    %r14d,%edi
call   1040 <malloc@plt>
movswq %bp,%rcx
mov    %rax,(%rbx,%rcx,8)
test   %rax,%rax
je     1403 <getEditDistanceMatrix+0x2c3>
mov    %bp,(%rax)
add    $0x1,%ebp
cmp    %r15w,%bp
jle    1190 <getEditDistanceMatrix+0x50>
test   %r13w,%r13w
js     133d <getEditDistanceMatrix+0x1fd>
mov    (%rbx),%rax
lea    0x1(%r13),%ecx
movzwl %cx,%ecx
cmp    $0xf,%r13w
jae    11d7 <getEditDistanceMatrix+0x97>
xor    %edx,%edx
jmp    1330 <getEditDistanceMatrix+0x1f0>
mov    %ecx,%edx
and    $0xfffffff0,%edx
lea    -0x10(%rdx),%rbp
mov    %rbp,%rdi
shr    $0x4,%rdi
add    $0x1,%rdi
mov    %edi,%esi
and    $0x3,%esi
cmp    $0x30,%rbp
jae    1205 <getEditDistanceMatrix+0xc5>
movdqa 0xe02(%rip),%xmm0
xor    %ebp,%ebp
jmp    12d8 <getEditDistanceMatrix+0x198>
and    $0xfffffffffffffffc,%rdi
movdqa 0xdef(%rip),%xmm0
xor    %ebp,%ebp
movdqa 0xdf4(%rip),%xmm8
movdqa 0xdfb(%rip),%xmm9
movdqa 0xe02(%rip),%xmm10
movdqa 0xe0a(%rip),%xmm4
movdqa 0xe12(%rip),%xmm5
movdqa 0xe1a(%rip),%xmm6
movdqa 0xe22(%rip),%xmm7
movdqa 0xe2a(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
movdqa %xmm0,%xmm2
paddw  %xmm8,%xmm2
movdqu %xmm0,(%rax,%rbp,2)
movdqu %xmm2,0x10(%rax,%rbp,2)
movdqa %xmm0,%xmm2
paddw  %xmm9,%xmm2
movdqa %xmm0,%xmm3
paddw  %xmm10,%xmm3
movdqu %xmm2,0x20(%rax,%rbp,2)
movdqu %xmm3,0x30(%rax,%rbp,2)
movdqa %xmm0,%xmm2
paddw  %xmm4,%xmm2
movdqa %xmm0,%xmm3
paddw  %xmm5,%xmm3
movdqu %xmm2,0x40(%rax,%rbp,2)
movdqu %xmm3,0x50(%rax,%rbp,2)
movdqa %xmm0,%xmm2
paddw  %xmm6,%xmm2
movdqa %xmm0,%xmm3
paddw  %xmm7,%xmm3
movdqu %xmm2,0x60(%rax,%rbp,2)
movdqu %xmm3,0x70(%rax,%rbp,2)
add    $0x40,%rbp
paddw  %xmm1,%xmm0
add    $0xfffffffffffffffc,%rdi
jne    1260 <getEditDistanceMatrix+0x120>
test   %rsi,%rsi
je     1320 <getEditDistanceMatrix+0x1e0>
lea    (%rax,%rbp,2),%rdi
add    $0x10,%rdi
shl    $0x5,%rsi
xor    %ebp,%ebp
movdqa 0xd1d(%rip),%xmm1
movdqa 0xd25(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm3
paddw  %xmm1,%xmm3
movdqu %xmm0,-0x10(%rdi,%rbp,1)
movdqu %xmm3,(%rdi,%rbp,1)
paddw  %xmm2,%xmm0
add    $0x20,%rbp
cmp    %rbp,%rsi
jne    1300 <getEditDistanceMatrix+0x1c0>
cmp    %rcx,%rdx
je     133d <getEditDistanceMatrix+0x1fd>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %dx,(%rax,%rdx,2)
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    1330 <getEditDistanceMatrix+0x1f0>
test   %r15w,%r15w
jle    13f1 <getEditDistanceMatrix+0x2b1>
mov    $0x1,%ebp
mov    %r15,(%rsp)
jmp    1374 <getEditDistanceMatrix+0x234>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%ebp
movswq %bp,%rax
mov    (%rsp),%r15
cmp    %r15w,%bp
mov    %rax,%rbp
jg     13f1 <getEditDistanceMatrix+0x2b1>
test   %r13w,%r13w
jle    1360 <getEditDistanceMatrix+0x220>
mov    -0x8(%rbx,%rbp,8),%r15
mov    $0x1,%ax
jmp    13cb <getEditDistanceMatrix+0x28b>
cs nopw 0x0(%rax,%rax,1)
nop
movzwl (%r15,%r14,2),%eax
add    $0x1,%eax
mov    (%rbx,%rbp,8),%r12
movzwl -0x2(%r12,%r14,2),%ecx
add    $0x1,%ecx
movzwl -0x2(%r15,%r14,2),%edx
add    $0x1,%edx
movswl %ax,%edi
movswl %dx,%edx
movswl %cx,%esi
call   1050 <getMin@plt>
mov    %ax,(%r12,%r14,2)
lea    0x1(%r14),%eax
cmp    %r13w,%ax
jg     1360 <getEditDistanceMatrix+0x220>
movswq %ax,%r14
mov    0x8(%rsp),%rax
movzbl -0x1(%rax,%rbp,1),%eax
mov    0x10(%rsp),%rcx
cmp    -0x1(%r14,%rcx,1),%al
jne    1390 <getEditDistanceMatrix+0x250>
movzwl -0x2(%r15,%r14,2),%eax
mov    (%rbx,%rbp,8),%r12
jmp    13bc <getEditDistanceMatrix+0x27c>
mov    %rbx,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0xc86(%rip),%rdi
call   1030 <puts@plt>
mov    0x2bca(%rip),%rax
mov    (%rax),%edi
call   1060 <exit@plt>

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

LLVM IR (-O2):
@EXIT_FAILURE = global i32 0
@str.1 = [34 x i8] c"ERROR: Could not allocate memory.\00"
define noalias i16** @getEditDistanceMatrix(i8* nocapture %0, i16 signext %1, i8* nocapture %2, i16 signext %3) {
%5 = sext i16 %1 to i32
%6 = shl nsw i32 %5, 3
%7 = add nsw i32 %6, 8
%8 = tail call i8* @malloc(i32 %7)
%9 = bitcast i8* %8 to i16**
%10 = icmp eq i8* %8, null
br i1 %10, label %17, label %11
11: ; preds = %4
%12 = icmp slt i16 %1, 0
br i1 %12, label %21, label %13
13: ; preds = %11
%14 = sext i16 %3 to i32
%15 = shl nsw i32 %14, 1
%16 = add nsw i32 %15, 2
br label %92
17: ; preds = %4
%18 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([34 x i8], [34 x i8]* @str.1, i64 0, i64 0))
%19 = load i32, i32* @EXIT_FAILURE
%20 = tail call i32 @exit(i32 %19)
unreachable
21: ; preds = %103, %11
%22 = icmp slt i16 %3, 0
br i1 %22, label %107, label %23
23: ; preds = %21
%24 = load i16*, i16** %9
%25 = add nuw nsw i16 %3, 1
%26 = zext i16 %25 to i64
%27 = icmp ult i16 %3, 15
br i1 %27, label %90, label %28
28: ; preds = %23
%29 = and i64 %26, 65520
%30 = add nsw i64 %29, -16
%31 = lshr exact i64 %30, 4
%32 = add nuw nsw i64 %31, 1
%33 = and i64 %32, 3
%34 = icmp ult i64 %30, 48
br i1 %34, label %71, label %35
35: ; preds = %28
%36 = and i64 %32, 2305843009213693948
br label %37
37: ; preds = %37, %35
%38 = phi i64 [ 0, %35 ], [ %67, %37 ]
%39 = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, %35 ], [ %68, %37 ]
%40 = phi i64 [ 0, %35 ], [ %69, %37 ]
%41 = add <8 x i16> %39, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
%42 = getelementptr inbounds i16, i16* %24, i64 %38
%43 = bitcast i16* %42 to <8 x i16>*
store <8 x i16> %39, <8 x i16>* %43
%44 = getelementptr inbounds i16, i16* %42, i64 8
%45 = bitcast i16* %44 to <8 x i16>*
store <8 x i16> %41, <8 x i16>* %45
%46 = or i64 %38, 16
%47 = add <8 x i16> %39, <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>
%48 = add <8 x i16> %39, <i16 24, i16 24, i16 24, i16 24, i16 24, i16 24, i16 24, i16 24>
%49 = getelementptr inbounds i16, i16* %24, i64 %46
%50 = bitcast i16* %49 to <8 x i16>*
store <8 x i16> %47, <8 x i16>* %50
%51 = getelementptr inbounds i16, i16* %49, i64 8
%52 = bitcast i16* %51 to <8 x i16>*
store <8 x i16> %48, <8 x i16>* %52
%53 = or i64 %38, 32
%54 = add <8 x i16> %39, <i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32>
%55 = add <8 x i16> %39, <i16 40, i16 40, i16 40, i16 40, i16 40, i16 40, i16 40, i16 40>
%56 = getelementptr inbounds i16, i16* %24, i64 %53
%57 = bitcast i16* %56 to <8 x i16>*
store <8 x i16> %54, <8 x i16>* %57
%58 = getelementptr inbounds i16, i16* %56, i64 8
%59 = bitcast i16* %58 to <8 x i16>*
store <8 x i16> %55, <8 x i16>* %59
%60 = or i64 %38, 48
%61 = add <8 x i16> %39, <i16 48, i16 48, i16 48, i16 48, i16 48, i16 48, i16 48, i16 48>
%62 = add <8 x i16> %39, <i16 56, i16 56, i16 56, i16 56, i16 56, i16 56, i16 56, i16 56>
%63 = getelementptr inbounds i16, i16* %24, i64 %60
%64 = bitcast i16* %63 to <8 x i16>*
store <8 x i16> %61, <8 x i16>* %64
%65 = getelementptr inbounds i16, i16* %63, i64 8
%66 = bitcast i16* %65 to <8 x i16>*
store <8 x i16> %62, <8 x i16>* %66
%67 = add nuw i64 %38, 64
%68 = add <8 x i16> %39, <i16 64, i16 64, i16 64, i16 64, i16 64, i16 64, i16 64, i16 64>
%69 = add i64 %40, 4
%70 = icmp eq i64 %69, %36
br i1 %70, label %71, label %37
71: ; preds = %37, %28
%72 = phi i64 [ 0, %28 ], [ %67, %37 ]
%73 = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, %28 ], [ %68, %37 ]
%74 = icmp eq i64 %33, 0
br i1 %74, label %88, label %75
75: ; preds = %71, %75
%76 = phi i64 [ %84, %75 ], [ %72, %71 ]
%77 = phi <8 x i16> [ %85, %75 ], [ %73, %71 ]
%78 = phi i64 [ %86, %75 ], [ 0, %71 ]
%79 = add <8 x i16> %77, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
%80 = getelementptr inbounds i16, i16* %24, i64 %76
%81 = bitcast i16* %80 to <8 x i16>*
store <8 x i16> %77, <8 x i16>* %81
%82 = getelementptr inbounds i16, i16* %80, i64 8
%83 = bitcast i16* %82 to <8 x i16>*
store <8 x i16> %79, <8 x i16>* %83
%84 = add nuw i64 %76, 16
%85 = add <8 x i16> %77, <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>
%86 = add i64 %78, 1
%87 = icmp eq i64 %86, %33
br i1 %87, label %88, label %75
88: ; preds = %75, %71
%89 = icmp eq i64 %29, %26
br i1 %89, label %107, label %90
90: ; preds = %23, %88
%91 = phi i64 [ 0, %23 ], [ %29, %88 ]
br label %111
92: ; preds = %13, %103
%93 = phi i16 [ 0, %13 ], [ %105, %103 ]
%94 = tail call i8* @malloc(i32 %16)
%95 = sext i16 %93 to i64
%96 = getelementptr inbounds i16*, i16** %9, i64 %95
%97 = bitcast i16** %96 to i8**
store i8* %94, i8** %97
%98 = icmp eq i8* %94, null
br i1 %98, label %99, label %103
99: ; preds = %92
%100 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([34 x i8], [34 x i8]* @str.1, i64 0, i64 0))
%101 = load i32, i32* @EXIT_FAILURE
%102 = tail call i32 @exit(i32 %101)
unreachable
103: ; preds = %92
%104 = bitcast i8* %94 to i16*
store i16 %93, i16* %104
%105 = add i16 %93, 1
%106 = icmp sgt i16 %105, %1
br i1 %106, label %21, label %92
107: ; preds = %111, %88, %21
%108 = icmp slt i16 %1, 1
br i1 %108, label %160, label %109
109: ; preds = %107
%110 = icmp slt i16 %3, 1
br label %117
111: ; preds = %90, %111
%112 = phi i64 [ %115, %111 ], [ %91, %90 ]
%113 = getelementptr inbounds i16, i16* %24, i64 %112
%114 = trunc i64 %112 to i16
store i16 %114, i16* %113
%115 = add nuw nsw i64 %112, 1
%116 = icmp eq i64 %115, %26
br i1 %116, label %107, label %111
117: ; preds = %109, %156
%118 = phi i64 [ 1, %109 ], [ %158, %156 ]
%119 = trunc i64 %118 to i16
br i1 %110, label %156, label %120
120: ; preds = %117
%121 = add nsw i64 %118, -1
%122 = getelementptr inbounds i8, i8* %0, i64 %121
%123 = getelementptr inbounds i16*, i16** %9, i64 %121
%124 = getelementptr inbounds i16*, i16** %9, i64 %118
%125 = load i16*, i16** %123
br label %126
126: ; preds = %120, %150
%127 = phi i16 [ 1, %120 ], [ %154, %150 ]
%128 = sext i16 %127 to i64
%129 = load i8, i8* %122
%130 = add nsw i64 %128, -1
%131 = getelementptr inbounds i8, i8* %2, i64 %130
%132 = load i8, i8* %131
%133 = icmp eq i8 %129, %132
br i1 %133, label %134, label %138
134: ; preds = %126
%135 = getelementptr inbounds i16, i16* %125, i64 %130
%136 = load i16, i16* %135
%137 = load i16*, i16** %124
br label %150
138: ; preds = %126
%139 = getelementptr inbounds i16, i16* %125, i64 %128
%140 = load i16, i16* %139
%141 = add i16 %140, 1
%142 = load i16*, i16** %124
%143 = getelementptr inbounds i16, i16* %142, i64 %130
%144 = load i16, i16* %143
%145 = add i16 %144, 1
%146 = getelementptr inbounds i16, i16* %125, i64 %130
%147 = load i16, i16* %146
%148 = add i16 %147, 1
%149 = tail call signext i16 @getMin(i16 signext %141, i16 signext %145, i16 signext %148)
br label %150
150: ; preds = %134, %138
%151 = phi i16* [ %137, %134 ], [ %142, %138 ]
%152 = phi i16 [ %136, %134 ], [ %149, %138 ]
%153 = getelementptr inbounds i16, i16* %151, i64 %128
store i16 %152, i16* %153
%154 = add i16 %127, 1
%155 = icmp sgt i16 %154, %3
br i1 %155, label %156, label %126
156: ; preds = %150, %117
%157 = add i16 %119, 1
%158 = sext i16 %157 to i64
%159 = icmp sgt i16 %157, %1
br i1 %159, label %160, label %117
160: ; preds = %156, %107
ret i16** %9
}