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

; 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.PQueueType = type { i64, i64, i64, i64, i64, i64, i64, ptr, ptr, 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 }
%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 }

@.str.3 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [34 x i8], align 1

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

declare i32 @mprintf(ptr noundef, ...) #1

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

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

; Function Attrs: nounwind uwtable
define dso_local void @libmetis__MocInit2WayBalance2(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3) #2 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, 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 i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i64, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca float, align 4
  %40 = alloca [16 x [2 x %struct.PQueueType]], align 16
  %41 = alloca i64, align 8
  %42 = alloca i64, align 8
  %43 = alloca i64, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  store ptr %3, ptr %8, align 8, !tbaa !5
  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 8, ptr %26) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #3
  call void @llvm.lifetime.start.p0(i64 2816, ptr %40) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #3
  %44 = load ptr, ptr %6, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.graphdef, ptr %44, i32 0, i32 0
  %46 = load i64, ptr %45, align 8, !tbaa !9
  store i64 %46, ptr %15, align 8, !tbaa !13
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.graphdef, ptr %47, i32 0, i32 28
  %49 = load i64, ptr %48, align 8, !tbaa !14
  store i64 %49, ptr %17, align 8, !tbaa !13
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.graphdef, ptr %50, i32 0, i32 2
  %52 = load ptr, ptr %51, align 8, !tbaa !15
  store ptr %52, ptr %26, align 8, !tbaa !5
  %53 = load ptr, ptr %6, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.graphdef, ptr %53, i32 0, i32 5
  %55 = load ptr, ptr %54, align 8, !tbaa !16
  store ptr %55, ptr %27, align 8, !tbaa !5
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.graphdef, ptr %56, i32 0, i32 29
  %58 = load ptr, ptr %57, align 8, !tbaa !17
  store ptr %58, ptr %37, align 8, !tbaa !5
  %59 = load ptr, ptr %6, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.graphdef, ptr %59, i32 0, i32 6
  %61 = load ptr, ptr %60, align 8, !tbaa !18
  store ptr %61, ptr %28, align 8, !tbaa !5
  %62 = load ptr, ptr %6, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.graphdef, ptr %62, i32 0, i32 18
  %64 = load ptr, ptr %63, align 8, !tbaa !19
  store ptr %64, ptr %29, align 8, !tbaa !5
  %65 = load ptr, ptr %6, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.graphdef, ptr %65, i32 0, i32 23
  %67 = load ptr, ptr %66, align 8, !tbaa !20
  store ptr %67, ptr %30, align 8, !tbaa !5
  %68 = load ptr, ptr %6, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.graphdef, ptr %68, i32 0, i32 24
  %70 = load ptr, ptr %69, align 8, !tbaa !21
  store ptr %70, ptr %31, align 8, !tbaa !5
  %71 = load ptr, ptr %6, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.graphdef, ptr %71, i32 0, i32 30
  %73 = load ptr, ptr %72, align 8, !tbaa !22
  store ptr %73, ptr %38, align 8, !tbaa !5
  %74 = load ptr, ptr %6, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.graphdef, ptr %74, i32 0, i32 21
  %76 = load ptr, ptr %75, align 8, !tbaa !23
  store ptr %76, ptr %32, align 8, !tbaa !5
  %77 = load ptr, ptr %6, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.graphdef, ptr %77, i32 0, i32 22
  %79 = load ptr, ptr %78, align 8, !tbaa !24
  store ptr %79, ptr %33, align 8, !tbaa !5
  %80 = load ptr, ptr %5, align 8, !tbaa !5
  %81 = load i64, ptr %15, align 8, !tbaa !13
  %82 = call ptr @libmetis__idxwspacemalloc(ptr noundef %80, i64 noundef %81)
  store ptr %82, ptr %34, align 8, !tbaa !5
  %83 = load ptr, ptr %5, align 8, !tbaa !5
  %84 = load i64, ptr %15, align 8, !tbaa !13
  %85 = call ptr @libmetis__idxwspacemalloc(ptr noundef %83, i64 noundef %84)
  store ptr %85, ptr %35, align 8, !tbaa !5
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  %87 = load i64, ptr %15, align 8, !tbaa !13
  %88 = call ptr @libmetis__idxwspacemalloc(ptr noundef %86, i64 noundef %87)
  store ptr %88, ptr %36, align 8, !tbaa !5
  store i64 1, ptr %19, align 8, !tbaa !13
  %89 = load i64, ptr %19, align 8, !tbaa !13
  %90 = add nsw i64 %89, 1
  %91 = srem i64 %90, 2
  store i64 %91, ptr %20, align 8, !tbaa !13
  %92 = load ptr, ptr %5, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.controldef, ptr %92, i32 0, i32 1
  %94 = load i64, ptr %93, align 8, !tbaa !25
  %95 = and i64 %94, 8
  %96 = icmp ne i64 %95, 0
  br i1 %96, label %97, label %144

97:                                               ; preds = %4
  %98 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.3)
  store i64 0, ptr %13, align 8, !tbaa !13
  br label %99

99:                                               ; preds = %117, %97
  %100 = load i64, ptr %13, align 8, !tbaa !13
  %101 = load i64, ptr %17, align 8, !tbaa !13
  %102 = icmp slt i64 %100, %101
  br i1 %102, label %103, label %120

103:                                              ; preds = %99
  %104 = load ptr, ptr %38, align 8, !tbaa !5
  %105 = load i64, ptr %13, align 8, !tbaa !13
  %106 = getelementptr inbounds float, ptr %104, i64 %105
  %107 = load float, ptr %106, align 4, !tbaa !30
  %108 = fpext float %107 to double
  %109 = load ptr, ptr %38, align 8, !tbaa !5
  %110 = load i64, ptr %17, align 8, !tbaa !13
  %111 = load i64, ptr %13, align 8, !tbaa !13
  %112 = add nsw i64 %110, %111
  %113 = getelementptr inbounds float, ptr %109, i64 %112
  %114 = load float, ptr %113, align 4, !tbaa !30
  %115 = fpext float %114 to double
  %116 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.4, double noundef %108, double noundef %115)
  br label %117

117:                                              ; preds = %103
  %118 = load i64, ptr %13, align 8, !tbaa !13
  %119 = add nsw i64 %118, 1
  store i64 %119, ptr %13, align 8, !tbaa !13
  br label %99, !llvm.loop !31

120:                                              ; preds = %99
  %121 = load ptr, ptr %7, align 8, !tbaa !5
  %122 = getelementptr inbounds float, ptr %121, i64 0
  %123 = load float, ptr %122, align 4, !tbaa !30
  %124 = fpext float %123 to double
  %125 = load ptr, ptr %7, align 8, !tbaa !5
  %126 = getelementptr inbounds float, ptr %125, i64 1
  %127 = load float, ptr %126, align 4, !tbaa !30
  %128 = fpext float %127 to double
  %129 = load ptr, ptr %6, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.graphdef, ptr %129, i32 0, i32 0
  %131 = load i64, ptr %130, align 8, !tbaa !9
  %132 = load ptr, ptr %6, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.graphdef, ptr %132, i32 0, i32 20
  %134 = load i64, ptr %133, align 8, !tbaa !33
  %135 = load ptr, ptr %6, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.graphdef, ptr %135, i32 0, i32 16
  %137 = load i64, ptr %136, align 8, !tbaa !34
  %138 = load i64, ptr %17, align 8, !tbaa !13
  %139 = load ptr, ptr %38, align 8, !tbaa !5
  %140 = load ptr, ptr %7, align 8, !tbaa !5
  %141 = call float @libmetis__ComputeLoadImbalance(i64 noundef %138, i64 noundef 2, ptr noundef %139, ptr noundef %140)
  %142 = fpext float %141 to double
  %143 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.5, double noundef %124, double noundef %128, i64 noundef %131, i64 noundef %134, i64 noundef %137, double noundef %142)
  br label %144

144:                                              ; preds = %120, %4
  store i64 0, ptr %9, align 8, !tbaa !13
  br label %145

145:                                              ; preds = %160, %144
  %146 = load i64, ptr %9, align 8, !tbaa !13
  %147 = load i64, ptr %17, align 8, !tbaa !13
  %148 = icmp slt i64 %146, %147
  br i1 %148, label %149, label %163

149:                                              ; preds = %145
  %150 = load ptr, ptr %5, align 8, !tbaa !5
  %151 = load i64, ptr %9, align 8, !tbaa !13
  %152 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %151
  %153 = getelementptr inbounds [2 x %struct.PQueueType], ptr %152, i64 0, i64 0
  %154 = load i64, ptr %15, align 8, !tbaa !13
  call void @libmetis__PQueueInit(ptr noundef %150, ptr noundef %153, i64 noundef %154, i64 noundef 501)
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  %156 = load i64, ptr %9, align 8, !tbaa !13
  %157 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %156
  %158 = getelementptr inbounds [2 x %struct.PQueueType], ptr %157, i64 0, i64 1
  %159 = load i64, ptr %15, align 8, !tbaa !13
  call void @libmetis__PQueueInit(ptr noundef %155, ptr noundef %158, i64 noundef %159, i64 noundef 501)
  br label %160

160:                                              ; preds = %149
  %161 = load i64, ptr %9, align 8, !tbaa !13
  %162 = add nsw i64 %161, 1
  store i64 %162, ptr %9, align 8, !tbaa !13
  br label %145, !llvm.loop !35

163:                                              ; preds = %145
  %164 = load i64, ptr %15, align 8, !tbaa !13
  %165 = load ptr, ptr %34, align 8, !tbaa !5
  %166 = call ptr @libmetis__idxset(i64 noundef %164, i64 noundef -1, ptr noundef %165)
  store i64 0, ptr %9, align 8, !tbaa !13
  br label %167

167:                                              ; preds = %182, %163
  %168 = load i64, ptr %9, align 8, !tbaa !13
  %169 = load i64, ptr %15, align 8, !tbaa !13
  %170 = icmp slt i64 %168, %169
  br i1 %170, label %171, label %185

171:                                              ; preds = %167
  %172 = load i64, ptr %17, align 8, !tbaa !13
  %173 = load ptr, ptr %37, align 8, !tbaa !5
  %174 = load i64, ptr %9, align 8, !tbaa !13
  %175 = load i64, ptr %17, align 8, !tbaa !13
  %176 = mul nsw i64 %174, %175
  %177 = getelementptr inbounds float, ptr %173, i64 %176
  %178 = call i64 @gk_fargmax(i64 noundef %172, ptr noundef %177)
  %179 = load ptr, ptr %36, align 8, !tbaa !5
  %180 = load i64, ptr %9, align 8, !tbaa !13
  %181 = getelementptr inbounds i64, ptr %179, i64 %180
  store i64 %178, ptr %181, align 8, !tbaa !13
  br label %182

182:                                              ; preds = %171
  %183 = load i64, ptr %9, align 8, !tbaa !13
  %184 = add nsw i64 %183, 1
  store i64 %184, ptr %9, align 8, !tbaa !13
  br label %167, !llvm.loop !36

185:                                              ; preds = %167
  %186 = load i64, ptr %15, align 8, !tbaa !13
  %187 = load ptr, ptr %35, align 8, !tbaa !5
  call void @libmetis__RandomPermute(i64 noundef %186, ptr noundef %187, i64 noundef 1)
  store i64 0, ptr %10, align 8, !tbaa !13
  br label %188

188:                                              ; preds = %247, %185
  %189 = load i64, ptr %10, align 8, !tbaa !13
  %190 = load i64, ptr %15, align 8, !tbaa !13
  %191 = icmp slt i64 %189, %190
  br i1 %191, label %192, label %250

192:                                              ; preds = %188
  %193 = load ptr, ptr %35, align 8, !tbaa !5
  %194 = load i64, ptr %10, align 8, !tbaa !13
  %195 = getelementptr inbounds i64, ptr %193, i64 %194
  %196 = load i64, ptr %195, align 8, !tbaa !13
  store i64 %196, ptr %9, align 8, !tbaa !13
  %197 = load ptr, ptr %29, align 8, !tbaa !5
  %198 = load i64, ptr %9, align 8, !tbaa !13
  %199 = getelementptr inbounds i64, ptr %197, i64 %198
  %200 = load i64, ptr %199, align 8, !tbaa !13
  %201 = load i64, ptr %19, align 8, !tbaa !13
  %202 = icmp eq i64 %200, %201
  br i1 %202, label %203, label %246

203:                                              ; preds = %192
  %204 = load ptr, ptr %31, align 8, !tbaa !5
  %205 = load i64, ptr %9, align 8, !tbaa !13
  %206 = getelementptr inbounds i64, ptr %204, i64 %205
  %207 = load i64, ptr %206, align 8, !tbaa !13
  %208 = icmp sgt i64 %207, 0
  br i1 %208, label %209, label %227

209:                                              ; preds = %203
  %210 = load ptr, ptr %36, align 8, !tbaa !5
  %211 = load i64, ptr %9, align 8, !tbaa !13
  %212 = getelementptr inbounds i64, ptr %210, i64 %211
  %213 = load i64, ptr %212, align 8, !tbaa !13
  %214 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %213
  %215 = getelementptr inbounds [2 x %struct.PQueueType], ptr %214, i64 0, i64 0
  %216 = load i64, ptr %9, align 8, !tbaa !13
  %217 = load ptr, ptr %31, align 8, !tbaa !5
  %218 = load i64, ptr %9, align 8, !tbaa !13
  %219 = getelementptr inbounds i64, ptr %217, i64 %218
  %220 = load i64, ptr %219, align 8, !tbaa !13
  %221 = load ptr, ptr %30, align 8, !tbaa !5
  %222 = load i64, ptr %9, align 8, !tbaa !13
  %223 = getelementptr inbounds i64, ptr %221, i64 %222
  %224 = load i64, ptr %223, align 8, !tbaa !13
  %225 = sub nsw i64 %220, %224
  %226 = call i64 @libmetis__PQueueInsert(ptr noundef %215, i64 noundef %216, i64 noundef %225)
  br label %245

227:                                              ; preds = %203
  %228 = load ptr, ptr %36, align 8, !tbaa !5
  %229 = load i64, ptr %9, align 8, !tbaa !13
  %230 = getelementptr inbounds i64, ptr %228, i64 %229
  %231 = load i64, ptr %230, align 8, !tbaa !13
  %232 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %231
  %233 = getelementptr inbounds [2 x %struct.PQueueType], ptr %232, i64 0, i64 1
  %234 = load i64, ptr %9, align 8, !tbaa !13
  %235 = load ptr, ptr %31, align 8, !tbaa !5
  %236 = load i64, ptr %9, align 8, !tbaa !13
  %237 = getelementptr inbounds i64, ptr %235, i64 %236
  %238 = load i64, ptr %237, align 8, !tbaa !13
  %239 = load ptr, ptr %30, align 8, !tbaa !5
  %240 = load i64, ptr %9, align 8, !tbaa !13
  %241 = getelementptr inbounds i64, ptr %239, i64 %240
  %242 = load i64, ptr %241, align 8, !tbaa !13
  %243 = sub nsw i64 %238, %242
  %244 = call i64 @libmetis__PQueueInsert(ptr noundef %233, i64 noundef %234, i64 noundef %243)
  br label %245

245:                                              ; preds = %227, %209
  br label %246

246:                                              ; preds = %245, %192
  br label %247

247:                                              ; preds = %246
  %248 = load i64, ptr %10, align 8, !tbaa !13
  %249 = add nsw i64 %248, 1
  store i64 %249, ptr %10, align 8, !tbaa !13
  br label %188, !llvm.loop !37

250:                                              ; preds = %188
  store i64 0, ptr %25, align 8, !tbaa !13
  store i64 1, ptr %9, align 8, !tbaa !13
  br label %251

251:                                              ; preds = %271, %250
  %252 = load i64, ptr %9, align 8, !tbaa !13
  %253 = load i64, ptr %17, align 8, !tbaa !13
  %254 = icmp slt i64 %252, %253
  br i1 %254, label %255, label %274

255:                                              ; preds = %251
  %256 = load ptr, ptr %8, align 8, !tbaa !5
  %257 = load i64, ptr %9, align 8, !tbaa !13
  %258 = getelementptr inbounds float, ptr %256, i64 %257
  %259 = load float, ptr %258, align 4, !tbaa !30
  %260 = load ptr, ptr %8, align 8, !tbaa !5
  %261 = load i64, ptr %25, align 8, !tbaa !13
  %262 = getelementptr inbounds float, ptr %260, i64 %261
  %263 = load float, ptr %262, align 4, !tbaa !30
  %264 = fcmp olt float %259, %263
  br i1 %264, label %265, label %267

265:                                              ; preds = %255
  %266 = load i64, ptr %9, align 8, !tbaa !13
  br label %269

267:                                              ; preds = %255
  %268 = load i64, ptr %25, align 8, !tbaa !13
  br label %269

269:                                              ; preds = %267, %265
  %270 = phi i64 [ %266, %265 ], [ %268, %267 ]
  store i64 %270, ptr %25, align 8, !tbaa !13
  br label %271

271:                                              ; preds = %269
  %272 = load i64, ptr %9, align 8, !tbaa !13
  %273 = add nsw i64 %272, 1
  store i64 %273, ptr %9, align 8, !tbaa !13
  br label %251, !llvm.loop !38

274:                                              ; preds = %251
  %275 = load ptr, ptr %8, align 8, !tbaa !5
  %276 = load i64, ptr %25, align 8, !tbaa !13
  %277 = getelementptr inbounds float, ptr %275, i64 %276
  %278 = load float, ptr %277, align 4, !tbaa !30
  %279 = fpext float %278 to double
  %280 = fdiv double 5.000000e-01, %279
  %281 = fptrunc double %280 to float
  store float %281, ptr %39, align 4, !tbaa !30
  %282 = load ptr, ptr %6, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.graphdef, ptr %282, i32 0, i32 16
  %284 = load i64, ptr %283, align 8, !tbaa !34
  store i64 %284, ptr %43, align 8, !tbaa !13
  %285 = load ptr, ptr %6, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.graphdef, ptr %285, i32 0, i32 20
  %287 = load i64, ptr %286, align 8, !tbaa !33
  store i64 %287, ptr %16, align 8, !tbaa !13
  store i64 0, ptr %18, align 8, !tbaa !13
  br label %288

288:                                              ; preds = %738, %274
  %289 = load i64, ptr %18, align 8, !tbaa !13
  %290 = load i64, ptr %15, align 8, !tbaa !13
  %291 = icmp slt i64 %289, %290
  br i1 %291, label %292, label %741

292:                                              ; preds = %288
  %293 = load ptr, ptr %38, align 8, !tbaa !5
  %294 = load i64, ptr %20, align 8, !tbaa !13
  %295 = load i64, ptr %17, align 8, !tbaa !13
  %296 = mul nsw i64 %294, %295
  %297 = load i64, ptr %25, align 8, !tbaa !13
  %298 = add nsw i64 %296, %297
  %299 = getelementptr inbounds float, ptr %293, i64 %298
  %300 = load float, ptr %299, align 4, !tbaa !30
  %301 = load float, ptr %39, align 4, !tbaa !30
  %302 = fcmp ogt float %300, %301
  br i1 %302, label %303, label %304

303:                                              ; preds = %292
  br label %741

304:                                              ; preds = %292
  %305 = load i64, ptr %17, align 8, !tbaa !13
  %306 = load ptr, ptr %38, align 8, !tbaa !5
  %307 = load i64, ptr %20, align 8, !tbaa !13
  %308 = load i64, ptr %17, align 8, !tbaa !13
  %309 = mul nsw i64 %307, %308
  %310 = getelementptr inbounds float, ptr %306, i64 %309
  %311 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 0
  %312 = load ptr, ptr %8, align 8, !tbaa !5
  %313 = call i64 @libmetis__SelectQueueOneWay2(i64 noundef %305, ptr noundef %310, ptr noundef %311, ptr noundef %312)
  store i64 %313, ptr %23, align 8, !tbaa !13
  %314 = icmp eq i64 %313, -1
  br i1 %314, label %315, label %316

315:                                              ; preds = %304
  br label %741

316:                                              ; preds = %304
  %317 = load i64, ptr %23, align 8, !tbaa !13
  %318 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %317
  %319 = getelementptr inbounds [2 x %struct.PQueueType], ptr %318, i64 0, i64 0
  %320 = call i64 @libmetis__PQueueGetMax(ptr noundef %319)
  store i64 %320, ptr %41, align 8, !tbaa !13
  %321 = icmp eq i64 %320, -1
  br i1 %321, label %322, label %327

322:                                              ; preds = %316
  %323 = load i64, ptr %23, align 8, !tbaa !13
  %324 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %323
  %325 = getelementptr inbounds [2 x %struct.PQueueType], ptr %324, i64 0, i64 1
  %326 = call i64 @libmetis__PQueueGetMax(ptr noundef %325)
  store i64 %326, ptr %41, align 8, !tbaa !13
  br label %327

327:                                              ; preds = %322, %316
  %328 = load ptr, ptr %31, align 8, !tbaa !5
  %329 = load i64, ptr %41, align 8, !tbaa !13
  %330 = getelementptr inbounds i64, ptr %328, i64 %329
  %331 = load i64, ptr %330, align 8, !tbaa !13
  %332 = load ptr, ptr %30, align 8, !tbaa !5
  %333 = load i64, ptr %41, align 8, !tbaa !13
  %334 = getelementptr inbounds i64, ptr %332, i64 %333
  %335 = load i64, ptr %334, align 8, !tbaa !13
  %336 = sub nsw i64 %331, %335
  %337 = load i64, ptr %43, align 8, !tbaa !13
  %338 = sub nsw i64 %337, %336
  store i64 %338, ptr %43, align 8, !tbaa !13
  %339 = load i64, ptr %17, align 8, !tbaa !13
  %340 = load ptr, ptr %37, align 8, !tbaa !5
  %341 = load i64, ptr %41, align 8, !tbaa !13
  %342 = load i64, ptr %17, align 8, !tbaa !13
  %343 = mul nsw i64 %341, %342
  %344 = getelementptr inbounds float, ptr %340, i64 %343
  %345 = load ptr, ptr %38, align 8, !tbaa !5
  %346 = load i64, ptr %20, align 8, !tbaa !13
  %347 = load i64, ptr %17, align 8, !tbaa !13
  %348 = mul nsw i64 %346, %347
  %349 = getelementptr inbounds float, ptr %345, i64 %348
  %350 = call ptr @gk_faxpy(i64 noundef %339, float noundef 1.000000e+00, ptr noundef %344, i64 noundef 1, ptr noundef %349, i64 noundef 1)
  %351 = load i64, ptr %17, align 8, !tbaa !13
  %352 = load ptr, ptr %37, align 8, !tbaa !5
  %353 = load i64, ptr %41, align 8, !tbaa !13
  %354 = load i64, ptr %17, align 8, !tbaa !13
  %355 = mul nsw i64 %353, %354
  %356 = getelementptr inbounds float, ptr %352, i64 %355
  %357 = load ptr, ptr %38, align 8, !tbaa !5
  %358 = load i64, ptr %19, align 8, !tbaa !13
  %359 = load i64, ptr %17, align 8, !tbaa !13
  %360 = mul nsw i64 %358, %359
  %361 = getelementptr inbounds float, ptr %357, i64 %360
  %362 = call ptr @gk_faxpy(i64 noundef %351, float noundef -1.000000e+00, ptr noundef %356, i64 noundef 1, ptr noundef %361, i64 noundef 1)
  %363 = load i64, ptr %20, align 8, !tbaa !13
  %364 = load ptr, ptr %29, align 8, !tbaa !5
  %365 = load i64, ptr %41, align 8, !tbaa !13
  %366 = getelementptr inbounds i64, ptr %364, i64 %365
  store i64 %363, ptr %366, align 8, !tbaa !13
  %367 = load i64, ptr %18, align 8, !tbaa !13
  %368 = load ptr, ptr %34, align 8, !tbaa !5
  %369 = load i64, ptr %41, align 8, !tbaa !13
  %370 = getelementptr inbounds i64, ptr %368, i64 %369
  store i64 %367, ptr %370, align 8, !tbaa !13
  %371 = load ptr, ptr %5, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.controldef, ptr %371, i32 0, i32 1
  %373 = load i64, ptr %372, align 8, !tbaa !25
  %374 = and i64 %373, 32
  %375 = icmp ne i64 %374, 0
  br i1 %375, label %376, label %433

376:                                              ; preds = %327
  %377 = load i64, ptr %41, align 8, !tbaa !13
  %378 = load i64, ptr %19, align 8, !tbaa !13
  %379 = load i64, ptr %23, align 8, !tbaa !13
  %380 = load ptr, ptr %31, align 8, !tbaa !5
  %381 = load i64, ptr %41, align 8, !tbaa !13
  %382 = getelementptr inbounds i64, ptr %380, i64 %381
  %383 = load i64, ptr %382, align 8, !tbaa !13
  %384 = load ptr, ptr %30, align 8, !tbaa !5
  %385 = load i64, ptr %41, align 8, !tbaa !13
  %386 = getelementptr inbounds i64, ptr %384, i64 %385
  %387 = load i64, ptr %386, align 8, !tbaa !13
  %388 = sub nsw i64 %383, %387
  %389 = load i64, ptr %43, align 8, !tbaa !13
  %390 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.6, i64 noundef %377, i64 noundef %378, i64 noundef %379, i64 noundef %388, i64 noundef %389)
  store i64 0, ptr %13, align 8, !tbaa !13
  br label %391

391:                                              ; preds = %409, %376
  %392 = load i64, ptr %13, align 8, !tbaa !13
  %393 = load i64, ptr %17, align 8, !tbaa !13
  %394 = icmp slt i64 %392, %393
  br i1 %394, label %395, label %412

395:                                              ; preds = %391
  %396 = load ptr, ptr %38, align 8, !tbaa !5
  %397 = load i64, ptr %13, align 8, !tbaa !13
  %398 = getelementptr inbounds float, ptr %396, i64 %397
  %399 = load float, ptr %398, align 4, !tbaa !30
  %400 = fpext float %399 to double
  %401 = load ptr, ptr %38, align 8, !tbaa !5
  %402 = load i64, ptr %17, align 8, !tbaa !13
  %403 = load i64, ptr %13, align 8, !tbaa !13
  %404 = add nsw i64 %402, %403
  %405 = getelementptr inbounds float, ptr %401, i64 %404
  %406 = load float, ptr %405, align 4, !tbaa !30
  %407 = fpext float %406 to double
  %408 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.4, double noundef %400, double noundef %407)
  br label %409

409:                                              ; preds = %395
  %410 = load i64, ptr %13, align 8, !tbaa !13
  %411 = add nsw i64 %410, 1
  store i64 %411, ptr %13, align 8, !tbaa !13
  br label %391, !llvm.loop !39

412:                                              ; preds = %391
  %413 = load i64, ptr %17, align 8, !tbaa !13
  %414 = load ptr, ptr %38, align 8, !tbaa !5
  %415 = load ptr, ptr %7, align 8, !tbaa !5
  %416 = call float @libmetis__ComputeLoadImbalance(i64 noundef %413, i64 noundef 2, ptr noundef %414, ptr noundef %415)
  %417 = fpext float %416 to double
  %418 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.7, double noundef %417)
  %419 = load ptr, ptr %31, align 8, !tbaa !5
  %420 = load i64, ptr %41, align 8, !tbaa !13
  %421 = getelementptr inbounds i64, ptr %419, i64 %420
  %422 = load i64, ptr %421, align 8, !tbaa !13
  %423 = icmp eq i64 %422, 0
  br i1 %423, label %424, label %432

424:                                              ; preds = %412
  %425 = load ptr, ptr %30, align 8, !tbaa !5
  %426 = load i64, ptr %41, align 8, !tbaa !13
  %427 = getelementptr inbounds i64, ptr %425, i64 %426
  %428 = load i64, ptr %427, align 8, !tbaa !13
  %429 = icmp sgt i64 %428, 0
  br i1 %429, label %430, label %432

430:                                              ; preds = %424
  %431 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.8)
  br label %432

432:                                              ; preds = %430, %424, %412
  br label %433

433:                                              ; preds = %432, %327
  br label %434

434:                                              ; preds = %433
  %435 = load ptr, ptr %30, align 8, !tbaa !5
  %436 = load i64, ptr %41, align 8, !tbaa !13
  %437 = getelementptr inbounds i64, ptr %435, i64 %436
  %438 = load i64, ptr %437, align 8, !tbaa !13
  store i64 %438, ptr %24, align 8, !tbaa !13
  %439 = load ptr, ptr %31, align 8, !tbaa !5
  %440 = load i64, ptr %41, align 8, !tbaa !13
  %441 = getelementptr inbounds i64, ptr %439, i64 %440
  %442 = load i64, ptr %441, align 8, !tbaa !13
  %443 = load ptr, ptr %30, align 8, !tbaa !5
  %444 = load i64, ptr %41, align 8, !tbaa !13
  %445 = getelementptr inbounds i64, ptr %443, i64 %444
  store i64 %442, ptr %445, align 8, !tbaa !13
  %446 = load i64, ptr %24, align 8, !tbaa !13
  %447 = load ptr, ptr %31, align 8, !tbaa !5
  %448 = load i64, ptr %41, align 8, !tbaa !13
  %449 = getelementptr inbounds i64, ptr %447, i64 %448
  store i64 %446, ptr %449, align 8, !tbaa !13
  br label %450

450:                                              ; preds = %434
  br label %451

451:                                              ; preds = %450
  %452 = load ptr, ptr %31, align 8, !tbaa !5
  %453 = load i64, ptr %41, align 8, !tbaa !13
  %454 = getelementptr inbounds i64, ptr %452, i64 %453
  %455 = load i64, ptr %454, align 8, !tbaa !13
  %456 = icmp eq i64 %455, 0
  br i1 %456, label %457, label %502

457:                                              ; preds = %451
  %458 = load ptr, ptr %32, align 8, !tbaa !5
  %459 = load i64, ptr %41, align 8, !tbaa !13
  %460 = getelementptr inbounds i64, ptr %458, i64 %459
  %461 = load i64, ptr %460, align 8, !tbaa !13
  %462 = icmp ne i64 %461, -1
  br i1 %462, label %463, label %502

463:                                              ; preds = %457
  %464 = load ptr, ptr %26, align 8, !tbaa !5
  %465 = load i64, ptr %41, align 8, !tbaa !13
  %466 = getelementptr inbounds i64, ptr %464, i64 %465
  %467 = load i64, ptr %466, align 8, !tbaa !13
  %468 = load ptr, ptr %26, align 8, !tbaa !5
  %469 = load i64, ptr %41, align 8, !tbaa !13
  %470 = add nsw i64 %469, 1
  %471 = getelementptr inbounds i64, ptr %468, i64 %470
  %472 = load i64, ptr %471, align 8, !tbaa !13
  %473 = icmp slt i64 %467, %472
  br i1 %473, label %474, label %502

474:                                              ; preds = %463
  br label %475

475:                                              ; preds = %474
  %476 = load ptr, ptr %33, align 8, !tbaa !5
  %477 = load i64, ptr %16, align 8, !tbaa !13
  %478 = add nsw i64 %477, -1
  store i64 %478, ptr %16, align 8, !tbaa !13
  %479 = getelementptr inbounds i64, ptr %476, i64 %478
  %480 = load i64, ptr %479, align 8, !tbaa !13
  %481 = load ptr, ptr %33, align 8, !tbaa !5
  %482 = load ptr, ptr %32, align 8, !tbaa !5
  %483 = load i64, ptr %41, align 8, !tbaa !13
  %484 = getelementptr inbounds i64, ptr %482, i64 %483
  %485 = load i64, ptr %484, align 8, !tbaa !13
  %486 = getelementptr inbounds i64, ptr %481, i64 %485
  store i64 %480, ptr %486, align 8, !tbaa !13
  %487 = load ptr, ptr %32, align 8, !tbaa !5
  %488 = load i64, ptr %41, align 8, !tbaa !13
  %489 = getelementptr inbounds i64, ptr %487, i64 %488
  %490 = load i64, ptr %489, align 8, !tbaa !13
  %491 = load ptr, ptr %32, align 8, !tbaa !5
  %492 = load ptr, ptr %33, align 8, !tbaa !5
  %493 = load i64, ptr %16, align 8, !tbaa !13
  %494 = getelementptr inbounds i64, ptr %492, i64 %493
  %495 = load i64, ptr %494, align 8, !tbaa !13
  %496 = getelementptr inbounds i64, ptr %491, i64 %495
  store i64 %490, ptr %496, align 8, !tbaa !13
  %497 = load ptr, ptr %32, align 8, !tbaa !5
  %498 = load i64, ptr %41, align 8, !tbaa !13
  %499 = getelementptr inbounds i64, ptr %497, i64 %498
  store i64 -1, ptr %499, align 8, !tbaa !13
  br label %500

500:                                              ; preds = %475
  br label %501

501:                                              ; preds = %500
  br label %502

502:                                              ; preds = %501, %463, %457, %451
  %503 = load ptr, ptr %31, align 8, !tbaa !5
  %504 = load i64, ptr %41, align 8, !tbaa !13
  %505 = getelementptr inbounds i64, ptr %503, i64 %504
  %506 = load i64, ptr %505, align 8, !tbaa !13
  %507 = icmp sgt i64 %506, 0
  br i1 %507, label %508, label %527

508:                                              ; preds = %502
  %509 = load ptr, ptr %32, align 8, !tbaa !5
  %510 = load i64, ptr %41, align 8, !tbaa !13
  %511 = getelementptr inbounds i64, ptr %509, i64 %510
  %512 = load i64, ptr %511, align 8, !tbaa !13
  %513 = icmp eq i64 %512, -1
  br i1 %513, label %514, label %527

514:                                              ; preds = %508
  br label %515

515:                                              ; preds = %514
  %516 = load i64, ptr %41, align 8, !tbaa !13
  %517 = load ptr, ptr %33, align 8, !tbaa !5
  %518 = load i64, ptr %16, align 8, !tbaa !13
  %519 = getelementptr inbounds i64, ptr %517, i64 %518
  store i64 %516, ptr %519, align 8, !tbaa !13
  %520 = load i64, ptr %16, align 8, !tbaa !13
  %521 = add nsw i64 %520, 1
  store i64 %521, ptr %16, align 8, !tbaa !13
  %522 = load ptr, ptr %32, align 8, !tbaa !5
  %523 = load i64, ptr %41, align 8, !tbaa !13
  %524 = getelementptr inbounds i64, ptr %522, i64 %523
  store i64 %520, ptr %524, align 8, !tbaa !13
  br label %525

525:                                              ; preds = %515
  br label %526

526:                                              ; preds = %525
  br label %527

527:                                              ; preds = %526, %508, %502
  %528 = load ptr, ptr %26, align 8, !tbaa !5
  %529 = load i64, ptr %41, align 8, !tbaa !13
  %530 = getelementptr inbounds i64, ptr %528, i64 %529
  %531 = load i64, ptr %530, align 8, !tbaa !13
  store i64 %531, ptr %11, align 8, !tbaa !13
  br label %532

532:                                              ; preds = %734, %527
  %533 = load i64, ptr %11, align 8, !tbaa !13
  %534 = load ptr, ptr %26, align 8, !tbaa !5
  %535 = load i64, ptr %41, align 8, !tbaa !13
  %536 = add nsw i64 %535, 1
  %537 = getelementptr inbounds i64, ptr %534, i64 %536
  %538 = load i64, ptr %537, align 8, !tbaa !13
  %539 = icmp slt i64 %533, %538
  br i1 %539, label %540, label %737

540:                                              ; preds = %532
  %541 = load ptr, ptr %27, align 8, !tbaa !5
  %542 = load i64, ptr %11, align 8, !tbaa !13
  %543 = getelementptr inbounds i64, ptr %541, i64 %542
  %544 = load i64, ptr %543, align 8, !tbaa !13
  store i64 %544, ptr %12, align 8, !tbaa !13
  %545 = load ptr, ptr %31, align 8, !tbaa !5
  %546 = load i64, ptr %12, align 8, !tbaa !13
  %547 = getelementptr inbounds i64, ptr %545, i64 %546
  %548 = load i64, ptr %547, align 8, !tbaa !13
  %549 = load ptr, ptr %30, align 8, !tbaa !5
  %550 = load i64, ptr %12, align 8, !tbaa !13
  %551 = getelementptr inbounds i64, ptr %549, i64 %550
  %552 = load i64, ptr %551, align 8, !tbaa !13
  %553 = sub nsw i64 %548, %552
  store i64 %553, ptr %42, align 8, !tbaa !13
  %554 = load i64, ptr %20, align 8, !tbaa !13
  %555 = load ptr, ptr %29, align 8, !tbaa !5
  %556 = load i64, ptr %12, align 8, !tbaa !13
  %557 = getelementptr inbounds i64, ptr %555, i64 %556
  %558 = load i64, ptr %557, align 8, !tbaa !13
  %559 = icmp eq i64 %554, %558
  br i1 %559, label %560, label %565

560:                                              ; preds = %540
  %561 = load ptr, ptr %28, align 8, !tbaa !5
  %562 = load i64, ptr %11, align 8, !tbaa !13
  %563 = getelementptr inbounds i64, ptr %561, i64 %562
  %564 = load i64, ptr %563, align 8, !tbaa !13
  br label %571

565:                                              ; preds = %540
  %566 = load ptr, ptr %28, align 8, !tbaa !5
  %567 = load i64, ptr %11, align 8, !tbaa !13
  %568 = getelementptr inbounds i64, ptr %566, i64 %567
  %569 = load i64, ptr %568, align 8, !tbaa !13
  %570 = sub nsw i64 0, %569
  br label %571

571:                                              ; preds = %565, %560
  %572 = phi i64 [ %564, %560 ], [ %570, %565 ]
  store i64 %572, ptr %14, align 8, !tbaa !13
  br label %573

573:                                              ; preds = %571
  %574 = load i64, ptr %14, align 8, !tbaa !13
  %575 = load ptr, ptr %30, align 8, !tbaa !5
  %576 = load i64, ptr %12, align 8, !tbaa !13
  %577 = getelementptr inbounds i64, ptr %575, i64 %576
  %578 = load i64, ptr %577, align 8, !tbaa !13
  %579 = add nsw i64 %578, %574
  store i64 %579, ptr %577, align 8, !tbaa !13
  %580 = load i64, ptr %14, align 8, !tbaa !13
  %581 = load ptr, ptr %31, align 8, !tbaa !5
  %582 = load i64, ptr %12, align 8, !tbaa !13
  %583 = getelementptr inbounds i64, ptr %581, i64 %582
  %584 = load i64, ptr %583, align 8, !tbaa !13
  %585 = sub nsw i64 %584, %580
  store i64 %585, ptr %583, align 8, !tbaa !13
  br label %586

586:                                              ; preds = %573
  br label %587

587:                                              ; preds = %586
  %588 = load ptr, ptr %34, align 8, !tbaa !5
  %589 = load i64, ptr %12, align 8, !tbaa !13
  %590 = getelementptr inbounds i64, ptr %588, i64 %589
  %591 = load i64, ptr %590, align 8, !tbaa !13
  %592 = icmp eq i64 %591, -1
  br i1 %592, label %593, label %667

593:                                              ; preds = %587
  %594 = load ptr, ptr %29, align 8, !tbaa !5
  %595 = load i64, ptr %12, align 8, !tbaa !13
  %596 = getelementptr inbounds i64, ptr %594, i64 %595
  %597 = load i64, ptr %596, align 8, !tbaa !13
  %598 = load i64, ptr %19, align 8, !tbaa !13
  %599 = icmp eq i64 %597, %598
  br i1 %599, label %600, label %667

600:                                              ; preds = %593
  %601 = load ptr, ptr %31, align 8, !tbaa !5
  %602 = load i64, ptr %12, align 8, !tbaa !13
  %603 = getelementptr inbounds i64, ptr %601, i64 %602
  %604 = load i64, ptr %603, align 8, !tbaa !13
  %605 = icmp sgt i64 %604, 0
  br i1 %605, label %606, label %639

606:                                              ; preds = %600
  %607 = load ptr, ptr %32, align 8, !tbaa !5
  %608 = load i64, ptr %12, align 8, !tbaa !13
  %609 = getelementptr inbounds i64, ptr %607, i64 %608
  %610 = load i64, ptr %609, align 8, !tbaa !13
  %611 = icmp eq i64 %610, -1
  br i1 %611, label %612, label %639

612:                                              ; preds = %606
  %613 = load ptr, ptr %36, align 8, !tbaa !5
  %614 = load i64, ptr %12, align 8, !tbaa !13
  %615 = getelementptr inbounds i64, ptr %613, i64 %614
  %616 = load i64, ptr %615, align 8, !tbaa !13
  %617 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %616
  %618 = getelementptr inbounds [2 x %struct.PQueueType], ptr %617, i64 0, i64 1
  %619 = load i64, ptr %12, align 8, !tbaa !13
  %620 = load i64, ptr %42, align 8, !tbaa !13
  %621 = call i64 @libmetis__PQueueDelete(ptr noundef %618, i64 noundef %619, i64 noundef %620)
  %622 = load ptr, ptr %36, align 8, !tbaa !5
  %623 = load i64, ptr %12, align 8, !tbaa !13
  %624 = getelementptr inbounds i64, ptr %622, i64 %623
  %625 = load i64, ptr %624, align 8, !tbaa !13
  %626 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %625
  %627 = getelementptr inbounds [2 x %struct.PQueueType], ptr %626, i64 0, i64 0
  %628 = load i64, ptr %12, align 8, !tbaa !13
  %629 = load ptr, ptr %31, align 8, !tbaa !5
  %630 = load i64, ptr %12, align 8, !tbaa !13
  %631 = getelementptr inbounds i64, ptr %629, i64 %630
  %632 = load i64, ptr %631, align 8, !tbaa !13
  %633 = load ptr, ptr %30, align 8, !tbaa !5
  %634 = load i64, ptr %12, align 8, !tbaa !13
  %635 = getelementptr inbounds i64, ptr %633, i64 %634
  %636 = load i64, ptr %635, align 8, !tbaa !13
  %637 = sub nsw i64 %632, %636
  %638 = call i64 @libmetis__PQueueInsert(ptr noundef %627, i64 noundef %628, i64 noundef %637)
  br label %666

639:                                              ; preds = %606, %600
  %640 = load ptr, ptr %32, align 8, !tbaa !5
  %641 = load i64, ptr %12, align 8, !tbaa !13
  %642 = getelementptr inbounds i64, ptr %640, i64 %641
  %643 = load i64, ptr %642, align 8, !tbaa !13
  %644 = icmp eq i64 %643, -1
  br i1 %644, label %645, label %647

645:                                              ; preds = %639
  %646 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.9)
  br label %647

647:                                              ; preds = %645, %639
  %648 = load ptr, ptr %36, align 8, !tbaa !5
  %649 = load i64, ptr %12, align 8, !tbaa !13
  %650 = getelementptr inbounds i64, ptr %648, i64 %649
  %651 = load i64, ptr %650, align 8, !tbaa !13
  %652 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %651
  %653 = getelementptr inbounds [2 x %struct.PQueueType], ptr %652, i64 0, i64 0
  %654 = load i64, ptr %12, align 8, !tbaa !13
  %655 = load i64, ptr %42, align 8, !tbaa !13
  %656 = load ptr, ptr %31, align 8, !tbaa !5
  %657 = load i64, ptr %12, align 8, !tbaa !13
  %658 = getelementptr inbounds i64, ptr %656, i64 %657
  %659 = load i64, ptr %658, align 8, !tbaa !13
  %660 = load ptr, ptr %30, align 8, !tbaa !5
  %661 = load i64, ptr %12, align 8, !tbaa !13
  %662 = getelementptr inbounds i64, ptr %660, i64 %661
  %663 = load i64, ptr %662, align 8, !tbaa !13
  %664 = sub nsw i64 %659, %663
  %665 = call i64 @libmetis__PQueueUpdate(ptr noundef %653, i64 noundef %654, i64 noundef %655, i64 noundef %664)
  br label %666

666:                                              ; preds = %647, %612
  br label %667

667:                                              ; preds = %666, %593, %587
  %668 = load ptr, ptr %31, align 8, !tbaa !5
  %669 = load i64, ptr %12, align 8, !tbaa !13
  %670 = getelementptr inbounds i64, ptr %668, i64 %669
  %671 = load i64, ptr %670, align 8, !tbaa !13
  %672 = icmp eq i64 %671, 0
  br i1 %672, label %673, label %707

673:                                              ; preds = %667
  %674 = load ptr, ptr %32, align 8, !tbaa !5
  %675 = load i64, ptr %12, align 8, !tbaa !13
  %676 = getelementptr inbounds i64, ptr %674, i64 %675
  %677 = load i64, ptr %676, align 8, !tbaa !13
  %678 = icmp ne i64 %677, -1
  br i1 %678, label %679, label %707

679:                                              ; preds = %673
  br label %680

680:                                              ; preds = %679
  %681 = load ptr, ptr %33, align 8, !tbaa !5
  %682 = load i64, ptr %16, align 8, !tbaa !13
  %683 = add nsw i64 %682, -1
  store i64 %683, ptr %16, align 8, !tbaa !13
  %684 = getelementptr inbounds i64, ptr %681, i64 %683
  %685 = load i64, ptr %684, align 8, !tbaa !13
  %686 = load ptr, ptr %33, align 8, !tbaa !5
  %687 = load ptr, ptr %32, align 8, !tbaa !5
  %688 = load i64, ptr %12, align 8, !tbaa !13
  %689 = getelementptr inbounds i64, ptr %687, i64 %688
  %690 = load i64, ptr %689, align 8, !tbaa !13
  %691 = getelementptr inbounds i64, ptr %686, i64 %690
  store i64 %685, ptr %691, align 8, !tbaa !13
  %692 = load ptr, ptr %32, align 8, !tbaa !5
  %693 = load i64, ptr %12, align 8, !tbaa !13
  %694 = getelementptr inbounds i64, ptr %692, i64 %693
  %695 = load i64, ptr %694, align 8, !tbaa !13
  %696 = load ptr, ptr %32, align 8, !tbaa !5
  %697 = load ptr, ptr %33, align 8, !tbaa !5
  %698 = load i64, ptr %16, align 8, !tbaa !13
  %699 = getelementptr inbounds i64, ptr %697, i64 %698
  %700 = load i64, ptr %699, align 8, !tbaa !13
  %701 = getelementptr inbounds i64, ptr %696, i64 %700
  store i64 %695, ptr %701, align 8, !tbaa !13
  %702 = load ptr, ptr %32, align 8, !tbaa !5
  %703 = load i64, ptr %12, align 8, !tbaa !13
  %704 = getelementptr inbounds i64, ptr %702, i64 %703
  store i64 -1, ptr %704, align 8, !tbaa !13
  br label %705

705:                                              ; preds = %680
  br label %706

706:                                              ; preds = %705
  br label %733

707:                                              ; preds = %673, %667
  %708 = load ptr, ptr %31, align 8, !tbaa !5
  %709 = load i64, ptr %12, align 8, !tbaa !13
  %710 = getelementptr inbounds i64, ptr %708, i64 %709
  %711 = load i64, ptr %710, align 8, !tbaa !13
  %712 = icmp sgt i64 %711, 0
  br i1 %712, label %713, label %732

713:                                              ; preds = %707
  %714 = load ptr, ptr %32, align 8, !tbaa !5
  %715 = load i64, ptr %12, align 8, !tbaa !13
  %716 = getelementptr inbounds i64, ptr %714, i64 %715
  %717 = load i64, ptr %716, align 8, !tbaa !13
  %718 = icmp eq i64 %717, -1
  br i1 %718, label %719, label %732

719:                                              ; preds = %713
  br label %720

720:                                              ; preds = %719
  %721 = load i64, ptr %12, align 8, !tbaa !13
  %722 = load ptr, ptr %33, align 8, !tbaa !5
  %723 = load i64, ptr %16, align 8, !tbaa !13
  %724 = getelementptr inbounds i64, ptr %722, i64 %723
  store i64 %721, ptr %724, align 8, !tbaa !13
  %725 = load i64, ptr %16, align 8, !tbaa !13
  %726 = add nsw i64 %725, 1
  store i64 %726, ptr %16, align 8, !tbaa !13
  %727 = load ptr, ptr %32, align 8, !tbaa !5
  %728 = load i64, ptr %12, align 8, !tbaa !13
  %729 = getelementptr inbounds i64, ptr %727, i64 %728
  store i64 %725, ptr %729, align 8, !tbaa !13
  br label %730

730:                                              ; preds = %720
  br label %731

731:                                              ; preds = %730
  br label %732

732:                                              ; preds = %731, %713, %707
  br label %733

733:                                              ; preds = %732, %706
  br label %734

734:                                              ; preds = %733
  %735 = load i64, ptr %11, align 8, !tbaa !13
  %736 = add nsw i64 %735, 1
  store i64 %736, ptr %11, align 8, !tbaa !13
  br label %532, !llvm.loop !40

737:                                              ; preds = %532
  br label %738

738:                                              ; preds = %737
  %739 = load i64, ptr %18, align 8, !tbaa !13
  %740 = add nsw i64 %739, 1
  store i64 %740, ptr %18, align 8, !tbaa !13
  br label %288, !llvm.loop !41

741:                                              ; preds = %315, %303, %288
  %742 = load ptr, ptr %5, align 8, !tbaa !5
  %743 = getelementptr inbounds %struct.controldef, ptr %742, i32 0, i32 1
  %744 = load i64, ptr %743, align 8, !tbaa !25
  %745 = and i64 %744, 8
  %746 = icmp ne i64 %745, 0
  br i1 %746, label %747, label %779

747:                                              ; preds = %741
  %748 = load i64, ptr %43, align 8, !tbaa !13
  %749 = load i64, ptr %16, align 8, !tbaa !13
  %750 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.10, i64 noundef %748, i64 noundef %749)
  store i64 0, ptr %13, align 8, !tbaa !13
  br label %751

751:                                              ; preds = %769, %747
  %752 = load i64, ptr %13, align 8, !tbaa !13
  %753 = load i64, ptr %17, align 8, !tbaa !13
  %754 = icmp slt i64 %752, %753
  br i1 %754, label %755, label %772

755:                                              ; preds = %751
  %756 = load ptr, ptr %38, align 8, !tbaa !5
  %757 = load i64, ptr %13, align 8, !tbaa !13
  %758 = getelementptr inbounds float, ptr %756, i64 %757
  %759 = load float, ptr %758, align 4, !tbaa !30
  %760 = fpext float %759 to double
  %761 = load ptr, ptr %38, align 8, !tbaa !5
  %762 = load i64, ptr %17, align 8, !tbaa !13
  %763 = load i64, ptr %13, align 8, !tbaa !13
  %764 = add nsw i64 %762, %763
  %765 = getelementptr inbounds float, ptr %761, i64 %764
  %766 = load float, ptr %765, align 4, !tbaa !30
  %767 = fpext float %766 to double
  %768 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.4, double noundef %760, double noundef %767)
  br label %769

769:                                              ; preds = %755
  %770 = load i64, ptr %13, align 8, !tbaa !13
  %771 = add nsw i64 %770, 1
  store i64 %771, ptr %13, align 8, !tbaa !13
  br label %751, !llvm.loop !42

772:                                              ; preds = %751
  %773 = load i64, ptr %17, align 8, !tbaa !13
  %774 = load ptr, ptr %38, align 8, !tbaa !5
  %775 = load ptr, ptr %7, align 8, !tbaa !5
  %776 = call float @libmetis__ComputeLoadImbalance(i64 noundef %773, i64 noundef 2, ptr noundef %774, ptr noundef %775)
  %777 = fpext float %776 to double
  %778 = call i32 (ptr, ...) @mprintf(ptr noundef @.str.7, double noundef %777)
  br label %779

779:                                              ; preds = %772, %741
  %780 = load i64, ptr %43, align 8, !tbaa !13
  %781 = load ptr, ptr %6, align 8, !tbaa !5
  %782 = getelementptr inbounds %struct.graphdef, ptr %781, i32 0, i32 16
  store i64 %780, ptr %782, align 8, !tbaa !34
  %783 = load i64, ptr %16, align 8, !tbaa !13
  %784 = load ptr, ptr %6, align 8, !tbaa !5
  %785 = getelementptr inbounds %struct.graphdef, ptr %784, i32 0, i32 20
  store i64 %783, ptr %785, align 8, !tbaa !33
  store i64 0, ptr %9, align 8, !tbaa !13
  br label %786

786:                                              ; preds = %799, %779
  %787 = load i64, ptr %9, align 8, !tbaa !13
  %788 = load i64, ptr %17, align 8, !tbaa !13
  %789 = icmp slt i64 %787, %788
  br i1 %789, label %790, label %802

790:                                              ; preds = %786
  %791 = load ptr, ptr %5, align 8, !tbaa !5
  %792 = load i64, ptr %9, align 8, !tbaa !13
  %793 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %792
  %794 = getelementptr inbounds [2 x %struct.PQueueType], ptr %793, i64 0, i64 0
  call void @libmetis__PQueueFree(ptr noundef %791, ptr noundef %794)
  %795 = load ptr, ptr %5, align 8, !tbaa !5
  %796 = load i64, ptr %9, align 8, !tbaa !13
  %797 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %40, i64 0, i64 %796
  %798 = getelementptr inbounds [2 x %struct.PQueueType], ptr %797, i64 0, i64 1
  call void @libmetis__PQueueFree(ptr noundef %795, ptr noundef %798)
  br label %799

799:                                              ; preds = %790
  %800 = load i64, ptr %9, align 8, !tbaa !13
  %801 = add nsw i64 %800, 1
  store i64 %801, ptr %9, align 8, !tbaa !13
  br label %786, !llvm.loop !43

802:                                              ; preds = %786
  %803 = load ptr, ptr %5, align 8, !tbaa !5
  %804 = load i64, ptr %15, align 8, !tbaa !13
  call void @libmetis__idxwspacefree(ptr noundef %803, i64 noundef %804)
  %805 = load ptr, ptr %5, align 8, !tbaa !5
  %806 = load i64, ptr %15, align 8, !tbaa !13
  call void @libmetis__idxwspacefree(ptr noundef %805, i64 noundef %806)
  %807 = load ptr, ptr %5, align 8, !tbaa !5
  %808 = load i64, ptr %15, align 8, !tbaa !13
  call void @libmetis__idxwspacefree(ptr noundef %807, i64 noundef %808)
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #3
  call void @llvm.lifetime.end.p0(i64 2816, ptr %40) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #3
  call void @llvm.lifetime.end.p0(i64 8, 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
  ret void
}

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

declare float @libmetis__ComputeLoadImbalance(i64 noundef, i64 noundef, ptr noundef, ptr noundef) #1

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

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

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

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

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

declare i64 @libmetis__PQueueGetMax(ptr noundef) #1

declare ptr @gk_faxpy(i64 noundef, float noundef, ptr noundef, i64 noundef, ptr noundef, i64 noundef) #1

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

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

declare void @libmetis__PQueueFree(ptr noundef, ptr noundef) #1

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

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, !11, i64 0}
!10 = !{!"graphdef", !11, i64 0, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !12, i64 56, !12, i64 60, !12, i64 64, !12, i64 68, !12, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !11, i64 112, !11, i64 120, !6, i64 128, !6, i64 136, !11, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !11, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !6, i64 240}
!11 = !{!"long", !7, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!10, !11, i64 208}
!15 = !{!10, !6, i64 16}
!16 = !{!10, !6, i64 40}
!17 = !{!10, !6, i64 216}
!18 = !{!10, !6, i64 48}
!19 = !{!10, !6, i64 128}
!20 = !{!10, !6, i64 168}
!21 = !{!10, !6, i64 176}
!22 = !{!10, !6, i64 224}
!23 = !{!10, !6, i64 152}
!24 = !{!10, !6, i64 160}
!25 = !{!26, !11, i64 8}
!26 = !{!"controldef", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !27, i64 48, !11, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !28, i64 88, !29, i64 152, !29, i64 160, !29, i64 168, !29, i64 176, !29, i64 184, !29, i64 192, !29, i64 200, !29, i64 208, !29, i64 216, !29, i64 224, !29, i64 232, !29, i64 240, !29, i64 248, !29, i64 256, !29, i64 264, !29, i64 272}
!27 = !{!"float", !7, i64 0}
!28 = !{!"workspacedef", !6, i64 0, !11, i64 8, !11, i64 16, !6, i64 24, !6, i64 32, !11, i64 40, !6, i64 48, !6, i64 56}
!29 = !{!"double", !7, i64 0}
!30 = !{!27, !27, i64 0}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!10, !11, i64 144}
!34 = !{!10, !11, i64 112}
!35 = distinct !{!35, !32}
!36 = distinct !{!36, !32}
!37 = distinct !{!37, !32}
!38 = distinct !{!38, !32}
!39 = distinct !{!39, !32}
!40 = distinct !{!40, !32}
!41 = distinct !{!41, !32}
!42 = distinct !{!42, !32}
!43 = distinct !{!43, !32}


; 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.PQueueType = type { i64, i64, i64, i64, i64, i64, i64, ptr, ptr, ptr, ptr }

@.str.3 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [34 x i8], align 1

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

declare i32 @mprintf(ptr noundef, ...) local_unnamed_addr #1

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

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

; Function Attrs: nounwind uwtable
define dso_local void @libmetis__MocInit2WayBalance2(ptr noundef %0, ptr nocapture noundef %1, ptr noundef %2, ptr noundef %3) local_unnamed_addr #2 {
  %5 = alloca [16 x [2 x %struct.PQueueType]], align 16
  call void @llvm.lifetime.start.p0(i64 2816, ptr nonnull %5) #3
  %6 = load i64, ptr %1, align 8, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %1, i64 208
  %8 = load i64, ptr %7, align 8, !tbaa !12
  %9 = getelementptr inbounds i8, ptr %1, i64 16
  %10 = load ptr, ptr %9, align 8, !tbaa !13
  %11 = getelementptr inbounds i8, ptr %1, i64 40
  %12 = load ptr, ptr %11, align 8, !tbaa !14
  %13 = getelementptr inbounds i8, ptr %1, i64 216
  %14 = load ptr, ptr %13, align 8, !tbaa !15
  %15 = getelementptr inbounds i8, ptr %1, i64 48
  %16 = load ptr, ptr %15, align 8, !tbaa !16
  %17 = getelementptr inbounds i8, ptr %1, i64 128
  %18 = load ptr, ptr %17, align 8, !tbaa !17
  %19 = getelementptr inbounds i8, ptr %1, i64 168
  %20 = load ptr, ptr %19, align 8, !tbaa !18
  %21 = getelementptr inbounds i8, ptr %1, i64 176
  %22 = load ptr, ptr %21, align 8, !tbaa !19
  %23 = getelementptr inbounds i8, ptr %1, i64 224
  %24 = load ptr, ptr %23, align 8, !tbaa !20
  %25 = getelementptr inbounds i8, ptr %1, i64 152
  %26 = load ptr, ptr %25, align 8, !tbaa !21
  %27 = getelementptr inbounds i8, ptr %1, i64 160
  %28 = load ptr, ptr %27, align 8, !tbaa !22
  %29 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %6) #3
  %30 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %6) #3
  %31 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %6) #3
  %32 = getelementptr inbounds i8, ptr %0, i64 8
  %33 = load i64, ptr %32, align 8, !tbaa !23
  %34 = and i64 %33, 8
  %.not = icmp eq i64 %34, 0
  br i1 %.not, label %61, label %35

35:                                               ; preds = %4
  %36 = tail call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.3) #3
  %37 = icmp sgt i64 %8, 0
  br i1 %37, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %35
  %38 = getelementptr float, ptr %24, i64 %8
  br label %39

39:                                               ; preds = %.lr.ph, %39
  %.0313340 = phi i64 [ 0, %.lr.ph ], [ %47, %39 ]
  %40 = getelementptr inbounds float, ptr %24, i64 %.0313340
  %41 = load float, ptr %40, align 4, !tbaa !28
  %42 = fpext float %41 to double
  %43 = getelementptr float, ptr %38, i64 %.0313340
  %44 = load float, ptr %43, align 4, !tbaa !28
  %45 = fpext float %44 to double
  %46 = tail call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.4, double noundef %42, double noundef %45) #3
  %47 = add nuw nsw i64 %.0313340, 1
  %exitcond.not = icmp eq i64 %47, %8
  br i1 %exitcond.not, label %._crit_edge, label %39, !llvm.loop !29

._crit_edge:                                      ; preds = %39, %35
  %48 = load float, ptr %2, align 4, !tbaa !28
  %49 = fpext float %48 to double
  %50 = getelementptr inbounds i8, ptr %2, i64 4
  %51 = load float, ptr %50, align 4, !tbaa !28
  %52 = fpext float %51 to double
  %53 = load i64, ptr %1, align 8, !tbaa !5
  %54 = getelementptr inbounds i8, ptr %1, i64 144
  %55 = load i64, ptr %54, align 8, !tbaa !31
  %56 = getelementptr inbounds i8, ptr %1, i64 112
  %57 = load i64, ptr %56, align 8, !tbaa !32
  %58 = tail call float @libmetis__ComputeLoadImbalance(i64 noundef %8, i64 noundef 2, ptr noundef %24, ptr noundef nonnull %2) #3
  %59 = fpext float %58 to double
  %60 = tail call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.5, double noundef %49, double noundef %52, i64 noundef %53, i64 noundef %55, i64 noundef %57, double noundef %59) #3
  br label %61

61:                                               ; preds = %._crit_edge, %4
  %62 = icmp sgt i64 %8, 0
  br i1 %62, label %.lr.ph343, label %._crit_edge344

.lr.ph343:                                        ; preds = %61, %.lr.ph343
  %.0309341 = phi i64 [ %65, %.lr.ph343 ], [ 0, %61 ]
  %63 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %.0309341
  call void @libmetis__PQueueInit(ptr noundef %0, ptr noundef nonnull %63, i64 noundef %6, i64 noundef 501) #3
  %64 = getelementptr inbounds i8, ptr %63, i64 88
  call void @libmetis__PQueueInit(ptr noundef %0, ptr noundef nonnull %64, i64 noundef %6, i64 noundef 501) #3
  %65 = add nuw nsw i64 %.0309341, 1
  %exitcond388.not = icmp eq i64 %65, %8
  br i1 %exitcond388.not, label %._crit_edge344, label %.lr.ph343, !llvm.loop !33

._crit_edge344:                                   ; preds = %.lr.ph343, %61
  %66 = call ptr @libmetis__idxset(i64 noundef %6, i64 noundef -1, ptr noundef %29) #3
  %67 = icmp sgt i64 %6, 0
  br i1 %67, label %.lr.ph347, label %._crit_edge348.thread

._crit_edge348.thread:                            ; preds = %._crit_edge344
  call void @libmetis__RandomPermute(i64 noundef %6, ptr noundef %30, i64 noundef 1) #3
  br label %.preheader

.lr.ph347:                                        ; preds = %._crit_edge344, %.lr.ph347
  %.1345 = phi i64 [ %72, %.lr.ph347 ], [ 0, %._crit_edge344 ]
  %68 = mul nsw i64 %.1345, %8
  %69 = getelementptr inbounds float, ptr %14, i64 %68
  %70 = call i64 @gk_fargmax(i64 noundef %8, ptr noundef %69) #3
  %71 = getelementptr inbounds i64, ptr %31, i64 %.1345
  store i64 %70, ptr %71, align 8, !tbaa !34
  %72 = add nuw nsw i64 %.1345, 1
  %exitcond389.not = icmp eq i64 %72, %6
  br i1 %exitcond389.not, label %._crit_edge348, label %.lr.ph347, !llvm.loop !35

._crit_edge348:                                   ; preds = %.lr.ph347
  call void @libmetis__RandomPermute(i64 noundef %6, ptr noundef %30, i64 noundef 1) #3
  br i1 %67, label %.lr.ph351, label %.preheader

.preheader:                                       ; preds = %93, %._crit_edge348.thread, %._crit_edge348
  %73 = icmp sgt i64 %8, 1
  br i1 %73, label %.lr.ph354.preheader, label %._crit_edge355

.lr.ph354.preheader:                              ; preds = %.preheader
  %74 = add nsw i64 %8, -1
  %75 = add nsw i64 %8, -2
  %xtraiter = and i64 %74, 3
  %76 = icmp ult i64 %75, 3
  br i1 %76, label %._crit_edge355.loopexit.unr-lcssa, label %.lr.ph354.preheader.new

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

.lr.ph351:                                        ; preds = %._crit_edge348, %93
  %.0311349 = phi i64 [ %94, %93 ], [ 0, %._crit_edge348 ]
  %77 = getelementptr inbounds i64, ptr %30, i64 %.0311349
  %78 = load i64, ptr %77, align 8, !tbaa !34
  %79 = getelementptr inbounds i64, ptr %18, i64 %78
  %80 = load i64, ptr %79, align 8, !tbaa !34
  %81 = icmp eq i64 %80, 1
  br i1 %81, label %.sink.split, label %93

.sink.split:                                      ; preds = %.lr.ph351
  %82 = getelementptr inbounds i64, ptr %22, i64 %78
  %83 = load i64, ptr %82, align 8, !tbaa !34
  %84 = icmp sgt i64 %83, 0
  %85 = getelementptr inbounds i64, ptr %31, i64 %78
  %86 = load i64, ptr %85, align 8, !tbaa !34
  %87 = getelementptr inbounds i64, ptr %20, i64 %78
  %88 = load i64, ptr %87, align 8, !tbaa !34
  %89 = sub nsw i64 %83, %88
  %90 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %86, i64 1
  %91 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %86
  %.sink = select i1 %84, ptr %91, ptr %90
  %92 = call i64 @libmetis__PQueueInsert(ptr noundef nonnull %.sink, i64 noundef %78, i64 noundef %89) #3
  br label %93

93:                                               ; preds = %.sink.split, %.lr.ph351
  %94 = add nuw nsw i64 %.0311349, 1
  %exitcond390.not = icmp eq i64 %94, %6
  br i1 %exitcond390.not, label %.preheader, label %.lr.ph351, !llvm.loop !36

.lr.ph354:                                        ; preds = %.lr.ph354, %.lr.ph354.preheader.new
  %.2353 = phi i64 [ 1, %.lr.ph354.preheader.new ], [ %122, %.lr.ph354 ]
  %.0321352 = phi i64 [ 0, %.lr.ph354.preheader.new ], [ %121, %.lr.ph354 ]
  %niter = phi i64 [ 0, %.lr.ph354.preheader.new ], [ %niter.next.3, %.lr.ph354 ]
  %95 = getelementptr inbounds float, ptr %3, i64 %.2353
  %96 = load float, ptr %95, align 4, !tbaa !28
  %97 = getelementptr inbounds float, ptr %3, i64 %.0321352
  %98 = load float, ptr %97, align 4, !tbaa !28
  %99 = fcmp olt float %96, %98
  %100 = select i1 %99, i64 %.2353, i64 %.0321352
  %101 = add nuw nsw i64 %.2353, 1
  %102 = getelementptr inbounds float, ptr %3, i64 %101
  %103 = load float, ptr %102, align 4, !tbaa !28
  %104 = getelementptr inbounds float, ptr %3, i64 %100
  %105 = load float, ptr %104, align 4, !tbaa !28
  %106 = fcmp olt float %103, %105
  %107 = select i1 %106, i64 %101, i64 %100
  %108 = add nuw nsw i64 %.2353, 2
  %109 = getelementptr inbounds float, ptr %3, i64 %108
  %110 = load float, ptr %109, align 4, !tbaa !28
  %111 = getelementptr inbounds float, ptr %3, i64 %107
  %112 = load float, ptr %111, align 4, !tbaa !28
  %113 = fcmp olt float %110, %112
  %114 = select i1 %113, i64 %108, i64 %107
  %115 = add nuw nsw i64 %.2353, 3
  %116 = getelementptr inbounds float, ptr %3, i64 %115
  %117 = load float, ptr %116, align 4, !tbaa !28
  %118 = getelementptr inbounds float, ptr %3, i64 %114
  %119 = load float, ptr %118, align 4, !tbaa !28
  %120 = fcmp olt float %117, %119
  %121 = select i1 %120, i64 %115, i64 %114
  %122 = add nuw nsw i64 %.2353, 4
  %niter.next.3 = add nuw i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge355.loopexit.unr-lcssa, label %.lr.ph354, !llvm.loop !37

._crit_edge355.loopexit.unr-lcssa:                ; preds = %.lr.ph354, %.lr.ph354.preheader
  %.lcssa.ph = phi i64 [ poison, %.lr.ph354.preheader ], [ %121, %.lr.ph354 ]
  %.2353.unr = phi i64 [ 1, %.lr.ph354.preheader ], [ %122, %.lr.ph354 ]
  %.0321352.unr = phi i64 [ 0, %.lr.ph354.preheader ], [ %121, %.lr.ph354 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge355, label %.lr.ph354.epil

.lr.ph354.epil:                                   ; preds = %._crit_edge355.loopexit.unr-lcssa, %.lr.ph354.epil
  %.2353.epil = phi i64 [ %129, %.lr.ph354.epil ], [ %.2353.unr, %._crit_edge355.loopexit.unr-lcssa ]
  %.0321352.epil = phi i64 [ %128, %.lr.ph354.epil ], [ %.0321352.unr, %._crit_edge355.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph354.epil ], [ 0, %._crit_edge355.loopexit.unr-lcssa ]
  %123 = getelementptr inbounds float, ptr %3, i64 %.2353.epil
  %124 = load float, ptr %123, align 4, !tbaa !28
  %125 = getelementptr inbounds float, ptr %3, i64 %.0321352.epil
  %126 = load float, ptr %125, align 4, !tbaa !28
  %127 = fcmp olt float %124, %126
  %128 = select i1 %127, i64 %.2353.epil, i64 %.0321352.epil
  %129 = add nuw nsw i64 %.2353.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge355, label %.lr.ph354.epil, !llvm.loop !38

._crit_edge355:                                   ; preds = %._crit_edge355.loopexit.unr-lcssa, %.lr.ph354.epil, %.preheader
  %.0321.lcssa = phi i64 [ 0, %.preheader ], [ %.lcssa.ph, %._crit_edge355.loopexit.unr-lcssa ], [ %128, %.lr.ph354.epil ]
  %130 = getelementptr inbounds float, ptr %3, i64 %.0321.lcssa
  %131 = load float, ptr %130, align 4, !tbaa !28
  %132 = fdiv float 5.000000e-01, %131
  %133 = getelementptr inbounds i8, ptr %1, i64 112
  %134 = load i64, ptr %133, align 8, !tbaa !32
  %135 = getelementptr inbounds i8, ptr %1, i64 144
  %136 = load i64, ptr %135, align 8, !tbaa !31
  %137 = getelementptr inbounds float, ptr %24, i64 %.0321.lcssa
  br i1 %67, label %.lr.ph370, label %._crit_edge371

.lr.ph370:                                        ; preds = %._crit_edge355
  %138 = getelementptr inbounds float, ptr %24, i64 %8
  br label %139

139:                                              ; preds = %.lr.ph370, %._crit_edge364
  %.0368 = phi i64 [ %134, %.lr.ph370 ], [ %157, %._crit_edge364 ]
  %.0316367 = phi i64 [ %136, %.lr.ph370 ], [ %.3319.lcssa, %._crit_edge364 ]
  %.0320366 = phi i64 [ 0, %.lr.ph370 ], [ %297, %._crit_edge364 ]
  %140 = load float, ptr %137, align 4, !tbaa !28
  %141 = fcmp ogt float %140, %132
  br i1 %141, label %._crit_edge371, label %142

142:                                              ; preds = %139
  %143 = call i64 @libmetis__SelectQueueOneWay2(i64 noundef %8, ptr noundef nonnull %24, ptr noundef nonnull %5, ptr noundef %3)
  %144 = icmp eq i64 %143, -1
  br i1 %144, label %._crit_edge371, label %145

145:                                              ; preds = %142
  %146 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %143
  %147 = call i64 @libmetis__PQueueGetMax(ptr noundef nonnull %146) #3
  %148 = icmp eq i64 %147, -1
  br i1 %148, label %149, label %152

149:                                              ; preds = %145
  %150 = getelementptr inbounds i8, ptr %146, i64 88
  %151 = call i64 @libmetis__PQueueGetMax(ptr noundef nonnull %150) #3
  br label %152

152:                                              ; preds = %149, %145
  %.0310 = phi i64 [ %151, %149 ], [ %147, %145 ]
  %153 = getelementptr inbounds i64, ptr %22, i64 %.0310
  %154 = load i64, ptr %153, align 8, !tbaa !34
  %155 = getelementptr inbounds i64, ptr %20, i64 %.0310
  %156 = load i64, ptr %155, align 8, !tbaa !34
  %.neg = sub i64 %156, %154
  %157 = add i64 %.neg, %.0368
  %158 = mul nsw i64 %.0310, %8
  %159 = getelementptr inbounds float, ptr %14, i64 %158
  %160 = call ptr @gk_faxpy(i64 noundef %8, float noundef 1.000000e+00, ptr noundef %159, i64 noundef 1, ptr noundef nonnull %24, i64 noundef 1) #3
  %161 = call ptr @gk_faxpy(i64 noundef %8, float noundef -1.000000e+00, ptr noundef %159, i64 noundef 1, ptr noundef nonnull %138, i64 noundef 1) #3
  %162 = getelementptr inbounds i64, ptr %18, i64 %.0310
  store i64 0, ptr %162, align 8, !tbaa !34
  %163 = getelementptr inbounds i64, ptr %29, i64 %.0310
  store i64 %.0320366, ptr %163, align 8, !tbaa !34
  %164 = load i64, ptr %32, align 8, !tbaa !23
  %165 = and i64 %164, 32
  %.not332 = icmp eq i64 %165, 0
  %.pre.pre400 = load i64, ptr %153, align 8, !tbaa !34
  br i1 %.not332, label %thread-pre-split, label %166

166:                                              ; preds = %152
  %167 = load i64, ptr %155, align 8, !tbaa !34
  %168 = sub nsw i64 %.pre.pre400, %167
  %169 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.6, i64 noundef %.0310, i64 noundef 1, i64 noundef %143, i64 noundef %168, i64 noundef %157) #3
  br i1 %62, label %.lr.ph358, label %._crit_edge359

.lr.ph358:                                        ; preds = %166, %.lr.ph358
  %.1314356 = phi i64 [ %177, %.lr.ph358 ], [ 0, %166 ]
  %170 = getelementptr inbounds float, ptr %24, i64 %.1314356
  %171 = load float, ptr %170, align 4, !tbaa !28
  %172 = fpext float %171 to double
  %173 = getelementptr float, ptr %138, i64 %.1314356
  %174 = load float, ptr %173, align 4, !tbaa !28
  %175 = fpext float %174 to double
  %176 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.4, double noundef %172, double noundef %175) #3
  %177 = add nuw nsw i64 %.1314356, 1
  %exitcond392.not = icmp eq i64 %177, %8
  br i1 %exitcond392.not, label %._crit_edge359, label %.lr.ph358, !llvm.loop !40

._crit_edge359:                                   ; preds = %.lr.ph358, %166
  %178 = call float @libmetis__ComputeLoadImbalance(i64 noundef %8, i64 noundef 2, ptr noundef nonnull %24, ptr noundef %2) #3
  %179 = fpext float %178 to double
  %180 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.7, double noundef %179) #3
  %181 = load i64, ptr %153, align 8, !tbaa !34
  %182 = icmp eq i64 %181, 0
  br i1 %182, label %183, label %thread-pre-split

183:                                              ; preds = %._crit_edge359
  %184 = load i64, ptr %155, align 8, !tbaa !34
  %185 = icmp sgt i64 %184, 0
  br i1 %185, label %186, label %188

186:                                              ; preds = %183
  %187 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.8) #3
  %.pre.pre = load i64, ptr %153, align 8, !tbaa !34
  br label %thread-pre-split

thread-pre-split:                                 ; preds = %._crit_edge359, %186, %152
  %.pre = phi i64 [ %181, %._crit_edge359 ], [ %.pre.pre, %186 ], [ %.pre.pre400, %152 ]
  %.pr = load i64, ptr %155, align 8, !tbaa !34
  br label %188

188:                                              ; preds = %thread-pre-split, %183
  %189 = phi i64 [ %.pre, %thread-pre-split ], [ 0, %183 ]
  %190 = phi i64 [ %.pr, %thread-pre-split ], [ %184, %183 ]
  store i64 %189, ptr %155, align 8, !tbaa !34
  store i64 %190, ptr %153, align 8, !tbaa !34
  %191 = icmp eq i64 %190, 0
  br i1 %191, label %192, label %thread-pre-split336

192:                                              ; preds = %188
  %193 = getelementptr inbounds i64, ptr %26, i64 %.0310
  %194 = load i64, ptr %193, align 8, !tbaa !34
  %.not333 = icmp eq i64 %194, -1
  br i1 %.not333, label %thread-pre-split336.thread, label %195

195:                                              ; preds = %192
  %196 = getelementptr inbounds i64, ptr %10, i64 %.0310
  %197 = load i64, ptr %196, align 8, !tbaa !34
  %198 = getelementptr i8, ptr %196, i64 8
  %199 = load i64, ptr %198, align 8, !tbaa !34
  %200 = icmp slt i64 %197, %199
  br i1 %200, label %201, label %thread-pre-split336.thread

201:                                              ; preds = %195
  %202 = add nsw i64 %.0316367, -1
  %203 = getelementptr inbounds i64, ptr %28, i64 %202
  %204 = load i64, ptr %203, align 8, !tbaa !34
  %205 = getelementptr inbounds i64, ptr %28, i64 %194
  store i64 %204, ptr %205, align 8, !tbaa !34
  %206 = load i64, ptr %193, align 8, !tbaa !34
  %207 = getelementptr inbounds i64, ptr %26, i64 %204
  store i64 %206, ptr %207, align 8, !tbaa !34
  store i64 -1, ptr %193, align 8, !tbaa !34
  %.pr337.pre = load i64, ptr %153, align 8, !tbaa !34
  br label %thread-pre-split336

thread-pre-split336:                              ; preds = %201, %188
  %208 = phi i64 [ %190, %188 ], [ %.pr337.pre, %201 ]
  %.1317 = phi i64 [ %.0316367, %188 ], [ %202, %201 ]
  %209 = icmp sgt i64 %208, 0
  br i1 %209, label %210, label %thread-pre-split336.thread

210:                                              ; preds = %thread-pre-split336
  %211 = getelementptr inbounds i64, ptr %26, i64 %.0310
  %212 = load i64, ptr %211, align 8, !tbaa !34
  %213 = icmp eq i64 %212, -1
  br i1 %213, label %214, label %thread-pre-split336.thread

214:                                              ; preds = %210
  %215 = getelementptr inbounds i64, ptr %28, i64 %.1317
  store i64 %.0310, ptr %215, align 8, !tbaa !34
  %216 = add nsw i64 %.1317, 1
  store i64 %.1317, ptr %211, align 8, !tbaa !34
  br label %thread-pre-split336.thread

thread-pre-split336.thread:                       ; preds = %195, %192, %214, %210, %thread-pre-split336
  %.2318 = phi i64 [ %216, %214 ], [ %.1317, %210 ], [ %.1317, %thread-pre-split336 ], [ %.0316367, %192 ], [ %.0316367, %195 ]
  %217 = getelementptr inbounds i64, ptr %10, i64 %.0310
  %218 = load i64, ptr %217, align 8, !tbaa !34
  %219 = getelementptr i8, ptr %217, i64 8
  %220 = load i64, ptr %219, align 8, !tbaa !34
  %221 = icmp slt i64 %218, %220
  br i1 %221, label %.lr.ph363, label %._crit_edge364

.lr.ph363:                                        ; preds = %thread-pre-split336.thread, %.thread
  %.0312361 = phi i64 [ %294, %.thread ], [ %218, %thread-pre-split336.thread ]
  %.3319360 = phi i64 [ %.4, %.thread ], [ %.2318, %thread-pre-split336.thread ]
  %222 = getelementptr inbounds i64, ptr %12, i64 %.0312361
  %223 = load i64, ptr %222, align 8, !tbaa !34
  %224 = getelementptr inbounds i64, ptr %22, i64 %223
  %225 = load i64, ptr %224, align 8, !tbaa !34
  %226 = getelementptr inbounds i64, ptr %20, i64 %223
  %227 = load i64, ptr %226, align 8, !tbaa !34
  %228 = sub nsw i64 %225, %227
  %229 = getelementptr inbounds i64, ptr %18, i64 %223
  %230 = load i64, ptr %229, align 8, !tbaa !34
  %231 = icmp eq i64 %230, 0
  %232 = getelementptr inbounds i64, ptr %16, i64 %.0312361
  %233 = load i64, ptr %232, align 8, !tbaa !34
  %234 = sub nsw i64 0, %233
  %235 = select i1 %231, i64 %233, i64 %234
  %236 = add nsw i64 %235, %227
  store i64 %236, ptr %226, align 8, !tbaa !34
  %237 = load i64, ptr %224, align 8, !tbaa !34
  %238 = sub nsw i64 %237, %235
  store i64 %238, ptr %224, align 8, !tbaa !34
  %239 = getelementptr inbounds i64, ptr %29, i64 %223
  %240 = load i64, ptr %239, align 8, !tbaa !34
  %241 = icmp eq i64 %240, -1
  br i1 %241, label %242, label %272

242:                                              ; preds = %.lr.ph363
  %243 = load i64, ptr %229, align 8, !tbaa !34
  %244 = icmp eq i64 %243, 1
  br i1 %244, label %245, label %thread-pre-split338

245:                                              ; preds = %242
  %246 = icmp sgt i64 %238, 0
  %247 = getelementptr inbounds i64, ptr %26, i64 %223
  %248 = load i64, ptr %247, align 8, !tbaa !34
  %249 = icmp eq i64 %248, -1
  br i1 %246, label %250, label %262

250:                                              ; preds = %245
  br i1 %249, label %251, label %.thread403

251:                                              ; preds = %250
  %252 = getelementptr inbounds i64, ptr %31, i64 %223
  %253 = load i64, ptr %252, align 8, !tbaa !34
  %254 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %253, i64 1
  %255 = call i64 @libmetis__PQueueDelete(ptr noundef nonnull %254, i64 noundef %223, i64 noundef %228) #3
  %256 = load i64, ptr %252, align 8, !tbaa !34
  %257 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %256
  %258 = load i64, ptr %224, align 8, !tbaa !34
  %259 = load i64, ptr %226, align 8, !tbaa !34
  %260 = sub nsw i64 %258, %259
  %261 = call i64 @libmetis__PQueueInsert(ptr noundef nonnull %257, i64 noundef %223, i64 noundef %260) #3
  br label %thread-pre-split338

262:                                              ; preds = %245
  br i1 %249, label %263, label %.thread403

263:                                              ; preds = %262
  %264 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.9) #3
  %.pre399 = load i64, ptr %224, align 8, !tbaa !34
  br label %.thread403

.thread403:                                       ; preds = %250, %263, %262
  %265 = phi i64 [ %.pre399, %263 ], [ %238, %262 ], [ %238, %250 ]
  %266 = getelementptr inbounds i64, ptr %31, i64 %223
  %267 = load i64, ptr %266, align 8, !tbaa !34
  %268 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %267
  %269 = load i64, ptr %226, align 8, !tbaa !34
  %270 = sub nsw i64 %265, %269
  %271 = call i64 @libmetis__PQueueUpdate(ptr noundef nonnull %268, i64 noundef %223, i64 noundef %228, i64 noundef %270) #3
  br label %thread-pre-split338

thread-pre-split338:                              ; preds = %242, %.thread403, %251
  %.pr339 = load i64, ptr %224, align 8, !tbaa !34
  br label %272

272:                                              ; preds = %thread-pre-split338, %.lr.ph363
  %273 = phi i64 [ %.pr339, %thread-pre-split338 ], [ %238, %.lr.ph363 ]
  %274 = icmp eq i64 %273, 0
  br i1 %274, label %275, label %285

275:                                              ; preds = %272
  %276 = getelementptr inbounds i64, ptr %26, i64 %223
  %277 = load i64, ptr %276, align 8, !tbaa !34
  %.not334 = icmp eq i64 %277, -1
  br i1 %.not334, label %.thread, label %278

278:                                              ; preds = %275
  %279 = add nsw i64 %.3319360, -1
  %280 = getelementptr inbounds i64, ptr %28, i64 %279
  %281 = load i64, ptr %280, align 8, !tbaa !34
  %282 = getelementptr inbounds i64, ptr %28, i64 %277
  store i64 %281, ptr %282, align 8, !tbaa !34
  %283 = load i64, ptr %276, align 8, !tbaa !34
  %284 = getelementptr inbounds i64, ptr %26, i64 %281
  store i64 %283, ptr %284, align 8, !tbaa !34
  store i64 -1, ptr %276, align 8, !tbaa !34
  br label %.thread

285:                                              ; preds = %272
  %286 = icmp sgt i64 %273, 0
  br i1 %286, label %287, label %.thread

287:                                              ; preds = %285
  %288 = getelementptr inbounds i64, ptr %26, i64 %223
  %289 = load i64, ptr %288, align 8, !tbaa !34
  %290 = icmp eq i64 %289, -1
  br i1 %290, label %291, label %.thread

291:                                              ; preds = %287
  %292 = getelementptr inbounds i64, ptr %28, i64 %.3319360
  store i64 %223, ptr %292, align 8, !tbaa !34
  %293 = add nsw i64 %.3319360, 1
  store i64 %.3319360, ptr %288, align 8, !tbaa !34
  br label %.thread

.thread:                                          ; preds = %275, %278, %291, %287, %285
  %.4 = phi i64 [ %279, %278 ], [ %293, %291 ], [ %.3319360, %287 ], [ %.3319360, %285 ], [ %.3319360, %275 ]
  %294 = add nsw i64 %.0312361, 1
  %295 = load i64, ptr %219, align 8, !tbaa !34
  %296 = icmp slt i64 %294, %295
  br i1 %296, label %.lr.ph363, label %._crit_edge364, !llvm.loop !41

._crit_edge364:                                   ; preds = %.thread, %thread-pre-split336.thread
  %.3319.lcssa = phi i64 [ %.2318, %thread-pre-split336.thread ], [ %.4, %.thread ]
  %297 = add nuw nsw i64 %.0320366, 1
  %exitcond393.not = icmp eq i64 %297, %6
  br i1 %exitcond393.not, label %._crit_edge371, label %139, !llvm.loop !42

._crit_edge371:                                   ; preds = %._crit_edge364, %139, %142, %._crit_edge355
  %.0316.lcssa = phi i64 [ %136, %._crit_edge355 ], [ %.0316367, %142 ], [ %.0316367, %139 ], [ %.3319.lcssa, %._crit_edge364 ]
  %.0.lcssa = phi i64 [ %134, %._crit_edge355 ], [ %.0368, %142 ], [ %.0368, %139 ], [ %157, %._crit_edge364 ]
  %298 = load i64, ptr %32, align 8, !tbaa !23
  %299 = and i64 %298, 8
  %.not335 = icmp eq i64 %299, 0
  br i1 %.not335, label %315, label %300

300:                                              ; preds = %._crit_edge371
  %301 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.10, i64 noundef %.0.lcssa, i64 noundef %.0316.lcssa) #3
  br i1 %62, label %.lr.ph382, label %._crit_edge383

.lr.ph382:                                        ; preds = %300
  %302 = getelementptr float, ptr %24, i64 %8
  br label %303

303:                                              ; preds = %.lr.ph382, %303
  %.2315380 = phi i64 [ 0, %.lr.ph382 ], [ %311, %303 ]
  %304 = getelementptr inbounds float, ptr %24, i64 %.2315380
  %305 = load float, ptr %304, align 4, !tbaa !28
  %306 = fpext float %305 to double
  %307 = getelementptr float, ptr %302, i64 %.2315380
  %308 = load float, ptr %307, align 4, !tbaa !28
  %309 = fpext float %308 to double
  %310 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.4, double noundef %306, double noundef %309) #3
  %311 = add nuw nsw i64 %.2315380, 1
  %exitcond394.not = icmp eq i64 %311, %8
  br i1 %exitcond394.not, label %._crit_edge383, label %303, !llvm.loop !43

._crit_edge383:                                   ; preds = %303, %300
  %312 = call float @libmetis__ComputeLoadImbalance(i64 noundef %8, i64 noundef 2, ptr noundef %24, ptr noundef %2) #3
  %313 = fpext float %312 to double
  %314 = call i32 (ptr, ...) @mprintf(ptr noundef nonnull @.str.7, double noundef %313) #3
  br label %315

315:                                              ; preds = %._crit_edge383, %._crit_edge371
  store i64 %.0.lcssa, ptr %133, align 8, !tbaa !32
  store i64 %.0316.lcssa, ptr %135, align 8, !tbaa !31
  br i1 %62, label %.lr.ph386, label %._crit_edge387

.lr.ph386:                                        ; preds = %315, %.lr.ph386
  %.3384 = phi i64 [ %318, %.lr.ph386 ], [ 0, %315 ]
  %316 = getelementptr inbounds [16 x [2 x %struct.PQueueType]], ptr %5, i64 0, i64 %.3384
  call void @libmetis__PQueueFree(ptr noundef %0, ptr noundef nonnull %316) #3
  %317 = getelementptr inbounds i8, ptr %316, i64 88
  call void @libmetis__PQueueFree(ptr noundef %0, ptr noundef nonnull %317) #3
  %318 = add nuw nsw i64 %.3384, 1
  %exitcond395.not = icmp eq i64 %318, %8
  br i1 %exitcond395.not, label %._crit_edge387, label %.lr.ph386, !llvm.loop !44

._crit_edge387:                                   ; preds = %.lr.ph386, %315
  call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %6) #3
  call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %6) #3
  call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %6) #3
  call void @llvm.lifetime.end.p0(i64 2816, ptr nonnull %5) #3
  ret void
}

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

declare float @libmetis__ComputeLoadImbalance(i64 noundef, i64 noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

declare i64 @gk_fargmax(i64 noundef, ptr noundef) local_unnamed_addr #1

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

declare i64 @libmetis__PQueueInsert(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #1

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

declare i64 @libmetis__PQueueGetMax(ptr noundef) local_unnamed_addr #1

declare ptr @gk_faxpy(i64 noundef, float noundef, ptr noundef, i64 noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

declare i64 @libmetis__PQueueDelete(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #1

declare i64 @libmetis__PQueueUpdate(ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #1

declare void @libmetis__PQueueFree(ptr noundef, ptr noundef) local_unnamed_addr #1

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

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


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