#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 */
scalar_t__ abs(int);
int search(int *num, int size, int aim, int i1, int i2) {
  int left = 0, right = size - 1, mid;
  while (left <= right) {
    mid = (left + right) / 2;
    if (num[mid] == aim) {
      int x = mid, y = mid, i;
      while (x >= 0 && num[x] == aim)
        x--;
      while (y < size && num[y] == aim)
        y++;
      for (i = x + 1; i < y; i++)
        if (i != i1 && i != i2)
          return aim;
      break;
    }
    if (num[mid] > aim)
      right = mid - 1;
    else
      left = mid + 1;
  }
  while (right >= 0) {
    if (right == i1 || right == i2)
      right--;
    else
      break;
  }
  while (left < size) {
    if (left == i1 || left == i2)
      left++;
    else
      break;
  }
  if (right >= 0 && left < size) {
    return abs(num[left] - aim) > abs(num[right] - aim) ? num[right]
                                                        : num[left];
  } else if (right < 0)
    return num[left];
  else
    return num[right];
}


x86 assembly (clang, -O0):
<search>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jg     127f <search+0x16f>
mov    -0x24(%rbp),%eax
add    -0x28(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jne    124f <search+0x13f>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x34(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x30(%rbp)
mov    %al,-0x39(%rbp)
jl     1199 <search+0x89>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
sete   %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    11a9 <search+0x99>
jmp    11b7 <search+0xa7>
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
jmp    1176 <search+0x66>
jmp    11bc <search+0xac>
mov    -0x34(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x3a(%rbp)
jge    11e1 <search+0xd1>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
sete   %al
mov    %al,-0x3a(%rbp)
mov    -0x3a(%rbp),%al
test   $0x1,%al
jne    11f1 <search+0xe1>
jmp    11ff <search+0xef>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11bc <search+0xac>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    124a <search+0x13a>
mov    -0x38(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     1237 <search+0x127>
mov    -0x38(%rbp),%eax
cmp    -0x20(%rbp),%eax
je     1237 <search+0x127>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    13a6 <search+0x296>
jmp    123c <search+0x12c>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1208 <search+0xf8>
jmp    127f <search+0x16f>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jle    1271 <search+0x161>
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    127a <search+0x16a>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1139 <search+0x29>
jmp    1284 <search+0x174>
cmpl   $0x0,-0x28(%rbp)
jl     12be <search+0x1ae>
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     12a6 <search+0x196>
mov    -0x28(%rbp),%eax
cmp    -0x20(%rbp),%eax
jne    12b4 <search+0x1a4>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    12b9 <search+0x1a9>
jmp    12be <search+0x1ae>
jmp    1284 <search+0x174>
jmp    12c3 <search+0x1b3>
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12ff <search+0x1ef>
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     12e7 <search+0x1d7>
mov    -0x24(%rbp),%eax
cmp    -0x20(%rbp),%eax
jne    12f5 <search+0x1e5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12fa <search+0x1ea>
jmp    12ff <search+0x1ef>
jmp    12c3 <search+0x1b3>
cmpl   $0x0,-0x28(%rbp)
jl     137b <search+0x26b>
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    137b <search+0x26b>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edi
sub    -0x18(%rbp),%edi
call   1030 <abs@plt>
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%edi
sub    -0x18(%rbp),%edi
call   1030 <abs@plt>
mov    %rax,%rcx
mov    -0x48(%rbp),%rax
cmp    %rcx,%rax
jle    1362 <search+0x252>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x4c(%rbp)
jmp    1370 <search+0x260>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    13a6 <search+0x296>
cmpl   $0x0,-0x28(%rbp)
jge    1398 <search+0x288>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x4(%rbp)
jmp    13a6 <search+0x296>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<search>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r12d
mov    %rdi,%r15
lea    -0x1(%rsi),%ebx
xor    %r11d,%r11d
test   %esi,%esi
jg     113b <search+0x2b>
jmp    1164 <search+0x54>
nopw   0x0(%rax,%rax,1)
add    $0x1,%edx
mov    %edx,%r11d
cmp    %ebx,%r11d
jg     1160 <search+0x50>
lea    (%rbx,%r11,1),%eax
mov    %eax,%edx
shr    $0x1f,%edx
add    %eax,%edx
sar    %edx
movslq %edx,%rbp
mov    (%r15,%rbp,4),%edi
cmp    %r12d,%edi
je     1196 <search+0x86>
jle    1130 <search+0x20>
add    $0xffffffff,%edx
mov    %edx,%ebx
cmp    %ebx,%r11d
jle    113b <search+0x2b>
test   %ebx,%ebx
jns    1187 <search+0x77>
xor    %r9d,%r9d
cmp    %esi,%r11d
jl     121b <search+0x10b>
jmp    129b <search+0x18b>
cs nopw 0x0(%rax,%rax,1)
nop
lea    -0x1(%rdx),%ebx
test   %edx,%edx
jle    11fe <search+0xee>
mov    %ebx,%edx
cmp    %ebx,%ecx
je     1180 <search+0x70>
cmp    %edx,%r8d
je     1180 <search+0x70>
mov    %edx,%ebx
jmp    1203 <search+0xf3>
mov    %edx,%edi
cmp    $0xffffffff,%eax
jl     11c4 <search+0xb4>
xor    %r9d,%r9d
test   %edx,%edx
cmovs  %edx,%r9d
add    $0xffffffff,%r9d
mov    %edx,%edi
nopl   0x0(%rax)
mov    %edi,%eax
cmp    %r12d,(%r15,%rax,4)
jne    11c4 <search+0xb4>
lea    -0x1(%rdi),%eax
test   %edi,%edi
mov    %eax,%edi
jg     11b0 <search+0xa0>
mov    %r9d,%edi
cmp    %esi,%edx
jge    12bc <search+0x1ac>
movslq %esi,%r9
lea    0x1(%rdx),%r10d
cmp    %r10d,%esi
cmovg  %esi,%r10d
add    $0x1,%rbp
xchg   %ax,%ax
cmp    %r9,%rbp
jge    12b9 <search+0x1a9>
add    $0x1,%edx
lea    0x1(%rbp),%rax
cmp    %r12d,(%r15,%rbp,4)
mov    %rax,%rbp
je     11e0 <search+0xd0>
jmp    12bc <search+0x1ac>
mov    $0xffffffff,%ebx
cmp    %edx,%r8d
setne  %al
cmp    %edx,%ecx
setne  %r9b
and    %al,%r9b
cmp    %esi,%r11d
jge    129b <search+0x18b>
cmp    %ecx,%r11d
je     1227 <search+0x117>
mov    $0x1,%al
cmp    %r8d,%r11d
jne    125d <search+0x14d>
neg    %r11d
mov    $0x1,%edi
mov    $0x1,%ebp
sub    %r8d,%ebp
mov    $0x1,%edx
sub    %ecx,%edx
sub    %esi,%edi
cmp    %r11d,%edi
je     1298 <search+0x188>
mov    %r11d,%eax
lea    -0x1(%rax),%r11d
cmp    %eax,%edx
je     1240 <search+0x130>
cmp    %eax,%ebp
je     1240 <search+0x130>
neg    %r11d
cmp    %esi,%r11d
setl   %al
and    %al,%r9b
cmp    $0x1,%r9b
jne    129b <search+0x18b>
movslq %r11d,%rax
lea    (%r15,%rax,4),%rbp
mov    (%r15,%rax,4),%edi
sub    %r12d,%edi
call   1030 <abs@plt>
mov    %rax,%r14
movslq %ebx,%rax
lea    (%r15,%rax,4),%rbx
mov    (%r15,%rax,4),%edi
sub    %r12d,%edi
call   1030 <abs@plt>
cmp    %rax,%r14
cmovle %rbp,%rbx
jmp    12aa <search+0x19a>
mov    %esi,%r11d
test   %ebx,%ebx
js     12a3 <search+0x193>
mov    %ebx,%eax
jmp    12a6 <search+0x196>
movslq %r11d,%rax
lea    (%r15,%rax,4),%rbx
mov    (%rbx),%r12d
mov    %r12d,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r10d,%edx
add    $0x1,%edi
nop
cmp    %edx,%edi
jge    1160 <search+0x50>
mov    %edi,%eax
lea    0x1(%rax),%edi
cmp    %eax,%ecx
je     12c0 <search+0x1b0>
cmp    %eax,%r8d
je     12c0 <search+0x1b0>
jmp    12ad <search+0x19d>

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

LLVM IR (-O2):
define i32 @search(i32* nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = add nsw i32 %1, -1
%7 = icmp slt i32 %1, 1
br i1 %7, label %81, label %8
8: ; preds = %5, %58
%9 = phi i32 [ %63, %58 ], [ %6, %5 ]
%10 = phi i32 [ %62, %58 ], [ 0, %5 ]
%11 = add nsw i32 %9, %10
%12 = sdiv i32 %11, 2
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i32, i32* %0, i64 %13
%15 = load i32, i32* %14
%16 = icmp eq i32 %15, %2
br i1 %16, label %17, label %58
17: ; preds = %8
%18 = icmp sgt i32 %11, -2
br i1 %18, label %19, label %31
19: ; preds = %17
%20 = call i32 @llvm.smin.i32(i32 %12, i32 0)
%21 = add nsw i32 %20, -1
br label %22
22: ; preds = %19, %28
%23 = phi i32 [ %29, %28 ], [ %12, %19 ]
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds i32, i32* %0, i64 %24
%26 = load i32, i32* %25
%27 = icmp eq i32 %26, %2
br i1 %27, label %28, label %31
28: ; preds = %22
%29 = add nsw i32 %23, -1
%30 = icmp sgt i32 %23, 0
br i1 %30, label %22, label %31
31: ; preds = %22, %28, %17
%32 = phi i32 [ %12, %17 ], [ %21, %28 ], [ %23, %22 ]
%33 = icmp slt i32 %12, %1
br i1 %33, label %34, label %48
34: ; preds = %31
%35 = sext i32 %1 to i64
%36 = add nsw i32 %12, 1
%37 = call i32 @llvm.smax.i32(i32 %1, i32 %36)
br label %38
38: ; preds = %34, %42
%39 = phi i64 [ %13, %34 ], [ %40, %42 ]
%40 = add nsw i64 %39, 1
%41 = icmp slt i64 %40, %35
br i1 %41, label %42, label %48
42: ; preds = %38
%43 = getelementptr inbounds i32, i32* %0, i64 %40
%44 = load i32, i32* %43
%45 = icmp eq i32 %44, %2
br i1 %45, label %38, label %46
46: ; preds = %42
%47 = trunc i64 %40 to i32
br label %48
48: ; preds = %38, %46, %31
%49 = phi i32 [ %12, %31 ], [ %47, %46 ], [ %37, %38 ]
br label %50
50: ; preds = %54, %48
%51 = phi i32 [ %32, %48 ], [ %52, %54 ]
%52 = add nsw i32 %51, 1
%53 = icmp slt i32 %52, %49
br i1 %53, label %54, label %65
54: ; preds = %50
%55 = icmp eq i32 %52, %3
%56 = icmp eq i32 %52, %4
%57 = or i1 %55, %56
br i1 %57, label %50, label %129
58: ; preds = %8
%59 = icmp sgt i32 %15, %2
%60 = add nsw i32 %12, -1
%61 = add nsw i32 %12, 1
%62 = select i1 %59, i32 %10, i32 %61
%63 = select i1 %59, i32 %60, i32 %9
%64 = icmp sgt i32 %62, %63
br i1 %64, label %65, label %8
65: ; preds = %58, %50
%66 = phi i32 [ %10, %50 ], [ %62, %58 ]
%67 = phi i32 [ %9, %50 ], [ %63, %58 ]
%68 = icmp sgt i32 %67, -1
br i1 %68, label %69, label %81
69: ; preds = %65, %74
%70 = phi i32 [ %75, %74 ], [ %67, %65 ]
%71 = icmp eq i32 %70, %3
%72 = icmp eq i32 %70, %4
%73 = or i1 %71, %72
br i1 %73, label %74, label %77
74: ; preds = %69
%75 = add nsw i32 %70, -1
%76 = icmp sgt i32 %70, 0
br i1 %76, label %69, label %77
77: ; preds = %69, %74
%78 = phi i32 [ -1, %74 ], [ %70, %69 ]
%79 = or i1 %71, %72
%80 = xor i1 %79, true
br label %81
81: ; preds = %5, %77, %65
%82 = phi i32 [ %66, %65 ], [ %66, %77 ], [ 0, %5 ]
%83 = phi i32 [ %67, %65 ], [ %78, %77 ], [ %6, %5 ]
%84 = phi i1 [ false, %65 ], [ %80, %77 ], [ false, %5 ]
%85 = icmp slt i32 %82, %1
br i1 %85, label %86, label %117
86: ; preds = %81
%87 = icmp eq i32 %82, %3
%88 = icmp eq i32 %82, %4
%89 = or i1 %87, %88
br i1 %89, label %94, label %100
90: ; preds = %94
%91 = icmp eq i32 %96, %3
%92 = icmp eq i32 %96, %4
%93 = or i1 %91, %92
br i1 %93, label %94, label %98
94: ; preds = %86, %90
%95 = phi i32 [ %96, %90 ], [ %82, %86 ]
%96 = add i32 %95, 1
%97 = icmp eq i32 %96, %1
br i1 %97, label %117, label %90
98: ; preds = %90
%99 = icmp slt i32 %96, %1
br label %100
100: ; preds = %98, %86
%101 = phi i1 [ %99, %98 ], [ true, %86 ]
%102 = phi i32 [ %96, %98 ], [ %82, %86 ]
%103 = select i1 %84, i1 %101, i1 false
br i1 %103, label %104, label %117
104: ; preds = %100
%105 = sext i32 %102 to i64
%106 = getelementptr inbounds i32, i32* %0, i64 %105
%107 = load i32, i32* %106
%108 = sub nsw i32 %107, %2
%109 = tail call i64 @abs(i32 %108)
%110 = sext i32 %83 to i64
%111 = getelementptr inbounds i32, i32* %0, i64 %110
%112 = load i32, i32* %111
%113 = sub nsw i32 %112, %2
%114 = tail call i64 @abs(i32 %113)
%115 = icmp sgt i64 %109, %114
%116 = select i1 %115, i32* %111, i32* %106
br label %126
117: ; preds = %94, %81, %100
%118 = phi i32 [ %102, %100 ], [ %82, %81 ], [ %1, %94 ]
%119 = icmp slt i32 %83, 0
br i1 %119, label %120, label %123
120: ; preds = %117
%121 = sext i32 %118 to i64
%122 = getelementptr inbounds i32, i32* %0, i64 %121
br label %126
123: ; preds = %117
%124 = zext i32 %83 to i64
%125 = getelementptr inbounds i32, i32* %0, i64 %124
br label %126
126: ; preds = %104, %120, %123
%127 = phi i32* [ %125, %123 ], [ %122, %120 ], [ %116, %104 ]
%128 = load i32, i32* %127
br label %129
129: ; preds = %54, %126
%130 = phi i32 [ %128, %126 ], [ %2, %54 ]
ret i32 %130
}