; LLVM IR from fcimeson/cbTSP :: cbLKH/SRC (Best3OptMove)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.Node = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, double, double, double, double, double, i8, i8, i8 }
%struct.Segment = type { i8, ptr, ptr, ptr, ptr, i32, i32, ptr }
%struct.Candidate = type { ptr, i32, i32 }

@Reversed = external dso_local global i16, align 2
@GainCriterionUsed = external dso_local global i32, align 4
@ProblemType = external dso_local global i32, align 4
@MaxBreadth = external dso_local global i32, align 4
@C = external dso_local global ptr, align 8
@c = external dso_local global ptr, align 8
@Backtracking = external dso_local global i32, align 4
@Precision = external dso_local global i32, align 4
@Swaps = external dso_local global i32, align 4
@MaxSwaps = external dso_local global i32, align 4
@RestrictedSearch = external dso_local global i32, align 4
@BestSubsequentMove = external dso_local global ptr, align 8

; Function Attrs: nounwind uwtable
define dso_local ptr @Best3OptMove(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i64, align 8
  %33 = alloca ptr, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  store ptr null, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  store ptr null, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #3
  store ptr null, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  store ptr null, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  store i64 -9223372036854775808, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #3
  store i32 0, ptr %26, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #3
  store i32 0, ptr %29, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #3
  %34 = load i16, ptr @Reversed, align 2, !tbaa !13
  %35 = sext i16 %34 to i32
  %36 = load ptr, ptr %6, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.Node, ptr %36, i32 0, i32 45
  %38 = load ptr, ptr %37, align 8, !tbaa !15
  %39 = getelementptr inbounds %struct.Segment, ptr %38, i32 0, i32 0
  %40 = load i8, ptr %39, align 8, !tbaa !18
  %41 = sext i8 %40 to i32
  %42 = icmp eq i32 %35, %41
  br i1 %42, label %43, label %47

43:                                               ; preds = %4
  %44 = load ptr, ptr %6, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.Node, ptr %44, i32 0, i32 16
  %46 = load ptr, ptr %45, align 8, !tbaa !20
  br label %51

47:                                               ; preds = %4
  %48 = load ptr, ptr %6, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.Node, ptr %48, i32 0, i32 15
  %50 = load ptr, ptr %49, align 8, !tbaa !21
  br label %51

51:                                               ; preds = %47, %43
  %52 = phi ptr [ %46, %43 ], [ %50, %47 ]
  %53 = load ptr, ptr %7, align 8, !tbaa !5
  %54 = icmp ne ptr %52, %53
  br i1 %54, label %55, label %60

55:                                               ; preds = %51
  %56 = load i16, ptr @Reversed, align 2, !tbaa !13
  %57 = sext i16 %56 to i32
  %58 = xor i32 %57, 1
  %59 = trunc i32 %58 to i16
  store i16 %59, ptr @Reversed, align 2, !tbaa !13
  br label %60

60:                                               ; preds = %55, %51
  %61 = load ptr, ptr %7, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.Node, ptr %61, i32 0, i32 43
  %63 = load ptr, ptr %62, align 8, !tbaa !22
  store ptr %63, ptr %18, align 8, !tbaa !5
  br label %64

64:                                               ; preds = %679, %60
  %65 = load ptr, ptr %18, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.Candidate, ptr %65, i32 0, i32 0
  %67 = load ptr, ptr %66, align 8, !tbaa !23
  store ptr %67, ptr %10, align 8, !tbaa !5
  %68 = icmp ne ptr %67, null
  br i1 %68, label %69, label %682

69:                                               ; preds = %64
  %70 = load ptr, ptr %10, align 8, !tbaa !5
  %71 = load ptr, ptr %7, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.Node, ptr %71, i32 0, i32 15
  %73 = load ptr, ptr %72, align 8, !tbaa !21
  %74 = icmp eq ptr %70, %73
  br i1 %74, label %99, label %75

75:                                               ; preds = %69
  %76 = load ptr, ptr %10, align 8, !tbaa !5
  %77 = load ptr, ptr %7, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.Node, ptr %77, i32 0, i32 16
  %79 = load ptr, ptr %78, align 8, !tbaa !20
  %80 = icmp eq ptr %76, %79
  br i1 %80, label %99, label %81

81:                                               ; preds = %75
  %82 = load ptr, ptr %8, align 8, !tbaa !5
  %83 = load i64, ptr %82, align 8, !tbaa !9
  %84 = load ptr, ptr %18, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.Candidate, ptr %84, i32 0, i32 1
  %86 = load i32, ptr %85, align 8, !tbaa !25
  %87 = sext i32 %86 to i64
  %88 = sub nsw i64 %83, %87
  store i64 %88, ptr %20, align 8, !tbaa !9
  %89 = icmp sle i64 %88, 0
  br i1 %89, label %90, label %100

90:                                               ; preds = %81
  %91 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !11
  %92 = icmp ne i32 %91, 0
  br i1 %92, label %93, label %100

93:                                               ; preds = %90
  %94 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %95 = icmp ne i32 %94, 3
  br i1 %95, label %96, label %100

96:                                               ; preds = %93
  %97 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %98 = icmp ne i32 %97, 6
  br i1 %98, label %99, label %100

99:                                               ; preds = %96, %75, %69
  br label %679

100:                                              ; preds = %96, %93, %90, %81
  %101 = load i32, ptr %29, align 4, !tbaa !11
  %102 = add nsw i32 %101, 1
  store i32 %102, ptr %29, align 4, !tbaa !11
  %103 = load i32, ptr @MaxBreadth, align 4, !tbaa !11
  %104 = icmp sgt i32 %102, %103
  br i1 %104, label %105, label %106

105:                                              ; preds = %100
  br label %682

106:                                              ; preds = %100
  store i32 1, ptr %27, align 4, !tbaa !11
  br label %107

107:                                              ; preds = %675, %106
  %108 = load i32, ptr %27, align 4, !tbaa !11
  %109 = icmp sle i32 %108, 2
  br i1 %109, label %110, label %678

110:                                              ; preds = %107
  %111 = load i32, ptr %27, align 4, !tbaa !11
  %112 = icmp eq i32 %111, 1
  br i1 %112, label %113, label %133

113:                                              ; preds = %110
  %114 = load i16, ptr @Reversed, align 2, !tbaa !13
  %115 = sext i16 %114 to i32
  %116 = load ptr, ptr %10, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.Node, ptr %116, i32 0, i32 45
  %118 = load ptr, ptr %117, align 8, !tbaa !15
  %119 = getelementptr inbounds %struct.Segment, ptr %118, i32 0, i32 0
  %120 = load i8, ptr %119, align 8, !tbaa !18
  %121 = sext i8 %120 to i32
  %122 = icmp eq i32 %115, %121
  br i1 %122, label %123, label %127

123:                                              ; preds = %113
  %124 = load ptr, ptr %10, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.Node, ptr %124, i32 0, i32 15
  %126 = load ptr, ptr %125, align 8, !tbaa !21
  br label %131

127:                                              ; preds = %113
  %128 = load ptr, ptr %10, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.Node, ptr %128, i32 0, i32 16
  %130 = load ptr, ptr %129, align 8, !tbaa !20
  br label %131

131:                                              ; preds = %127, %123
  %132 = phi ptr [ %126, %123 ], [ %130, %127 ]
  br label %153

133:                                              ; preds = %110
  %134 = load i16, ptr @Reversed, align 2, !tbaa !13
  %135 = sext i16 %134 to i32
  %136 = load ptr, ptr %10, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.Node, ptr %136, i32 0, i32 45
  %138 = load ptr, ptr %137, align 8, !tbaa !15
  %139 = getelementptr inbounds %struct.Segment, ptr %138, i32 0, i32 0
  %140 = load i8, ptr %139, align 8, !tbaa !18
  %141 = sext i8 %140 to i32
  %142 = icmp eq i32 %135, %141
  br i1 %142, label %143, label %147

143:                                              ; preds = %133
  %144 = load ptr, ptr %10, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.Node, ptr %144, i32 0, i32 16
  %146 = load ptr, ptr %145, align 8, !tbaa !20
  br label %151

147:                                              ; preds = %133
  %148 = load ptr, ptr %10, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.Node, ptr %148, i32 0, i32 15
  %150 = load ptr, ptr %149, align 8, !tbaa !21
  br label %151

151:                                              ; preds = %147, %143
  %152 = phi ptr [ %146, %143 ], [ %150, %147 ]
  br label %153

153:                                              ; preds = %151, %131
  %154 = phi ptr [ %132, %131 ], [ %152, %151 ]
  store ptr %154, ptr %11, align 8, !tbaa !5
  %155 = load ptr, ptr %10, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.Node, ptr %155, i32 0, i32 26
  %157 = load ptr, ptr %156, align 8, !tbaa !26
  %158 = load ptr, ptr %11, align 8, !tbaa !5
  %159 = icmp eq ptr %157, %158
  br i1 %159, label %171, label %160

160:                                              ; preds = %153
  %161 = load ptr, ptr %10, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.Node, ptr %161, i32 0, i32 27
  %163 = load ptr, ptr %162, align 8, !tbaa !27
  %164 = load ptr, ptr %11, align 8, !tbaa !5
  %165 = icmp eq ptr %163, %164
  br i1 %165, label %171, label %166

166:                                              ; preds = %160
  %167 = load ptr, ptr %10, align 8, !tbaa !5
  %168 = load ptr, ptr %11, align 8, !tbaa !5
  %169 = call i32 @IsCommonEdge(ptr noundef %167, ptr noundef %168)
  %170 = icmp ne i32 %169, 0
  br i1 %170, label %171, label %172

171:                                              ; preds = %166, %160, %153
  br label %675

172:                                              ; preds = %166
  %173 = load i64, ptr %20, align 8, !tbaa !9
  %174 = load ptr, ptr @C, align 8, !tbaa !5
  %175 = load ptr, ptr %10, align 8, !tbaa !5
  %176 = load ptr, ptr %11, align 8, !tbaa !5
  %177 = call i32 %174(ptr noundef %175, ptr noundef %176)
  %178 = sext i32 %177 to i64
  %179 = add nsw i64 %173, %178
  store i64 %179, ptr %21, align 8, !tbaa !9
  %180 = load i32, ptr %27, align 4, !tbaa !11
  %181 = icmp eq i32 %180, 1
  br i1 %181, label %182, label %213

182:                                              ; preds = %172
  %183 = load ptr, ptr %11, align 8, !tbaa !5
  %184 = load ptr, ptr %6, align 8, !tbaa !5
  %185 = call i32 @Forbidden(ptr noundef %183, ptr noundef %184)
  %186 = icmp ne i32 %185, 0
  br i1 %186, label %213, label %187

187:                                              ; preds = %182
  %188 = load ptr, ptr @c, align 8, !tbaa !5
  %189 = icmp ne ptr %188, null
  br i1 %189, label %190, label %199

190:                                              ; preds = %187
  %191 = load i64, ptr %21, align 8, !tbaa !9
  %192 = load ptr, ptr @c, align 8, !tbaa !5
  %193 = load ptr, ptr %11, align 8, !tbaa !5
  %194 = load ptr, ptr %6, align 8, !tbaa !5
  %195 = call i32 %192(ptr noundef %193, ptr noundef %194)
  %196 = sext i32 %195 to i64
  %197 = sub nsw i64 %191, %196
  %198 = icmp sgt i64 %197, 0
  br i1 %198, label %199, label %213

199:                                              ; preds = %190, %187
  %200 = load i64, ptr %21, align 8, !tbaa !9
  %201 = load ptr, ptr @C, align 8, !tbaa !5
  %202 = load ptr, ptr %11, align 8, !tbaa !5
  %203 = load ptr, ptr %6, align 8, !tbaa !5
  %204 = call i32 %201(ptr noundef %202, ptr noundef %203)
  %205 = sext i32 %204 to i64
  %206 = sub nsw i64 %200, %205
  %207 = load ptr, ptr %9, align 8, !tbaa !5
  store i64 %206, ptr %207, align 8, !tbaa !9
  %208 = icmp sgt i64 %206, 0
  br i1 %208, label %209, label %213

209:                                              ; preds = %199
  %210 = load ptr, ptr %6, align 8, !tbaa !5
  %211 = load ptr, ptr %7, align 8, !tbaa !5
  %212 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Flip_SL(ptr noundef %210, ptr noundef %211, ptr noundef %212)
  store ptr null, ptr %5, align 8
  store i32 1, ptr %31, align 4
  br label %704

213:                                              ; preds = %199, %190, %182, %172
  %214 = load i32, ptr @Backtracking, align 4, !tbaa !11
  %215 = icmp ne i32 %214, 0
  br i1 %215, label %216, label %222

216:                                              ; preds = %213
  %217 = load ptr, ptr %10, align 8, !tbaa !5
  %218 = load ptr, ptr %11, align 8, !tbaa !5
  %219 = call i32 @Excludable(ptr noundef %217, ptr noundef %218)
  %220 = icmp ne i32 %219, 0
  br i1 %220, label %222, label %221

221:                                              ; preds = %216
  br label %675

222:                                              ; preds = %216, %213
  store i32 0, ptr %30, align 4, !tbaa !11
  %223 = load ptr, ptr %11, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.Node, ptr %223, i32 0, i32 43
  %225 = load ptr, ptr %224, align 8, !tbaa !22
  store ptr %225, ptr %19, align 8, !tbaa !5
  br label %226

226:                                              ; preds = %671, %222
  %227 = load ptr, ptr %19, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.Candidate, ptr %227, i32 0, i32 0
  %229 = load ptr, ptr %228, align 8, !tbaa !23
  store ptr %229, ptr %12, align 8, !tbaa !5
  %230 = icmp ne ptr %229, null
  br i1 %230, label %231, label %674

231:                                              ; preds = %226
  %232 = load ptr, ptr %12, align 8, !tbaa !5
  %233 = load ptr, ptr %11, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.Node, ptr %233, i32 0, i32 15
  %235 = load ptr, ptr %234, align 8, !tbaa !21
  %236 = icmp eq ptr %232, %235
  br i1 %236, label %269, label %237

237:                                              ; preds = %231
  %238 = load ptr, ptr %12, align 8, !tbaa !5
  %239 = load ptr, ptr %11, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.Node, ptr %239, i32 0, i32 16
  %241 = load ptr, ptr %240, align 8, !tbaa !20
  %242 = icmp eq ptr %238, %241
  br i1 %242, label %269, label %243

243:                                              ; preds = %237
  %244 = load i64, ptr %21, align 8, !tbaa !9
  %245 = load ptr, ptr %19, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.Candidate, ptr %245, i32 0, i32 1
  %247 = load i32, ptr %246, align 8, !tbaa !25
  %248 = sext i32 %247 to i64
  %249 = sub nsw i64 %244, %248
  store i64 %249, ptr %22, align 8, !tbaa !9
  %250 = icmp sle i64 %249, 0
  br i1 %250, label %251, label %260

251:                                              ; preds = %243
  %252 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !11
  %253 = icmp ne i32 %252, 0
  br i1 %253, label %254, label %260

254:                                              ; preds = %251
  %255 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %256 = icmp ne i32 %255, 3
  br i1 %256, label %257, label %260

257:                                              ; preds = %254
  %258 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %259 = icmp ne i32 %258, 6
  br i1 %259, label %269, label %260

260:                                              ; preds = %257, %254, %251, %243
  %261 = load i32, ptr %27, align 4, !tbaa !11
  %262 = icmp eq i32 %261, 2
  br i1 %262, label %263, label %270

263:                                              ; preds = %260
  %264 = load ptr, ptr %7, align 8, !tbaa !5
  %265 = load ptr, ptr %12, align 8, !tbaa !5
  %266 = load ptr, ptr %10, align 8, !tbaa !5
  %267 = call i32 @Between_SL(ptr noundef %264, ptr noundef %265, ptr noundef %266)
  %268 = icmp ne i32 %267, 0
  br i1 %268, label %270, label %269

269:                                              ; preds = %263, %257, %237, %231
  br label %671

270:                                              ; preds = %263, %260
  %271 = load i32, ptr %30, align 4, !tbaa !11
  %272 = add nsw i32 %271, 1
  store i32 %272, ptr %30, align 4, !tbaa !11
  %273 = load i32, ptr @MaxBreadth, align 4, !tbaa !11
  %274 = icmp sgt i32 %272, %273
  br i1 %274, label %275, label %276

275:                                              ; preds = %270
  br label %674

276:                                              ; preds = %270
  store i32 1, ptr %28, align 4, !tbaa !11
  br label %277

277:                                              ; preds = %667, %276
  %278 = load i32, ptr %28, align 4, !tbaa !11
  %279 = load i32, ptr %27, align 4, !tbaa !11
  %280 = icmp sle i32 %278, %279
  br i1 %280, label %281, label %670

281:                                              ; preds = %277
  %282 = load i32, ptr %27, align 4, !tbaa !11
  %283 = icmp eq i32 %282, 1
  br i1 %283, label %284, label %337

284:                                              ; preds = %281
  %285 = load ptr, ptr %7, align 8, !tbaa !5
  %286 = load ptr, ptr %12, align 8, !tbaa !5
  %287 = load ptr, ptr %11, align 8, !tbaa !5
  %288 = call i32 @Between_SL(ptr noundef %285, ptr noundef %286, ptr noundef %287)
  %289 = icmp ne i32 %288, 0
  %290 = xor i1 %289, true
  %291 = zext i1 %290 to i32
  %292 = add nsw i32 1, %291
  store i32 %292, ptr %25, align 4, !tbaa !11
  %293 = load i32, ptr %25, align 4, !tbaa !11
  %294 = icmp eq i32 %293, 1
  br i1 %294, label %295, label %315

295:                                              ; preds = %284
  %296 = load i16, ptr @Reversed, align 2, !tbaa !13
  %297 = sext i16 %296 to i32
  %298 = load ptr, ptr %12, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.Node, ptr %298, i32 0, i32 45
  %300 = load ptr, ptr %299, align 8, !tbaa !15
  %301 = getelementptr inbounds %struct.Segment, ptr %300, i32 0, i32 0
  %302 = load i8, ptr %301, align 8, !tbaa !18
  %303 = sext i8 %302 to i32
  %304 = icmp eq i32 %297, %303
  br i1 %304, label %305, label %309

305:                                              ; preds = %295
  %306 = load ptr, ptr %12, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.Node, ptr %306, i32 0, i32 16
  %308 = load ptr, ptr %307, align 8, !tbaa !20
  br label %313

309:                                              ; preds = %295
  %310 = load ptr, ptr %12, align 8, !tbaa !5
  %311 = getelementptr inbounds %struct.Node, ptr %310, i32 0, i32 15
  %312 = load ptr, ptr %311, align 8, !tbaa !21
  br label %313

313:                                              ; preds = %309, %305
  %314 = phi ptr [ %308, %305 ], [ %312, %309 ]
  br label %335

315:                                              ; preds = %284
  %316 = load i16, ptr @Reversed, align 2, !tbaa !13
  %317 = sext i16 %316 to i32
  %318 = load ptr, ptr %12, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.Node, ptr %318, i32 0, i32 45
  %320 = load ptr, ptr %319, align 8, !tbaa !15
  %321 = getelementptr inbounds %struct.Segment, ptr %320, i32 0, i32 0
  %322 = load i8, ptr %321, align 8, !tbaa !18
  %323 = sext i8 %322 to i32
  %324 = icmp eq i32 %317, %323
  br i1 %324, label %325, label %329

325:                                              ; preds = %315
  %326 = load ptr, ptr %12, align 8, !tbaa !5
  %327 = getelementptr inbounds %struct.Node, ptr %326, i32 0, i32 15
  %328 = load ptr, ptr %327, align 8, !tbaa !21
  br label %333

329:                                              ; preds = %315
  %330 = load ptr, ptr %12, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.Node, ptr %330, i32 0, i32 16
  %332 = load ptr, ptr %331, align 8, !tbaa !20
  br label %333

333:                                              ; preds = %329, %325
  %334 = phi ptr [ %328, %325 ], [ %332, %329 ]
  br label %335

335:                                              ; preds = %333, %313
  %336 = phi ptr [ %314, %313 ], [ %334, %333 ]
  store ptr %336, ptr %13, align 8, !tbaa !5
  br label %389

337:                                              ; preds = %281
  %338 = load i32, ptr %28, align 4, !tbaa !11
  %339 = add nsw i32 4, %338
  store i32 %339, ptr %25, align 4, !tbaa !11
  %340 = load i32, ptr %28, align 4, !tbaa !11
  %341 = icmp eq i32 %340, 1
  br i1 %341, label %342, label %362

342:                                              ; preds = %337
  %343 = load i16, ptr @Reversed, align 2, !tbaa !13
  %344 = sext i16 %343 to i32
  %345 = load ptr, ptr %12, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.Node, ptr %345, i32 0, i32 45
  %347 = load ptr, ptr %346, align 8, !tbaa !15
  %348 = getelementptr inbounds %struct.Segment, ptr %347, i32 0, i32 0
  %349 = load i8, ptr %348, align 8, !tbaa !18
  %350 = sext i8 %349 to i32
  %351 = icmp eq i32 %344, %350
  br i1 %351, label %352, label %356

352:                                              ; preds = %342
  %353 = load ptr, ptr %12, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.Node, ptr %353, i32 0, i32 16
  %355 = load ptr, ptr %354, align 8, !tbaa !20
  br label %360

356:                                              ; preds = %342
  %357 = load ptr, ptr %12, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.Node, ptr %357, i32 0, i32 15
  %359 = load ptr, ptr %358, align 8, !tbaa !21
  br label %360

360:                                              ; preds = %356, %352
  %361 = phi ptr [ %355, %352 ], [ %359, %356 ]
  br label %382

362:                                              ; preds = %337
  %363 = load i16, ptr @Reversed, align 2, !tbaa !13
  %364 = sext i16 %363 to i32
  %365 = load ptr, ptr %12, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.Node, ptr %365, i32 0, i32 45
  %367 = load ptr, ptr %366, align 8, !tbaa !15
  %368 = getelementptr inbounds %struct.Segment, ptr %367, i32 0, i32 0
  %369 = load i8, ptr %368, align 8, !tbaa !18
  %370 = sext i8 %369 to i32
  %371 = icmp eq i32 %364, %370
  br i1 %371, label %372, label %376

372:                                              ; preds = %362
  %373 = load ptr, ptr %12, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.Node, ptr %373, i32 0, i32 15
  %375 = load ptr, ptr %374, align 8, !tbaa !21
  br label %380

376:                                              ; preds = %362
  %377 = load ptr, ptr %12, align 8, !tbaa !5
  %378 = getelementptr inbounds %struct.Node, ptr %377, i32 0, i32 16
  %379 = load ptr, ptr %378, align 8, !tbaa !20
  br label %380

380:                                              ; preds = %376, %372
  %381 = phi ptr [ %375, %372 ], [ %379, %376 ]
  br label %382

382:                                              ; preds = %380, %360
  %383 = phi ptr [ %361, %360 ], [ %381, %380 ]
  store ptr %383, ptr %13, align 8, !tbaa !5
  %384 = load ptr, ptr %13, align 8, !tbaa !5
  %385 = load ptr, ptr %6, align 8, !tbaa !5
  %386 = icmp eq ptr %384, %385
  br i1 %386, label %387, label %388

387:                                              ; preds = %382
  br label %667

388:                                              ; preds = %382
  br label %389

389:                                              ; preds = %388, %335
  %390 = load ptr, ptr %12, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.Node, ptr %390, i32 0, i32 26
  %392 = load ptr, ptr %391, align 8, !tbaa !26
  %393 = load ptr, ptr %13, align 8, !tbaa !5
  %394 = icmp eq ptr %392, %393
  br i1 %394, label %406, label %395

395:                                              ; preds = %389
  %396 = load ptr, ptr %12, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.Node, ptr %396, i32 0, i32 27
  %398 = load ptr, ptr %397, align 8, !tbaa !27
  %399 = load ptr, ptr %13, align 8, !tbaa !5
  %400 = icmp eq ptr %398, %399
  br i1 %400, label %406, label %401

401:                                              ; preds = %395
  %402 = load ptr, ptr %12, align 8, !tbaa !5
  %403 = load ptr, ptr %13, align 8, !tbaa !5
  %404 = call i32 @IsCommonEdge(ptr noundef %402, ptr noundef %403)
  %405 = icmp ne i32 %404, 0
  br i1 %405, label %406, label %407

406:                                              ; preds = %401, %395, %389
  br label %667

407:                                              ; preds = %401
  %408 = load i64, ptr %22, align 8, !tbaa !9
  %409 = load ptr, ptr @C, align 8, !tbaa !5
  %410 = load ptr, ptr %12, align 8, !tbaa !5
  %411 = load ptr, ptr %13, align 8, !tbaa !5
  %412 = call i32 %409(ptr noundef %410, ptr noundef %411)
  %413 = sext i32 %412 to i64
  %414 = add nsw i64 %408, %413
  store i64 %414, ptr %23, align 8, !tbaa !9
  %415 = load ptr, ptr %13, align 8, !tbaa !5
  %416 = load ptr, ptr %6, align 8, !tbaa !5
  %417 = call i32 @Forbidden(ptr noundef %415, ptr noundef %416)
  %418 = icmp ne i32 %417, 0
  br i1 %418, label %449, label %419

419:                                              ; preds = %407
  %420 = load ptr, ptr @c, align 8, !tbaa !5
  %421 = icmp ne ptr %420, null
  br i1 %421, label %422, label %431

422:                                              ; preds = %419
  %423 = load i64, ptr %23, align 8, !tbaa !9
  %424 = load ptr, ptr @c, align 8, !tbaa !5
  %425 = load ptr, ptr %13, align 8, !tbaa !5
  %426 = load ptr, ptr %6, align 8, !tbaa !5
  %427 = call i32 %424(ptr noundef %425, ptr noundef %426)
  %428 = sext i32 %427 to i64
  %429 = sub nsw i64 %423, %428
  %430 = icmp sgt i64 %429, 0
  br i1 %430, label %431, label %449

431:                                              ; preds = %422, %419
  %432 = load i64, ptr %23, align 8, !tbaa !9
  %433 = load ptr, ptr @C, align 8, !tbaa !5
  %434 = load ptr, ptr %13, align 8, !tbaa !5
  %435 = load ptr, ptr %6, align 8, !tbaa !5
  %436 = call i32 %433(ptr noundef %434, ptr noundef %435)
  %437 = sext i32 %436 to i64
  %438 = sub nsw i64 %432, %437
  %439 = load ptr, ptr %9, align 8, !tbaa !5
  store i64 %438, ptr %439, align 8, !tbaa !9
  %440 = icmp sgt i64 %438, 0
  br i1 %440, label %441, label %449

441:                                              ; preds = %431
  %442 = load ptr, ptr %6, align 8, !tbaa !5
  %443 = load ptr, ptr %7, align 8, !tbaa !5
  %444 = load ptr, ptr %10, align 8, !tbaa !5
  %445 = load ptr, ptr %11, align 8, !tbaa !5
  %446 = load ptr, ptr %12, align 8, !tbaa !5
  %447 = load ptr, ptr %13, align 8, !tbaa !5
  %448 = load i32, ptr %25, align 4, !tbaa !11
  call void @Make3OptMove(ptr noundef %442, ptr noundef %443, ptr noundef %444, ptr noundef %445, ptr noundef %446, ptr noundef %447, i32 noundef %448)
  store ptr null, ptr %5, align 8
  store i32 1, ptr %31, align 4
  br label %704

449:                                              ; preds = %431, %422, %407
  %450 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !11
  %451 = icmp ne i32 %450, 0
  br i1 %451, label %452, label %463

452:                                              ; preds = %449
  %453 = load i64, ptr %23, align 8, !tbaa !9
  %454 = load i32, ptr @Precision, align 4, !tbaa !11
  %455 = sext i32 %454 to i64
  %456 = sub nsw i64 %453, %455
  %457 = load ptr, ptr %13, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.Node, ptr %457, i32 0, i32 5
  %459 = load i32, ptr %458, align 4, !tbaa !28
  %460 = sext i32 %459 to i64
  %461 = icmp slt i64 %456, %460
  br i1 %461, label %462, label %463

462:                                              ; preds = %452
  br label %667

463:                                              ; preds = %452, %449
  %464 = load i32, ptr @Backtracking, align 4, !tbaa !11
  %465 = icmp ne i32 %464, 0
  br i1 %465, label %466, label %469

466:                                              ; preds = %463
  %467 = load i32, ptr @Swaps, align 4, !tbaa !11
  %468 = icmp sgt i32 %467, 0
  br i1 %468, label %469, label %602

469:                                              ; preds = %466, %463
  %470 = load i64, ptr %23, align 8, !tbaa !9
  %471 = load i64, ptr %24, align 8, !tbaa !9
  %472 = icmp sgt i64 %470, %471
  br i1 %472, label %535, label %473

473:                                              ; preds = %469
  %474 = load i64, ptr %23, align 8, !tbaa !9
  %475 = load i64, ptr %24, align 8, !tbaa !9
  %476 = icmp eq i64 %474, %475
  br i1 %476, label %477, label %601

477:                                              ; preds = %473
  %478 = load ptr, ptr %12, align 8, !tbaa !5
  %479 = getelementptr inbounds %struct.Node, ptr %478, i32 0, i32 19
  %480 = load ptr, ptr %479, align 8, !tbaa !29
  %481 = icmp ne ptr %480, null
  br i1 %481, label %482, label %494

482:                                              ; preds = %477
  %483 = load ptr, ptr %12, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct.Node, ptr %483, i32 0, i32 19
  %485 = load ptr, ptr %484, align 8, !tbaa !29
  %486 = load ptr, ptr %13, align 8, !tbaa !5
  %487 = icmp eq ptr %485, %486
  br i1 %487, label %601, label %488

488:                                              ; preds = %482
  %489 = load ptr, ptr %13, align 8, !tbaa !5
  %490 = getelementptr inbounds %struct.Node, ptr %489, i32 0, i32 19
  %491 = load ptr, ptr %490, align 8, !tbaa !29
  %492 = load ptr, ptr %12, align 8, !tbaa !5
  %493 = icmp eq ptr %491, %492
  br i1 %493, label %601, label %506

494:                                              ; preds = %477
  %495 = load ptr, ptr %12, align 8, !tbaa !5
  %496 = getelementptr inbounds %struct.Node, ptr %495, i32 0, i32 21
  %497 = load ptr, ptr %496, align 8, !tbaa !30
  %498 = load ptr, ptr %13, align 8, !tbaa !5
  %499 = icmp eq ptr %497, %498
  br i1 %499, label %601, label %500

500:                                              ; preds = %494
  %501 = load ptr, ptr %13, align 8, !tbaa !5
  %502 = getelementptr inbounds %struct.Node, ptr %501, i32 0, i32 21
  %503 = load ptr, ptr %502, align 8, !tbaa !30
  %504 = load ptr, ptr %12, align 8, !tbaa !5
  %505 = icmp eq ptr %503, %504
  br i1 %505, label %601, label %506

506:                                              ; preds = %500, %488
  %507 = load ptr, ptr %16, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.Node, ptr %507, i32 0, i32 19
  %509 = load ptr, ptr %508, align 8, !tbaa !29
  %510 = icmp ne ptr %509, null
  br i1 %510, label %511, label %523

511:                                              ; preds = %506
  %512 = load ptr, ptr %16, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.Node, ptr %512, i32 0, i32 19
  %514 = load ptr, ptr %513, align 8, !tbaa !29
  %515 = load ptr, ptr %17, align 8, !tbaa !5
  %516 = icmp eq ptr %514, %515
  br i1 %516, label %535, label %517

517:                                              ; preds = %511
  %518 = load ptr, ptr %17, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.Node, ptr %518, i32 0, i32 19
  %520 = load ptr, ptr %519, align 8, !tbaa !29
  %521 = load ptr, ptr %16, align 8, !tbaa !5
  %522 = icmp eq ptr %520, %521
  br i1 %522, label %535, label %601

523:                                              ; preds = %506
  %524 = load ptr, ptr %16, align 8, !tbaa !5
  %525 = getelementptr inbounds %struct.Node, ptr %524, i32 0, i32 21
  %526 = load ptr, ptr %525, align 8, !tbaa !30
  %527 = load ptr, ptr %17, align 8, !tbaa !5
  %528 = icmp eq ptr %526, %527
  br i1 %528, label %535, label %529

529:                                              ; preds = %523
  %530 = load ptr, ptr %17, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.Node, ptr %530, i32 0, i32 21
  %532 = load ptr, ptr %531, align 8, !tbaa !30
  %533 = load ptr, ptr %16, align 8, !tbaa !5
  %534 = icmp eq ptr %532, %533
  br i1 %534, label %535, label %601

535:                                              ; preds = %529, %523, %517, %511, %469
  %536 = load i32, ptr @Swaps, align 4, !tbaa !11
  %537 = load i32, ptr @MaxSwaps, align 4, !tbaa !11
  %538 = icmp slt i32 %536, %537
  br i1 %538, label %539, label %601

539:                                              ; preds = %535
  %540 = load ptr, ptr %12, align 8, !tbaa !5
  %541 = load ptr, ptr %13, align 8, !tbaa !5
  %542 = call i32 @Excludable(ptr noundef %540, ptr noundef %541)
  %543 = icmp ne i32 %542, 0
  br i1 %543, label %544, label %601

544:                                              ; preds = %539
  %545 = load ptr, ptr %12, align 8, !tbaa !5
  %546 = getelementptr inbounds %struct.Node, ptr %545, i32 0, i32 32
  %547 = load ptr, ptr %546, align 8, !tbaa !31
  %548 = load ptr, ptr %13, align 8, !tbaa !5
  %549 = icmp eq ptr %547, %548
  br i1 %549, label %601, label %550

550:                                              ; preds = %544
  %551 = load ptr, ptr %13, align 8, !tbaa !5
  %552 = getelementptr inbounds %struct.Node, ptr %551, i32 0, i32 32
  %553 = load ptr, ptr %552, align 8, !tbaa !31
  %554 = load ptr, ptr %12, align 8, !tbaa !5
  %555 = icmp eq ptr %553, %554
  br i1 %555, label %601, label %556

556:                                              ; preds = %550
  %557 = load i32, ptr @RestrictedSearch, align 4, !tbaa !11
  %558 = icmp ne i32 %557, 0
  br i1 %558, label %559, label %594

559:                                              ; preds = %556
  %560 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %561 = icmp ne i32 %560, 3
  br i1 %561, label %562, label %594

562:                                              ; preds = %559
  %563 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %564 = icmp ne i32 %563, 6
  br i1 %564, label %565, label %594

565:                                              ; preds = %562
  %566 = load i64, ptr %21, align 8, !tbaa !9
  %567 = load ptr, ptr %11, align 8, !tbaa !5
  %568 = getelementptr inbounds %struct.Node, ptr %567, i32 0, i32 9
  %569 = load i32, ptr %568, align 4, !tbaa !32
  %570 = sext i32 %569 to i64
  %571 = sub nsw i64 %566, %570
  %572 = load i64, ptr %23, align 8, !tbaa !9
  %573 = load ptr, ptr %13, align 8, !tbaa !5
  %574 = getelementptr inbounds %struct.Node, ptr %573, i32 0, i32 9
  %575 = load i32, ptr %574, align 4, !tbaa !32
  %576 = sext i32 %575 to i64
  %577 = sub nsw i64 %572, %576
  %578 = icmp eq i64 %571, %577
  br i1 %578, label %579, label %594

579:                                              ; preds = %565
  %580 = load i64, ptr %22, align 8, !tbaa !9
  %581 = load ptr, ptr %12, align 8, !tbaa !5
  %582 = getelementptr inbounds %struct.Node, ptr %581, i32 0, i32 9
  %583 = load i32, ptr %582, align 4, !tbaa !32
  %584 = sext i32 %583 to i64
  %585 = add nsw i64 %580, %584
  %586 = load i64, ptr %20, align 8, !tbaa !9
  %587 = load ptr, ptr %10, align 8, !tbaa !5
  %588 = getelementptr inbounds %struct.Node, ptr %587, i32 0, i32 9
  %589 = load i32, ptr %588, align 4, !tbaa !32
  %590 = sext i32 %589 to i64
  %591 = add nsw i64 %586, %590
  %592 = icmp eq i64 %585, %591
  br i1 %592, label %593, label %594

593:                                              ; preds = %579
  br label %667

594:                                              ; preds = %579, %565, %562, %559, %556
  %595 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %595, ptr %14, align 8, !tbaa !5
  %596 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %596, ptr %15, align 8, !tbaa !5
  %597 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %597, ptr %16, align 8, !tbaa !5
  %598 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %598, ptr %17, align 8, !tbaa !5
  %599 = load i32, ptr %25, align 4, !tbaa !11
  store i32 %599, ptr %26, align 4, !tbaa !11
  %600 = load i64, ptr %23, align 8, !tbaa !9
  store i64 %600, ptr %24, align 8, !tbaa !9
  br label %601

601:                                              ; preds = %594, %550, %544, %539, %535, %529, %517, %500, %494, %488, %482, %473
  br label %666

602:                                              ; preds = %466
  %603 = load i32, ptr @MaxSwaps, align 4, !tbaa !11
  %604 = icmp sgt i32 %603, 0
  br i1 %604, label %605, label %665

605:                                              ; preds = %602
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #3
  %606 = load i64, ptr %23, align 8, !tbaa !9
  store i64 %606, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #3
  %607 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %607, ptr %33, align 8, !tbaa !5
  %608 = load ptr, ptr %6, align 8, !tbaa !5
  %609 = load ptr, ptr %7, align 8, !tbaa !5
  %610 = load ptr, ptr %10, align 8, !tbaa !5
  %611 = load ptr, ptr %11, align 8, !tbaa !5
  %612 = load ptr, ptr %12, align 8, !tbaa !5
  %613 = load ptr, ptr %13, align 8, !tbaa !5
  %614 = load i32, ptr %25, align 4, !tbaa !11
  call void @Make3OptMove(ptr noundef %608, ptr noundef %609, ptr noundef %610, ptr noundef %611, ptr noundef %612, ptr noundef %613, i32 noundef %614)
  %615 = load ptr, ptr %6, align 8, !tbaa !5
  %616 = load ptr, ptr %7, align 8, !tbaa !5
  call void @Exclude(ptr noundef %615, ptr noundef %616)
  %617 = load ptr, ptr %10, align 8, !tbaa !5
  %618 = load ptr, ptr %11, align 8, !tbaa !5
  call void @Exclude(ptr noundef %617, ptr noundef %618)
  %619 = load ptr, ptr %12, align 8, !tbaa !5
  %620 = load ptr, ptr %13, align 8, !tbaa !5
  call void @Exclude(ptr noundef %619, ptr noundef %620)
  br label %621

621:                                              ; preds = %628, %605
  %622 = load ptr, ptr @BestSubsequentMove, align 8, !tbaa !5
  %623 = load ptr, ptr %6, align 8, !tbaa !5
  %624 = load ptr, ptr %33, align 8, !tbaa !5
  %625 = load ptr, ptr %9, align 8, !tbaa !5
  %626 = call ptr %622(ptr noundef %623, ptr noundef %624, ptr noundef %32, ptr noundef %625)
  store ptr %626, ptr %33, align 8, !tbaa !5
  %627 = icmp ne ptr %626, null
  br i1 %627, label %628, label %629

628:                                              ; preds = %621
  br label %621, !llvm.loop !33

629:                                              ; preds = %621
  %630 = load ptr, ptr %9, align 8, !tbaa !5
  %631 = load i64, ptr %630, align 8, !tbaa !9
  %632 = icmp sgt i64 %631, 0
  br i1 %632, label %633, label %634

633:                                              ; preds = %629
  store ptr null, ptr %5, align 8
  store i32 1, ptr %31, align 4
  br label %662

634:                                              ; preds = %629
  call void @RestoreTour()
  %635 = load ptr, ptr %7, align 8, !tbaa !5
  %636 = load i16, ptr @Reversed, align 2, !tbaa !13
  %637 = sext i16 %636 to i32
  %638 = load ptr, ptr %6, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.Node, ptr %638, i32 0, i32 45
  %640 = load ptr, ptr %639, align 8, !tbaa !15
  %641 = getelementptr inbounds %struct.Segment, ptr %640, i32 0, i32 0
  %642 = load i8, ptr %641, align 8, !tbaa !18
  %643 = sext i8 %642 to i32
  %644 = icmp eq i32 %637, %643
  br i1 %644, label %645, label %649

645:                                              ; preds = %634
  %646 = load ptr, ptr %6, align 8, !tbaa !5
  %647 = getelementptr inbounds %struct.Node, ptr %646, i32 0, i32 16
  %648 = load ptr, ptr %647, align 8, !tbaa !20
  br label %653

649:                                              ; preds = %634
  %650 = load ptr, ptr %6, align 8, !tbaa !5
  %651 = getelementptr inbounds %struct.Node, ptr %650, i32 0, i32 15
  %652 = load ptr, ptr %651, align 8, !tbaa !21
  br label %653

653:                                              ; preds = %649, %645
  %654 = phi ptr [ %648, %645 ], [ %652, %649 ]
  %655 = icmp ne ptr %635, %654
  br i1 %655, label %656, label %661

656:                                              ; preds = %653
  %657 = load i16, ptr @Reversed, align 2, !tbaa !13
  %658 = sext i16 %657 to i32
  %659 = xor i32 %658, 1
  %660 = trunc i32 %659 to i16
  store i16 %660, ptr @Reversed, align 2, !tbaa !13
  br label %661

661:                                              ; preds = %656, %653
  store i32 0, ptr %31, align 4
  br label %662

662:                                              ; preds = %661, %633
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #3
  %663 = load i32, ptr %31, align 4
  switch i32 %663, label %704 [
    i32 0, label %664
  ]

664:                                              ; preds = %662
  br label %665

665:                                              ; preds = %664, %602
  br label %666

666:                                              ; preds = %665, %601
  br label %667

667:                                              ; preds = %666, %593, %462, %406, %387
  %668 = load i32, ptr %28, align 4, !tbaa !11
  %669 = add nsw i32 %668, 1
  store i32 %669, ptr %28, align 4, !tbaa !11
  br label %277, !llvm.loop !35

670:                                              ; preds = %277
  br label %671

671:                                              ; preds = %670, %269
  %672 = load ptr, ptr %19, align 8, !tbaa !5
  %673 = getelementptr inbounds %struct.Candidate, ptr %672, i32 1
  store ptr %673, ptr %19, align 8, !tbaa !5
  br label %226, !llvm.loop !36

674:                                              ; preds = %275, %226
  br label %675

675:                                              ; preds = %674, %221, %171
  %676 = load i32, ptr %27, align 4, !tbaa !11
  %677 = add nsw i32 %676, 1
  store i32 %677, ptr %27, align 4, !tbaa !11
  br label %107, !llvm.loop !37

678:                                              ; preds = %107
  br label %679

679:                                              ; preds = %678, %99
  %680 = load ptr, ptr %18, align 8, !tbaa !5
  %681 = getelementptr inbounds %struct.Candidate, ptr %680, i32 1
  store ptr %681, ptr %18, align 8, !tbaa !5
  br label %64, !llvm.loop !38

682:                                              ; preds = %105, %64
  %683 = load ptr, ptr %9, align 8, !tbaa !5
  store i64 0, ptr %683, align 8, !tbaa !9
  %684 = load ptr, ptr %17, align 8, !tbaa !5
  %685 = icmp ne ptr %684, null
  br i1 %685, label %686, label %702

686:                                              ; preds = %682
  %687 = load ptr, ptr %6, align 8, !tbaa !5
  %688 = load ptr, ptr %7, align 8, !tbaa !5
  %689 = load ptr, ptr %14, align 8, !tbaa !5
  %690 = load ptr, ptr %15, align 8, !tbaa !5
  %691 = load ptr, ptr %16, align 8, !tbaa !5
  %692 = load ptr, ptr %17, align 8, !tbaa !5
  %693 = load i32, ptr %26, align 4, !tbaa !11
  call void @Make3OptMove(ptr noundef %687, ptr noundef %688, ptr noundef %689, ptr noundef %690, ptr noundef %691, ptr noundef %692, i32 noundef %693)
  %694 = load ptr, ptr %6, align 8, !tbaa !5
  %695 = load ptr, ptr %7, align 8, !tbaa !5
  call void @Exclude(ptr noundef %694, ptr noundef %695)
  %696 = load ptr, ptr %14, align 8, !tbaa !5
  %697 = load ptr, ptr %15, align 8, !tbaa !5
  call void @Exclude(ptr noundef %696, ptr noundef %697)
  %698 = load ptr, ptr %16, align 8, !tbaa !5
  %699 = load ptr, ptr %17, align 8, !tbaa !5
  call void @Exclude(ptr noundef %698, ptr noundef %699)
  %700 = load i64, ptr %24, align 8, !tbaa !9
  %701 = load ptr, ptr %8, align 8, !tbaa !5
  store i64 %700, ptr %701, align 8, !tbaa !9
  br label %702

702:                                              ; preds = %686, %682
  %703 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %703, ptr %5, align 8
  store i32 1, ptr %31, align 4
  br label %704

704:                                              ; preds = %702, %662, %441, %209
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  %705 = load ptr, ptr %5, align 8
  ret ptr %705
}

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

declare i32 @IsCommonEdge(ptr noundef, ptr noundef) #2

declare i32 @Forbidden(ptr noundef, ptr noundef) #2

declare void @Flip_SL(ptr noundef, ptr noundef, ptr noundef) #2

declare i32 @Excludable(ptr noundef, ptr noundef) #2

declare i32 @Between_SL(ptr noundef, ptr noundef, ptr noundef) #2

declare void @Make3OptMove(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef) #2

declare void @Exclude(ptr noundef, ptr noundef) #2

declare void @RestoreTour() #2

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"short", !7, i64 0}
!15 = !{!16, !6, i64 304}
!16 = !{!"Node", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !12, i64 48, !12, i64 52, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !6, i64 240, !6, i64 248, !6, i64 256, !6, i64 264, !6, i64 272, !6, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !17, i64 312, !17, i64 320, !17, i64 328, !17, i64 336, !17, i64 344, !17, i64 352, !7, i64 360, !7, i64 361, !7, i64 362}
!17 = !{!"double", !7, i64 0}
!18 = !{!19, !7, i64 0}
!19 = !{!"Segment", !7, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !12, i64 44, !6, i64 48}
!20 = !{!16, !6, i64 72}
!21 = !{!16, !6, i64 64}
!22 = !{!16, !6, i64 288}
!23 = !{!24, !6, i64 0}
!24 = !{!"Candidate", !6, i64 0, !12, i64 8, !12, i64 12}
!25 = !{!24, !12, i64 8}
!26 = !{!16, !6, i64 152}
!27 = !{!16, !6, i64 160}
!28 = !{!16, !12, i64 20}
!29 = !{!16, !6, i64 96}
!30 = !{!16, !6, i64 112}
!31 = !{!16, !6, i64 200}
!32 = !{!16, !12, i64 36}
!33 = distinct !{!33, !34}
!34 = !{!"llvm.loop.mustprogress"}
!35 = distinct !{!35, !34}
!36 = distinct !{!36, !34}
!37 = distinct !{!37, !34}
!38 = distinct !{!38, !34}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@Reversed = external dso_local local_unnamed_addr global i16, align 2
@GainCriterionUsed = external dso_local local_unnamed_addr global i32, align 4
@ProblemType = external dso_local local_unnamed_addr global i32, align 4
@MaxBreadth = external dso_local local_unnamed_addr global i32, align 4
@C = external dso_local local_unnamed_addr global ptr, align 8
@c = external dso_local local_unnamed_addr global ptr, align 8
@Backtracking = external dso_local local_unnamed_addr global i32, align 4
@Precision = external dso_local local_unnamed_addr global i32, align 4
@Swaps = external dso_local local_unnamed_addr global i32, align 4
@MaxSwaps = external dso_local local_unnamed_addr global i32, align 4
@RestrictedSearch = external dso_local local_unnamed_addr global i32, align 4
@BestSubsequentMove = external dso_local local_unnamed_addr global ptr, align 8

; Function Attrs: nounwind uwtable
define dso_local ptr @Best3OptMove(ptr noundef %0, ptr noundef %1, ptr nocapture noundef %2, ptr noundef %3) local_unnamed_addr #0 {
  %5 = alloca i64, align 8
  %6 = load i16, ptr @Reversed, align 2, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %0, i64 304
  %8 = load ptr, ptr %7, align 8, !tbaa !9
  %9 = load i8, ptr %8, align 8, !tbaa !14
  %10 = sext i8 %9 to i16
  %11 = icmp eq i16 %6, %10
  %12 = getelementptr inbounds i8, ptr %0, i64 72
  %13 = getelementptr inbounds i8, ptr %0, i64 64
  %.in = select i1 %11, ptr %12, ptr %13
  %14 = load ptr, ptr %.in, align 8, !tbaa !16
  %.not = icmp eq ptr %14, %1
  br i1 %.not, label %17, label %15

15:                                               ; preds = %4
  %16 = xor i16 %6, 1
  store i16 %16, ptr @Reversed, align 2, !tbaa !5
  br label %17

17:                                               ; preds = %15, %4
  %18 = getelementptr inbounds i8, ptr %1, i64 288
  %19 = load ptr, ptr %18, align 8, !tbaa !17
  %20 = load ptr, ptr %19, align 8, !tbaa !18
  %.not284418 = icmp eq ptr %20, null
  br i1 %.not284418, label %._crit_edge.thread, label %.lr.ph427

._crit_edge.thread:                               ; preds = %17
  store i64 0, ptr %3, align 8, !tbaa !20
  br label %295

.lr.ph427:                                        ; preds = %17
  %21 = getelementptr inbounds i8, ptr %1, i64 64
  %22 = getelementptr inbounds i8, ptr %1, i64 72
  br label %23

23:                                               ; preds = %.lr.ph427, %.loopexit312
  %24 = phi ptr [ %20, %.lr.ph427 ], [ %293, %.loopexit312 ]
  %.0215426 = phi i32 [ 0, %.lr.ph427 ], [ %.1216, %.loopexit312 ]
  %.0219425 = phi i32 [ 0, %.lr.ph427 ], [ %.7, %.loopexit312 ]
  %.0222424 = phi i64 [ -9223372036854775808, %.lr.ph427 ], [ %.7229, %.loopexit312 ]
  %.0239423 = phi ptr [ null, %.lr.ph427 ], [ %.7246, %.loopexit312 ]
  %.0247422 = phi ptr [ null, %.lr.ph427 ], [ %.7254, %.loopexit312 ]
  %.0256421 = phi ptr [ %19, %.lr.ph427 ], [ %292, %.loopexit312 ]
  %.0257420 = phi ptr [ null, %.lr.ph427 ], [ %.7264, %.loopexit312 ]
  %.0265419 = phi ptr [ null, %.lr.ph427 ], [ %.7272, %.loopexit312 ]
  %25 = load ptr, ptr %21, align 8, !tbaa !22
  %26 = icmp eq ptr %24, %25
  br i1 %26, label %.loopexit312, label %27

27:                                               ; preds = %23
  %28 = load ptr, ptr %22, align 8, !tbaa !23
  %29 = icmp eq ptr %24, %28
  br i1 %29, label %.loopexit312, label %30

30:                                               ; preds = %27
  %31 = load i64, ptr %2, align 8, !tbaa !20
  %32 = getelementptr inbounds i8, ptr %.0256421, i64 8
  %33 = load i32, ptr %32, align 8, !tbaa !24
  %34 = sext i32 %33 to i64
  %35 = sub nsw i64 %31, %34
  %36 = icmp slt i64 %35, 1
  %37 = load i32, ptr @GainCriterionUsed, align 4
  %38 = icmp ne i32 %37, 0
  %or.cond = select i1 %36, i1 %38, i1 false
  %39 = load i32, ptr @ProblemType, align 4
  %40 = icmp ne i32 %39, 3
  %41 = icmp ne i32 %39, 6
  %42 = and i1 %40, %41
  %or.cond5 = select i1 %or.cond, i1 %42, i1 false
  br i1 %or.cond5, label %.loopexit312, label %43

43:                                               ; preds = %30
  %44 = add nsw i32 %.0215426, 1
  %45 = load i32, ptr @MaxBreadth, align 4, !tbaa !25
  %.not285 = icmp slt i32 %.0215426, %45
  br i1 %.not285, label %.preheader311, label %._crit_edge

.preheader311:                                    ; preds = %43
  %46 = getelementptr inbounds i8, ptr %24, i64 152
  %47 = getelementptr inbounds i8, ptr %24, i64 304
  %48 = getelementptr inbounds i8, ptr %24, i64 160
  %49 = getelementptr inbounds i8, ptr %24, i64 36
  br label %50

50:                                               ; preds = %.preheader311, %.loopexit310
  %indvars.iv = phi i32 [ 2, %.preheader311 ], [ %indvars.iv.next, %.loopexit310 ]
  %.0218416 = phi i32 [ 1, %.preheader311 ], [ %291, %.loopexit310 ]
  %.1220415 = phi i32 [ %.0219425, %.preheader311 ], [ %.6, %.loopexit310 ]
  %.1223414 = phi i64 [ %.0222424, %.preheader311 ], [ %.6228, %.loopexit310 ]
  %.1240413 = phi ptr [ %.0239423, %.preheader311 ], [ %.6245, %.loopexit310 ]
  %.1248412 = phi ptr [ %.0247422, %.preheader311 ], [ %.6253, %.loopexit310 ]
  %.1258411 = phi ptr [ %.0257420, %.preheader311 ], [ %.6263, %.loopexit310 ]
  %.1266410 = phi ptr [ %.0265419, %.preheader311 ], [ %.6271, %.loopexit310 ]
  %51 = icmp eq i32 %.0218416, 1
  %52 = load i16, ptr @Reversed, align 2, !tbaa !5
  %53 = load ptr, ptr %47, align 8, !tbaa !9
  %54 = load i8, ptr %53, align 8, !tbaa !14
  %55 = sext i8 %54 to i16
  %56 = icmp eq i16 %52, %55
  %57 = xor i1 %56, %51
  %..v.pn = select i1 %57, i64 72, i64 64
  %.in286 = getelementptr inbounds i8, ptr %24, i64 %..v.pn
  %58 = load ptr, ptr %.in286, align 8, !tbaa !16
  %59 = load ptr, ptr %46, align 8, !tbaa !26
  %60 = icmp eq ptr %59, %58
  br i1 %60, label %.loopexit310, label %61

61:                                               ; preds = %50
  %62 = load ptr, ptr %48, align 8, !tbaa !27
  %63 = icmp eq ptr %62, %58
  br i1 %63, label %.loopexit310, label %64

64:                                               ; preds = %61
  %65 = call i32 @IsCommonEdge(ptr noundef nonnull %24, ptr noundef %58) #3
  %.not287 = icmp eq i32 %65, 0
  br i1 %.not287, label %66, label %.loopexit310

66:                                               ; preds = %64
  %67 = load ptr, ptr @C, align 8, !tbaa !16
  %68 = call i32 %67(ptr noundef nonnull %24, ptr noundef %58) #3
  %69 = sext i32 %68 to i64
  %70 = add nsw i64 %35, %69
  br i1 %51, label %71, label %86

71:                                               ; preds = %66
  %72 = call i32 @Forbidden(ptr noundef %58, ptr noundef %0) #3
  %.not288 = icmp eq i32 %72, 0
  br i1 %.not288, label %73, label %86

73:                                               ; preds = %71
  %74 = load ptr, ptr @c, align 8, !tbaa !16
  %.not289 = icmp eq ptr %74, null
  br i1 %.not289, label %79, label %75

75:                                               ; preds = %73
  %76 = call i32 %74(ptr noundef %58, ptr noundef %0) #3
  %77 = sext i32 %76 to i64
  %78 = icmp sgt i64 %70, %77
  br i1 %78, label %79, label %86

79:                                               ; preds = %75, %73
  %80 = load ptr, ptr @C, align 8, !tbaa !16
  %81 = call i32 %80(ptr noundef %58, ptr noundef %0) #3
  %82 = sext i32 %81 to i64
  %83 = sub nsw i64 %70, %82
  store i64 %83, ptr %3, align 8, !tbaa !20
  %84 = icmp sgt i64 %83, 0
  br i1 %84, label %85, label %86

85:                                               ; preds = %79
  call void @Flip_SL(ptr noundef %0, ptr noundef %1, ptr noundef nonnull %24) #3
  br label %295

86:                                               ; preds = %79, %75, %71, %66
  %87 = load i32, ptr @Backtracking, align 4, !tbaa !25
  %.not290 = icmp eq i32 %87, 0
  br i1 %.not290, label %90, label %88

88:                                               ; preds = %86
  %89 = call i32 @Excludable(ptr noundef nonnull %24, ptr noundef %58) #3
  %.not291 = icmp eq i32 %89, 0
  br i1 %.not291, label %.loopexit310, label %90

90:                                               ; preds = %88, %86
  %91 = getelementptr inbounds i8, ptr %58, i64 288
  %92 = load ptr, ptr %91, align 8, !tbaa !17
  %93 = load ptr, ptr %92, align 8, !tbaa !18
  %.not292389 = icmp eq ptr %93, null
  br i1 %.not292389, label %.loopexit310, label %.lr.ph

.lr.ph:                                           ; preds = %90
  %94 = getelementptr inbounds i8, ptr %58, i64 64
  %95 = getelementptr inbounds i8, ptr %58, i64 72
  %96 = icmp eq i32 %.0218416, 2
  %97 = getelementptr inbounds i8, ptr %58, i64 36
  br label %98

98:                                               ; preds = %.lr.ph, %.loopexit
  %99 = phi ptr [ %93, %.lr.ph ], [ %290, %.loopexit ]
  %.0214397 = phi i32 [ 0, %.lr.ph ], [ %.1, %.loopexit ]
  %.2396 = phi i32 [ %.1220415, %.lr.ph ], [ %.5, %.loopexit ]
  %.2224395 = phi i64 [ %.1223414, %.lr.ph ], [ %.5227, %.loopexit ]
  %.2241394 = phi ptr [ %.1240413, %.lr.ph ], [ %.5244, %.loopexit ]
  %.2249393 = phi ptr [ %.1248412, %.lr.ph ], [ %.5252, %.loopexit ]
  %.0255392 = phi ptr [ %92, %.lr.ph ], [ %289, %.loopexit ]
  %.2259391 = phi ptr [ %.1258411, %.lr.ph ], [ %.5262, %.loopexit ]
  %.2267390 = phi ptr [ %.1266410, %.lr.ph ], [ %.5270, %.loopexit ]
  %100 = load ptr, ptr %94, align 8, !tbaa !22
  %101 = icmp eq ptr %99, %100
  br i1 %101, label %.loopexit, label %102

102:                                              ; preds = %98
  %103 = load ptr, ptr %95, align 8, !tbaa !23
  %104 = icmp eq ptr %99, %103
  br i1 %104, label %.loopexit, label %105

105:                                              ; preds = %102
  %106 = getelementptr inbounds i8, ptr %.0255392, i64 8
  %107 = load i32, ptr %106, align 8, !tbaa !24
  %108 = sext i32 %107 to i64
  %109 = sub nsw i64 %70, %108
  %110 = icmp slt i64 %109, 1
  %111 = load i32, ptr @GainCriterionUsed, align 4
  %112 = icmp ne i32 %111, 0
  %or.cond7 = select i1 %110, i1 %112, i1 false
  %113 = load i32, ptr @ProblemType, align 4
  %114 = icmp ne i32 %113, 3
  %115 = icmp ne i32 %113, 6
  %116 = and i1 %114, %115
  %or.cond11 = select i1 %or.cond7, i1 %116, i1 false
  br i1 %or.cond11, label %.loopexit, label %117

117:                                              ; preds = %105
  br i1 %96, label %118, label %120

118:                                              ; preds = %117
  %119 = call i32 @Between_SL(ptr noundef %1, ptr noundef nonnull %99, ptr noundef nonnull %24) #3
  %.not293 = icmp eq i32 %119, 0
  br i1 %.not293, label %.loopexit, label %120

120:                                              ; preds = %118, %117
  %121 = add nsw i32 %.0214397, 1
  %122 = load i32, ptr @MaxBreadth, align 4, !tbaa !25
  %.not294 = icmp slt i32 %.0214397, %122
  br i1 %.not294, label %.preheader, label %.loopexit310

.preheader:                                       ; preds = %120
  %123 = getelementptr inbounds i8, ptr %99, i64 304
  %124 = getelementptr inbounds i8, ptr %99, i64 152
  %125 = getelementptr inbounds i8, ptr %99, i64 160
  %126 = getelementptr inbounds i8, ptr %99, i64 96
  %127 = getelementptr inbounds i8, ptr %99, i64 112
  %128 = getelementptr inbounds i8, ptr %99, i64 200
  %129 = getelementptr inbounds i8, ptr %99, i64 36
  br label %130

130:                                              ; preds = %.preheader, %287
  %.0217388 = phi i32 [ 1, %.preheader ], [ %288, %287 ]
  %.3387 = phi i32 [ %.2396, %.preheader ], [ %.4, %287 ]
  %.3225386 = phi i64 [ %.2224395, %.preheader ], [ %.4226, %287 ]
  %.3242385 = phi ptr [ %.2241394, %.preheader ], [ %.4243, %287 ]
  %.3250384 = phi ptr [ %.2249393, %.preheader ], [ %.4251, %287 ]
  %.3260383 = phi ptr [ %.2259391, %.preheader ], [ %.4261, %287 ]
  %.3268382 = phi ptr [ %.2267390, %.preheader ], [ %.4269, %287 ]
  br i1 %51, label %131, label %141

131:                                              ; preds = %130
  %132 = call i32 @Between_SL(ptr noundef %1, ptr noundef nonnull %99, ptr noundef %58) #3
  %.not297 = icmp eq i32 %132, 0
  %133 = select i1 %.not297, i32 2, i32 1
  %134 = load i16, ptr @Reversed, align 2, !tbaa !5
  %135 = load ptr, ptr %123, align 8, !tbaa !9
  %136 = load i8, ptr %135, align 8, !tbaa !14
  %137 = sext i8 %136 to i16
  %138 = icmp eq i16 %134, %137
  %139 = xor i1 %138, %.not297
  %.442.v.pn = select i1 %139, i64 72, i64 64
  %.in298 = getelementptr inbounds i8, ptr %99, i64 %.442.v.pn
  %140 = load ptr, ptr %.in298, align 8, !tbaa !16
  br label %152

141:                                              ; preds = %130
  %142 = add nuw nsw i32 %.0217388, 4
  %143 = icmp eq i32 %.0217388, 1
  %144 = load i16, ptr @Reversed, align 2, !tbaa !5
  %145 = load ptr, ptr %123, align 8, !tbaa !9
  %146 = load i8, ptr %145, align 8, !tbaa !14
  %147 = sext i8 %146 to i16
  %148 = icmp eq i16 %144, %147
  %149 = xor i1 %148, %143
  %.444.v.pn = select i1 %149, i64 64, i64 72
  %.in296 = getelementptr inbounds i8, ptr %99, i64 %.444.v.pn
  %150 = load ptr, ptr %.in296, align 8, !tbaa !16
  %151 = icmp eq ptr %150, %0
  br i1 %151, label %287, label %152

152:                                              ; preds = %141, %131
  %.0238 = phi ptr [ %140, %131 ], [ %150, %141 ]
  %.0221 = phi i32 [ %133, %131 ], [ %142, %141 ]
  %153 = load ptr, ptr %124, align 8, !tbaa !26
  %154 = icmp eq ptr %153, %.0238
  br i1 %154, label %287, label %155

155:                                              ; preds = %152
  %156 = load ptr, ptr %125, align 8, !tbaa !27
  %157 = icmp eq ptr %156, %.0238
  br i1 %157, label %287, label %158

158:                                              ; preds = %155
  %159 = call i32 @IsCommonEdge(ptr noundef nonnull %99, ptr noundef %.0238) #3
  %.not299 = icmp eq i32 %159, 0
  br i1 %.not299, label %160, label %287

160:                                              ; preds = %158
  %161 = load ptr, ptr @C, align 8, !tbaa !16
  %162 = call i32 %161(ptr noundef nonnull %99, ptr noundef %.0238) #3
  %163 = sext i32 %162 to i64
  %164 = add nsw i64 %109, %163
  %165 = call i32 @Forbidden(ptr noundef %.0238, ptr noundef %0) #3
  %.not300 = icmp eq i32 %165, 0
  br i1 %.not300, label %166, label %179

166:                                              ; preds = %160
  %167 = load ptr, ptr @c, align 8, !tbaa !16
  %.not301 = icmp eq ptr %167, null
  br i1 %.not301, label %172, label %168

168:                                              ; preds = %166
  %169 = call i32 %167(ptr noundef %.0238, ptr noundef %0) #3
  %170 = sext i32 %169 to i64
  %171 = icmp sgt i64 %164, %170
  br i1 %171, label %172, label %179

172:                                              ; preds = %168, %166
  %173 = load ptr, ptr @C, align 8, !tbaa !16
  %174 = call i32 %173(ptr noundef %.0238, ptr noundef %0) #3
  %175 = sext i32 %174 to i64
  %176 = sub nsw i64 %164, %175
  store i64 %176, ptr %3, align 8, !tbaa !20
  %177 = icmp sgt i64 %176, 0
  br i1 %177, label %178, label %179

178:                                              ; preds = %172
  call void @Make3OptMove(ptr noundef %0, ptr noundef %1, ptr noundef nonnull %24, ptr noundef %58, ptr noundef nonnull %99, ptr noundef %.0238, i32 noundef %.0221) #3
  br label %295

179:                                              ; preds = %172, %168, %160
  %180 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !25
  %.not302 = icmp eq i32 %180, 0
  br i1 %.not302, label %189, label %181

181:                                              ; preds = %179
  %182 = load i32, ptr @Precision, align 4, !tbaa !25
  %183 = sext i32 %182 to i64
  %184 = sub nsw i64 %164, %183
  %185 = getelementptr inbounds i8, ptr %.0238, i64 20
  %186 = load i32, ptr %185, align 4, !tbaa !28
  %187 = sext i32 %186 to i64
  %188 = icmp slt i64 %184, %187
  br i1 %188, label %287, label %189

189:                                              ; preds = %181, %179
  %190 = load i32, ptr @Backtracking, align 4, !tbaa !25
  %191 = icmp eq i32 %190, 0
  %192 = load i32, ptr @Swaps, align 4
  %193 = icmp sgt i32 %192, 0
  %or.cond13 = select i1 %191, i1 true, i1 %193
  br i1 %or.cond13, label %194, label %267

194:                                              ; preds = %189
  %195 = icmp sgt i64 %164, %.3225386
  br i1 %195, label %230, label %196

196:                                              ; preds = %194
  %197 = icmp eq i64 %164, %.3225386
  br i1 %197, label %198, label %287

198:                                              ; preds = %196
  %199 = load ptr, ptr %126, align 8, !tbaa !29
  %.not306 = icmp eq ptr %199, null
  br i1 %.not306, label %206, label %200

200:                                              ; preds = %198
  %201 = icmp eq ptr %199, %.0238
  br i1 %201, label %287, label %202

202:                                              ; preds = %200
  %203 = getelementptr inbounds i8, ptr %.0238, i64 96
  %204 = load ptr, ptr %203, align 8, !tbaa !29
  %205 = icmp eq ptr %204, %99
  br i1 %205, label %287, label %213

206:                                              ; preds = %198
  %207 = load ptr, ptr %127, align 8, !tbaa !30
  %208 = icmp eq ptr %207, %.0238
  br i1 %208, label %287, label %209

209:                                              ; preds = %206
  %210 = getelementptr inbounds i8, ptr %.0238, i64 112
  %211 = load ptr, ptr %210, align 8, !tbaa !30
  %212 = icmp eq ptr %211, %99
  br i1 %212, label %287, label %213

213:                                              ; preds = %209, %202
  %214 = getelementptr inbounds i8, ptr %.3268382, i64 96
  %215 = load ptr, ptr %214, align 8, !tbaa !29
  %.not307 = icmp eq ptr %215, null
  br i1 %.not307, label %222, label %216

216:                                              ; preds = %213
  %217 = icmp eq ptr %215, %.3260383
  br i1 %217, label %230, label %218

218:                                              ; preds = %216
  %219 = getelementptr inbounds i8, ptr %.3260383, i64 96
  %220 = load ptr, ptr %219, align 8, !tbaa !29
  %221 = icmp eq ptr %220, %.3268382
  br i1 %221, label %230, label %287

222:                                              ; preds = %213
  %223 = getelementptr inbounds i8, ptr %.3268382, i64 112
  %224 = load ptr, ptr %223, align 8, !tbaa !30
  %225 = icmp eq ptr %224, %.3260383
  br i1 %225, label %230, label %226

226:                                              ; preds = %222
  %227 = getelementptr inbounds i8, ptr %.3260383, i64 112
  %228 = load ptr, ptr %227, align 8, !tbaa !30
  %229 = icmp eq ptr %228, %.3268382
  br i1 %229, label %230, label %287

230:                                              ; preds = %226, %222, %218, %216, %194
  %231 = load i32, ptr @MaxSwaps, align 4, !tbaa !25
  %232 = icmp slt i32 %192, %231
  br i1 %232, label %233, label %287

233:                                              ; preds = %230
  %234 = call i32 @Excludable(ptr noundef nonnull %99, ptr noundef %.0238) #3
  %.not308 = icmp eq i32 %234, 0
  br i1 %.not308, label %287, label %235

235:                                              ; preds = %233
  %236 = load ptr, ptr %128, align 8, !tbaa !31
  %237 = icmp eq ptr %236, %.0238
  br i1 %237, label %287, label %238

238:                                              ; preds = %235
  %239 = getelementptr inbounds i8, ptr %.0238, i64 200
  %240 = load ptr, ptr %239, align 8, !tbaa !31
  %241 = icmp eq ptr %240, %99
  br i1 %241, label %287, label %242

242:                                              ; preds = %238
  %243 = load i32, ptr @RestrictedSearch, align 4, !tbaa !25
  %244 = icmp ne i32 %243, 0
  %245 = load i32, ptr @ProblemType, align 4
  %246 = icmp ne i32 %245, 3
  %247 = icmp ne i32 %245, 6
  %248 = and i1 %246, %247
  %or.cond17 = select i1 %244, i1 %248, i1 false
  br i1 %or.cond17, label %249, label %266

249:                                              ; preds = %242
  %250 = load i32, ptr %97, align 4, !tbaa !32
  %251 = sext i32 %250 to i64
  %252 = sub nsw i64 %70, %251
  %253 = getelementptr inbounds i8, ptr %.0238, i64 36
  %254 = load i32, ptr %253, align 4, !tbaa !32
  %255 = sext i32 %254 to i64
  %256 = sub nsw i64 %164, %255
  %257 = icmp eq i64 %252, %256
  br i1 %257, label %258, label %266

258:                                              ; preds = %249
  %259 = load i32, ptr %129, align 4, !tbaa !32
  %260 = sext i32 %259 to i64
  %261 = add nsw i64 %109, %260
  %262 = load i32, ptr %49, align 4, !tbaa !32
  %263 = sext i32 %262 to i64
  %264 = add nsw i64 %35, %263
  %265 = icmp eq i64 %261, %264
  br i1 %265, label %287, label %266

266:                                              ; preds = %258, %249, %242
  br label %287

267:                                              ; preds = %189
  %268 = load i32, ptr @MaxSwaps, align 4, !tbaa !25
  %269 = icmp sgt i32 %268, 0
  br i1 %269, label %270, label %287

270:                                              ; preds = %267
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #3
  store i64 %164, ptr %5, align 8, !tbaa !20
  call void @Make3OptMove(ptr noundef %0, ptr noundef %1, ptr noundef nonnull %24, ptr noundef %58, ptr noundef nonnull %99, ptr noundef %.0238, i32 noundef %.0221) #3
  call void @Exclude(ptr noundef %0, ptr noundef %1) #3
  call void @Exclude(ptr noundef nonnull %24, ptr noundef %58) #3
  call void @Exclude(ptr noundef nonnull %99, ptr noundef %.0238) #3
  br label %271

271:                                              ; preds = %271, %270
  %.0 = phi ptr [ %.0238, %270 ], [ %273, %271 ]
  %272 = load ptr, ptr @BestSubsequentMove, align 8, !tbaa !16
  %273 = call ptr %272(ptr noundef %0, ptr noundef %.0, ptr noundef nonnull %5, ptr noundef %3) #3
  %.not303 = icmp eq ptr %273, null
  br i1 %.not303, label %274, label %271, !llvm.loop !33

274:                                              ; preds = %271
  %275 = load i64, ptr %3, align 8, !tbaa !20
  %276 = icmp slt i64 %275, 1
  br i1 %276, label %277, label %.critedge

277:                                              ; preds = %274
  call void @RestoreTour() #3
  %278 = load i16, ptr @Reversed, align 2, !tbaa !5
  %279 = load ptr, ptr %7, align 8, !tbaa !9
  %280 = load i8, ptr %279, align 8, !tbaa !14
  %281 = sext i8 %280 to i16
  %282 = icmp eq i16 %278, %281
  %.in304 = select i1 %282, ptr %12, ptr %13
  %283 = load ptr, ptr %.in304, align 8, !tbaa !16
  %.not305 = icmp eq ptr %283, %1
  br i1 %.not305, label %286, label %284

284:                                              ; preds = %277
  %285 = xor i16 %278, 1
  store i16 %285, ptr @Reversed, align 2, !tbaa !5
  br label %286

286:                                              ; preds = %277, %284
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  br label %287

287:                                              ; preds = %286, %266, %238, %235, %233, %230, %226, %218, %209, %206, %202, %200, %196, %267, %258, %181, %152, %155, %158, %141
  %.4269 = phi ptr [ %.3268382, %152 ], [ %.3268382, %155 ], [ %.3268382, %158 ], [ %.3268382, %181 ], [ %.3268382, %235 ], [ %.3268382, %238 ], [ %.3268382, %258 ], [ %99, %266 ], [ %.3268382, %233 ], [ %.3268382, %230 ], [ %.3268382, %200 ], [ %.3268382, %202 ], [ %.3268382, %218 ], [ %.3268382, %226 ], [ %.3268382, %206 ], [ %.3268382, %209 ], [ %.3268382, %196 ], [ %.3268382, %286 ], [ %.3268382, %267 ], [ %.3268382, %141 ]
  %.4261 = phi ptr [ %.3260383, %152 ], [ %.3260383, %155 ], [ %.3260383, %158 ], [ %.3260383, %181 ], [ %.3260383, %235 ], [ %.3260383, %238 ], [ %.3260383, %258 ], [ %.0238, %266 ], [ %.3260383, %233 ], [ %.3260383, %230 ], [ %.3260383, %200 ], [ %.3260383, %202 ], [ %.3260383, %218 ], [ %.3260383, %226 ], [ %.3260383, %206 ], [ %.3260383, %209 ], [ %.3260383, %196 ], [ %.3260383, %286 ], [ %.3260383, %267 ], [ %.3260383, %141 ]
  %.4251 = phi ptr [ %.3250384, %152 ], [ %.3250384, %155 ], [ %.3250384, %158 ], [ %.3250384, %181 ], [ %.3250384, %235 ], [ %.3250384, %238 ], [ %.3250384, %258 ], [ %58, %266 ], [ %.3250384, %233 ], [ %.3250384, %230 ], [ %.3250384, %200 ], [ %.3250384, %202 ], [ %.3250384, %218 ], [ %.3250384, %226 ], [ %.3250384, %206 ], [ %.3250384, %209 ], [ %.3250384, %196 ], [ %.3250384, %286 ], [ %.3250384, %267 ], [ %.3250384, %141 ]
  %.4243 = phi ptr [ %.3242385, %152 ], [ %.3242385, %155 ], [ %.3242385, %158 ], [ %.3242385, %181 ], [ %.3242385, %235 ], [ %.3242385, %238 ], [ %.3242385, %258 ], [ %24, %266 ], [ %.3242385, %233 ], [ %.3242385, %230 ], [ %.3242385, %200 ], [ %.3242385, %202 ], [ %.3242385, %218 ], [ %.3242385, %226 ], [ %.3242385, %206 ], [ %.3242385, %209 ], [ %.3242385, %196 ], [ %.3242385, %286 ], [ %.3242385, %267 ], [ %.3242385, %141 ]
  %.4226 = phi i64 [ %.3225386, %152 ], [ %.3225386, %155 ], [ %.3225386, %158 ], [ %.3225386, %181 ], [ %.3225386, %235 ], [ %.3225386, %238 ], [ %.3225386, %258 ], [ %164, %266 ], [ %.3225386, %233 ], [ %.3225386, %230 ], [ %.3225386, %200 ], [ %.3225386, %202 ], [ %.3225386, %218 ], [ %.3225386, %226 ], [ %.3225386, %206 ], [ %.3225386, %209 ], [ %.3225386, %196 ], [ %.3225386, %286 ], [ %.3225386, %267 ], [ %.3225386, %141 ]
  %.4 = phi i32 [ %.3387, %152 ], [ %.3387, %155 ], [ %.3387, %158 ], [ %.3387, %181 ], [ %.3387, %235 ], [ %.3387, %238 ], [ %.3387, %258 ], [ %.0221, %266 ], [ %.3387, %233 ], [ %.3387, %230 ], [ %.3387, %200 ], [ %.3387, %202 ], [ %.3387, %218 ], [ %.3387, %226 ], [ %.3387, %206 ], [ %.3387, %209 ], [ %.3387, %196 ], [ %.3387, %286 ], [ %.3387, %267 ], [ %.3387, %141 ]
  %288 = add nuw nsw i32 %.0217388, 1
  %exitcond.not = icmp eq i32 %288, %indvars.iv
  br i1 %exitcond.not, label %.loopexit, label %130, !llvm.loop !35

.loopexit:                                        ; preds = %287, %98, %102, %118, %105
  %.5270 = phi ptr [ %.2267390, %98 ], [ %.2267390, %102 ], [ %.2267390, %105 ], [ %.2267390, %118 ], [ %.4269, %287 ]
  %.5262 = phi ptr [ %.2259391, %98 ], [ %.2259391, %102 ], [ %.2259391, %105 ], [ %.2259391, %118 ], [ %.4261, %287 ]
  %.5252 = phi ptr [ %.2249393, %98 ], [ %.2249393, %102 ], [ %.2249393, %105 ], [ %.2249393, %118 ], [ %.4251, %287 ]
  %.5244 = phi ptr [ %.2241394, %98 ], [ %.2241394, %102 ], [ %.2241394, %105 ], [ %.2241394, %118 ], [ %.4243, %287 ]
  %.5227 = phi i64 [ %.2224395, %98 ], [ %.2224395, %102 ], [ %.2224395, %105 ], [ %.2224395, %118 ], [ %.4226, %287 ]
  %.5 = phi i32 [ %.2396, %98 ], [ %.2396, %102 ], [ %.2396, %105 ], [ %.2396, %118 ], [ %.4, %287 ]
  %.1 = phi i32 [ %.0214397, %98 ], [ %.0214397, %102 ], [ %.0214397, %105 ], [ %.0214397, %118 ], [ %121, %287 ]
  %289 = getelementptr inbounds i8, ptr %.0255392, i64 16
  %290 = load ptr, ptr %289, align 8, !tbaa !18
  %.not292 = icmp eq ptr %290, null
  br i1 %.not292, label %.loopexit310, label %98, !llvm.loop !36

.loopexit310:                                     ; preds = %120, %.loopexit, %90, %88, %50, %61, %64
  %.6271 = phi ptr [ %.1266410, %50 ], [ %.1266410, %61 ], [ %.1266410, %64 ], [ %.1266410, %88 ], [ %.1266410, %90 ], [ %.2267390, %120 ], [ %.5270, %.loopexit ]
  %.6263 = phi ptr [ %.1258411, %50 ], [ %.1258411, %61 ], [ %.1258411, %64 ], [ %.1258411, %88 ], [ %.1258411, %90 ], [ %.2259391, %120 ], [ %.5262, %.loopexit ]
  %.6253 = phi ptr [ %.1248412, %50 ], [ %.1248412, %61 ], [ %.1248412, %64 ], [ %.1248412, %88 ], [ %.1248412, %90 ], [ %.2249393, %120 ], [ %.5252, %.loopexit ]
  %.6245 = phi ptr [ %.1240413, %50 ], [ %.1240413, %61 ], [ %.1240413, %64 ], [ %.1240413, %88 ], [ %.1240413, %90 ], [ %.2241394, %120 ], [ %.5244, %.loopexit ]
  %.6228 = phi i64 [ %.1223414, %50 ], [ %.1223414, %61 ], [ %.1223414, %64 ], [ %.1223414, %88 ], [ %.1223414, %90 ], [ %.2224395, %120 ], [ %.5227, %.loopexit ]
  %.6 = phi i32 [ %.1220415, %50 ], [ %.1220415, %61 ], [ %.1220415, %64 ], [ %.1220415, %88 ], [ %.1220415, %90 ], [ %.2396, %120 ], [ %.5, %.loopexit ]
  %291 = add nuw nsw i32 %.0218416, 1
  %indvars.iv.next = add nuw nsw i32 %indvars.iv, 1
  %exitcond456.not = icmp eq i32 %indvars.iv.next, 4
  br i1 %exitcond456.not, label %.loopexit312, label %50, !llvm.loop !37

.loopexit312:                                     ; preds = %.loopexit310, %23, %27, %30
  %.7272 = phi ptr [ %.0265419, %23 ], [ %.0265419, %27 ], [ %.0265419, %30 ], [ %.6271, %.loopexit310 ]
  %.7264 = phi ptr [ %.0257420, %23 ], [ %.0257420, %27 ], [ %.0257420, %30 ], [ %.6263, %.loopexit310 ]
  %.7254 = phi ptr [ %.0247422, %23 ], [ %.0247422, %27 ], [ %.0247422, %30 ], [ %.6253, %.loopexit310 ]
  %.7246 = phi ptr [ %.0239423, %23 ], [ %.0239423, %27 ], [ %.0239423, %30 ], [ %.6245, %.loopexit310 ]
  %.7229 = phi i64 [ %.0222424, %23 ], [ %.0222424, %27 ], [ %.0222424, %30 ], [ %.6228, %.loopexit310 ]
  %.7 = phi i32 [ %.0219425, %23 ], [ %.0219425, %27 ], [ %.0219425, %30 ], [ %.6, %.loopexit310 ]
  %.1216 = phi i32 [ %.0215426, %23 ], [ %.0215426, %27 ], [ %.0215426, %30 ], [ %44, %.loopexit310 ]
  %292 = getelementptr inbounds i8, ptr %.0256421, i64 16
  %293 = load ptr, ptr %292, align 8, !tbaa !18
  %.not284 = icmp eq ptr %293, null
  br i1 %.not284, label %._crit_edge, label %23, !llvm.loop !38

._crit_edge:                                      ; preds = %.loopexit312, %43
  %.0265.lcssa = phi ptr [ %.7272, %.loopexit312 ], [ %.0265419, %43 ]
  %.0257.lcssa = phi ptr [ %.7264, %.loopexit312 ], [ %.0257420, %43 ]
  %.0247.lcssa = phi ptr [ %.7254, %.loopexit312 ], [ %.0247422, %43 ]
  %.0239.lcssa = phi ptr [ %.7246, %.loopexit312 ], [ %.0239423, %43 ]
  %.0222.lcssa = phi i64 [ %.7229, %.loopexit312 ], [ %.0222424, %43 ]
  %.0219.lcssa = phi i32 [ %.7, %.loopexit312 ], [ %.0219425, %43 ]
  store i64 0, ptr %3, align 8, !tbaa !20
  %.not309 = icmp eq ptr %.0257.lcssa, null
  br i1 %.not309, label %295, label %294

294:                                              ; preds = %._crit_edge
  call void @Make3OptMove(ptr noundef %0, ptr noundef %1, ptr noundef %.0239.lcssa, ptr noundef %.0247.lcssa, ptr noundef %.0265.lcssa, ptr noundef nonnull %.0257.lcssa, i32 noundef %.0219.lcssa) #3
  call void @Exclude(ptr noundef %0, ptr noundef %1) #3
  call void @Exclude(ptr noundef %.0239.lcssa, ptr noundef %.0247.lcssa) #3
  call void @Exclude(ptr noundef %.0265.lcssa, ptr noundef nonnull %.0257.lcssa) #3
  store i64 %.0222.lcssa, ptr %2, align 8, !tbaa !20
  br label %295

.critedge:                                        ; preds = %274
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  br label %295

295:                                              ; preds = %._crit_edge.thread, %._crit_edge, %294, %.critedge, %178, %85
  %.9 = phi ptr [ null, %178 ], [ null, %85 ], [ null, %.critedge ], [ %.0257.lcssa, %294 ], [ null, %._crit_edge ], [ null, %._crit_edge.thread ]
  ret ptr %.9
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

declare i32 @IsCommonEdge(ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @Forbidden(ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @Flip_SL(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @Excludable(ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @Between_SL(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @Make3OptMove(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare void @Exclude(ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @RestoreTour() local_unnamed_addr #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"short", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !12, i64 304}
!10 = !{!"Node", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !12, i64 128, !12, i64 136, !12, i64 144, !12, i64 152, !12, i64 160, !12, i64 168, !12, i64 176, !12, i64 184, !12, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !12, i64 224, !12, i64 232, !12, i64 240, !12, i64 248, !12, i64 256, !12, i64 264, !12, i64 272, !12, i64 280, !12, i64 288, !12, i64 296, !12, i64 304, !13, i64 312, !13, i64 320, !13, i64 328, !13, i64 336, !13, i64 344, !13, i64 352, !7, i64 360, !7, i64 361, !7, i64 362}
!11 = !{!"int", !7, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = !{!15, !7, i64 0}
!15 = !{!"Segment", !7, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !11, i64 40, !11, i64 44, !12, i64 48}
!16 = !{!12, !12, i64 0}
!17 = !{!10, !12, i64 288}
!18 = !{!19, !12, i64 0}
!19 = !{!"Candidate", !12, i64 0, !11, i64 8, !11, i64 12}
!20 = !{!21, !21, i64 0}
!21 = !{!"long long", !7, i64 0}
!22 = !{!10, !12, i64 64}
!23 = !{!10, !12, i64 72}
!24 = !{!19, !11, i64 8}
!25 = !{!11, !11, i64 0}
!26 = !{!10, !12, i64 152}
!27 = !{!10, !12, i64 160}
!28 = !{!10, !11, i64 20}
!29 = !{!10, !12, i64 96}
!30 = !{!10, !12, i64 112}
!31 = !{!10, !12, i64 200}
!32 = !{!10, !11, i64 36}
!33 = distinct !{!33, !34}
!34 = !{!"llvm.loop.mustprogress"}
!35 = distinct !{!35, !34}
!36 = distinct !{!36, !34}
!37 = distinct !{!37, !34}
!38 = distinct !{!38, !34}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass