; LLVM IR from ekoontz/graphlab :: src/graphlab/extern/metis/libmetis/mmatch.ll_libmetis (MCMatch_SBHEM)

; 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.controldef = type { i64, i64, i64, i64, i64, i64, float, i64, i64, i64, i64, %struct.workspacedef, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double }
%struct.workspacedef = type { ptr, i64, i64, ptr, ptr, i64, ptr, ptr }
%struct.graphdef = type { i64, i64, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, i64, i64, ptr, ptr, i64, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, ptr, ptr, ptr, ptr }

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

declare double @gk_CPUSeconds() #1

declare ptr @libmetis__idxset(i64 noundef, i64 noundef, ptr noundef) #1

declare ptr @libmetis__idxwspacemalloc(ptr noundef, i64 noundef) #1

declare void @libmetis__RandomPermute(i64 noundef, ptr noundef, i64 noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local i64 @libmetis__AreAllVwgtsBelowFast(i64 noundef, ptr noundef, ptr noundef, float noundef) #2

declare void @libmetis__CreateCoarseGraph(ptr noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef) #1

declare void @libmetis__idxwspacefree(ptr noundef, i64 noundef) #1

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

declare void @libmetis__BucketSortKeysInc(i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local float @libmetis__BetterVBalance(i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local void @libmetis__MCMatch_SBHEM(ptr noundef %0, ptr noundef %1, i64 noundef %2) #2 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca i64, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca float, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store i64 %2, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  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
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #3
  %27 = load ptr, ptr %4, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.controldef, ptr %27, i32 0, i32 1
  %29 = load i64, ptr %28, align 8, !tbaa !11
  %30 = and i64 %29, 1
  %31 = icmp ne i64 %30, 0
  br i1 %31, label %32, label %38

32:                                               ; preds = %3
  %33 = call double @gk_CPUSeconds()
  %34 = load ptr, ptr %4, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.controldef, ptr %34, i32 0, i32 14
  %36 = load double, ptr %35, align 8, !tbaa !16
  %37 = fsub double %36, %33
  store double %37, ptr %35, align 8, !tbaa !16
  br label %38

38:                                               ; preds = %32, %3
  %39 = load ptr, ptr %5, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.graphdef, ptr %39, i32 0, i32 0
  %41 = load i64, ptr %40, align 8, !tbaa !17
  store i64 %41, ptr %11, align 8, !tbaa !9
  %42 = load ptr, ptr %5, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.graphdef, ptr %42, i32 0, i32 28
  %44 = load i64, ptr %43, align 8, !tbaa !20
  store i64 %44, ptr %13, align 8, !tbaa !9
  %45 = load ptr, ptr %5, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.graphdef, ptr %45, i32 0, i32 2
  %47 = load ptr, ptr %46, align 8, !tbaa !21
  store ptr %47, ptr %17, align 8, !tbaa !5
  %48 = load ptr, ptr %5, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.graphdef, ptr %48, i32 0, i32 29
  %50 = load ptr, ptr %49, align 8, !tbaa !22
  store ptr %50, ptr %25, align 8, !tbaa !5
  %51 = load ptr, ptr %5, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.graphdef, ptr %51, i32 0, i32 5
  %53 = load ptr, ptr %52, align 8, !tbaa !23
  store ptr %53, ptr %18, align 8, !tbaa !5
  %54 = load ptr, ptr %5, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.graphdef, ptr %54, i32 0, i32 6
  %56 = load ptr, ptr %55, align 8, !tbaa !24
  store ptr %56, ptr %19, align 8, !tbaa !5
  %57 = load ptr, ptr %5, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.graphdef, ptr %57, i32 0, i32 15
  %59 = load ptr, ptr %58, align 8, !tbaa !25
  store ptr %59, ptr %21, align 8, !tbaa !5
  %60 = load i64, ptr %11, align 8, !tbaa !9
  %61 = load ptr, ptr %4, align 8, !tbaa !5
  %62 = load i64, ptr %11, align 8, !tbaa !9
  %63 = call ptr @libmetis__idxwspacemalloc(ptr noundef %61, i64 noundef %62)
  %64 = call ptr @libmetis__idxset(i64 noundef %60, i64 noundef -1, ptr noundef %63)
  store ptr %64, ptr %20, align 8, !tbaa !5
  %65 = load ptr, ptr %4, align 8, !tbaa !5
  %66 = load i64, ptr %11, align 8, !tbaa !9
  %67 = call ptr @libmetis__idxwspacemalloc(ptr noundef %65, i64 noundef %66)
  store ptr %67, ptr %23, align 8, !tbaa !5
  %68 = load ptr, ptr %4, align 8, !tbaa !5
  %69 = load i64, ptr %11, align 8, !tbaa !9
  %70 = call ptr @libmetis__idxwspacemalloc(ptr noundef %68, i64 noundef %69)
  store ptr %70, ptr %24, align 8, !tbaa !5
  %71 = load ptr, ptr %4, align 8, !tbaa !5
  %72 = load i64, ptr %11, align 8, !tbaa !9
  %73 = call ptr @libmetis__idxwspacemalloc(ptr noundef %71, i64 noundef %72)
  store ptr %73, ptr %22, align 8, !tbaa !5
  %74 = load i64, ptr %11, align 8, !tbaa !9
  %75 = load ptr, ptr %24, align 8, !tbaa !5
  call void @libmetis__RandomPermute(i64 noundef %74, ptr noundef %75, i64 noundef 1)
  %76 = load ptr, ptr %17, align 8, !tbaa !5
  %77 = load i64, ptr %11, align 8, !tbaa !9
  %78 = getelementptr inbounds i64, ptr %76, i64 %77
  %79 = load i64, ptr %78, align 8, !tbaa !9
  %80 = load i64, ptr %11, align 8, !tbaa !9
  %81 = sdiv i64 %79, %80
  %82 = sitofp i64 %81 to double
  %83 = fmul double 0x3FE6666666666666, %82
  %84 = fptosi double %83 to i64
  store i64 %84, ptr %16, align 8, !tbaa !9
  store i64 0, ptr %7, align 8, !tbaa !9
  br label %85

85:                                               ; preds = %120, %38
  %86 = load i64, ptr %7, align 8, !tbaa !9
  %87 = load i64, ptr %11, align 8, !tbaa !9
  %88 = icmp slt i64 %86, %87
  br i1 %88, label %89, label %123

89:                                               ; preds = %85
  %90 = load ptr, ptr %17, align 8, !tbaa !5
  %91 = load i64, ptr %7, align 8, !tbaa !9
  %92 = add nsw i64 %91, 1
  %93 = getelementptr inbounds i64, ptr %90, i64 %92
  %94 = load i64, ptr %93, align 8, !tbaa !9
  %95 = load ptr, ptr %17, align 8, !tbaa !5
  %96 = load i64, ptr %7, align 8, !tbaa !9
  %97 = getelementptr inbounds i64, ptr %95, i64 %96
  %98 = load i64, ptr %97, align 8, !tbaa !9
  %99 = sub nsw i64 %94, %98
  %100 = load i64, ptr %16, align 8, !tbaa !9
  %101 = icmp sgt i64 %99, %100
  br i1 %101, label %102, label %104

102:                                              ; preds = %89
  %103 = load i64, ptr %16, align 8, !tbaa !9
  br label %115

104:                                              ; preds = %89
  %105 = load ptr, ptr %17, align 8, !tbaa !5
  %106 = load i64, ptr %7, align 8, !tbaa !9
  %107 = add nsw i64 %106, 1
  %108 = getelementptr inbounds i64, ptr %105, i64 %107
  %109 = load i64, ptr %108, align 8, !tbaa !9
  %110 = load ptr, ptr %17, align 8, !tbaa !5
  %111 = load i64, ptr %7, align 8, !tbaa !9
  %112 = getelementptr inbounds i64, ptr %110, i64 %111
  %113 = load i64, ptr %112, align 8, !tbaa !9
  %114 = sub nsw i64 %109, %113
  br label %115

115:                                              ; preds = %104, %102
  %116 = phi i64 [ %103, %102 ], [ %114, %104 ]
  %117 = load ptr, ptr %22, align 8, !tbaa !5
  %118 = load i64, ptr %7, align 8, !tbaa !9
  %119 = getelementptr inbounds i64, ptr %117, i64 %118
  store i64 %116, ptr %119, align 8, !tbaa !9
  br label %120

120:                                              ; preds = %115
  %121 = load i64, ptr %7, align 8, !tbaa !9
  %122 = add nsw i64 %121, 1
  store i64 %122, ptr %7, align 8, !tbaa !9
  br label %85, !llvm.loop !26

123:                                              ; preds = %85
  %124 = load i64, ptr %11, align 8, !tbaa !9
  %125 = load i64, ptr %16, align 8, !tbaa !9
  %126 = load ptr, ptr %22, align 8, !tbaa !5
  %127 = load ptr, ptr %24, align 8, !tbaa !5
  %128 = load ptr, ptr %23, align 8, !tbaa !5
  call void @libmetis__BucketSortKeysInc(i64 noundef %124, i64 noundef %125, ptr noundef %126, ptr noundef %127, ptr noundef %128)
  store i64 0, ptr %12, align 8, !tbaa !9
  store i64 0, ptr %8, align 8, !tbaa !9
  br label %129

129:                                              ; preds = %208, %123
  %130 = load i64, ptr %8, align 8, !tbaa !9
  %131 = load i64, ptr %11, align 8, !tbaa !9
  %132 = icmp slt i64 %130, %131
  br i1 %132, label %133, label %211

133:                                              ; preds = %129
  %134 = load ptr, ptr %23, align 8, !tbaa !5
  %135 = load i64, ptr %8, align 8, !tbaa !9
  %136 = getelementptr inbounds i64, ptr %134, i64 %135
  %137 = load i64, ptr %136, align 8, !tbaa !9
  store i64 %137, ptr %7, align 8, !tbaa !9
  %138 = load ptr, ptr %20, align 8, !tbaa !5
  %139 = load i64, ptr %7, align 8, !tbaa !9
  %140 = getelementptr inbounds i64, ptr %138, i64 %139
  %141 = load i64, ptr %140, align 8, !tbaa !9
  %142 = icmp eq i64 %141, -1
  br i1 %142, label %143, label %207

143:                                              ; preds = %133
  %144 = load ptr, ptr %17, align 8, !tbaa !5
  %145 = load i64, ptr %7, align 8, !tbaa !9
  %146 = getelementptr inbounds i64, ptr %144, i64 %145
  %147 = load i64, ptr %146, align 8, !tbaa !9
  %148 = load ptr, ptr %17, align 8, !tbaa !5
  %149 = load i64, ptr %7, align 8, !tbaa !9
  %150 = add nsw i64 %149, 1
  %151 = getelementptr inbounds i64, ptr %148, i64 %150
  %152 = load i64, ptr %151, align 8, !tbaa !9
  %153 = icmp slt i64 %147, %152
  br i1 %153, label %154, label %155

154:                                              ; preds = %143
  br label %211

155:                                              ; preds = %143
  %156 = load i64, ptr %7, align 8, !tbaa !9
  store i64 %156, ptr %14, align 8, !tbaa !9
  %157 = load i64, ptr %11, align 8, !tbaa !9
  %158 = sub nsw i64 %157, 1
  store i64 %158, ptr %9, align 8, !tbaa !9
  br label %159

159:                                              ; preds = %187, %155
  %160 = load i64, ptr %9, align 8, !tbaa !9
  %161 = load i64, ptr %8, align 8, !tbaa !9
  %162 = icmp sgt i64 %160, %161
  br i1 %162, label %163, label %190

163:                                              ; preds = %159
  %164 = load ptr, ptr %23, align 8, !tbaa !5
  %165 = load i64, ptr %9, align 8, !tbaa !9
  %166 = getelementptr inbounds i64, ptr %164, i64 %165
  %167 = load i64, ptr %166, align 8, !tbaa !9
  store i64 %167, ptr %10, align 8, !tbaa !9
  %168 = load ptr, ptr %20, align 8, !tbaa !5
  %169 = load i64, ptr %10, align 8, !tbaa !9
  %170 = getelementptr inbounds i64, ptr %168, i64 %169
  %171 = load i64, ptr %170, align 8, !tbaa !9
  %172 = icmp eq i64 %171, -1
  br i1 %172, label %173, label %186

173:                                              ; preds = %163
  %174 = load ptr, ptr %17, align 8, !tbaa !5
  %175 = load i64, ptr %10, align 8, !tbaa !9
  %176 = getelementptr inbounds i64, ptr %174, i64 %175
  %177 = load i64, ptr %176, align 8, !tbaa !9
  %178 = load ptr, ptr %17, align 8, !tbaa !5
  %179 = load i64, ptr %10, align 8, !tbaa !9
  %180 = add nsw i64 %179, 1
  %181 = getelementptr inbounds i64, ptr %178, i64 %180
  %182 = load i64, ptr %181, align 8, !tbaa !9
  %183 = icmp slt i64 %177, %182
  br i1 %183, label %184, label %186

184:                                              ; preds = %173
  %185 = load i64, ptr %10, align 8, !tbaa !9
  store i64 %185, ptr %14, align 8, !tbaa !9
  br label %190

186:                                              ; preds = %173, %163
  br label %187

187:                                              ; preds = %186
  %188 = load i64, ptr %9, align 8, !tbaa !9
  %189 = add nsw i64 %188, -1
  store i64 %189, ptr %9, align 8, !tbaa !9
  br label %159, !llvm.loop !28

190:                                              ; preds = %184, %159
  %191 = load i64, ptr %12, align 8, !tbaa !9
  %192 = add nsw i64 %191, 1
  store i64 %192, ptr %12, align 8, !tbaa !9
  %193 = load ptr, ptr %21, align 8, !tbaa !5
  %194 = load i64, ptr %14, align 8, !tbaa !9
  %195 = getelementptr inbounds i64, ptr %193, i64 %194
  store i64 %191, ptr %195, align 8, !tbaa !9
  %196 = load ptr, ptr %21, align 8, !tbaa !5
  %197 = load i64, ptr %7, align 8, !tbaa !9
  %198 = getelementptr inbounds i64, ptr %196, i64 %197
  store i64 %191, ptr %198, align 8, !tbaa !9
  %199 = load i64, ptr %14, align 8, !tbaa !9
  %200 = load ptr, ptr %20, align 8, !tbaa !5
  %201 = load i64, ptr %7, align 8, !tbaa !9
  %202 = getelementptr inbounds i64, ptr %200, i64 %201
  store i64 %199, ptr %202, align 8, !tbaa !9
  %203 = load i64, ptr %7, align 8, !tbaa !9
  %204 = load ptr, ptr %20, align 8, !tbaa !5
  %205 = load i64, ptr %14, align 8, !tbaa !9
  %206 = getelementptr inbounds i64, ptr %204, i64 %205
  store i64 %203, ptr %206, align 8, !tbaa !9
  br label %207

207:                                              ; preds = %190, %133
  br label %208

208:                                              ; preds = %207
  %209 = load i64, ptr %8, align 8, !tbaa !9
  %210 = add nsw i64 %209, 1
  store i64 %210, ptr %8, align 8, !tbaa !9
  br label %129, !llvm.loop !29

211:                                              ; preds = %154, %129
  br label %212

212:                                              ; preds = %333, %211
  %213 = load i64, ptr %8, align 8, !tbaa !9
  %214 = load i64, ptr %11, align 8, !tbaa !9
  %215 = icmp slt i64 %213, %214
  br i1 %215, label %216, label %336

216:                                              ; preds = %212
  %217 = load ptr, ptr %23, align 8, !tbaa !5
  %218 = load i64, ptr %8, align 8, !tbaa !9
  %219 = getelementptr inbounds i64, ptr %217, i64 %218
  %220 = load i64, ptr %219, align 8, !tbaa !9
  store i64 %220, ptr %7, align 8, !tbaa !9
  %221 = load ptr, ptr %20, align 8, !tbaa !5
  %222 = load i64, ptr %7, align 8, !tbaa !9
  %223 = getelementptr inbounds i64, ptr %221, i64 %222
  %224 = load i64, ptr %223, align 8, !tbaa !9
  %225 = icmp eq i64 %224, -1
  br i1 %225, label %226, label %332

226:                                              ; preds = %216
  %227 = load i64, ptr %7, align 8, !tbaa !9
  store i64 %227, ptr %14, align 8, !tbaa !9
  store i64 -1, ptr %15, align 8, !tbaa !9
  store float 0.000000e+00, ptr %26, align 4, !tbaa !30
  %228 = load ptr, ptr %17, align 8, !tbaa !5
  %229 = load i64, ptr %7, align 8, !tbaa !9
  %230 = getelementptr inbounds i64, ptr %228, i64 %229
  %231 = load i64, ptr %230, align 8, !tbaa !9
  store i64 %231, ptr %9, align 8, !tbaa !9
  br label %232

232:                                              ; preds = %312, %226
  %233 = load i64, ptr %9, align 8, !tbaa !9
  %234 = load ptr, ptr %17, align 8, !tbaa !5
  %235 = load i64, ptr %7, align 8, !tbaa !9
  %236 = add nsw i64 %235, 1
  %237 = getelementptr inbounds i64, ptr %234, i64 %236
  %238 = load i64, ptr %237, align 8, !tbaa !9
  %239 = icmp slt i64 %233, %238
  br i1 %239, label %240, label %315

240:                                              ; preds = %232
  %241 = load ptr, ptr %18, align 8, !tbaa !5
  %242 = load i64, ptr %9, align 8, !tbaa !9
  %243 = getelementptr inbounds i64, ptr %241, i64 %242
  %244 = load i64, ptr %243, align 8, !tbaa !9
  store i64 %244, ptr %10, align 8, !tbaa !9
  %245 = load ptr, ptr %20, align 8, !tbaa !5
  %246 = load i64, ptr %10, align 8, !tbaa !9
  %247 = getelementptr inbounds i64, ptr %245, i64 %246
  %248 = load i64, ptr %247, align 8, !tbaa !9
  %249 = icmp eq i64 %248, -1
  br i1 %249, label %250, label %311

250:                                              ; preds = %240
  %251 = load i64, ptr %13, align 8, !tbaa !9
  %252 = load ptr, ptr %25, align 8, !tbaa !5
  %253 = load i64, ptr %7, align 8, !tbaa !9
  %254 = load i64, ptr %13, align 8, !tbaa !9
  %255 = mul nsw i64 %253, %254
  %256 = getelementptr inbounds float, ptr %252, i64 %255
  %257 = load ptr, ptr %25, align 8, !tbaa !5
  %258 = load i64, ptr %10, align 8, !tbaa !9
  %259 = load i64, ptr %13, align 8, !tbaa !9
  %260 = mul nsw i64 %258, %259
  %261 = getelementptr inbounds float, ptr %257, i64 %260
  %262 = load ptr, ptr %4, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct.controldef, ptr %262, i32 0, i32 6
  %264 = load float, ptr %263, align 8, !tbaa !31
  %265 = call i64 @libmetis__AreAllVwgtsBelowFast(i64 noundef %251, ptr noundef %256, ptr noundef %261, float noundef %264)
  %266 = icmp ne i64 %265, 0
  br i1 %266, label %267, label %311

267:                                              ; preds = %250
  %268 = load i64, ptr %14, align 8, !tbaa !9
  %269 = load i64, ptr %7, align 8, !tbaa !9
  %270 = icmp ne i64 %268, %269
  br i1 %270, label %271, label %290

271:                                              ; preds = %267
  %272 = load i64, ptr %13, align 8, !tbaa !9
  %273 = load i64, ptr %6, align 8, !tbaa !9
  %274 = load ptr, ptr %25, align 8, !tbaa !5
  %275 = load i64, ptr %7, align 8, !tbaa !9
  %276 = load i64, ptr %13, align 8, !tbaa !9
  %277 = mul nsw i64 %275, %276
  %278 = getelementptr inbounds float, ptr %274, i64 %277
  %279 = load ptr, ptr %25, align 8, !tbaa !5
  %280 = load i64, ptr %14, align 8, !tbaa !9
  %281 = load i64, ptr %13, align 8, !tbaa !9
  %282 = mul nsw i64 %280, %281
  %283 = getelementptr inbounds float, ptr %279, i64 %282
  %284 = load ptr, ptr %25, align 8, !tbaa !5
  %285 = load i64, ptr %10, align 8, !tbaa !9
  %286 = load i64, ptr %13, align 8, !tbaa !9
  %287 = mul nsw i64 %285, %286
  %288 = getelementptr inbounds float, ptr %284, i64 %287
  %289 = call float @libmetis__BetterVBalance(i64 noundef %272, i64 noundef %273, ptr noundef %278, ptr noundef %283, ptr noundef %288)
  store float %289, ptr %26, align 4, !tbaa !30
  br label %290

290:                                              ; preds = %271, %267
  %291 = load float, ptr %26, align 4, !tbaa !30
  %292 = fcmp ogt float %291, 0.000000e+00
  br i1 %292, label %304, label %293

293:                                              ; preds = %290
  %294 = load float, ptr %26, align 4, !tbaa !30
  %295 = fpext float %294 to double
  %296 = fcmp ogt double %295, -1.000000e-02
  br i1 %296, label %297, label %310

297:                                              ; preds = %293
  %298 = load i64, ptr %15, align 8, !tbaa !9
  %299 = load ptr, ptr %19, align 8, !tbaa !5
  %300 = load i64, ptr %9, align 8, !tbaa !9
  %301 = getelementptr inbounds i64, ptr %299, i64 %300
  %302 = load i64, ptr %301, align 8, !tbaa !9
  %303 = icmp slt i64 %298, %302
  br i1 %303, label %304, label %310

304:                                              ; preds = %297, %290
  %305 = load ptr, ptr %19, align 8, !tbaa !5
  %306 = load i64, ptr %9, align 8, !tbaa !9
  %307 = getelementptr inbounds i64, ptr %305, i64 %306
  %308 = load i64, ptr %307, align 8, !tbaa !9
  store i64 %308, ptr %15, align 8, !tbaa !9
  %309 = load i64, ptr %10, align 8, !tbaa !9
  store i64 %309, ptr %14, align 8, !tbaa !9
  br label %310

310:                                              ; preds = %304, %297, %293
  br label %311

311:                                              ; preds = %310, %250, %240
  br label %312

312:                                              ; preds = %311
  %313 = load i64, ptr %9, align 8, !tbaa !9
  %314 = add nsw i64 %313, 1
  store i64 %314, ptr %9, align 8, !tbaa !9
  br label %232, !llvm.loop !32

315:                                              ; preds = %232
  %316 = load i64, ptr %12, align 8, !tbaa !9
  %317 = add nsw i64 %316, 1
  store i64 %317, ptr %12, align 8, !tbaa !9
  %318 = load ptr, ptr %21, align 8, !tbaa !5
  %319 = load i64, ptr %14, align 8, !tbaa !9
  %320 = getelementptr inbounds i64, ptr %318, i64 %319
  store i64 %316, ptr %320, align 8, !tbaa !9
  %321 = load ptr, ptr %21, align 8, !tbaa !5
  %322 = load i64, ptr %7, align 8, !tbaa !9
  %323 = getelementptr inbounds i64, ptr %321, i64 %322
  store i64 %316, ptr %323, align 8, !tbaa !9
  %324 = load i64, ptr %14, align 8, !tbaa !9
  %325 = load ptr, ptr %20, align 8, !tbaa !5
  %326 = load i64, ptr %7, align 8, !tbaa !9
  %327 = getelementptr inbounds i64, ptr %325, i64 %326
  store i64 %324, ptr %327, align 8, !tbaa !9
  %328 = load i64, ptr %7, align 8, !tbaa !9
  %329 = load ptr, ptr %20, align 8, !tbaa !5
  %330 = load i64, ptr %14, align 8, !tbaa !9
  %331 = getelementptr inbounds i64, ptr %329, i64 %330
  store i64 %328, ptr %331, align 8, !tbaa !9
  br label %332

332:                                              ; preds = %315, %216
  br label %333

333:                                              ; preds = %332
  %334 = load i64, ptr %8, align 8, !tbaa !9
  %335 = add nsw i64 %334, 1
  store i64 %335, ptr %8, align 8, !tbaa !9
  br label %212, !llvm.loop !33

336:                                              ; preds = %212
  %337 = load ptr, ptr %4, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct.controldef, ptr %337, i32 0, i32 1
  %339 = load i64, ptr %338, align 8, !tbaa !11
  %340 = and i64 %339, 1
  %341 = icmp ne i64 %340, 0
  br i1 %341, label %342, label %348

342:                                              ; preds = %336
  %343 = call double @gk_CPUSeconds()
  %344 = load ptr, ptr %4, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.controldef, ptr %344, i32 0, i32 14
  %346 = load double, ptr %345, align 8, !tbaa !16
  %347 = fadd double %346, %343
  store double %347, ptr %345, align 8, !tbaa !16
  br label %348

348:                                              ; preds = %342, %336
  %349 = load ptr, ptr %4, align 8, !tbaa !5
  %350 = load i64, ptr %11, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %349, i64 noundef %350)
  %351 = load ptr, ptr %4, align 8, !tbaa !5
  %352 = load i64, ptr %11, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %351, i64 noundef %352)
  %353 = load ptr, ptr %4, align 8, !tbaa !5
  %354 = load ptr, ptr %5, align 8, !tbaa !5
  %355 = load i64, ptr %12, align 8, !tbaa !9
  %356 = load ptr, ptr %20, align 8, !tbaa !5
  %357 = load ptr, ptr %23, align 8, !tbaa !5
  call void @libmetis__CreateCoarseGraph(ptr noundef %353, ptr noundef %354, i64 noundef %355, ptr noundef %356, ptr noundef %357)
  %358 = load ptr, ptr %4, align 8, !tbaa !5
  %359 = load i64, ptr %11, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %358, i64 noundef %359)
  %360 = load ptr, ptr %4, align 8, !tbaa !5
  %361 = load i64, ptr %11, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %360, i64 noundef %361)
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { 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 #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", !7, i64 0}
!11 = !{!12, !10, i64 8}
!12 = !{!"controldef", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !13, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !14, i64 88, !15, i64 152, !15, i64 160, !15, i64 168, !15, i64 176, !15, i64 184, !15, i64 192, !15, i64 200, !15, i64 208, !15, i64 216, !15, i64 224, !15, i64 232, !15, i64 240, !15, i64 248, !15, i64 256, !15, i64 264, !15, i64 272}
!13 = !{!"float", !7, i64 0}
!14 = !{!"workspacedef", !6, i64 0, !10, i64 8, !10, i64 16, !6, i64 24, !6, i64 32, !10, i64 40, !6, i64 48, !6, i64 56}
!15 = !{!"double", !7, i64 0}
!16 = !{!12, !15, i64 168}
!17 = !{!18, !10, i64 0}
!18 = !{!"graphdef", !10, i64 0, !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !19, i64 56, !19, i64 60, !19, i64 64, !19, i64 68, !19, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !10, i64 112, !10, i64 120, !6, i64 128, !6, i64 136, !10, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !10, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !6, i64 240}
!19 = !{!"int", !7, i64 0}
!20 = !{!18, !10, i64 208}
!21 = !{!18, !6, i64 16}
!22 = !{!18, !6, i64 216}
!23 = !{!18, !6, i64 40}
!24 = !{!18, !6, i64 48}
!25 = !{!18, !6, i64 104}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = distinct !{!28, !27}
!29 = distinct !{!29, !27}
!30 = !{!13, !13, i64 0}
!31 = !{!12, !13, i64 48}
!32 = distinct !{!32, !27}
!33 = distinct !{!33, !27}


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

declare double @gk_CPUSeconds() local_unnamed_addr #0

declare ptr @libmetis__idxset(i64 noundef, i64 noundef, ptr noundef) local_unnamed_addr #0

declare ptr @libmetis__idxwspacemalloc(ptr noundef, i64 noundef) local_unnamed_addr #0

declare void @libmetis__RandomPermute(i64 noundef, ptr noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local i64 @libmetis__AreAllVwgtsBelowFast(i64 noundef, ptr noundef, ptr noundef, float noundef) local_unnamed_addr #1

declare void @libmetis__CreateCoarseGraph(ptr noundef, ptr noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare void @libmetis__idxwspacefree(ptr noundef, i64 noundef) local_unnamed_addr #0

declare void @libmetis__BucketSortKeysInc(i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local float @libmetis__BetterVBalance(i64 noundef, i64 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local void @libmetis__MCMatch_SBHEM(ptr noundef %0, ptr noundef %1, i64 noundef %2) local_unnamed_addr #1 {
  %4 = getelementptr inbounds i8, ptr %0, i64 8
  %5 = load i64, ptr %4, align 8, !tbaa !5
  %6 = and i64 %5, 1
  %.not = icmp eq i64 %6, 0
  br i1 %.not, label %12, label %7

7:                                                ; preds = %3
  %8 = tail call double @gk_CPUSeconds() #3
  %9 = getelementptr inbounds i8, ptr %0, i64 168
  %10 = load double, ptr %9, align 8, !tbaa !14
  %11 = fsub double %10, %8
  store double %11, ptr %9, align 8, !tbaa !14
  br label %12

12:                                               ; preds = %7, %3
  %13 = load i64, ptr %1, align 8, !tbaa !15
  %14 = getelementptr inbounds i8, ptr %1, i64 208
  %15 = load i64, ptr %14, align 8, !tbaa !18
  %16 = getelementptr inbounds i8, ptr %1, i64 16
  %17 = load ptr, ptr %16, align 8, !tbaa !19
  %18 = getelementptr inbounds i8, ptr %1, i64 216
  %19 = load ptr, ptr %18, align 8, !tbaa !20
  %20 = getelementptr inbounds i8, ptr %1, i64 40
  %21 = load ptr, ptr %20, align 8, !tbaa !21
  %22 = getelementptr inbounds i8, ptr %1, i64 48
  %23 = load ptr, ptr %22, align 8, !tbaa !22
  %24 = getelementptr inbounds i8, ptr %1, i64 104
  %25 = load ptr, ptr %24, align 8, !tbaa !23
  %26 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef nonnull %0, i64 noundef %13) #3
  %27 = tail call ptr @libmetis__idxset(i64 noundef %13, i64 noundef -1, ptr noundef %26) #3
  %28 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef nonnull %0, i64 noundef %13) #3
  %29 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef nonnull %0, i64 noundef %13) #3
  %30 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef nonnull %0, i64 noundef %13) #3
  tail call void @libmetis__RandomPermute(i64 noundef %13, ptr noundef %29, i64 noundef 1) #3
  %31 = getelementptr inbounds i64, ptr %17, i64 %13
  %32 = load i64, ptr %31, align 8, !tbaa !24
  %33 = sdiv i64 %32, %13
  %34 = sitofp i64 %33 to double
  %35 = fmul double %34, 0x3FE6666666666666
  %36 = fptosi double %35 to i64
  %37 = icmp sgt i64 %13, 0
  br i1 %37, label %.lr.ph.preheader, label %._crit_edge.thread

.lr.ph.preheader:                                 ; preds = %12
  %min.iters.check = icmp ult i64 %13, 8
  br i1 %min.iters.check, label %.lr.ph.preheader221, label %vector.memcheck

.lr.ph.preheader221:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph.preheader
  %.0151170.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph.preheader ], [ %n.vec, %middle.block ]
  %.neg = or disjoint i64 %.0151170.ph, 1
  %xtraiter = and i64 %13, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol

.lr.ph.prol:                                      ; preds = %.lr.ph.preheader221
  %38 = or disjoint i64 %.0151170.ph, 1
  %39 = getelementptr inbounds i64, ptr %17, i64 %38
  %40 = load i64, ptr %39, align 8, !tbaa !24
  %41 = getelementptr inbounds i64, ptr %17, i64 %.0151170.ph
  %42 = load i64, ptr %41, align 8, !tbaa !24
  %43 = sub nsw i64 %40, %42
  %..prol = tail call i64 @llvm.smin.i64(i64 %43, i64 %36)
  %44 = getelementptr inbounds i64, ptr %30, i64 %.0151170.ph
  store i64 %..prol, ptr %44, align 8, !tbaa !24
  br label %.lr.ph.prol.loopexit

.lr.ph.prol.loopexit:                             ; preds = %.lr.ph.prol, %.lr.ph.preheader221
  %.0151170.unr = phi i64 [ %.0151170.ph, %.lr.ph.preheader221 ], [ %38, %.lr.ph.prol ]
  %45 = icmp eq i64 %13, %.neg
  br i1 %45, label %._crit_edge, label %.lr.ph

vector.memcheck:                                  ; preds = %.lr.ph.preheader
  %46 = shl i64 %13, 3
  %scevgep = getelementptr i8, ptr %30, i64 %46
  %47 = getelementptr i8, ptr %17, i64 %46
  %scevgep214 = getelementptr i8, ptr %47, i64 8
  %bound0 = icmp ult ptr %30, %scevgep214
  %bound1 = icmp ult ptr %17, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph.preheader221, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %13, 9223372036854775804
  %broadcast.splatinsert = insertelement <2 x i64> poison, i64 %36, i64 0
  %broadcast.splat = shufflevector <2 x i64> %broadcast.splatinsert, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %48 = or disjoint i64 %index, 1
  %49 = getelementptr inbounds i64, ptr %17, i64 %48
  %50 = getelementptr inbounds i8, ptr %49, i64 16
  %wide.load = load <2 x i64>, ptr %49, align 8, !tbaa !24, !alias.scope !25
  %wide.load215 = load <2 x i64>, ptr %50, align 8, !tbaa !24, !alias.scope !25
  %51 = getelementptr inbounds i64, ptr %17, i64 %index
  %52 = getelementptr inbounds i8, ptr %51, i64 16
  %wide.load216 = load <2 x i64>, ptr %51, align 8, !tbaa !24, !alias.scope !25
  %wide.load217 = load <2 x i64>, ptr %52, align 8, !tbaa !24, !alias.scope !25
  %53 = sub nsw <2 x i64> %wide.load, %wide.load216
  %54 = sub nsw <2 x i64> %wide.load215, %wide.load217
  %55 = tail call <2 x i64> @llvm.smin.v2i64(<2 x i64> %53, <2 x i64> %broadcast.splat)
  %56 = tail call <2 x i64> @llvm.smin.v2i64(<2 x i64> %54, <2 x i64> %broadcast.splat)
  %57 = getelementptr inbounds i64, ptr %30, i64 %index
  %58 = getelementptr inbounds i8, ptr %57, i64 16
  store <2 x i64> %55, ptr %57, align 8, !tbaa !24, !alias.scope !28, !noalias !25
  store <2 x i64> %56, ptr %58, align 8, !tbaa !24, !alias.scope !28, !noalias !25
  %index.next = add nuw i64 %index, 4
  %59 = icmp eq i64 %index.next, %n.vec
  br i1 %59, label %middle.block, label %vector.body, !llvm.loop !30

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %13, %n.vec
  br i1 %cmp.n, label %._crit_edge, label %.lr.ph.preheader221

._crit_edge.thread:                               ; preds = %12
  tail call void @libmetis__BucketSortKeysInc(i64 noundef %13, i64 noundef %36, ptr noundef %30, ptr noundef %29, ptr noundef %28) #3
  br label %._crit_edge182

.lr.ph:                                           ; preds = %.lr.ph.prol.loopexit, %.lr.ph
  %.0151170 = phi i64 [ %67, %.lr.ph ], [ %.0151170.unr, %.lr.ph.prol.loopexit ]
  %60 = add nuw nsw i64 %.0151170, 1
  %61 = getelementptr inbounds i64, ptr %17, i64 %60
  %62 = load i64, ptr %61, align 8, !tbaa !24
  %63 = getelementptr inbounds i64, ptr %17, i64 %.0151170
  %64 = load i64, ptr %63, align 8, !tbaa !24
  %65 = sub nsw i64 %62, %64
  %. = tail call i64 @llvm.smin.i64(i64 %65, i64 %36)
  %66 = getelementptr inbounds i64, ptr %30, i64 %.0151170
  store i64 %., ptr %66, align 8, !tbaa !24
  %67 = add nuw nsw i64 %.0151170, 2
  %68 = getelementptr inbounds i64, ptr %17, i64 %67
  %69 = load i64, ptr %68, align 8, !tbaa !24
  %70 = getelementptr inbounds i64, ptr %17, i64 %60
  %71 = load i64, ptr %70, align 8, !tbaa !24
  %72 = sub nsw i64 %69, %71
  %..1 = tail call i64 @llvm.smin.i64(i64 %72, i64 %36)
  %73 = getelementptr inbounds i64, ptr %30, i64 %60
  store i64 %..1, ptr %73, align 8, !tbaa !24
  %exitcond.not.1 = icmp eq i64 %67, %13
  br i1 %exitcond.not.1, label %._crit_edge, label %.lr.ph, !llvm.loop !34

._crit_edge:                                      ; preds = %.lr.ph.prol.loopexit, %.lr.ph, %middle.block
  tail call void @libmetis__BucketSortKeysInc(i64 noundef %13, i64 noundef %36, ptr noundef nonnull %30, ptr noundef %29, ptr noundef %28) #3
  br i1 %37, label %.lr.ph181, label %._crit_edge182

.lr.ph181:                                        ; preds = %._crit_edge
  %.0154171 = add nsw i64 %13, -1
  br label %74

74:                                               ; preds = %.lr.ph181, %104
  %.0152178 = phi i64 [ 0, %.lr.ph181 ], [ %105, %104 ]
  %.0156177 = phi i64 [ 0, %.lr.ph181 ], [ %.1157, %104 ]
  %75 = getelementptr inbounds i64, ptr %28, i64 %.0152178
  %76 = load i64, ptr %75, align 8, !tbaa !24
  %77 = getelementptr inbounds i64, ptr %27, i64 %76
  %78 = load i64, ptr %77, align 8, !tbaa !24
  %79 = icmp eq i64 %78, -1
  br i1 %79, label %80, label %104

80:                                               ; preds = %74
  %81 = getelementptr inbounds i64, ptr %17, i64 %76
  %82 = load i64, ptr %81, align 8, !tbaa !24
  %83 = getelementptr i8, ptr %81, i64 8
  %84 = load i64, ptr %83, align 8, !tbaa !24
  %85 = icmp slt i64 %82, %84
  br i1 %85, label %._crit_edge182, label %.preheader

.preheader:                                       ; preds = %80
  %86 = icmp sgt i64 %.0154171, %.0152178
  br i1 %86, label %.lr.ph173, label %._crit_edge174

.lr.ph173:                                        ; preds = %.preheader, %98
  %.0154172 = phi i64 [ %.0154, %98 ], [ %.0154171, %.preheader ]
  %87 = getelementptr inbounds i64, ptr %28, i64 %.0154172
  %88 = load i64, ptr %87, align 8, !tbaa !24
  %89 = getelementptr inbounds i64, ptr %27, i64 %88
  %90 = load i64, ptr %89, align 8, !tbaa !24
  %91 = icmp eq i64 %90, -1
  br i1 %91, label %92, label %98

92:                                               ; preds = %.lr.ph173
  %93 = getelementptr inbounds i64, ptr %17, i64 %88
  %94 = load i64, ptr %93, align 8, !tbaa !24
  %95 = getelementptr i8, ptr %93, i64 8
  %96 = load i64, ptr %95, align 8, !tbaa !24
  %97 = icmp slt i64 %94, %96
  br i1 %97, label %._crit_edge174, label %98

98:                                               ; preds = %.lr.ph173, %92
  %.0154 = add nsw i64 %.0154172, -1
  %99 = icmp sgt i64 %.0154, %.0152178
  br i1 %99, label %.lr.ph173, label %._crit_edge174, !llvm.loop !35

._crit_edge174:                                   ; preds = %98, %92, %.preheader
  %.0159 = phi i64 [ %76, %.preheader ], [ %88, %92 ], [ %76, %98 ]
  %100 = add nsw i64 %.0156177, 1
  %101 = getelementptr inbounds i64, ptr %25, i64 %.0159
  store i64 %.0156177, ptr %101, align 8, !tbaa !24
  %102 = getelementptr inbounds i64, ptr %25, i64 %76
  store i64 %.0156177, ptr %102, align 8, !tbaa !24
  store i64 %.0159, ptr %77, align 8, !tbaa !24
  %103 = getelementptr inbounds i64, ptr %27, i64 %.0159
  store i64 %76, ptr %103, align 8, !tbaa !24
  br label %104

104:                                              ; preds = %74, %._crit_edge174
  %.1157 = phi i64 [ %100, %._crit_edge174 ], [ %.0156177, %74 ]
  %105 = add nuw nsw i64 %.0152178, 1
  %exitcond202.not = icmp eq i64 %105, %13
  br i1 %exitcond202.not, label %._crit_edge200, label %74, !llvm.loop !36

._crit_edge182:                                   ; preds = %80, %._crit_edge.thread, %._crit_edge
  %.0156.lcssa = phi i64 [ 0, %._crit_edge ], [ 0, %._crit_edge.thread ], [ %.0156177, %80 ]
  %.0152.lcssa = phi i64 [ 0, %._crit_edge ], [ 0, %._crit_edge.thread ], [ %.0152178, %80 ]
  %106 = icmp slt i64 %.0152.lcssa, %13
  br i1 %106, label %.lr.ph199, label %._crit_edge200

.lr.ph199:                                        ; preds = %._crit_edge182
  %107 = getelementptr inbounds i8, ptr %0, i64 48
  br label %108

108:                                              ; preds = %.lr.ph199, %155
  %.1153197 = phi i64 [ %.0152.lcssa, %.lr.ph199 ], [ %156, %155 ]
  %.2158196 = phi i64 [ %.0156.lcssa, %.lr.ph199 ], [ %.3, %155 ]
  %109 = getelementptr inbounds i64, ptr %28, i64 %.1153197
  %110 = load i64, ptr %109, align 8, !tbaa !24
  %111 = getelementptr inbounds i64, ptr %27, i64 %110
  %112 = load i64, ptr %111, align 8, !tbaa !24
  %113 = icmp eq i64 %112, -1
  br i1 %113, label %114, label %155

114:                                              ; preds = %108
  %115 = getelementptr inbounds i64, ptr %17, i64 %110
  %116 = load i64, ptr %115, align 8, !tbaa !24
  %117 = getelementptr i8, ptr %115, i64 8
  %118 = load i64, ptr %117, align 8, !tbaa !24
  %119 = icmp slt i64 %116, %118
  br i1 %119, label %.lr.ph193, label %._crit_edge194

.lr.ph193:                                        ; preds = %114
  %120 = mul nsw i64 %110, %15
  %121 = getelementptr inbounds float, ptr %19, i64 %120
  br label %122

122:                                              ; preds = %.lr.ph193, %147
  %.0191 = phi float [ 0.000000e+00, %.lr.ph193 ], [ %.2, %147 ]
  %.1155190 = phi i64 [ %116, %.lr.ph193 ], [ %148, %147 ]
  %.1160189 = phi i64 [ %110, %.lr.ph193 ], [ %.2161, %147 ]
  %.0162188 = phi i64 [ -1, %.lr.ph193 ], [ %.1163, %147 ]
  %123 = getelementptr inbounds i64, ptr %21, i64 %.1155190
  %124 = load i64, ptr %123, align 8, !tbaa !24
  %125 = getelementptr inbounds i64, ptr %27, i64 %124
  %126 = load i64, ptr %125, align 8, !tbaa !24
  %127 = icmp eq i64 %126, -1
  br i1 %127, label %128, label %147

128:                                              ; preds = %122
  %129 = mul nsw i64 %124, %15
  %130 = getelementptr inbounds float, ptr %19, i64 %129
  %131 = load float, ptr %107, align 8, !tbaa !37
  %132 = tail call i64 @libmetis__AreAllVwgtsBelowFast(i64 noundef %15, ptr noundef %121, ptr noundef %130, float noundef %131)
  %.not168 = icmp eq i64 %132, 0
  br i1 %.not168, label %147, label %133

133:                                              ; preds = %128
  %.not169 = icmp eq i64 %.1160189, %110
  br i1 %.not169, label %138, label %134

134:                                              ; preds = %133
  %135 = mul nsw i64 %.1160189, %15
  %136 = getelementptr inbounds float, ptr %19, i64 %135
  %137 = tail call float @libmetis__BetterVBalance(i64 noundef %15, i64 noundef %2, ptr noundef %121, ptr noundef %136, ptr noundef %130)
  br label %138

138:                                              ; preds = %134, %133
  %.1 = phi float [ %137, %134 ], [ %.0191, %133 ]
  %139 = fcmp ogt float %.1, 0.000000e+00
  br i1 %139, label %._crit_edge204, label %140

._crit_edge204:                                   ; preds = %138
  %.phi.trans.insert = getelementptr inbounds i64, ptr %23, i64 %.1155190
  %.pre = load i64, ptr %.phi.trans.insert, align 8, !tbaa !24
  br label %147

140:                                              ; preds = %138
  %141 = fpext float %.1 to double
  %142 = fcmp ogt double %141, -1.000000e-02
  br i1 %142, label %143, label %147

143:                                              ; preds = %140
  %144 = getelementptr inbounds i64, ptr %23, i64 %.1155190
  %145 = load i64, ptr %144, align 8, !tbaa !24
  %146 = icmp slt i64 %.0162188, %145
  %spec.select = tail call i64 @llvm.smax.i64(i64 %.0162188, i64 %145)
  %spec.select210 = select i1 %146, i64 %124, i64 %.1160189
  br label %147

147:                                              ; preds = %143, %._crit_edge204, %122, %128, %140
  %.1163 = phi i64 [ %.0162188, %140 ], [ %.0162188, %128 ], [ %.0162188, %122 ], [ %.pre, %._crit_edge204 ], [ %spec.select, %143 ]
  %.2161 = phi i64 [ %.1160189, %140 ], [ %.1160189, %128 ], [ %.1160189, %122 ], [ %124, %._crit_edge204 ], [ %spec.select210, %143 ]
  %.2 = phi float [ %.1, %140 ], [ %.0191, %128 ], [ %.0191, %122 ], [ %.1, %._crit_edge204 ], [ %.1, %143 ]
  %148 = add nsw i64 %.1155190, 1
  %149 = load i64, ptr %117, align 8, !tbaa !24
  %150 = icmp slt i64 %148, %149
  br i1 %150, label %122, label %._crit_edge194, !llvm.loop !38

._crit_edge194:                                   ; preds = %147, %114
  %.1160.lcssa = phi i64 [ %110, %114 ], [ %.2161, %147 ]
  %151 = add nsw i64 %.2158196, 1
  %152 = getelementptr inbounds i64, ptr %25, i64 %.1160.lcssa
  store i64 %.2158196, ptr %152, align 8, !tbaa !24
  %153 = getelementptr inbounds i64, ptr %25, i64 %110
  store i64 %.2158196, ptr %153, align 8, !tbaa !24
  store i64 %.1160.lcssa, ptr %111, align 8, !tbaa !24
  %154 = getelementptr inbounds i64, ptr %27, i64 %.1160.lcssa
  store i64 %110, ptr %154, align 8, !tbaa !24
  br label %155

155:                                              ; preds = %108, %._crit_edge194
  %.3 = phi i64 [ %151, %._crit_edge194 ], [ %.2158196, %108 ]
  %156 = add i64 %.1153197, 1
  %exitcond203.not = icmp eq i64 %156, %13
  br i1 %exitcond203.not, label %._crit_edge200, label %108, !llvm.loop !39

._crit_edge200:                                   ; preds = %104, %155, %._crit_edge182
  %.2158.lcssa = phi i64 [ %.0156.lcssa, %._crit_edge182 ], [ %.3, %155 ], [ %.1157, %104 ]
  %157 = load i64, ptr %4, align 8, !tbaa !5
  %158 = and i64 %157, 1
  %.not167 = icmp eq i64 %158, 0
  br i1 %.not167, label %164, label %159

159:                                              ; preds = %._crit_edge200
  %160 = tail call double @gk_CPUSeconds() #3
  %161 = getelementptr inbounds i8, ptr %0, i64 168
  %162 = load double, ptr %161, align 8, !tbaa !14
  %163 = fadd double %160, %162
  store double %163, ptr %161, align 8, !tbaa !14
  br label %164

164:                                              ; preds = %159, %._crit_edge200
  tail call void @libmetis__idxwspacefree(ptr noundef nonnull %0, i64 noundef %13) #3
  tail call void @libmetis__idxwspacefree(ptr noundef nonnull %0, i64 noundef %13) #3
  tail call void @libmetis__CreateCoarseGraph(ptr noundef nonnull %0, ptr noundef nonnull %1, i64 noundef %.2158.lcssa, ptr noundef %27, ptr noundef %28) #3
  tail call void @libmetis__idxwspacefree(ptr noundef nonnull %0, i64 noundef %13) #3
  tail call void @libmetis__idxwspacefree(ptr noundef nonnull %0, i64 noundef %13) #3
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smin.i64(i64, i64) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smax.i64(i64, i64) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>) #2

attributes #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 = { 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 #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !7, i64 8}
!6 = !{!"controldef", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !10, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !11, i64 88, !13, i64 152, !13, i64 160, !13, i64 168, !13, i64 176, !13, i64 184, !13, i64 192, !13, i64 200, !13, i64 208, !13, i64 216, !13, i64 224, !13, i64 232, !13, i64 240, !13, i64 248, !13, i64 256, !13, i64 264, !13, i64 272}
!7 = !{!"long", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"workspacedef", !12, i64 0, !7, i64 8, !7, i64 16, !12, i64 24, !12, i64 32, !7, i64 40, !12, i64 48, !12, i64 56}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!"double", !8, i64 0}
!14 = !{!6, !13, i64 168}
!15 = !{!16, !7, i64 0}
!16 = !{!"graphdef", !7, i64 0, !7, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !17, i64 56, !17, i64 60, !17, i64 64, !17, i64 68, !17, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !7, i64 112, !7, i64 120, !12, i64 128, !12, i64 136, !7, i64 144, !12, i64 152, !12, i64 160, !12, i64 168, !12, i64 176, !12, i64 184, !12, i64 192, !12, i64 200, !7, i64 208, !12, i64 216, !12, i64 224, !12, i64 232, !12, i64 240}
!17 = !{!"int", !8, i64 0}
!18 = !{!16, !7, i64 208}
!19 = !{!16, !12, i64 16}
!20 = !{!16, !12, i64 216}
!21 = !{!16, !12, i64 40}
!22 = !{!16, !12, i64 48}
!23 = !{!16, !12, i64 104}
!24 = !{!7, !7, i64 0}
!25 = !{!26}
!26 = distinct !{!26, !27}
!27 = distinct !{!27, !"LVerDomain"}
!28 = !{!29}
!29 = distinct !{!29, !27}
!30 = distinct !{!30, !31, !32, !33}
!31 = !{!"llvm.loop.mustprogress"}
!32 = !{!"llvm.loop.isvectorized", i32 1}
!33 = !{!"llvm.loop.unroll.runtime.disable"}
!34 = distinct !{!34, !31, !32}
!35 = distinct !{!35, !31}
!36 = distinct !{!36, !31}
!37 = !{!6, !10, i64 48}
!38 = distinct !{!38, !31}
!39 = distinct !{!39, !31}


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