int za(const char *text, const char *pattern) {
  int *z;
  unsigned int tsize, psize;
  int i, k;
  char *s;
  int len;
  int R = 0, L, n, p;
  psize = strlen(pattern);
  tsize = strlen(text);
  s = calloc(psize + tsize + 1, sizeof(char));
  if (!s) {
    printf("Error: Failed alloc\n");
    exit(-1);
  }
  s = strcat(s, pattern);
  s = strcat(s, text);
  len = psize + tsize + 1;
  z = calloc(len, sizeof(int));
  if (!z) {
    printf("Error: Failed alloc\n");
    exit(-1);
  }
  for (k = 1; k < len; k++) {
    if (k > R) {
      n = 0;
      while (n + k < len && s[n] == s[n + k])
        n++;
      z[k] = n;
      if (n > 0) {
        L = k;
        R = k + n - 1;
      }
    } else {
      p = k - L;
      if (z[p] < R - k + 1) {
        z[k] = z[p];
      } else {
        i = R + 1;
        while (i < len && s[i] == s[i - k])
          i++;
        z[k] = i - k;
        L = k;
        R = i - 1;
      }
    }
    z[k] = psize < z[k] ? psize : z[k];
    if (z[k] == psize) {
      free(s);
      free(z);
      return k - psize;
    }
  }
  free(s);
  free(z);
  return -1;
}


x86 assembly (clang, -O0):
<za>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x40(%rbp)
mov    -0x18(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
add    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,%eax
mov    %eax,%edi
mov    $0x1,%esi
call   1060 <calloc@plt>
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jne    11cd <za+0x6d>
lea    0xe44(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0xffffffff,%edi
call   1080 <exit@plt>
mov    -0x38(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1070 <strcat@plt>
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rdi
mov    -0x10(%rbp),%rsi
call   1070 <strcat@plt>
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
movslq -0x3c(%rbp),%rdi
mov    $0x4,%esi
call   1060 <calloc@plt>
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    1230 <za+0xd0>
lea    0xde1(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0xffffffff,%edi
call   1080 <exit@plt>
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    1420 <za+0x2c0>
mov    -0x30(%rbp),%eax
cmp    -0x40(%rbp),%eax
jle    12dc <za+0x17c>
movl   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%ecx
add    -0x30(%rbp),%ecx
xor    %eax,%eax
cmp    -0x3c(%rbp),%ecx
mov    %al,-0x4d(%rbp)
jge    128f <za+0x12f>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x38(%rbp),%rcx
mov    -0x48(%rbp),%edx
add    -0x30(%rbp),%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x4d(%rbp)
mov    -0x4d(%rbp),%al
test   $0x1,%al
jne    129f <za+0x13f>
jmp    12ad <za+0x14d>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1256 <za+0xf6>
mov    -0x48(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x48(%rbp)
jle    12d7 <za+0x177>
mov    -0x30(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x30(%rbp),%eax
add    -0x48(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    139e <za+0x23e>
mov    -0x30(%rbp),%eax
sub    -0x44(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x40(%rbp),%ecx
sub    -0x30(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    131c <za+0x1bc>
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1399 <za+0x239>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x3c(%rbp),%ecx
mov    %al,-0x4e(%rbp)
jge    135b <za+0x1fb>
mov    -0x38(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x38(%rbp),%rcx
mov    -0x2c(%rbp),%edx
sub    -0x30(%rbp),%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x4e(%rbp)
mov    -0x4e(%rbp),%al
test   $0x1,%al
jne    136b <za+0x20b>
jmp    1379 <za+0x219>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1325 <za+0x1c5>
mov    -0x2c(%rbp),%edx
sub    -0x30(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    139e <za+0x23e>
mov    -0x28(%rbp),%eax
mov    -0x20(%rbp),%rcx
movslq -0x30(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jae    13bd <za+0x25d>
mov    -0x28(%rbp),%eax
mov    %eax,-0x54(%rbp)
jmp    13cb <za+0x26b>
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x28(%rbp),%eax
jne    140d <za+0x2ad>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x20(%rbp),%rdi
call   1030 <free@plt>
mov    -0x30(%rbp),%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1439 <za+0x2d9>
jmp    1412 <za+0x2b2>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1237 <za+0xd7>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x20(%rbp),%rdi
call   1030 <free@plt>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<za>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%rbp
mov    %rdi,%r13
mov    %rsi,%rdi
call   1050 <strlen@plt>
mov    %rax,%r14
mov    %r13,%rdi
call   1050 <strlen@plt>
mov    %rax,%r12
lea    (%r14,%rax,1),%r15d
add    $0x1,%r15d
mov    $0x1,%esi
mov    %r15,%rdi
call   1060 <calloc@plt>
test   %rax,%rax
je     1305 <za+0x1a5>
mov    %rax,%rbx
mov    %rax,%rdi
mov    %rbp,%rsi
call   1070 <strcat@plt>
mov    %rbx,%rdi
mov    %r13,%rsi
call   1070 <strcat@plt>
movslq %r15d,%rbp
mov    $0x4,%esi
mov    %rbp,%rdi
call   1060 <calloc@plt>
test   %rax,%rax
je     1305 <za+0x1a5>
cmp    $0x2,%r15d
jl     12c2 <za+0x162>
add    %r14d,%r12d
xor    %ecx,%ecx
mov    $0x1,%r13d
mov    %rbx,%r10
nop
movslq %ecx,%rdi
cmp    %rdi,%r13
jle    1230 <za+0xd0>
lea    (%rbx,%r13,1),%rdi
xor    %esi,%esi
xchg   %ax,%ax
movzbl (%rbx,%rsi,1),%edx
cmp    (%rdi,%rsi,1),%dl
jne    1280 <za+0x120>
lea    (%rsi,%r13,1),%rdx
add    $0x1,%rdx
add    $0x1,%rsi
cmp    %rbp,%rdx
jl     1200 <za+0xa0>
mov    %r12d,%esi
mov    %r15d,%edi
jmp    1284 <za+0x124>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq %r8d,%rdx
mov    %r13,%rsi
sub    %rdx,%rsi
mov    (%rax,%rsi,4),%esi
mov    %ecx,%edx
sub    %r13d,%edx
cmp    %edx,%esi
jle    12a0 <za+0x140>
lea    0x1(%rcx),%r9d
cmp    %r9d,%r15d
cmovg  %r15d,%r9d
lea    -0x1(%r9),%r8d
add    $0x1,%rdi
nopl   0x0(%rax,%rax,1)
cmp    %rbp,%rdi
jge    1292 <za+0x132>
movzbl (%rbx,%rdi,1),%edx
add    $0x1,%ecx
lea    0x1(%rdi),%rsi
cmp    -0x1(%r10,%rdi,1),%dl
mov    %rsi,%rdi
je     1260 <za+0x100>
lea    -0x1(%rcx),%r8d
jmp    1295 <za+0x135>
lea    (%rsi,%r13,1),%edi
add    $0xffffffff,%edi
test   %esi,%esi
cmovne %edi,%ecx
cmovne %r13d,%r8d
jmp    12a0 <za+0x140>
mov    %r9d,%ecx
sub    %r13d,%ecx
mov    %ecx,%esi
mov    %r8d,%ecx
mov    %r13d,%r8d
cmp    %r14d,%esi
cmova  %r14d,%esi
mov    %esi,(%rax,%r13,4)
jae    12dd <za+0x17d>
add    $0x1,%r13
add    $0xffffffff,%r12d
add    $0xffffffffffffffff,%r10
cmp    %r15,%r13
jne    11f0 <za+0x90>
mov    %rbx,%rdi
mov    %rax,%rbx
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    $0xffffffff,%r13d
jmp    12f3 <za+0x193>
mov    %rbx,%rdi
mov    %rax,%rbx
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
sub    %r14d,%r13d
mov    %r13d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0xcf4(%rip),%rdi
call   1040 <puts@plt>
mov    $0xffffffff,%edi
call   1080 <exit@plt>

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

LLVM IR (-O2):
@str.1 = [20 x i8] c"Error: Failed alloc\00"
define i32 @za(i8* nocapture %0, i8* nocapture %1) {
%3 = tail call i64 @strlen(i8* dereferenceable(1) %1)
%4 = trunc i64 %3 to i32
%5 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%6 = trunc i64 %5 to i32
%7 = add i32 %4, 1
%8 = add i32 %7, %6
%9 = zext i32 %8 to i64
%10 = tail call i8* @calloc(i64 %9, i64 1)
%11 = icmp eq i8* %10, null
br i1 %11, label %12, label %14
12: ; preds = %2
%13 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @str.1, i64 0, i64 0))
tail call void @exit(i32 -1)
unreachable
14: ; preds = %2
%15 = tail call i8* @strcat(i8* %10, i8* dereferenceable(1) %1)
%16 = tail call i8* @strcat(i8* %10, i8* dereferenceable(1) %0)
%17 = sext i32 %8 to i64
%18 = tail call i8* @calloc(i64 %17, i64 4)
%19 = bitcast i8* %18 to i32*
%20 = icmp eq i8* %18, null
br i1 %20, label %25, label %21
21: ; preds = %14
%22 = icmp sgt i32 %8, 1
br i1 %22, label %23, label %102
23: ; preds = %21
%24 = add i32 %4, %6
br label %27
25: ; preds = %14
%26 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @str.1, i64 0, i64 0))
tail call void @exit(i32 -1)
unreachable
27: ; preds = %23, %98
%28 = phi i32 [ %24, %23 ], [ %100, %98 ]
%29 = phi i64 [ 1, %23 ], [ %99, %98 ]
%30 = phi i32 [ undef, %23 ], [ %90, %98 ]
%31 = phi i32 [ 0, %23 ], [ %89, %98 ]
%32 = trunc i64 %29 to i32
%33 = sext i32 %31 to i64
%34 = icmp sgt i64 %29, %33
br i1 %34, label %35, label %58
35: ; preds = %27, %43
%36 = phi i64 [ %44, %43 ], [ 0, %27 ]
%37 = phi i64 [ %46, %43 ], [ %29, %27 ]
%38 = getelementptr inbounds i8, i8* %10, i64 %36
%39 = load i8, i8* %38
%40 = getelementptr inbounds i8, i8* %10, i64 %37
%41 = load i8, i8* %40
%42 = icmp eq i8 %39, %41
br i1 %42, label %43, label %48
43: ; preds = %35
%44 = add nuw nsw i64 %36, 1
%45 = add nuw nsw i64 %44, %29
%46 = add nuw nsw i64 %37, 1
%47 = icmp slt i64 %45, %17
br i1 %47, label %35, label %51
48: ; preds = %35
%49 = trunc i64 %37 to i32
%50 = trunc i64 %36 to i32
br label %51
51: ; preds = %43, %48
%52 = phi i32 [ %50, %48 ], [ %28, %43 ]
%53 = phi i32 [ %49, %48 ], [ %8, %43 ]
%54 = icmp eq i32 %52, 0
%55 = add nsw i32 %53, -1
%56 = select i1 %54, i32 %31, i32 %55
%57 = select i1 %54, i32 %30, i32 %32
br label %87
58: ; preds = %27
%59 = sext i32 %30 to i64
%60 = sub nsw i64 %29, %59
%61 = getelementptr inbounds i32, i32* %19, i64 %60
%62 = load i32, i32* %61
%63 = sub nsw i32 %31, %32
%64 = icmp sgt i32 %62, %63
br i1 %64, label %65, label %87
65: ; preds = %58
%66 = add i32 %31, 1
%67 = call i32 @llvm.smax.i32(i32 %8, i32 %66)
%68 = add i32 %67, -1
br label %69
69: ; preds = %65, %73
%70 = phi i64 [ %33, %65 ], [ %71, %73 ]
%71 = add nsw i64 %70, 1
%72 = icmp slt i64 %71, %17
br i1 %72, label %73, label %83
73: ; preds = %69
%74 = getelementptr inbounds i8, i8* %10, i64 %71
%75 = load i8, i8* %74
%76 = sub nsw i64 %71, %29
%77 = getelementptr inbounds i8, i8* %10, i64 %76
%78 = load i8, i8* %77
%79 = icmp eq i8 %75, %78
br i1 %79, label %69, label %80
80: ; preds = %73
%81 = trunc i64 %70 to i32
%82 = trunc i64 %71 to i32
br label %83
83: ; preds = %69, %80
%84 = phi i32 [ %81, %80 ], [ %68, %69 ]
%85 = phi i32 [ %82, %80 ], [ %67, %69 ]
%86 = sub nsw i32 %85, %32
br label %87
87: ; preds = %58, %51, %83
%88 = phi i32 [ %86, %83 ], [ %52, %51 ], [ %62, %58 ]
%89 = phi i32 [ %84, %83 ], [ %56, %51 ], [ %31, %58 ]
%90 = phi i32 [ %32, %83 ], [ %57, %51 ], [ %30, %58 ]
%91 = getelementptr inbounds i32, i32* %19, i64 %29
%92 = icmp ugt i32 %88, %4
%93 = select i1 %92, i32 %4, i32 %88
store i32 %93, i32* %91
%94 = icmp ult i32 %88, %4
br i1 %94, label %98, label %95
95: ; preds = %87
%96 = trunc i64 %29 to i32
tail call void @free(i8* %10)
tail call void @free(i8* %18)
%97 = sub i32 %96, %4
br label %103
98: ; preds = %87
%99 = add nuw nsw i64 %29, 1
%100 = add i32 %28, -1
%101 = icmp eq i64 %99, %9
br i1 %101, label %102, label %27
102: ; preds = %98, %21
tail call void @free(i8* %10)
tail call void @free(i8* %18)
br label %103
103: ; preds = %102, %95
%104 = phi i32 [ %97, %95 ], [ -1, %102 ]
ret i32 %104
}