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

; 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 }

@FirstNode = external dso_local global ptr, align 8
@Run = external dso_local global i32, align 4
@Dimension = external dso_local global i32, align 4
@DimensionSaved = external dso_local global i32, align 4
@OrdinalTourCost = external hidden global i64, align 8
@C = external dso_local global ptr, align 8
@NodeSet = external dso_local global ptr, align 8
@Precision = external dso_local global i32, align 4
@BetterCost = external dso_local global i64, align 8
@MaxTrials = external dso_local global i32, align 4
@HTable = external dso_local global ptr, align 8
@Trial = external dso_local global i32, align 4
@TimeLimit = external dso_local global double, align 8
@TraceLevel = external dso_local global i32, align 4
@.str = external hidden unnamed_addr constant [29 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [18 x i8], align 1
@Optimum = external dso_local global i64, align 8
@.str.2 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [1 x i8], align 1
@BestCost = external dso_local global i64, align 8
@OutputTourFileName = external dso_local global ptr, align 8
@BetterTour = external dso_local global ptr, align 8
@StopAtOptimum = external dso_local global i32, align 4
@StopAtMaxCost = external dso_local global i32, align 4
@MaxCost = external dso_local global i64, align 8
@Hash = external dso_local global i32, align 4
@.str.7 = external hidden unnamed_addr constant [38 x i8], align 1
@BackboneTrials = external dso_local global i32, align 4
@.str.8 = external hidden unnamed_addr constant [30 x i8], align 1
@Norm = external dso_local global i32, align 4

; Function Attrs: nounwind uwtable
define dso_local i64 @FindTour() #0 {
  %1 = alloca i64, align 8
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %4 = alloca double, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %1) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %2) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #5
  %5 = call double @GetTime()
  store double %5, ptr %4, align 8, !tbaa !5
  %6 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  store ptr %6, ptr %2, align 8, !tbaa !9
  br label %7

7:                                                ; preds = %16, %0
  %8 = load ptr, ptr %2, align 8, !tbaa !9
  %9 = getelementptr inbounds %struct.Node, ptr %8, i32 0, i32 19
  store ptr null, ptr %9, align 8, !tbaa !11
  %10 = load ptr, ptr %2, align 8, !tbaa !9
  %11 = getelementptr inbounds %struct.Node, ptr %10, i32 0, i32 20
  store ptr null, ptr %11, align 8, !tbaa !14
  %12 = load ptr, ptr %2, align 8, !tbaa !9
  %13 = getelementptr inbounds %struct.Node, ptr %12, i32 0, i32 18
  store ptr null, ptr %13, align 8, !tbaa !15
  %14 = load ptr, ptr %2, align 8, !tbaa !9
  %15 = getelementptr inbounds %struct.Node, ptr %14, i32 0, i32 17
  store ptr null, ptr %15, align 8, !tbaa !16
  br label %16

16:                                               ; preds = %7
  %17 = load ptr, ptr %2, align 8, !tbaa !9
  %18 = getelementptr inbounds %struct.Node, ptr %17, i32 0, i32 16
  %19 = load ptr, ptr %18, align 8, !tbaa !17
  store ptr %19, ptr %2, align 8, !tbaa !9
  %20 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %21 = icmp ne ptr %19, %20
  br i1 %21, label %7, label %22, !llvm.loop !18

22:                                               ; preds = %16
  %23 = load i32, ptr @Run, align 4, !tbaa !20
  %24 = icmp eq i32 %23, 1
  br i1 %24, label %25, label %95

25:                                               ; preds = %22
  %26 = load i32, ptr @Dimension, align 4, !tbaa !20
  %27 = load i32, ptr @DimensionSaved, align 4, !tbaa !20
  %28 = icmp eq i32 %26, %27
  br i1 %28, label %29, label %95

29:                                               ; preds = %25
  store i64 0, ptr @OrdinalTourCost, align 8, !tbaa !21
  store i32 1, ptr %3, align 4, !tbaa !20
  br label %30

30:                                               ; preds = %64, %29
  %31 = load i32, ptr %3, align 4, !tbaa !20
  %32 = load i32, ptr @Dimension, align 4, !tbaa !20
  %33 = icmp slt i32 %31, %32
  br i1 %33, label %34, label %67

34:                                               ; preds = %30
  %35 = load ptr, ptr @C, align 8, !tbaa !9
  %36 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %37 = load i32, ptr %3, align 4, !tbaa !20
  %38 = sext i32 %37 to i64
  %39 = getelementptr inbounds %struct.Node, ptr %36, i64 %38
  %40 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %41 = load i32, ptr %3, align 4, !tbaa !20
  %42 = add nsw i32 %41, 1
  %43 = sext i32 %42 to i64
  %44 = getelementptr inbounds %struct.Node, ptr %40, i64 %43
  %45 = call i32 %35(ptr noundef %39, ptr noundef %44)
  %46 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %47 = load i32, ptr %3, align 4, !tbaa !20
  %48 = sext i32 %47 to i64
  %49 = getelementptr inbounds %struct.Node, ptr %46, i64 %48
  %50 = getelementptr inbounds %struct.Node, ptr %49, i32 0, i32 9
  %51 = load i32, ptr %50, align 4, !tbaa !23
  %52 = sub nsw i32 %45, %51
  %53 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %54 = load i32, ptr %3, align 4, !tbaa !20
  %55 = add nsw i32 %54, 1
  %56 = sext i32 %55 to i64
  %57 = getelementptr inbounds %struct.Node, ptr %53, i64 %56
  %58 = getelementptr inbounds %struct.Node, ptr %57, i32 0, i32 9
  %59 = load i32, ptr %58, align 4, !tbaa !23
  %60 = sub nsw i32 %52, %59
  %61 = sext i32 %60 to i64
  %62 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !21
  %63 = add nsw i64 %62, %61
  store i64 %63, ptr @OrdinalTourCost, align 8, !tbaa !21
  br label %64

64:                                               ; preds = %34
  %65 = load i32, ptr %3, align 4, !tbaa !20
  %66 = add nsw i32 %65, 1
  store i32 %66, ptr %3, align 4, !tbaa !20
  br label %30, !llvm.loop !24

67:                                               ; preds = %30
  %68 = load ptr, ptr @C, align 8, !tbaa !9
  %69 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %70 = load i32, ptr @Dimension, align 4, !tbaa !20
  %71 = sext i32 %70 to i64
  %72 = getelementptr inbounds %struct.Node, ptr %69, i64 %71
  %73 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %74 = getelementptr inbounds %struct.Node, ptr %73, i64 1
  %75 = call i32 %68(ptr noundef %72, ptr noundef %74)
  %76 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %77 = load i32, ptr @Dimension, align 4, !tbaa !20
  %78 = sext i32 %77 to i64
  %79 = getelementptr inbounds %struct.Node, ptr %76, i64 %78
  %80 = getelementptr inbounds %struct.Node, ptr %79, i32 0, i32 9
  %81 = load i32, ptr %80, align 4, !tbaa !23
  %82 = sub nsw i32 %75, %81
  %83 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %84 = getelementptr inbounds %struct.Node, ptr %83, i64 1
  %85 = getelementptr inbounds %struct.Node, ptr %84, i32 0, i32 9
  %86 = load i32, ptr %85, align 4, !tbaa !23
  %87 = sub nsw i32 %82, %86
  %88 = sext i32 %87 to i64
  %89 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !21
  %90 = add nsw i64 %89, %88
  store i64 %90, ptr @OrdinalTourCost, align 8, !tbaa !21
  %91 = load i32, ptr @Precision, align 4, !tbaa !20
  %92 = sext i32 %91 to i64
  %93 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !21
  %94 = sdiv i64 %93, %92
  store i64 %94, ptr @OrdinalTourCost, align 8, !tbaa !21
  br label %95

95:                                               ; preds = %67, %25, %22
  store i64 9223372036854775807, ptr @BetterCost, align 8, !tbaa !21
  %96 = load i32, ptr @MaxTrials, align 4, !tbaa !20
  %97 = icmp sgt i32 %96, 0
  br i1 %97, label %98, label %100

98:                                               ; preds = %95
  %99 = load ptr, ptr @HTable, align 8, !tbaa !9
  call void @HashInitialize(ptr noundef %99)
  br label %101

100:                                              ; preds = %95
  store i32 1, ptr @Trial, align 4, !tbaa !20
  call void @ChooseInitialTour()
  br label %101

101:                                              ; preds = %100, %98
  store i32 1, ptr @Trial, align 4, !tbaa !20
  br label %102

102:                                              ; preds = %310, %101
  %103 = load i32, ptr @Trial, align 4, !tbaa !20
  %104 = load i32, ptr @MaxTrials, align 4, !tbaa !20
  %105 = icmp sle i32 %103, %104
  br i1 %105, label %106, label %313

106:                                              ; preds = %102
  %107 = call double @GetTime()
  %108 = load double, ptr %4, align 8, !tbaa !5
  %109 = fsub double %107, %108
  %110 = load double, ptr @TimeLimit, align 8, !tbaa !5
  %111 = fcmp oge double %109, %110
  br i1 %111, label %112, label %117

112:                                              ; preds = %106
  %113 = load i32, ptr @TraceLevel, align 4, !tbaa !20
  %114 = icmp sge i32 %113, 1
  br i1 %114, label %115, label %116

115:                                              ; preds = %112
  call void (ptr, ...) @printff(ptr noundef @.str)
  br label %116

116:                                              ; preds = %115, %112
  br label %313

117:                                              ; preds = %106
  %118 = load i32, ptr @Dimension, align 4, !tbaa !20
  %119 = load i32, ptr @DimensionSaved, align 4, !tbaa !20
  %120 = icmp eq i32 %118, %119
  br i1 %120, label %121, label %129

121:                                              ; preds = %117
  %122 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %123 = call i32 @Random()
  %124 = load i32, ptr @Dimension, align 4, !tbaa !20
  %125 = urem i32 %123, %124
  %126 = add i32 1, %125
  %127 = zext i32 %126 to i64
  %128 = getelementptr inbounds %struct.Node, ptr %122, i64 %127
  store ptr %128, ptr @FirstNode, align 8, !tbaa !9
  br label %144

129:                                              ; preds = %117
  %130 = call i32 @Random()
  %131 = load i32, ptr @Dimension, align 4, !tbaa !20
  %132 = urem i32 %130, %131
  store i32 %132, ptr %3, align 4, !tbaa !20
  br label %133

133:                                              ; preds = %140, %129
  %134 = load i32, ptr %3, align 4, !tbaa !20
  %135 = icmp sgt i32 %134, 0
  br i1 %135, label %136, label %143

136:                                              ; preds = %133
  %137 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %138 = getelementptr inbounds %struct.Node, ptr %137, i32 0, i32 16
  %139 = load ptr, ptr %138, align 8, !tbaa !17
  store ptr %139, ptr @FirstNode, align 8, !tbaa !9
  br label %140

140:                                              ; preds = %136
  %141 = load i32, ptr %3, align 4, !tbaa !20
  %142 = add nsw i32 %141, -1
  store i32 %142, ptr %3, align 4, !tbaa !20
  br label %133, !llvm.loop !25

143:                                              ; preds = %133
  br label %144

144:                                              ; preds = %143, %121
  call void @ChooseInitialTour()
  %145 = call i64 @LinKernighan()
  store i64 %145, ptr %1, align 8, !tbaa !21
  %146 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %147 = getelementptr inbounds %struct.Node, ptr %146, i32 0, i32 19
  %148 = load ptr, ptr %147, align 8, !tbaa !11
  %149 = icmp ne ptr %148, null
  br i1 %149, label %150, label %163

150:                                              ; preds = %144
  %151 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  store ptr %151, ptr %2, align 8, !tbaa !9
  br label %152

152:                                              ; preds = %160, %150
  %153 = load ptr, ptr %2, align 8, !tbaa !9
  %154 = getelementptr inbounds %struct.Node, ptr %153, i32 0, i32 19
  %155 = load ptr, ptr %154, align 8, !tbaa !11
  %156 = load ptr, ptr %2, align 8, !tbaa !9
  %157 = getelementptr inbounds %struct.Node, ptr %156, i32 0, i32 23
  store ptr %155, ptr %157, align 8, !tbaa !26
  store ptr %155, ptr %2, align 8, !tbaa !9
  %158 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %159 = icmp ne ptr %155, %158
  br i1 %159, label %160, label %161

160:                                              ; preds = %152
  br label %152, !llvm.loop !27

161:                                              ; preds = %152
  %162 = call i64 @MergeWithTour()
  store i64 %162, ptr %1, align 8, !tbaa !21
  br label %163

163:                                              ; preds = %161, %144
  %164 = load i32, ptr @Dimension, align 4, !tbaa !20
  %165 = load i32, ptr @DimensionSaved, align 4, !tbaa !20
  %166 = icmp eq i32 %164, %165
  br i1 %166, label %167, label %203

167:                                              ; preds = %163
  %168 = load i64, ptr %1, align 8, !tbaa !21
  %169 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !21
  %170 = icmp sge i64 %168, %169
  br i1 %170, label %171, label %203

171:                                              ; preds = %167
  %172 = load i64, ptr @BetterCost, align 8, !tbaa !21
  %173 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !21
  %174 = icmp sgt i64 %172, %173
  br i1 %174, label %175, label %203

175:                                              ; preds = %171
  store i32 1, ptr %3, align 4, !tbaa !20
  br label %176

176:                                              ; preds = %191, %175
  %177 = load i32, ptr %3, align 4, !tbaa !20
  %178 = load i32, ptr @Dimension, align 4, !tbaa !20
  %179 = icmp slt i32 %177, %178
  br i1 %179, label %180, label %194

180:                                              ; preds = %176
  %181 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %182 = load i32, ptr %3, align 4, !tbaa !20
  %183 = add nsw i32 %182, 1
  %184 = sext i32 %183 to i64
  %185 = getelementptr inbounds %struct.Node, ptr %181, i64 %184
  %186 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %187 = load i32, ptr %3, align 4, !tbaa !20
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds %struct.Node, ptr %186, i64 %188
  %190 = getelementptr inbounds %struct.Node, ptr %189, i32 0, i32 23
  store ptr %185, ptr %190, align 8, !tbaa !26
  br label %191

191:                                              ; preds = %180
  %192 = load i32, ptr %3, align 4, !tbaa !20
  %193 = add nsw i32 %192, 1
  store i32 %193, ptr %3, align 4, !tbaa !20
  br label %176, !llvm.loop !28

194:                                              ; preds = %176
  %195 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %196 = getelementptr inbounds %struct.Node, ptr %195, i64 1
  %197 = load ptr, ptr @NodeSet, align 8, !tbaa !9
  %198 = load i32, ptr @Dimension, align 4, !tbaa !20
  %199 = sext i32 %198 to i64
  %200 = getelementptr inbounds %struct.Node, ptr %197, i64 %199
  %201 = getelementptr inbounds %struct.Node, ptr %200, i32 0, i32 23
  store ptr %196, ptr %201, align 8, !tbaa !26
  %202 = call i64 @MergeWithTour()
  store i64 %202, ptr %1, align 8, !tbaa !21
  br label %203

203:                                              ; preds = %194, %171, %167, %163
  %204 = load i64, ptr %1, align 8, !tbaa !21
  %205 = load i64, ptr @BetterCost, align 8, !tbaa !21
  %206 = icmp slt i64 %204, %205
  br i1 %206, label %207, label %278

207:                                              ; preds = %203
  %208 = load i32, ptr @TraceLevel, align 4, !tbaa !20
  %209 = icmp sge i32 %208, 1
  br i1 %209, label %210, label %244

210:                                              ; preds = %207
  %211 = load i32, ptr @Trial, align 4, !tbaa !20
  %212 = load i64, ptr %1, align 8, !tbaa !21
  call void (ptr, ...) @printff(ptr noundef @.str.1, i32 noundef %211, i64 noundef %212)
  %213 = load i64, ptr @Optimum, align 8, !tbaa !21
  %214 = icmp ne i64 %213, -9223372036854775808
  br i1 %214, label %215, label %227

215:                                              ; preds = %210
  %216 = load i64, ptr @Optimum, align 8, !tbaa !21
  %217 = icmp ne i64 %216, 0
  br i1 %217, label %218, label %227

218:                                              ; preds = %215
  %219 = load i64, ptr %1, align 8, !tbaa !21
  %220 = load i64, ptr @Optimum, align 8, !tbaa !21
  %221 = sub nsw i64 %219, %220
  %222 = sitofp i64 %221 to double
  %223 = fmul double 1.000000e+02, %222
  %224 = load i64, ptr @Optimum, align 8, !tbaa !21
  %225 = sitofp i64 %224 to double
  %226 = fdiv double %223, %225
  call void (ptr, ...) @printff(ptr noundef @.str.2, double noundef %226)
  br label %227

227:                                              ; preds = %218, %215, %210
  %228 = call double @GetTime()
  %229 = load double, ptr %4, align 8, !tbaa !5
  %230 = fsub double %228, %229
  %231 = call double @llvm.fabs.f64(double %230)
  %232 = load i64, ptr %1, align 8, !tbaa !21
  %233 = load i64, ptr @Optimum, align 8, !tbaa !21
  %234 = icmp slt i64 %232, %233
  br i1 %234, label %235, label %236

235:                                              ; preds = %227
  br label %242

236:                                              ; preds = %227
  %237 = load i64, ptr %1, align 8, !tbaa !21
  %238 = load i64, ptr @Optimum, align 8, !tbaa !21
  %239 = icmp eq i64 %237, %238
  %240 = zext i1 %239 to i64
  %241 = select i1 %239, ptr @.str.5, ptr @.str.6
  br label %242

242:                                              ; preds = %236, %235
  %243 = phi ptr [ @.str.4, %235 ], [ %241, %236 ]
  call void (ptr, ...) @printff(ptr noundef @.str.3, double noundef %231, ptr noundef %243)
  br label %244

244:                                              ; preds = %242, %207
  %245 = load i64, ptr %1, align 8, !tbaa !21
  store i64 %245, ptr @BetterCost, align 8, !tbaa !21
  call void @RecordBetterTour()
  %246 = load i32, ptr @Dimension, align 4, !tbaa !20
  %247 = load i32, ptr @DimensionSaved, align 4, !tbaa !20
  %248 = icmp eq i32 %246, %247
  br i1 %248, label %249, label %257

249:                                              ; preds = %244
  %250 = load i64, ptr @BetterCost, align 8, !tbaa !21
  %251 = load i64, ptr @BestCost, align 8, !tbaa !21
  %252 = icmp slt i64 %250, %251
  br i1 %252, label %253, label %257

253:                                              ; preds = %249
  %254 = load ptr, ptr @OutputTourFileName, align 8, !tbaa !9
  %255 = load ptr, ptr @BetterTour, align 8, !tbaa !9
  %256 = load i64, ptr @BetterCost, align 8, !tbaa !21
  call void @WriteTour(ptr noundef %254, ptr noundef %255, i64 noundef %256)
  br label %257

257:                                              ; preds = %253, %249, %244
  %258 = load i32, ptr @StopAtOptimum, align 4, !tbaa !20
  %259 = icmp ne i32 %258, 0
  br i1 %259, label %260, label %265

260:                                              ; preds = %257
  %261 = load i64, ptr @BetterCost, align 8, !tbaa !21
  %262 = load i64, ptr @Optimum, align 8, !tbaa !21
  %263 = icmp eq i64 %261, %262
  br i1 %263, label %264, label %265

264:                                              ; preds = %260
  br label %313

265:                                              ; preds = %260, %257
  %266 = load i32, ptr @StopAtMaxCost, align 4, !tbaa !20
  %267 = icmp ne i32 %266, 0
  br i1 %267, label %268, label %273

268:                                              ; preds = %265
  %269 = load i64, ptr @BetterCost, align 8, !tbaa !21
  %270 = load i64, ptr @MaxCost, align 8, !tbaa !21
  %271 = icmp sle i64 %269, %270
  br i1 %271, label %272, label %273

272:                                              ; preds = %268
  br label %313

273:                                              ; preds = %268, %265
  call void @AdjustCandidateSet()
  %274 = load ptr, ptr @HTable, align 8, !tbaa !9
  call void @HashInitialize(ptr noundef %274)
  %275 = load ptr, ptr @HTable, align 8, !tbaa !9
  %276 = load i32, ptr @Hash, align 4, !tbaa !20
  %277 = load i64, ptr %1, align 8, !tbaa !21
  call void @HashInsert(ptr noundef %275, i32 noundef %276, i64 noundef %277)
  br label %289

278:                                              ; preds = %203
  %279 = load i32, ptr @TraceLevel, align 4, !tbaa !20
  %280 = icmp sge i32 %279, 2
  br i1 %280, label %281, label %288

281:                                              ; preds = %278
  %282 = load i32, ptr @Trial, align 4, !tbaa !20
  %283 = load i64, ptr %1, align 8, !tbaa !21
  %284 = call double @GetTime()
  %285 = load double, ptr %4, align 8, !tbaa !5
  %286 = fsub double %284, %285
  %287 = call double @llvm.fabs.f64(double %286)
  call void (ptr, ...) @printff(ptr noundef @.str.7, i32 noundef %282, i64 noundef %283, double noundef %287)
  br label %288

288:                                              ; preds = %281, %278
  br label %289

289:                                              ; preds = %288, %273
  %290 = load i32, ptr @Trial, align 4, !tbaa !20
  %291 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %292 = icmp sle i32 %290, %291
  br i1 %292, label %293, label %309

293:                                              ; preds = %289
  %294 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %295 = load i32, ptr @MaxTrials, align 4, !tbaa !20
  %296 = icmp slt i32 %294, %295
  br i1 %296, label %297, label %309

297:                                              ; preds = %293
  call void @SwapCandidateSets()
  call void @AdjustCandidateSet()
  %298 = load i32, ptr @Trial, align 4, !tbaa !20
  %299 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %300 = icmp eq i32 %298, %299
  br i1 %300, label %301, label %307

301:                                              ; preds = %297
  %302 = load i32, ptr @TraceLevel, align 4, !tbaa !20
  %303 = icmp sge i32 %302, 1
  br i1 %303, label %304, label %306

304:                                              ; preds = %301
  %305 = load i32, ptr @Trial, align 4, !tbaa !20
  call void (ptr, ...) @printff(ptr noundef @.str.8, i32 noundef %305)
  call void @CandidateReport()
  br label %306

306:                                              ; preds = %304, %301
  br label %308

307:                                              ; preds = %297
  call void @SwapCandidateSets()
  br label %308

308:                                              ; preds = %307, %306
  br label %309

309:                                              ; preds = %308, %293, %289
  br label %310

310:                                              ; preds = %309
  %311 = load i32, ptr @Trial, align 4, !tbaa !20
  %312 = add nsw i32 %311, 1
  store i32 %312, ptr @Trial, align 4, !tbaa !20
  br label %102, !llvm.loop !29

313:                                              ; preds = %272, %264, %116, %102
  %314 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %315 = icmp sgt i32 %314, 0
  br i1 %315, label %316, label %351

316:                                              ; preds = %313
  %317 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %318 = load i32, ptr @MaxTrials, align 4, !tbaa !20
  %319 = icmp slt i32 %317, %318
  br i1 %319, label %320, label %351

320:                                              ; preds = %316
  %321 = load i32, ptr @Trial, align 4, !tbaa !20
  %322 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %323 = icmp sgt i32 %321, %322
  br i1 %323, label %335, label %324

324:                                              ; preds = %320
  %325 = load i32, ptr @Trial, align 4, !tbaa !20
  %326 = load i32, ptr @BackboneTrials, align 4, !tbaa !20
  %327 = icmp eq i32 %325, %326
  br i1 %327, label %328, label %336

328:                                              ; preds = %324
  %329 = load i32, ptr @StopAtOptimum, align 4, !tbaa !20
  %330 = icmp ne i32 %329, 0
  br i1 %330, label %331, label %335

331:                                              ; preds = %328
  %332 = load i64, ptr @BetterCost, align 8, !tbaa !21
  %333 = load i64, ptr @Optimum, align 8, !tbaa !21
  %334 = icmp ne i64 %332, %333
  br i1 %334, label %335, label %336

335:                                              ; preds = %331, %328, %320
  call void @SwapCandidateSets()
  br label %336

336:                                              ; preds = %335, %331, %324
  %337 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  store ptr %337, ptr %2, align 8, !tbaa !9
  br label %338

338:                                              ; preds = %344, %336
  %339 = load ptr, ptr %2, align 8, !tbaa !9
  %340 = getelementptr inbounds %struct.Node, ptr %339, i32 0, i32 44
  %341 = load ptr, ptr %340, align 8, !tbaa !30
  call void @free(ptr noundef %341) #5
  %342 = load ptr, ptr %2, align 8, !tbaa !9
  %343 = getelementptr inbounds %struct.Node, ptr %342, i32 0, i32 44
  store ptr null, ptr %343, align 8, !tbaa !30
  br label %344

344:                                              ; preds = %338
  %345 = load ptr, ptr %2, align 8, !tbaa !9
  %346 = getelementptr inbounds %struct.Node, ptr %345, i32 0, i32 16
  %347 = load ptr, ptr %346, align 8, !tbaa !17
  store ptr %347, ptr %2, align 8, !tbaa !9
  %348 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %349 = icmp ne ptr %347, %348
  br i1 %349, label %338, label %350, !llvm.loop !31

350:                                              ; preds = %344
  br label %351

351:                                              ; preds = %350, %316, %313
  %352 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  store ptr %352, ptr %2, align 8, !tbaa !9
  %353 = load i32, ptr @Norm, align 4, !tbaa !20
  %354 = icmp eq i32 %353, 0
  br i1 %354, label %355, label %367

355:                                              ; preds = %351
  br label %356

356:                                              ; preds = %362, %355
  %357 = load ptr, ptr %2, align 8, !tbaa !9
  %358 = getelementptr inbounds %struct.Node, ptr %357, i32 0, i32 16
  %359 = load ptr, ptr %358, align 8, !tbaa !17
  %360 = load ptr, ptr %2, align 8, !tbaa !9
  %361 = getelementptr inbounds %struct.Node, ptr %360, i32 0, i32 19
  store ptr %359, ptr %361, align 8, !tbaa !11
  store ptr %359, ptr %2, align 8, !tbaa !9
  br label %362

362:                                              ; preds = %356
  %363 = load ptr, ptr %2, align 8, !tbaa !9
  %364 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %365 = icmp ne ptr %363, %364
  br i1 %365, label %356, label %366, !llvm.loop !32

366:                                              ; preds = %362
  br label %367

367:                                              ; preds = %366, %351
  br label %368

368:                                              ; preds = %376, %367
  %369 = load ptr, ptr %2, align 8, !tbaa !9
  %370 = load ptr, ptr %2, align 8, !tbaa !9
  %371 = getelementptr inbounds %struct.Node, ptr %370, i32 0, i32 19
  %372 = load ptr, ptr %371, align 8, !tbaa !11
  %373 = load ptr, ptr %2, align 8, !tbaa !9
  %374 = getelementptr inbounds %struct.Node, ptr %373, i32 0, i32 16
  store ptr %372, ptr %374, align 8, !tbaa !17
  %375 = getelementptr inbounds %struct.Node, ptr %372, i32 0, i32 15
  store ptr %369, ptr %375, align 8, !tbaa !33
  br label %376

376:                                              ; preds = %368
  %377 = load ptr, ptr %2, align 8, !tbaa !9
  %378 = getelementptr inbounds %struct.Node, ptr %377, i32 0, i32 19
  %379 = load ptr, ptr %378, align 8, !tbaa !11
  store ptr %379, ptr %2, align 8, !tbaa !9
  %380 = load ptr, ptr @FirstNode, align 8, !tbaa !9
  %381 = icmp ne ptr %379, %380
  br i1 %381, label %368, label %382, !llvm.loop !34

382:                                              ; preds = %376
  %383 = load i32, ptr @Trial, align 4, !tbaa !20
  %384 = load i32, ptr @MaxTrials, align 4, !tbaa !20
  %385 = icmp sgt i32 %383, %384
  br i1 %385, label %386, label %388

386:                                              ; preds = %382
  %387 = load i32, ptr @MaxTrials, align 4, !tbaa !20
  store i32 %387, ptr @Trial, align 4, !tbaa !20
  br label %388

388:                                              ; preds = %386, %382
  call void @ResetCandidateSet()
  %389 = load i64, ptr @BetterCost, align 8, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %2) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %1) #5
  ret i64 %389
}

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

declare double @GetTime() #2

declare void @HashInitialize(ptr noundef) #2

declare void @ChooseInitialTour() #2

declare void @printff(ptr noundef, ...) #2

declare i32 @Random() #2

declare i64 @LinKernighan() #2

declare i64 @MergeWithTour() #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fabs.f64(double) #3

declare void @RecordBetterTour() #2

declare void @WriteTour(ptr noundef, ptr noundef, i64 noundef) #2

declare void @AdjustCandidateSet() #2

declare void @HashInsert(ptr noundef, i32 noundef, i64 noundef) #2

declare void @CandidateReport() #2

; Function Attrs: nounwind
declare void @free(ptr noundef) #4

declare void @ResetCandidateSet() #2

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

; Function Attrs: nounwind uwtable
declare hidden void @SwapCandidateSets() #0

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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nounwind "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 #5 = { 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 = !{!"double", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !10, i64 96}
!12 = !{!"Node", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !13, i64 44, !13, i64 48, !13, i64 52, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !10, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !10, i64 296, !10, i64 304, !6, i64 312, !6, i64 320, !6, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !7, i64 360, !7, i64 361, !7, i64 362}
!13 = !{!"int", !7, i64 0}
!14 = !{!12, !10, i64 104}
!15 = !{!12, !10, i64 88}
!16 = !{!12, !10, i64 80}
!17 = !{!12, !10, i64 72}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!13, !13, i64 0}
!21 = !{!22, !22, i64 0}
!22 = !{!"long long", !7, i64 0}
!23 = !{!12, !13, i64 36}
!24 = distinct !{!24, !19}
!25 = distinct !{!25, !19}
!26 = !{!12, !10, i64 128}
!27 = distinct !{!27, !19}
!28 = distinct !{!28, !19}
!29 = distinct !{!29, !19}
!30 = !{!12, !10, i64 296}
!31 = distinct !{!31, !19}
!32 = distinct !{!32, !19}
!33 = !{!12, !10, i64 64}
!34 = distinct !{!34, !19}


; 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"

%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 }

@FirstNode = external dso_local local_unnamed_addr global ptr, align 8
@Run = external dso_local local_unnamed_addr global i32, align 4
@Dimension = external dso_local local_unnamed_addr global i32, align 4
@DimensionSaved = external dso_local local_unnamed_addr global i32, align 4
@OrdinalTourCost = external hidden local_unnamed_addr global i64, align 8
@C = external dso_local local_unnamed_addr global ptr, align 8
@NodeSet = external dso_local local_unnamed_addr global ptr, align 8
@Precision = external dso_local local_unnamed_addr global i32, align 4
@BetterCost = external dso_local local_unnamed_addr global i64, align 8
@MaxTrials = external dso_local local_unnamed_addr global i32, align 4
@HTable = external dso_local local_unnamed_addr global ptr, align 8
@Trial = external dso_local local_unnamed_addr global i32, align 4
@TimeLimit = external dso_local local_unnamed_addr global double, align 8
@TraceLevel = external dso_local local_unnamed_addr global i32, align 4
@.str = external hidden unnamed_addr constant [29 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [18 x i8], align 1
@Optimum = external dso_local local_unnamed_addr global i64, align 8
@.str.2 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [1 x i8], align 1
@BestCost = external dso_local local_unnamed_addr global i64, align 8
@OutputTourFileName = external dso_local local_unnamed_addr global ptr, align 8
@BetterTour = external dso_local local_unnamed_addr global ptr, align 8
@StopAtOptimum = external dso_local local_unnamed_addr global i32, align 4
@StopAtMaxCost = external dso_local local_unnamed_addr global i32, align 4
@MaxCost = external dso_local local_unnamed_addr global i64, align 8
@Hash = external dso_local local_unnamed_addr global i32, align 4
@.str.7 = external hidden unnamed_addr constant [38 x i8], align 1
@BackboneTrials = external dso_local local_unnamed_addr global i32, align 4
@.str.8 = external hidden unnamed_addr constant [30 x i8], align 1
@Norm = external dso_local local_unnamed_addr global i32, align 4

; Function Attrs: nounwind uwtable
define dso_local i64 @FindTour() local_unnamed_addr #0 {
  %1 = tail call double @GetTime() #5
  %2 = load ptr, ptr @FirstNode, align 8, !tbaa !5
  br label %3

3:                                                ; preds = %3, %0
  %.043 = phi ptr [ %2, %0 ], [ %6, %3 ]
  %4 = getelementptr inbounds i8, ptr %.043, i64 80
  %5 = getelementptr inbounds i8, ptr %.043, i64 72
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(32) %4, i8 0, i64 32, i1 false)
  %6 = load ptr, ptr %5, align 8, !tbaa !9
  %.not = icmp eq ptr %6, %2
  br i1 %.not, label %7, label %3, !llvm.loop !13

7:                                                ; preds = %3
  %8 = load i32, ptr @Run, align 4, !tbaa !15
  %9 = icmp eq i32 %8, 1
  br i1 %9, label %10, label %53

10:                                               ; preds = %7
  %11 = load i32, ptr @Dimension, align 4, !tbaa !15
  %12 = load i32, ptr @DimensionSaved, align 4, !tbaa !15
  %13 = icmp eq i32 %11, %12
  br i1 %13, label %.preheader87, label %53

.preheader87:                                     ; preds = %10
  store i64 0, ptr @OrdinalTourCost, align 8, !tbaa !16
  %14 = icmp sgt i32 %11, 1
  %.pre108 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  br i1 %14, label %.lr.ph, label %.preheader87.._crit_edge_crit_edge

.preheader87.._crit_edge_crit_edge:               ; preds = %.preheader87
  %.pre111 = sext i32 %11 to i64
  br label %._crit_edge

.lr.ph:                                           ; preds = %.preheader87, %.lr.ph
  %15 = phi ptr [ %20, %.lr.ph ], [ %.pre108, %.preheader87 ]
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 1, %.preheader87 ]
  %16 = load ptr, ptr @C, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.Node, ptr %15, i64 %indvars.iv
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %18 = getelementptr inbounds %struct.Node, ptr %15, i64 %indvars.iv.next
  %19 = tail call i32 %16(ptr noundef nonnull %17, ptr noundef nonnull %18) #5
  %20 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.Node, ptr %20, i64 %indvars.iv, i32 9
  %22 = load i32, ptr %21, align 4, !tbaa !18
  %23 = getelementptr inbounds %struct.Node, ptr %20, i64 %indvars.iv.next, i32 9
  %24 = load i32, ptr %23, align 4, !tbaa !18
  %25 = add i32 %22, %24
  %26 = sub i32 %19, %25
  %27 = sext i32 %26 to i64
  %28 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !16
  %29 = add nsw i64 %28, %27
  store i64 %29, ptr @OrdinalTourCost, align 8, !tbaa !16
  %30 = load i32, ptr @Dimension, align 4, !tbaa !15
  %31 = sext i32 %30 to i64
  %32 = icmp slt i64 %indvars.iv.next, %31
  br i1 %32, label %.lr.ph, label %._crit_edge, !llvm.loop !19

._crit_edge:                                      ; preds = %.lr.ph, %.preheader87.._crit_edge_crit_edge
  %.pre-phi = phi i64 [ %.pre111, %.preheader87.._crit_edge_crit_edge ], [ %31, %.lr.ph ]
  %33 = phi ptr [ %.pre108, %.preheader87.._crit_edge_crit_edge ], [ %20, %.lr.ph ]
  %34 = load ptr, ptr @C, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.Node, ptr %33, i64 %.pre-phi
  %36 = getelementptr inbounds i8, ptr %33, i64 368
  %37 = tail call i32 %34(ptr noundef %35, ptr noundef nonnull %36) #5
  %38 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %39 = load i32, ptr @Dimension, align 4, !tbaa !15
  %40 = sext i32 %39 to i64
  %41 = getelementptr inbounds %struct.Node, ptr %38, i64 %40, i32 9
  %42 = load i32, ptr %41, align 4, !tbaa !18
  %43 = getelementptr inbounds i8, ptr %38, i64 404
  %44 = load i32, ptr %43, align 4, !tbaa !18
  %45 = add i32 %42, %44
  %46 = sub i32 %37, %45
  %47 = sext i32 %46 to i64
  %48 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !16
  %49 = add nsw i64 %48, %47
  %50 = load i32, ptr @Precision, align 4, !tbaa !15
  %51 = sext i32 %50 to i64
  %52 = sdiv i64 %49, %51
  store i64 %52, ptr @OrdinalTourCost, align 8, !tbaa !16
  br label %53

53:                                               ; preds = %._crit_edge, %10, %7
  store i64 9223372036854775807, ptr @BetterCost, align 8, !tbaa !16
  %54 = load i32, ptr @MaxTrials, align 4, !tbaa !15
  %55 = icmp sgt i32 %54, 0
  br i1 %55, label %56, label %58

56:                                               ; preds = %53
  %57 = load ptr, ptr @HTable, align 8, !tbaa !5
  tail call void @HashInitialize(ptr noundef %57) #5
  br label %59

58:                                               ; preds = %53
  store i32 1, ptr @Trial, align 4, !tbaa !15
  tail call void @ChooseInitialTour() #5
  br label %59

59:                                               ; preds = %58, %56
  store i32 1, ptr @Trial, align 4, !tbaa !15
  %60 = load i32, ptr @MaxTrials, align 4, !tbaa !15
  %.not5997 = icmp slt i32 %60, 1
  br i1 %.not5997, label %.loopexit86, label %.lr.ph99

.lr.ph99:                                         ; preds = %59, %225
  %61 = tail call double @GetTime() #5
  %62 = fsub double %61, %1
  %63 = load double, ptr @TimeLimit, align 8, !tbaa !20
  %64 = fcmp ult double %62, %63
  br i1 %64, label %69, label %65

65:                                               ; preds = %.lr.ph99
  %66 = load i32, ptr @TraceLevel, align 4, !tbaa !15
  %67 = icmp sgt i32 %66, 0
  br i1 %67, label %68, label %.loopexit86

68:                                               ; preds = %65
  tail call void (ptr, ...) @printff(ptr noundef nonnull @.str) #5
  br label %.loopexit86

69:                                               ; preds = %.lr.ph99
  %70 = load i32, ptr @Dimension, align 4, !tbaa !15
  %71 = load i32, ptr @DimensionSaved, align 4, !tbaa !15
  %72 = icmp eq i32 %70, %71
  br i1 %72, label %73, label %81

73:                                               ; preds = %69
  %74 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %75 = tail call i32 @Random() #5
  %76 = load i32, ptr @Dimension, align 4, !tbaa !15
  %77 = urem i32 %75, %76
  %78 = add nuw i32 %77, 1
  %79 = zext i32 %78 to i64
  %80 = getelementptr inbounds %struct.Node, ptr %74, i64 %79
  br label %.loopexit85.sink.split

81:                                               ; preds = %69
  %82 = tail call i32 @Random() #5
  %.fr = freeze i32 %82
  %83 = load i32, ptr @Dimension, align 4, !tbaa !15
  %84 = urem i32 %.fr, %83
  %85 = icmp sgt i32 %84, 0
  br i1 %85, label %.lr.ph92.preheader, label %.loopexit85

.lr.ph92.preheader:                               ; preds = %81
  %FirstNode.promoted = load ptr, ptr @FirstNode, align 8, !tbaa !5
  %86 = urem i32 %.fr, %83
  %87 = add i32 %86, -1
  %xtraiter = and i32 %84, 7
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph92.prol.loopexit, label %.lr.ph92.prol

.lr.ph92.prol:                                    ; preds = %.lr.ph92.preheader, %.lr.ph92.prol
  %.14290.prol = phi i32 [ %91, %.lr.ph92.prol ], [ %84, %.lr.ph92.preheader ]
  %88 = phi ptr [ %90, %.lr.ph92.prol ], [ %FirstNode.promoted, %.lr.ph92.preheader ]
  %prol.iter = phi i32 [ %prol.iter.next, %.lr.ph92.prol ], [ 0, %.lr.ph92.preheader ]
  %89 = getelementptr inbounds i8, ptr %88, i64 72
  %90 = load ptr, ptr %89, align 8, !tbaa !9
  %91 = add nsw i32 %.14290.prol, -1
  %prol.iter.next = add i32 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i32 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph92.prol.loopexit, label %.lr.ph92.prol, !llvm.loop !21

.lr.ph92.prol.loopexit:                           ; preds = %.lr.ph92.prol, %.lr.ph92.preheader
  %.14290.unr = phi i32 [ %84, %.lr.ph92.preheader ], [ %91, %.lr.ph92.prol ]
  %.unr = phi ptr [ %FirstNode.promoted, %.lr.ph92.preheader ], [ %90, %.lr.ph92.prol ]
  %.lcssa121.unr = phi ptr [ poison, %.lr.ph92.preheader ], [ %90, %.lr.ph92.prol ]
  %92 = icmp ult i32 %87, 7
  br i1 %92, label %.loopexit85.sink.split, label %.lr.ph92

.lr.ph92:                                         ; preds = %.lr.ph92.prol.loopexit, %.lr.ph92
  %.14290 = phi i32 [ %110, %.lr.ph92 ], [ %.14290.unr, %.lr.ph92.prol.loopexit ]
  %93 = phi ptr [ %109, %.lr.ph92 ], [ %.unr, %.lr.ph92.prol.loopexit ]
  %94 = getelementptr inbounds i8, ptr %93, i64 72
  %95 = load ptr, ptr %94, align 8, !tbaa !9
  %96 = getelementptr inbounds i8, ptr %95, i64 72
  %97 = load ptr, ptr %96, align 8, !tbaa !9
  %98 = getelementptr inbounds i8, ptr %97, i64 72
  %99 = load ptr, ptr %98, align 8, !tbaa !9
  %100 = getelementptr inbounds i8, ptr %99, i64 72
  %101 = load ptr, ptr %100, align 8, !tbaa !9
  %102 = getelementptr inbounds i8, ptr %101, i64 72
  %103 = load ptr, ptr %102, align 8, !tbaa !9
  %104 = getelementptr inbounds i8, ptr %103, i64 72
  %105 = load ptr, ptr %104, align 8, !tbaa !9
  %106 = getelementptr inbounds i8, ptr %105, i64 72
  %107 = load ptr, ptr %106, align 8, !tbaa !9
  %108 = getelementptr inbounds i8, ptr %107, i64 72
  %109 = load ptr, ptr %108, align 8, !tbaa !9
  %110 = add nsw i32 %.14290, -8
  %111 = add i32 %.14290, -9
  %112 = icmp ult i32 %111, -2
  br i1 %112, label %.lr.ph92, label %.loopexit85.sink.split, !llvm.loop !23

.loopexit85.sink.split:                           ; preds = %.lr.ph92.prol.loopexit, %.lr.ph92, %73
  %.lcssa113.sink = phi ptr [ %80, %73 ], [ %.lcssa121.unr, %.lr.ph92.prol.loopexit ], [ %109, %.lr.ph92 ]
  store ptr %.lcssa113.sink, ptr @FirstNode, align 8, !tbaa !5
  br label %.loopexit85

.loopexit85:                                      ; preds = %.loopexit85.sink.split, %81
  tail call void @ChooseInitialTour() #5
  %113 = tail call i64 @LinKernighan() #5
  %114 = load ptr, ptr @FirstNode, align 8, !tbaa !5
  %115 = getelementptr inbounds i8, ptr %114, i64 96
  %116 = load ptr, ptr %115, align 8, !tbaa !24
  %.not60 = icmp eq ptr %116, null
  br i1 %.not60, label %122, label %.preheader84

.preheader84:                                     ; preds = %.loopexit85, %.preheader84
  %.144 = phi ptr [ %118, %.preheader84 ], [ %114, %.loopexit85 ]
  %117 = getelementptr inbounds i8, ptr %.144, i64 96
  %118 = load ptr, ptr %117, align 8, !tbaa !24
  %119 = getelementptr inbounds i8, ptr %.144, i64 128
  store ptr %118, ptr %119, align 8, !tbaa !25
  %.not61 = icmp eq ptr %118, %114
  br i1 %.not61, label %120, label %.preheader84, !llvm.loop !26

120:                                              ; preds = %.preheader84
  %121 = tail call i64 @MergeWithTour() #5
  br label %122

122:                                              ; preds = %120, %.loopexit85
  %.0 = phi i64 [ %121, %120 ], [ %113, %.loopexit85 ]
  %123 = load i32, ptr @Dimension, align 4, !tbaa !15
  %124 = load i32, ptr @DimensionSaved, align 4, !tbaa !15
  %125 = icmp eq i32 %123, %124
  %.pre109 = load i64, ptr @BetterCost, align 8
  br i1 %125, label %126, label %153

126:                                              ; preds = %122
  %127 = load i64, ptr @OrdinalTourCost, align 8, !tbaa !16
  %.not62 = icmp sge i64 %.0, %127
  %128 = icmp sgt i64 %.pre109, %127
  %or.cond = select i1 %.not62, i1 %128, i1 false
  br i1 %or.cond, label %.preheader83, label %153

.preheader83:                                     ; preds = %126
  %129 = icmp sgt i32 %123, 1
  br i1 %129, label %.lr.ph95.preheader, label %._crit_edge96

.lr.ph95.preheader:                               ; preds = %.preheader83
  %wide.trip.count = zext nneg i32 %123 to i64
  %130 = add nsw i64 %wide.trip.count, -1
  %131 = add nsw i64 %wide.trip.count, -2
  %xtraiter124 = and i64 %130, 3
  %132 = icmp ult i64 %131, 3
  br i1 %132, label %._crit_edge96.loopexit.unr-lcssa, label %.lr.ph95.preheader.new

.lr.ph95.preheader.new:                           ; preds = %.lr.ph95.preheader
  %unroll_iter = and i64 %130, -4
  br label %.lr.ph95

.lr.ph95:                                         ; preds = %.lr.ph95, %.lr.ph95.preheader.new
  %indvars.iv105 = phi i64 [ 1, %.lr.ph95.preheader.new ], [ %indvars.iv.next106.3, %.lr.ph95 ]
  %niter = phi i64 [ 0, %.lr.ph95.preheader.new ], [ %niter.next.3, %.lr.ph95 ]
  %133 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %indvars.iv.next106 = add nuw nsw i64 %indvars.iv105, 1
  %134 = getelementptr inbounds %struct.Node, ptr %133, i64 %indvars.iv.next106
  %135 = getelementptr inbounds %struct.Node, ptr %133, i64 %indvars.iv105, i32 23
  store ptr %134, ptr %135, align 8, !tbaa !25
  %136 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %indvars.iv.next106.1 = add nuw nsw i64 %indvars.iv105, 2
  %137 = getelementptr inbounds %struct.Node, ptr %136, i64 %indvars.iv.next106.1
  %138 = getelementptr inbounds %struct.Node, ptr %136, i64 %indvars.iv.next106, i32 23
  store ptr %137, ptr %138, align 8, !tbaa !25
  %139 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %indvars.iv.next106.2 = add nuw nsw i64 %indvars.iv105, 3
  %140 = getelementptr inbounds %struct.Node, ptr %139, i64 %indvars.iv.next106.2
  %141 = getelementptr inbounds %struct.Node, ptr %139, i64 %indvars.iv.next106.1, i32 23
  store ptr %140, ptr %141, align 8, !tbaa !25
  %142 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %indvars.iv.next106.3 = add nuw nsw i64 %indvars.iv105, 4
  %143 = getelementptr inbounds %struct.Node, ptr %142, i64 %indvars.iv.next106.3
  %144 = getelementptr inbounds %struct.Node, ptr %142, i64 %indvars.iv.next106.2, i32 23
  store ptr %143, ptr %144, align 8, !tbaa !25
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge96.loopexit.unr-lcssa, label %.lr.ph95, !llvm.loop !27

._crit_edge96.loopexit.unr-lcssa:                 ; preds = %.lr.ph95, %.lr.ph95.preheader
  %indvars.iv105.unr = phi i64 [ 1, %.lr.ph95.preheader ], [ %indvars.iv.next106.3, %.lr.ph95 ]
  %lcmp.mod125.not = icmp eq i64 %xtraiter124, 0
  br i1 %lcmp.mod125.not, label %._crit_edge96, label %.lr.ph95.epil

.lr.ph95.epil:                                    ; preds = %._crit_edge96.loopexit.unr-lcssa, %.lr.ph95.epil
  %indvars.iv105.epil = phi i64 [ %indvars.iv.next106.epil, %.lr.ph95.epil ], [ %indvars.iv105.unr, %._crit_edge96.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph95.epil ], [ 0, %._crit_edge96.loopexit.unr-lcssa ]
  %145 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %indvars.iv.next106.epil = add nuw nsw i64 %indvars.iv105.epil, 1
  %146 = getelementptr inbounds %struct.Node, ptr %145, i64 %indvars.iv.next106.epil
  %147 = getelementptr inbounds %struct.Node, ptr %145, i64 %indvars.iv105.epil, i32 23
  store ptr %146, ptr %147, align 8, !tbaa !25
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter124
  br i1 %epil.iter.cmp.not, label %._crit_edge96, label %.lr.ph95.epil, !llvm.loop !28

._crit_edge96:                                    ; preds = %._crit_edge96.loopexit.unr-lcssa, %.lr.ph95.epil, %.preheader83
  %148 = load ptr, ptr @NodeSet, align 8, !tbaa !5
  %149 = getelementptr inbounds i8, ptr %148, i64 368
  %150 = sext i32 %123 to i64
  %151 = getelementptr inbounds %struct.Node, ptr %148, i64 %150, i32 23
  store ptr %149, ptr %151, align 8, !tbaa !25
  %152 = tail call i64 @MergeWithTour() #5
  %.pre = load i64, ptr @BetterCost, align 8, !tbaa !16
  br label %153

153:                                              ; preds = %._crit_edge96, %126, %122
  %154 = phi i64 [ %.pre, %._crit_edge96 ], [ %.pre109, %126 ], [ %.pre109, %122 ]
  %.1 = phi i64 [ %152, %._crit_edge96 ], [ %.0, %126 ], [ %.0, %122 ]
  %155 = icmp slt i64 %.1, %154
  %156 = load i32, ptr @TraceLevel, align 4, !tbaa !15
  br i1 %155, label %157, label %204

157:                                              ; preds = %153
  %158 = icmp sgt i32 %156, 0
  br i1 %158, label %159, label %178

159:                                              ; preds = %157
  %160 = load i32, ptr @Trial, align 4, !tbaa !15
  tail call void (ptr, ...) @printff(ptr noundef nonnull @.str.1, i32 noundef %160, i64 noundef %.1) #5
  %161 = load i64, ptr @Optimum, align 8
  %162 = and i64 %161, 9223372036854775807
  %or.cond.not = icmp eq i64 %162, 0
  br i1 %or.cond.not, label %169, label %163

163:                                              ; preds = %159
  %164 = sub nsw i64 %.1, %161
  %165 = sitofp i64 %164 to double
  %166 = fmul double %165, 1.000000e+02
  %167 = sitofp i64 %161 to double
  %168 = fdiv double %166, %167
  tail call void (ptr, ...) @printff(ptr noundef nonnull @.str.2, double noundef %168) #5
  br label %169

169:                                              ; preds = %163, %159
  %170 = tail call double @GetTime() #5
  %171 = fsub double %170, %1
  %172 = tail call double @llvm.fabs.f64(double %171)
  %173 = load i64, ptr @Optimum, align 8, !tbaa !16
  %174 = icmp slt i64 %.1, %173
  %175 = icmp eq i64 %.1, %173
  %176 = select i1 %175, ptr @.str.5, ptr @.str.6
  %177 = select i1 %174, ptr @.str.4, ptr %176
  tail call void (ptr, ...) @printff(ptr noundef nonnull @.str.3, double noundef %172, ptr noundef nonnull %177) #5
  br label %178

178:                                              ; preds = %169, %157
  store i64 %.1, ptr @BetterCost, align 8, !tbaa !16
  tail call void @RecordBetterTour() #5
  %179 = load i32, ptr @Dimension, align 4, !tbaa !15
  %180 = load i32, ptr @DimensionSaved, align 4, !tbaa !15
  %181 = icmp eq i32 %179, %180
  br i1 %181, label %182, label %189

182:                                              ; preds = %178
  %183 = load i64, ptr @BetterCost, align 8, !tbaa !16
  %184 = load i64, ptr @BestCost, align 8, !tbaa !16
  %185 = icmp slt i64 %183, %184
  br i1 %185, label %186, label %189

186:                                              ; preds = %182
  %187 = load ptr, ptr @OutputTourFileName, align 8, !tbaa !5
  %188 = load ptr, ptr @BetterTour, align 8, !tbaa !5
  tail call void @WriteTour(ptr noundef %187, ptr noundef %188, i64 noundef %183) #5
  br label %189

189:                                              ; preds = %186, %182, %178
  %190 = load i32, ptr @StopAtOptimum, align 4, !tbaa !15
  %.not63 = icmp eq i32 %190, 0
  br i1 %.not63, label %195, label %191

191:                                              ; preds = %189
  %192 = load i64, ptr @BetterCost, align 8, !tbaa !16
  %193 = load i64, ptr @Optimum, align 8, !tbaa !16
  %194 = icmp eq i64 %192, %193
  br i1 %194, label %.loopexit86, label %195

195:                                              ; preds = %191, %189
  %196 = load i32, ptr @StopAtMaxCost, align 4, !tbaa !15
  %.not64 = icmp eq i32 %196, 0
  br i1 %.not64, label %200, label %197

197:                                              ; preds = %195
  %198 = load i64, ptr @BetterCost, align 8, !tbaa !16
  %199 = load i64, ptr @MaxCost, align 8, !tbaa !16
  %.not65 = icmp sgt i64 %198, %199
  br i1 %.not65, label %200, label %.loopexit86

200:                                              ; preds = %197, %195
  tail call void @AdjustCandidateSet() #5
  %201 = load ptr, ptr @HTable, align 8, !tbaa !5
  tail call void @HashInitialize(ptr noundef %201) #5
  %202 = load ptr, ptr @HTable, align 8, !tbaa !5
  %203 = load i32, ptr @Hash, align 4, !tbaa !15
  tail call void @HashInsert(ptr noundef %202, i32 noundef %203, i64 noundef %.1) #5
  br label %211

204:                                              ; preds = %153
  %205 = icmp sgt i32 %156, 1
  br i1 %205, label %206, label %211

206:                                              ; preds = %204
  %207 = load i32, ptr @Trial, align 4, !tbaa !15
  %208 = tail call double @GetTime() #5
  %209 = fsub double %208, %1
  %210 = tail call double @llvm.fabs.f64(double %209)
  tail call void (ptr, ...) @printff(ptr noundef nonnull @.str.7, i32 noundef %207, i64 noundef %.1, double noundef %210) #5
  br label %211

211:                                              ; preds = %204, %206, %200
  %212 = load i32, ptr @Trial, align 4, !tbaa !15
  %213 = load i32, ptr @BackboneTrials, align 4, !tbaa !15
  %.not66 = icmp sle i32 %212, %213
  %214 = load i32, ptr @MaxTrials, align 4
  %215 = icmp slt i32 %213, %214
  %or.cond74 = select i1 %.not66, i1 %215, i1 false
  br i1 %or.cond74, label %216, label %225

216:                                              ; preds = %211
  tail call void @SwapCandidateSets()
  tail call void @AdjustCandidateSet() #5
  %217 = load i32, ptr @Trial, align 4, !tbaa !15
  %218 = load i32, ptr @BackboneTrials, align 4, !tbaa !15
  %219 = icmp eq i32 %217, %218
  br i1 %219, label %220, label %224

220:                                              ; preds = %216
  %221 = load i32, ptr @TraceLevel, align 4, !tbaa !15
  %222 = icmp sgt i32 %221, 0
  br i1 %222, label %223, label %225

223:                                              ; preds = %220
  tail call void (ptr, ...) @printff(ptr noundef nonnull @.str.8, i32 noundef %217) #5
  tail call void @CandidateReport() #5
  br label %225

224:                                              ; preds = %216
  tail call void @SwapCandidateSets()
  br label %225

225:                                              ; preds = %211, %220, %223, %224
  %226 = load i32, ptr @Trial, align 4, !tbaa !15
  %227 = add nsw i32 %226, 1
  store i32 %227, ptr @Trial, align 4, !tbaa !15
  %228 = load i32, ptr @MaxTrials, align 4, !tbaa !15
  %.not59.not = icmp slt i32 %226, %228
  br i1 %.not59.not, label %.lr.ph99, label %.loopexit86, !llvm.loop !29

.loopexit86:                                      ; preds = %225, %191, %197, %59, %65, %68
  %229 = load i32, ptr @BackboneTrials, align 4, !tbaa !15
  %230 = icmp sgt i32 %229, 0
  %231 = load i32, ptr @MaxTrials, align 4
  %232 = icmp slt i32 %229, %231
  %or.cond76 = select i1 %230, i1 %232, i1 false
  br i1 %or.cond76, label %233, label %.loopexit86..loopexit82_crit_edge

.loopexit86..loopexit82_crit_edge:                ; preds = %.loopexit86
  %.pre110 = load ptr, ptr @FirstNode, align 8, !tbaa !5
  br label %.loopexit82

233:                                              ; preds = %.loopexit86
  %234 = load i32, ptr @Trial, align 4, !tbaa !15
  %235 = icmp sgt i32 %234, %229
  br i1 %235, label %243, label %236

236:                                              ; preds = %233
  %237 = icmp eq i32 %234, %229
  br i1 %237, label %238, label %244

238:                                              ; preds = %236
  %239 = load i32, ptr @StopAtOptimum, align 4, !tbaa !15
  %.not67 = icmp eq i32 %239, 0
  br i1 %.not67, label %243, label %240

240:                                              ; preds = %238
  %241 = load i64, ptr @BetterCost, align 8, !tbaa !16
  %242 = load i64, ptr @Optimum, align 8, !tbaa !16
  %.not68 = icmp eq i64 %241, %242
  br i1 %.not68, label %244, label %243

243:                                              ; preds = %240, %238, %233
  tail call void @SwapCandidateSets()
  br label %244

244:                                              ; preds = %243, %240, %236
  %245 = load ptr, ptr @FirstNode, align 8, !tbaa !5
  br label %246

246:                                              ; preds = %246, %244
  %.245 = phi ptr [ %245, %244 ], [ %250, %246 ]
  %247 = getelementptr inbounds i8, ptr %.245, i64 296
  %248 = load ptr, ptr %247, align 8, !tbaa !30
  tail call void @free(ptr noundef %248) #5
  store ptr null, ptr %247, align 8, !tbaa !30
  %249 = getelementptr inbounds i8, ptr %.245, i64 72
  %250 = load ptr, ptr %249, align 8, !tbaa !9
  %251 = load ptr, ptr @FirstNode, align 8, !tbaa !5
  %.not69 = icmp eq ptr %250, %251
  br i1 %.not69, label %.loopexit82, label %246, !llvm.loop !31

.loopexit82:                                      ; preds = %246, %.loopexit86..loopexit82_crit_edge
  %252 = phi ptr [ %.pre110, %.loopexit86..loopexit82_crit_edge ], [ %251, %246 ]
  %253 = load i32, ptr @Norm, align 4, !tbaa !15
  %254 = icmp eq i32 %253, 0
  br i1 %254, label %.preheader, label %.loopexit.preheader

.preheader:                                       ; preds = %.loopexit82, %.preheader
  %.3 = phi ptr [ %256, %.preheader ], [ %252, %.loopexit82 ]
  %255 = getelementptr inbounds i8, ptr %.3, i64 72
  %256 = load ptr, ptr %255, align 8, !tbaa !9
  %257 = getelementptr inbounds i8, ptr %.3, i64 96
  store ptr %256, ptr %257, align 8, !tbaa !24
  %.not70 = icmp eq ptr %256, %252
  br i1 %.not70, label %.loopexit.preheader, label %.preheader, !llvm.loop !32

.loopexit.preheader:                              ; preds = %.preheader, %.loopexit82
  %.5.ph = phi ptr [ %252, %.loopexit82 ], [ %256, %.preheader ]
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.preheader, %.loopexit
  %.5 = phi ptr [ %259, %.loopexit ], [ %.5.ph, %.loopexit.preheader ]
  %258 = getelementptr inbounds i8, ptr %.5, i64 96
  %259 = load ptr, ptr %258, align 8, !tbaa !24
  %260 = getelementptr inbounds i8, ptr %.5, i64 72
  store ptr %259, ptr %260, align 8, !tbaa !9
  %261 = getelementptr inbounds i8, ptr %259, i64 64
  store ptr %.5, ptr %261, align 8, !tbaa !33
  %.not71 = icmp eq ptr %259, %252
  br i1 %.not71, label %262, label %.loopexit, !llvm.loop !34

262:                                              ; preds = %.loopexit
  %263 = load i32, ptr @Trial, align 4, !tbaa !15
  %264 = load i32, ptr @MaxTrials, align 4, !tbaa !15
  %265 = icmp sgt i32 %263, %264
  br i1 %265, label %266, label %267

266:                                              ; preds = %262
  store i32 %264, ptr @Trial, align 4, !tbaa !15
  br label %267

267:                                              ; preds = %266, %262
  tail call void @ResetCandidateSet() #5
  %268 = load i64, ptr @BetterCost, align 8, !tbaa !16
  ret i64 %268
}

declare double @GetTime() local_unnamed_addr #1

declare void @HashInitialize(ptr noundef) local_unnamed_addr #1

declare void @ChooseInitialTour() local_unnamed_addr #1

declare void @printff(ptr noundef, ...) local_unnamed_addr #1

declare i32 @Random() local_unnamed_addr #1

declare i64 @LinKernighan() local_unnamed_addr #1

declare i64 @MergeWithTour() local_unnamed_addr #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fabs.f64(double) #2

declare void @RecordBetterTour() local_unnamed_addr #1

declare void @WriteTour(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

declare void @AdjustCandidateSet() local_unnamed_addr #1

declare void @HashInsert(ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #1

declare void @CandidateReport() local_unnamed_addr #1

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #3

declare void @ResetCandidateSet() local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden void @SwapCandidateSets() local_unnamed_addr #0

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #4

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 = { "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 #2 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #5 = { 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, !6, i64 72}
!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, !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, !12, i64 312, !12, i64 320, !12, i64 328, !12, i64 336, !12, i64 344, !12, i64 352, !7, i64 360, !7, i64 361, !7, i64 362}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!11, !11, i64 0}
!16 = !{!17, !17, i64 0}
!17 = !{!"long long", !7, i64 0}
!18 = !{!10, !11, i64 36}
!19 = distinct !{!19, !14}
!20 = !{!12, !12, i64 0}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.unroll.disable"}
!23 = distinct !{!23, !14}
!24 = !{!10, !6, i64 96}
!25 = !{!10, !6, i64 128}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !22}
!29 = distinct !{!29, !14}
!30 = !{!10, !6, i64 296}
!31 = distinct !{!31, !14}
!32 = distinct !{!32, !14}
!33 = !{!10, !6, i64 64}
!34 = distinct !{!34, !14}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,MemCpyOptPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass