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

; 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
@C = external dso_local global ptr, align 8
@c = external dso_local global ptr, align 8
@MaxBreadth = external dso_local global i32, align 4
@Precision = external dso_local global i32, align 4
@Backtracking = external dso_local global i32, align 4
@Swaps = external dso_local global i32, align 4
@MaxSwaps = external dso_local global i32, align 4
@BestSubsequentMove = external dso_local global ptr, align 8

; Function Attrs: nounwind uwtable
define dso_local ptr @Best2OptMove(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 i64, align 8
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i64, align 8
  %21 = 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
  store ptr null, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  store ptr null, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  store i64 -9223372036854775808, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  store i32 0, ptr %18, align 4, !tbaa !11
  %22 = load i16, ptr @Reversed, align 2, !tbaa !13
  %23 = sext i16 %22 to i32
  %24 = load ptr, ptr %6, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.Node, ptr %24, i32 0, i32 45
  %26 = load ptr, ptr %25, align 8, !tbaa !15
  %27 = getelementptr inbounds %struct.Segment, ptr %26, i32 0, i32 0
  %28 = load i8, ptr %27, align 8, !tbaa !18
  %29 = sext i8 %28 to i32
  %30 = icmp eq i32 %23, %29
  br i1 %30, label %31, label %35

31:                                               ; preds = %4
  %32 = load ptr, ptr %6, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.Node, ptr %32, i32 0, i32 16
  %34 = load ptr, ptr %33, align 8, !tbaa !20
  br label %39

35:                                               ; preds = %4
  %36 = load ptr, ptr %6, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.Node, ptr %36, i32 0, i32 15
  %38 = load ptr, ptr %37, align 8, !tbaa !21
  br label %39

39:                                               ; preds = %35, %31
  %40 = phi ptr [ %34, %31 ], [ %38, %35 ]
  %41 = load ptr, ptr %7, align 8, !tbaa !5
  %42 = icmp ne ptr %40, %41
  br i1 %42, label %43, label %48

43:                                               ; preds = %39
  %44 = load i16, ptr @Reversed, align 2, !tbaa !13
  %45 = sext i16 %44 to i32
  %46 = xor i32 %45, 1
  %47 = trunc i32 %46 to i16
  store i16 %47, ptr @Reversed, align 2, !tbaa !13
  br label %48

48:                                               ; preds = %43, %39
  %49 = load ptr, ptr %7, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.Node, ptr %49, i32 0, i32 43
  %51 = load ptr, ptr %50, align 8, !tbaa !22
  store ptr %51, ptr %14, align 8, !tbaa !5
  br label %52

52:                                               ; preds = %341, %48
  %53 = load ptr, ptr %14, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.Candidate, ptr %53, i32 0, i32 0
  %55 = load ptr, ptr %54, align 8, !tbaa !23
  store ptr %55, ptr %10, align 8, !tbaa !5
  %56 = icmp ne ptr %55, null
  br i1 %56, label %57, label %344

57:                                               ; preds = %52
  %58 = load ptr, ptr %10, align 8, !tbaa !5
  %59 = load ptr, ptr %7, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.Node, ptr %59, i32 0, i32 15
  %61 = load ptr, ptr %60, align 8, !tbaa !21
  %62 = icmp eq ptr %58, %61
  br i1 %62, label %87, label %63

63:                                               ; preds = %57
  %64 = load ptr, ptr %10, align 8, !tbaa !5
  %65 = load ptr, ptr %7, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.Node, ptr %65, i32 0, i32 16
  %67 = load ptr, ptr %66, align 8, !tbaa !20
  %68 = icmp eq ptr %64, %67
  br i1 %68, label %87, label %69

69:                                               ; preds = %63
  %70 = load ptr, ptr %8, align 8, !tbaa !5
  %71 = load i64, ptr %70, align 8, !tbaa !9
  %72 = load ptr, ptr %14, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.Candidate, ptr %72, i32 0, i32 1
  %74 = load i32, ptr %73, align 8, !tbaa !25
  %75 = sext i32 %74 to i64
  %76 = sub nsw i64 %71, %75
  store i64 %76, ptr %15, align 8, !tbaa !9
  %77 = icmp sle i64 %76, 0
  br i1 %77, label %78, label %88

78:                                               ; preds = %69
  %79 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !11
  %80 = icmp ne i32 %79, 0
  br i1 %80, label %81, label %88

81:                                               ; preds = %78
  %82 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %83 = icmp ne i32 %82, 3
  br i1 %83, label %84, label %88

84:                                               ; preds = %81
  %85 = load i32, ptr @ProblemType, align 4, !tbaa !11
  %86 = icmp ne i32 %85, 6
  br i1 %86, label %87, label %88

87:                                               ; preds = %84, %63, %57
  br label %341

88:                                               ; preds = %84, %81, %78, %69
  %89 = load i16, ptr @Reversed, align 2, !tbaa !13
  %90 = sext i16 %89 to i32
  %91 = load ptr, ptr %10, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.Node, ptr %91, i32 0, i32 45
  %93 = load ptr, ptr %92, align 8, !tbaa !15
  %94 = getelementptr inbounds %struct.Segment, ptr %93, i32 0, i32 0
  %95 = load i8, ptr %94, align 8, !tbaa !18
  %96 = sext i8 %95 to i32
  %97 = icmp eq i32 %90, %96
  br i1 %97, label %98, label %102

98:                                               ; preds = %88
  %99 = load ptr, ptr %10, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.Node, ptr %99, i32 0, i32 15
  %101 = load ptr, ptr %100, align 8, !tbaa !21
  br label %106

102:                                              ; preds = %88
  %103 = load ptr, ptr %10, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.Node, ptr %103, i32 0, i32 16
  %105 = load ptr, ptr %104, align 8, !tbaa !20
  br label %106

106:                                              ; preds = %102, %98
  %107 = phi ptr [ %101, %98 ], [ %105, %102 ]
  store ptr %107, ptr %11, align 8, !tbaa !5
  %108 = load ptr, ptr %10, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.Node, ptr %108, i32 0, i32 26
  %110 = load ptr, ptr %109, align 8, !tbaa !26
  %111 = load ptr, ptr %11, align 8, !tbaa !5
  %112 = icmp eq ptr %110, %111
  br i1 %112, label %124, label %113

113:                                              ; preds = %106
  %114 = load ptr, ptr %10, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.Node, ptr %114, i32 0, i32 27
  %116 = load ptr, ptr %115, align 8, !tbaa !27
  %117 = load ptr, ptr %11, align 8, !tbaa !5
  %118 = icmp eq ptr %116, %117
  br i1 %118, label %124, label %119

119:                                              ; preds = %113
  %120 = load ptr, ptr %10, align 8, !tbaa !5
  %121 = load ptr, ptr %11, align 8, !tbaa !5
  %122 = call i32 @IsCommonEdge(ptr noundef %120, ptr noundef %121)
  %123 = icmp ne i32 %122, 0
  br i1 %123, label %124, label %125

124:                                              ; preds = %119, %113, %106
  br label %341

125:                                              ; preds = %119
  %126 = load i64, ptr %15, align 8, !tbaa !9
  %127 = load ptr, ptr @C, align 8, !tbaa !5
  %128 = load ptr, ptr %10, align 8, !tbaa !5
  %129 = load ptr, ptr %11, align 8, !tbaa !5
  %130 = call i32 %127(ptr noundef %128, ptr noundef %129)
  %131 = sext i32 %130 to i64
  %132 = add nsw i64 %126, %131
  store i64 %132, ptr %16, align 8, !tbaa !9
  %133 = load ptr, ptr %11, align 8, !tbaa !5
  %134 = load ptr, ptr %6, align 8, !tbaa !5
  %135 = call i32 @Forbidden(ptr noundef %133, ptr noundef %134)
  %136 = icmp ne i32 %135, 0
  br i1 %136, label %163, label %137

137:                                              ; preds = %125
  %138 = load ptr, ptr @c, align 8, !tbaa !5
  %139 = icmp ne ptr %138, null
  br i1 %139, label %140, label %149

140:                                              ; preds = %137
  %141 = load i64, ptr %16, align 8, !tbaa !9
  %142 = load ptr, ptr @c, align 8, !tbaa !5
  %143 = load ptr, ptr %11, align 8, !tbaa !5
  %144 = load ptr, ptr %6, align 8, !tbaa !5
  %145 = call i32 %142(ptr noundef %143, ptr noundef %144)
  %146 = sext i32 %145 to i64
  %147 = sub nsw i64 %141, %146
  %148 = icmp sgt i64 %147, 0
  br i1 %148, label %149, label %163

149:                                              ; preds = %140, %137
  %150 = load i64, ptr %16, align 8, !tbaa !9
  %151 = load ptr, ptr @C, align 8, !tbaa !5
  %152 = load ptr, ptr %11, align 8, !tbaa !5
  %153 = load ptr, ptr %6, align 8, !tbaa !5
  %154 = call i32 %151(ptr noundef %152, ptr noundef %153)
  %155 = sext i32 %154 to i64
  %156 = sub nsw i64 %150, %155
  %157 = load ptr, ptr %9, align 8, !tbaa !5
  store i64 %156, ptr %157, align 8, !tbaa !9
  %158 = icmp sgt i64 %156, 0
  br i1 %158, label %159, label %163

159:                                              ; preds = %149
  %160 = load ptr, ptr %6, align 8, !tbaa !5
  %161 = load ptr, ptr %7, align 8, !tbaa !5
  %162 = load ptr, ptr %10, align 8, !tbaa !5
  call void @Flip_SL(ptr noundef %160, ptr noundef %161, ptr noundef %162)
  store ptr null, ptr %5, align 8
  store i32 1, ptr %19, align 4
  br label %360

163:                                              ; preds = %149, %140, %125
  %164 = load i32, ptr %18, align 4, !tbaa !11
  %165 = add nsw i32 %164, 1
  store i32 %165, ptr %18, align 4, !tbaa !11
  %166 = load i32, ptr @MaxBreadth, align 4, !tbaa !11
  %167 = icmp sgt i32 %165, %166
  br i1 %167, label %168, label %169

168:                                              ; preds = %163
  br label %344

169:                                              ; preds = %163
  %170 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !11
  %171 = icmp ne i32 %170, 0
  br i1 %171, label %172, label %183

172:                                              ; preds = %169
  %173 = load i64, ptr %16, align 8, !tbaa !9
  %174 = load i32, ptr @Precision, align 4, !tbaa !11
  %175 = sext i32 %174 to i64
  %176 = sub nsw i64 %173, %175
  %177 = load ptr, ptr %11, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.Node, ptr %177, i32 0, i32 5
  %179 = load i32, ptr %178, align 4, !tbaa !28
  %180 = sext i32 %179 to i64
  %181 = icmp slt i64 %176, %180
  br i1 %181, label %182, label %183

182:                                              ; preds = %172
  br label %341

183:                                              ; preds = %172, %169
  %184 = load i32, ptr @Backtracking, align 4, !tbaa !11
  %185 = icmp ne i32 %184, 0
  br i1 %185, label %186, label %189

186:                                              ; preds = %183
  %187 = load i32, ptr @Swaps, align 4, !tbaa !11
  %188 = icmp sgt i32 %187, 0
  br i1 %188, label %189, label %281

189:                                              ; preds = %186, %183
  %190 = load i64, ptr %16, align 8, !tbaa !9
  %191 = load i64, ptr %17, align 8, !tbaa !9
  %192 = icmp sgt i64 %190, %191
  br i1 %192, label %255, label %193

193:                                              ; preds = %189
  %194 = load i64, ptr %16, align 8, !tbaa !9
  %195 = load i64, ptr %17, align 8, !tbaa !9
  %196 = icmp eq i64 %194, %195
  br i1 %196, label %197, label %280

197:                                              ; preds = %193
  %198 = load ptr, ptr %10, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.Node, ptr %198, i32 0, i32 19
  %200 = load ptr, ptr %199, align 8, !tbaa !29
  %201 = icmp ne ptr %200, null
  br i1 %201, label %202, label %214

202:                                              ; preds = %197
  %203 = load ptr, ptr %10, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.Node, ptr %203, i32 0, i32 19
  %205 = load ptr, ptr %204, align 8, !tbaa !29
  %206 = load ptr, ptr %11, align 8, !tbaa !5
  %207 = icmp eq ptr %205, %206
  br i1 %207, label %280, label %208

208:                                              ; preds = %202
  %209 = load ptr, ptr %11, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.Node, ptr %209, i32 0, i32 19
  %211 = load ptr, ptr %210, align 8, !tbaa !29
  %212 = load ptr, ptr %10, align 8, !tbaa !5
  %213 = icmp eq ptr %211, %212
  br i1 %213, label %280, label %226

214:                                              ; preds = %197
  %215 = load ptr, ptr %10, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.Node, ptr %215, i32 0, i32 21
  %217 = load ptr, ptr %216, align 8, !tbaa !30
  %218 = load ptr, ptr %11, align 8, !tbaa !5
  %219 = icmp eq ptr %217, %218
  br i1 %219, label %280, label %220

220:                                              ; preds = %214
  %221 = load ptr, ptr %11, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.Node, ptr %221, i32 0, i32 21
  %223 = load ptr, ptr %222, align 8, !tbaa !30
  %224 = load ptr, ptr %10, align 8, !tbaa !5
  %225 = icmp eq ptr %223, %224
  br i1 %225, label %280, label %226

226:                                              ; preds = %220, %208
  %227 = load ptr, ptr %12, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.Node, ptr %227, i32 0, i32 19
  %229 = load ptr, ptr %228, align 8, !tbaa !29
  %230 = icmp ne ptr %229, null
  br i1 %230, label %231, label %243

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

237:                                              ; preds = %231
  %238 = load ptr, ptr %13, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.Node, ptr %238, i32 0, i32 19
  %240 = load ptr, ptr %239, align 8, !tbaa !29
  %241 = load ptr, ptr %12, align 8, !tbaa !5
  %242 = icmp eq ptr %240, %241
  br i1 %242, label %255, label %280

243:                                              ; preds = %226
  %244 = load ptr, ptr %12, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.Node, ptr %244, i32 0, i32 21
  %246 = load ptr, ptr %245, align 8, !tbaa !30
  %247 = load ptr, ptr %13, align 8, !tbaa !5
  %248 = icmp eq ptr %246, %247
  br i1 %248, label %255, label %249

249:                                              ; preds = %243
  %250 = load ptr, ptr %13, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.Node, ptr %250, i32 0, i32 21
  %252 = load ptr, ptr %251, align 8, !tbaa !30
  %253 = load ptr, ptr %12, align 8, !tbaa !5
  %254 = icmp eq ptr %252, %253
  br i1 %254, label %255, label %280

255:                                              ; preds = %249, %243, %237, %231, %189
  %256 = load i32, ptr @Swaps, align 4, !tbaa !11
  %257 = load i32, ptr @MaxSwaps, align 4, !tbaa !11
  %258 = icmp slt i32 %256, %257
  br i1 %258, label %259, label %280

259:                                              ; preds = %255
  %260 = load ptr, ptr %10, align 8, !tbaa !5
  %261 = load ptr, ptr %11, align 8, !tbaa !5
  %262 = call i32 @Excludable(ptr noundef %260, ptr noundef %261)
  %263 = icmp ne i32 %262, 0
  br i1 %263, label %264, label %280

264:                                              ; preds = %259
  %265 = load ptr, ptr %10, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.Node, ptr %265, i32 0, i32 32
  %267 = load ptr, ptr %266, align 8, !tbaa !31
  %268 = load ptr, ptr %11, align 8, !tbaa !5
  %269 = icmp eq ptr %267, %268
  br i1 %269, label %280, label %270

270:                                              ; preds = %264
  %271 = load ptr, ptr %11, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.Node, ptr %271, i32 0, i32 32
  %273 = load ptr, ptr %272, align 8, !tbaa !31
  %274 = load ptr, ptr %10, align 8, !tbaa !5
  %275 = icmp eq ptr %273, %274
  br i1 %275, label %280, label %276

276:                                              ; preds = %270
  %277 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %277, ptr %12, align 8, !tbaa !5
  %278 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %278, ptr %13, align 8, !tbaa !5
  %279 = load i64, ptr %16, align 8, !tbaa !9
  store i64 %279, ptr %17, align 8, !tbaa !9
  br label %280

280:                                              ; preds = %276, %270, %264, %259, %255, %249, %237, %220, %214, %208, %202, %193
  br label %340

281:                                              ; preds = %186
  %282 = load i32, ptr @MaxSwaps, align 4, !tbaa !11
  %283 = icmp sgt i32 %282, 0
  br i1 %283, label %284, label %339

284:                                              ; preds = %281
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #3
  %285 = load i64, ptr %16, align 8, !tbaa !9
  store i64 %285, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #3
  %286 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %286, ptr %21, align 8, !tbaa !5
  %287 = load ptr, ptr %6, align 8, !tbaa !5
  %288 = load ptr, ptr %7, align 8, !tbaa !5
  %289 = load ptr, ptr %10, align 8, !tbaa !5
  %290 = load ptr, ptr %11, align 8, !tbaa !5
  call void @Make2OptMove(ptr noundef %287, ptr noundef %288, ptr noundef %289, ptr noundef %290)
  %291 = load ptr, ptr %6, align 8, !tbaa !5
  %292 = load ptr, ptr %7, align 8, !tbaa !5
  call void @Exclude(ptr noundef %291, ptr noundef %292)
  %293 = load ptr, ptr %10, align 8, !tbaa !5
  %294 = load ptr, ptr %11, align 8, !tbaa !5
  call void @Exclude(ptr noundef %293, ptr noundef %294)
  br label %295

295:                                              ; preds = %302, %284
  %296 = load ptr, ptr @BestSubsequentMove, align 8, !tbaa !5
  %297 = load ptr, ptr %6, align 8, !tbaa !5
  %298 = load ptr, ptr %21, align 8, !tbaa !5
  %299 = load ptr, ptr %9, align 8, !tbaa !5
  %300 = call ptr %296(ptr noundef %297, ptr noundef %298, ptr noundef %20, ptr noundef %299)
  store ptr %300, ptr %21, align 8, !tbaa !5
  %301 = icmp ne ptr %300, null
  br i1 %301, label %302, label %303

302:                                              ; preds = %295
  br label %295, !llvm.loop !32

303:                                              ; preds = %295
  %304 = load ptr, ptr %9, align 8, !tbaa !5
  %305 = load i64, ptr %304, align 8, !tbaa !9
  %306 = icmp sgt i64 %305, 0
  br i1 %306, label %307, label %308

307:                                              ; preds = %303
  store ptr null, ptr %5, align 8
  store i32 1, ptr %19, align 4
  br label %336

308:                                              ; preds = %303
  call void @RestoreTour()
  %309 = load ptr, ptr %7, align 8, !tbaa !5
  %310 = load i16, ptr @Reversed, align 2, !tbaa !13
  %311 = sext i16 %310 to i32
  %312 = load ptr, ptr %6, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.Node, ptr %312, i32 0, i32 45
  %314 = load ptr, ptr %313, align 8, !tbaa !15
  %315 = getelementptr inbounds %struct.Segment, ptr %314, i32 0, i32 0
  %316 = load i8, ptr %315, align 8, !tbaa !18
  %317 = sext i8 %316 to i32
  %318 = icmp eq i32 %311, %317
  br i1 %318, label %319, label %323

319:                                              ; preds = %308
  %320 = load ptr, ptr %6, align 8, !tbaa !5
  %321 = getelementptr inbounds %struct.Node, ptr %320, i32 0, i32 16
  %322 = load ptr, ptr %321, align 8, !tbaa !20
  br label %327

323:                                              ; preds = %308
  %324 = load ptr, ptr %6, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.Node, ptr %324, i32 0, i32 15
  %326 = load ptr, ptr %325, align 8, !tbaa !21
  br label %327

327:                                              ; preds = %323, %319
  %328 = phi ptr [ %322, %319 ], [ %326, %323 ]
  %329 = icmp ne ptr %309, %328
  br i1 %329, label %330, label %335

330:                                              ; preds = %327
  %331 = load i16, ptr @Reversed, align 2, !tbaa !13
  %332 = sext i16 %331 to i32
  %333 = xor i32 %332, 1
  %334 = trunc i32 %333 to i16
  store i16 %334, ptr @Reversed, align 2, !tbaa !13
  br label %335

335:                                              ; preds = %330, %327
  store i32 0, ptr %19, align 4
  br label %336

336:                                              ; preds = %335, %307
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #3
  %337 = load i32, ptr %19, align 4
  switch i32 %337, label %360 [
    i32 0, label %338
  ]

338:                                              ; preds = %336
  br label %339

339:                                              ; preds = %338, %281
  br label %340

340:                                              ; preds = %339, %280
  br label %341

341:                                              ; preds = %340, %182, %124, %87
  %342 = load ptr, ptr %14, align 8, !tbaa !5
  %343 = getelementptr inbounds %struct.Candidate, ptr %342, i32 1
  store ptr %343, ptr %14, align 8, !tbaa !5
  br label %52, !llvm.loop !34

344:                                              ; preds = %168, %52
  %345 = load ptr, ptr %9, align 8, !tbaa !5
  store i64 0, ptr %345, align 8, !tbaa !9
  %346 = load ptr, ptr %13, align 8, !tbaa !5
  %347 = icmp ne ptr %346, null
  br i1 %347, label %348, label %358

348:                                              ; preds = %344
  %349 = load ptr, ptr %6, align 8, !tbaa !5
  %350 = load ptr, ptr %7, align 8, !tbaa !5
  %351 = load ptr, ptr %12, align 8, !tbaa !5
  call void @Flip_SL(ptr noundef %349, ptr noundef %350, ptr noundef %351)
  %352 = load ptr, ptr %6, align 8, !tbaa !5
  %353 = load ptr, ptr %7, align 8, !tbaa !5
  call void @Exclude(ptr noundef %352, ptr noundef %353)
  %354 = load ptr, ptr %12, align 8, !tbaa !5
  %355 = load ptr, ptr %13, align 8, !tbaa !5
  call void @Exclude(ptr noundef %354, ptr noundef %355)
  %356 = load i64, ptr %17, align 8, !tbaa !9
  %357 = load ptr, ptr %8, align 8, !tbaa !5
  store i64 %356, ptr %357, align 8, !tbaa !9
  br label %358

358:                                              ; preds = %348, %344
  %359 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %359, ptr %5, align 8
  store i32 1, ptr %19, align 4
  br label %360

360:                                              ; preds = %358, %336, %159
  call void @llvm.lifetime.end.p0(i64 4, 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
  %361 = load ptr, ptr %5, align 8
  ret ptr %361
}

; 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 void @Make2OptMove(ptr noundef, ptr noundef, ptr noundef, ptr 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 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}


; 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
@C = external dso_local local_unnamed_addr global ptr, align 8
@c = external dso_local local_unnamed_addr global ptr, align 8
@MaxBreadth = external dso_local local_unnamed_addr global i32, align 4
@Precision = external dso_local local_unnamed_addr global i32, align 4
@Backtracking = 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
@BestSubsequentMove = external dso_local local_unnamed_addr global ptr, align 8

; Function Attrs: nounwind uwtable
define dso_local ptr @Best2OptMove(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
  %.not127149 = icmp eq ptr %20, null
  br i1 %.not127149, label %._crit_edge.thread, label %.lr.ph

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

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

23:                                               ; preds = %.lr.ph, %169
  %24 = phi ptr [ %20, %.lr.ph ], [ %171, %169 ]
  %.0110154 = phi i32 [ 0, %.lr.ph ], [ %.1, %169 ]
  %.0111153 = phi i64 [ -9223372036854775808, %.lr.ph ], [ %.1112, %169 ]
  %.0115152 = phi ptr [ null, %.lr.ph ], [ %.1116, %169 ]
  %.0117151 = phi ptr [ %19, %.lr.ph ], [ %170, %169 ]
  %.0118150 = phi ptr [ null, %.lr.ph ], [ %.1119, %169 ]
  %25 = load ptr, ptr %21, align 8, !tbaa !22
  %26 = icmp eq ptr %24, %25
  br i1 %26, label %169, label %27

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

30:                                               ; preds = %27
  %31 = load i64, ptr %2, align 8, !tbaa !20
  %32 = getelementptr inbounds i8, ptr %.0117151, 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 %169, label %43

43:                                               ; preds = %30
  %44 = load i16, ptr @Reversed, align 2, !tbaa !5
  %45 = getelementptr inbounds i8, ptr %24, i64 304
  %46 = load ptr, ptr %45, align 8, !tbaa !9
  %47 = load i8, ptr %46, align 8, !tbaa !14
  %48 = sext i8 %47 to i16
  %49 = icmp eq i16 %44, %48
  %.in128.v = select i1 %49, i64 64, i64 72
  %.in128 = getelementptr inbounds i8, ptr %24, i64 %.in128.v
  %50 = load ptr, ptr %.in128, align 8, !tbaa !16
  %51 = getelementptr inbounds i8, ptr %24, i64 152
  %52 = load ptr, ptr %51, align 8, !tbaa !25
  %53 = icmp eq ptr %52, %50
  br i1 %53, label %169, label %54

54:                                               ; preds = %43
  %55 = getelementptr inbounds i8, ptr %24, i64 160
  %56 = load ptr, ptr %55, align 8, !tbaa !26
  %57 = icmp eq ptr %56, %50
  br i1 %57, label %169, label %58

58:                                               ; preds = %54
  %59 = call i32 @IsCommonEdge(ptr noundef nonnull %24, ptr noundef %50) #3
  %.not129 = icmp eq i32 %59, 0
  br i1 %.not129, label %60, label %169

60:                                               ; preds = %58
  %61 = load ptr, ptr @C, align 8, !tbaa !16
  %62 = call i32 %61(ptr noundef nonnull %24, ptr noundef %50) #3
  %63 = sext i32 %62 to i64
  %64 = add nsw i64 %35, %63
  %65 = call i32 @Forbidden(ptr noundef %50, ptr noundef %0) #3
  %.not130 = icmp eq i32 %65, 0
  br i1 %.not130, label %66, label %79

66:                                               ; preds = %60
  %67 = load ptr, ptr @c, align 8, !tbaa !16
  %.not131 = icmp eq ptr %67, null
  br i1 %.not131, label %72, label %68

68:                                               ; preds = %66
  %69 = call i32 %67(ptr noundef %50, ptr noundef %0) #3
  %70 = sext i32 %69 to i64
  %71 = icmp sgt i64 %64, %70
  br i1 %71, label %72, label %79

72:                                               ; preds = %68, %66
  %73 = load ptr, ptr @C, align 8, !tbaa !16
  %74 = call i32 %73(ptr noundef %50, ptr noundef %0) #3
  %75 = sext i32 %74 to i64
  %76 = sub nsw i64 %64, %75
  store i64 %76, ptr %3, align 8, !tbaa !20
  %77 = icmp sgt i64 %76, 0
  br i1 %77, label %78, label %79

78:                                               ; preds = %72
  call void @Flip_SL(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %24) #3
  br label %173

79:                                               ; preds = %72, %68, %60
  %80 = add nsw i32 %.0110154, 1
  %81 = load i32, ptr @MaxBreadth, align 4, !tbaa !27
  %.not132 = icmp slt i32 %.0110154, %81
  br i1 %.not132, label %82, label %._crit_edge

82:                                               ; preds = %79
  %83 = load i32, ptr @GainCriterionUsed, align 4, !tbaa !27
  %.not133 = icmp eq i32 %83, 0
  br i1 %.not133, label %92, label %84

84:                                               ; preds = %82
  %85 = load i32, ptr @Precision, align 4, !tbaa !27
  %86 = sext i32 %85 to i64
  %87 = sub nsw i64 %64, %86
  %88 = getelementptr inbounds i8, ptr %50, i64 20
  %89 = load i32, ptr %88, align 4, !tbaa !28
  %90 = sext i32 %89 to i64
  %91 = icmp slt i64 %87, %90
  br i1 %91, label %169, label %92

92:                                               ; preds = %84, %82
  %93 = load i32, ptr @Backtracking, align 4, !tbaa !27
  %94 = icmp eq i32 %93, 0
  %95 = load i32, ptr @Swaps, align 4
  %96 = icmp sgt i32 %95, 0
  %or.cond7 = select i1 %94, i1 true, i1 %96
  br i1 %or.cond7, label %97, label %149

97:                                               ; preds = %92
  %98 = icmp sgt i64 %64, %.0111153
  br i1 %98, label %135, label %99

99:                                               ; preds = %97
  %100 = icmp eq i64 %64, %.0111153
  br i1 %100, label %101, label %169

101:                                              ; preds = %99
  %102 = getelementptr inbounds i8, ptr %24, i64 96
  %103 = load ptr, ptr %102, align 8, !tbaa !29
  %.not137 = icmp eq ptr %103, null
  br i1 %.not137, label %110, label %104

104:                                              ; preds = %101
  %105 = icmp eq ptr %103, %50
  br i1 %105, label %169, label %106

106:                                              ; preds = %104
  %107 = getelementptr inbounds i8, ptr %50, i64 96
  %108 = load ptr, ptr %107, align 8, !tbaa !29
  %109 = icmp eq ptr %108, %24
  br i1 %109, label %169, label %118

110:                                              ; preds = %101
  %111 = getelementptr inbounds i8, ptr %24, i64 112
  %112 = load ptr, ptr %111, align 8, !tbaa !30
  %113 = icmp eq ptr %112, %50
  br i1 %113, label %169, label %114

114:                                              ; preds = %110
  %115 = getelementptr inbounds i8, ptr %50, i64 112
  %116 = load ptr, ptr %115, align 8, !tbaa !30
  %117 = icmp eq ptr %116, %24
  br i1 %117, label %169, label %118

118:                                              ; preds = %114, %106
  %119 = getelementptr inbounds i8, ptr %.0115152, i64 96
  %120 = load ptr, ptr %119, align 8, !tbaa !29
  %.not138 = icmp eq ptr %120, null
  br i1 %.not138, label %127, label %121

121:                                              ; preds = %118
  %122 = icmp eq ptr %120, %.0118150
  br i1 %122, label %135, label %123

123:                                              ; preds = %121
  %124 = getelementptr inbounds i8, ptr %.0118150, i64 96
  %125 = load ptr, ptr %124, align 8, !tbaa !29
  %126 = icmp eq ptr %125, %.0115152
  br i1 %126, label %135, label %169

127:                                              ; preds = %118
  %128 = getelementptr inbounds i8, ptr %.0115152, i64 112
  %129 = load ptr, ptr %128, align 8, !tbaa !30
  %130 = icmp eq ptr %129, %.0118150
  br i1 %130, label %135, label %131

131:                                              ; preds = %127
  %132 = getelementptr inbounds i8, ptr %.0118150, i64 112
  %133 = load ptr, ptr %132, align 8, !tbaa !30
  %134 = icmp eq ptr %133, %.0115152
  br i1 %134, label %135, label %169

135:                                              ; preds = %131, %127, %123, %121, %97
  %136 = load i32, ptr @MaxSwaps, align 4, !tbaa !27
  %137 = icmp slt i32 %95, %136
  br i1 %137, label %138, label %169

138:                                              ; preds = %135
  %139 = call i32 @Excludable(ptr noundef nonnull %24, ptr noundef %50) #3
  %.not139 = icmp eq i32 %139, 0
  br i1 %.not139, label %169, label %140

140:                                              ; preds = %138
  %141 = getelementptr inbounds i8, ptr %24, i64 200
  %142 = load ptr, ptr %141, align 8, !tbaa !31
  %143 = icmp eq ptr %142, %50
  br i1 %143, label %169, label %144

144:                                              ; preds = %140
  %145 = getelementptr inbounds i8, ptr %50, i64 200
  %146 = load ptr, ptr %145, align 8, !tbaa !31
  %147 = icmp eq ptr %146, %24
  br i1 %147, label %169, label %148

148:                                              ; preds = %144
  br label %169

149:                                              ; preds = %92
  %150 = load i32, ptr @MaxSwaps, align 4, !tbaa !27
  %151 = icmp sgt i32 %150, 0
  br i1 %151, label %152, label %169

152:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #3
  store i64 %64, ptr %5, align 8, !tbaa !20
  call void @Make2OptMove(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %24, ptr noundef %50) #3
  call void @Exclude(ptr noundef %0, ptr noundef nonnull %1) #3
  call void @Exclude(ptr noundef nonnull %24, ptr noundef %50) #3
  br label %153

153:                                              ; preds = %153, %152
  %.0 = phi ptr [ %50, %152 ], [ %155, %153 ]
  %154 = load ptr, ptr @BestSubsequentMove, align 8, !tbaa !16
  %155 = call ptr %154(ptr noundef %0, ptr noundef %.0, ptr noundef nonnull %5, ptr noundef %3) #3
  %.not134 = icmp eq ptr %155, null
  br i1 %.not134, label %156, label %153, !llvm.loop !32

156:                                              ; preds = %153
  %157 = load i64, ptr %3, align 8, !tbaa !20
  %158 = icmp slt i64 %157, 1
  br i1 %158, label %159, label %.critedge

159:                                              ; preds = %156
  call void @RestoreTour() #3
  %160 = load i16, ptr @Reversed, align 2, !tbaa !5
  %161 = load ptr, ptr %7, align 8, !tbaa !9
  %162 = load i8, ptr %161, align 8, !tbaa !14
  %163 = sext i8 %162 to i16
  %164 = icmp eq i16 %160, %163
  %.in135 = select i1 %164, ptr %12, ptr %13
  %165 = load ptr, ptr %.in135, align 8, !tbaa !16
  %.not136 = icmp eq ptr %165, %1
  br i1 %.not136, label %168, label %166

166:                                              ; preds = %159
  %167 = xor i16 %160, 1
  store i16 %167, ptr @Reversed, align 2, !tbaa !5
  br label %168

168:                                              ; preds = %159, %166
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  br label %169

169:                                              ; preds = %168, %148, %144, %140, %138, %135, %131, %123, %114, %110, %106, %104, %99, %149, %84, %43, %54, %58, %23, %27, %30
  %.1119 = phi ptr [ %.0118150, %23 ], [ %.0118150, %27 ], [ %.0118150, %30 ], [ %.0118150, %43 ], [ %.0118150, %54 ], [ %.0118150, %58 ], [ %.0118150, %84 ], [ %.0118150, %140 ], [ %.0118150, %144 ], [ %50, %148 ], [ %.0118150, %138 ], [ %.0118150, %135 ], [ %.0118150, %104 ], [ %.0118150, %106 ], [ %.0118150, %123 ], [ %.0118150, %131 ], [ %.0118150, %110 ], [ %.0118150, %114 ], [ %.0118150, %99 ], [ %.0118150, %168 ], [ %.0118150, %149 ]
  %.1116 = phi ptr [ %.0115152, %23 ], [ %.0115152, %27 ], [ %.0115152, %30 ], [ %.0115152, %43 ], [ %.0115152, %54 ], [ %.0115152, %58 ], [ %.0115152, %84 ], [ %.0115152, %140 ], [ %.0115152, %144 ], [ %24, %148 ], [ %.0115152, %138 ], [ %.0115152, %135 ], [ %.0115152, %104 ], [ %.0115152, %106 ], [ %.0115152, %123 ], [ %.0115152, %131 ], [ %.0115152, %110 ], [ %.0115152, %114 ], [ %.0115152, %99 ], [ %.0115152, %168 ], [ %.0115152, %149 ]
  %.1112 = phi i64 [ %.0111153, %23 ], [ %.0111153, %27 ], [ %.0111153, %30 ], [ %.0111153, %43 ], [ %.0111153, %54 ], [ %.0111153, %58 ], [ %.0111153, %84 ], [ %.0111153, %140 ], [ %.0111153, %144 ], [ %64, %148 ], [ %.0111153, %138 ], [ %.0111153, %135 ], [ %.0111153, %104 ], [ %.0111153, %106 ], [ %.0111153, %123 ], [ %.0111153, %131 ], [ %.0111153, %110 ], [ %.0111153, %114 ], [ %.0111153, %99 ], [ %.0111153, %168 ], [ %.0111153, %149 ]
  %.1 = phi i32 [ %.0110154, %23 ], [ %.0110154, %27 ], [ %.0110154, %30 ], [ %.0110154, %43 ], [ %.0110154, %54 ], [ %.0110154, %58 ], [ %80, %84 ], [ %80, %140 ], [ %80, %144 ], [ %80, %148 ], [ %80, %138 ], [ %80, %135 ], [ %80, %104 ], [ %80, %106 ], [ %80, %123 ], [ %80, %131 ], [ %80, %110 ], [ %80, %114 ], [ %80, %99 ], [ %80, %168 ], [ %80, %149 ]
  %170 = getelementptr inbounds i8, ptr %.0117151, i64 16
  %171 = load ptr, ptr %170, align 8, !tbaa !18
  %.not127 = icmp eq ptr %171, null
  br i1 %.not127, label %._crit_edge, label %23, !llvm.loop !34

._crit_edge:                                      ; preds = %169, %79
  %.0118.lcssa = phi ptr [ %.1119, %169 ], [ %.0118150, %79 ]
  %.0115.lcssa = phi ptr [ %.1116, %169 ], [ %.0115152, %79 ]
  %.0111.lcssa = phi i64 [ %.1112, %169 ], [ %.0111153, %79 ]
  store i64 0, ptr %3, align 8, !tbaa !20
  %.not140 = icmp eq ptr %.0118.lcssa, null
  br i1 %.not140, label %173, label %172

172:                                              ; preds = %._crit_edge
  call void @Flip_SL(ptr noundef %0, ptr noundef %1, ptr noundef %.0115.lcssa) #3
  call void @Exclude(ptr noundef %0, ptr noundef %1) #3
  call void @Exclude(ptr noundef %.0115.lcssa, ptr noundef nonnull %.0118.lcssa) #3
  store i64 %.0111.lcssa, ptr %2, align 8, !tbaa !20
  br label %173

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

173:                                              ; preds = %._crit_edge.thread, %._crit_edge, %172, %.critedge, %78
  %.3 = phi ptr [ null, %78 ], [ null, %.critedge ], [ %.0118.lcssa, %172 ], [ null, %._crit_edge ], [ null, %._crit_edge.thread ]
  ret ptr %.3
}

; 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 void @Make2OptMove(ptr noundef, ptr noundef, ptr noundef, ptr 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 = !{!10, !12, i64 152}
!26 = !{!10, !12, i64 160}
!27 = !{!11, !11, i64 0}
!28 = !{!10, !11, i64 20}
!29 = !{!10, !12, i64 96}
!30 = !{!10, !12, i64 112}
!31 = !{!10, !12, i64 200}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}


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