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

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

@.str.8 = external hidden unnamed_addr constant [30 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 ptr @libmetis__idxwspacemalloc(ptr noundef, i64 noundef) #1

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

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

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

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

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

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

declare void @gk_free(ptr noundef, ...) #1

; Function Attrs: nounwind uwtable
define dso_local void @libmetis__EliminateSubDomainEdges(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3) #2 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i64, 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 i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, 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 ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i64 %2, ptr %7, align 8, !tbaa !9
  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 8, ptr %39) #3
  call void @llvm.lifetime.start.p0(i64 8, 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 !11
  store i64 %46, ptr %15, align 8, !tbaa !9
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.graphdef, ptr %47, i32 0, i32 2
  %49 = load ptr, ptr %48, align 8, !tbaa !14
  store ptr %49, ptr %30, align 8, !tbaa !5
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.graphdef, ptr %50, i32 0, i32 5
  %52 = load ptr, ptr %51, align 8, !tbaa !15
  store ptr %52, ptr %31, align 8, !tbaa !5
  %53 = load ptr, ptr %6, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.graphdef, ptr %53, i32 0, i32 3
  %55 = load ptr, ptr %54, align 8, !tbaa !16
  store ptr %55, ptr %32, align 8, !tbaa !5
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.graphdef, ptr %56, i32 0, i32 6
  %58 = load ptr, ptr %57, align 8, !tbaa !17
  store ptr %58, ptr %33, align 8, !tbaa !5
  %59 = load ptr, ptr %6, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.graphdef, ptr %59, i32 0, i32 18
  %61 = load ptr, ptr %60, align 8, !tbaa !18
  store ptr %61, ptr %35, align 8, !tbaa !5
  %62 = load ptr, ptr %6, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.graphdef, ptr %62, i32 0, i32 19
  %64 = load ptr, ptr %63, align 8, !tbaa !19
  store ptr %64, ptr %34, align 8, !tbaa !5
  %65 = load ptr, ptr %5, align 8, !tbaa !5
  %66 = load i64, ptr %7, align 8, !tbaa !9
  %67 = call ptr @libmetis__idxwspacemalloc(ptr noundef %65, i64 noundef %66)
  store ptr %67, ptr %36, align 8, !tbaa !5
  %68 = load ptr, ptr %5, align 8, !tbaa !5
  %69 = load i64, ptr %7, align 8, !tbaa !9
  %70 = call ptr @libmetis__idxwspacemalloc(ptr noundef %68, i64 noundef %69)
  store ptr %70, ptr %38, align 8, !tbaa !5
  %71 = load ptr, ptr %5, align 8, !tbaa !5
  %72 = load i64, ptr %7, align 8, !tbaa !9
  %73 = call ptr @libmetis__idxwspacemalloc(ptr noundef %71, i64 noundef %72)
  store ptr %73, ptr %40, align 8, !tbaa !5
  %74 = load ptr, ptr %5, align 8, !tbaa !5
  %75 = load i64, ptr %15, align 8, !tbaa !9
  %76 = call ptr @libmetis__idxwspacemalloc(ptr noundef %74, i64 noundef %75)
  store ptr %76, ptr %41, align 8, !tbaa !5
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.controldef, ptr %77, i32 0, i32 11
  %79 = getelementptr inbounds %struct.workspacedef, ptr %78, i32 0, i32 7
  %80 = load ptr, ptr %79, align 8, !tbaa !20
  store ptr %80, ptr %37, align 8, !tbaa !5
  %81 = load i64, ptr %7, align 8, !tbaa !9
  %82 = mul i64 %81, 16
  %83 = call ptr @gk_malloc(i64 noundef %82, ptr noundef @.str.8)
  store ptr %83, ptr %42, align 8, !tbaa !5
  %84 = load i64, ptr %7, align 8, !tbaa !9
  %85 = mul i64 %84, 16
  %86 = call ptr @gk_malloc(i64 noundef %85, ptr noundef @.str.8)
  store ptr %86, ptr %43, align 8, !tbaa !5
  %87 = load ptr, ptr %6, align 8, !tbaa !5
  %88 = load i64, ptr %7, align 8, !tbaa !9
  %89 = load ptr, ptr %37, align 8, !tbaa !5
  %90 = load ptr, ptr %38, align 8, !tbaa !5
  call void @libmetis__ComputeSubDomainGraph(ptr noundef %87, i64 noundef %88, ptr noundef %89, ptr noundef %90)
  %91 = load i64, ptr %7, align 8, !tbaa !9
  %92 = load ptr, ptr %34, align 8, !tbaa !5
  %93 = call i64 @libmetis__idxsum(i64 noundef %91, ptr noundef %92, i64 noundef 1)
  store i64 %93, ptr %29, align 8, !tbaa !9
  store i64 0, ptr %9, align 8, !tbaa !9
  br label %94

94:                                               ; preds = %112, %4
  %95 = load i64, ptr %9, align 8, !tbaa !9
  %96 = load i64, ptr %7, align 8, !tbaa !9
  %97 = icmp slt i64 %95, %96
  br i1 %97, label %98, label %115

98:                                               ; preds = %94
  %99 = load ptr, ptr %8, align 8, !tbaa !5
  %100 = load i64, ptr %9, align 8, !tbaa !9
  %101 = getelementptr inbounds float, ptr %99, i64 %100
  %102 = load float, ptr %101, align 4, !tbaa !25
  %103 = fpext float %102 to double
  %104 = fmul double 1.250000e+00, %103
  %105 = load i64, ptr %29, align 8, !tbaa !9
  %106 = sitofp i64 %105 to double
  %107 = fmul double %104, %106
  %108 = fptosi double %107 to i64
  %109 = load ptr, ptr %36, align 8, !tbaa !5
  %110 = load i64, ptr %9, align 8, !tbaa !9
  %111 = getelementptr inbounds i64, ptr %109, i64 %110
  store i64 %108, ptr %111, align 8, !tbaa !9
  br label %112

112:                                              ; preds = %98
  %113 = load i64, ptr %9, align 8, !tbaa !9
  %114 = add nsw i64 %113, 1
  store i64 %114, ptr %9, align 8, !tbaa !9
  br label %94, !llvm.loop !26

115:                                              ; preds = %94
  br label %116

116:                                              ; preds = %513, %115
  %117 = load i64, ptr %7, align 8, !tbaa !9
  %118 = load ptr, ptr %38, align 8, !tbaa !5
  %119 = call i64 @libmetis__idxsum(i64 noundef %117, ptr noundef %118, i64 noundef 1)
  store i64 %119, ptr %16, align 8, !tbaa !9
  %120 = load i64, ptr %16, align 8, !tbaa !9
  %121 = load i64, ptr %7, align 8, !tbaa !9
  %122 = sdiv i64 %120, %121
  store i64 %122, ptr %18, align 8, !tbaa !9
  %123 = load ptr, ptr %38, align 8, !tbaa !5
  %124 = load i64, ptr %7, align 8, !tbaa !9
  %125 = load ptr, ptr %38, align 8, !tbaa !5
  %126 = call i64 @libmetis__idxargmax(i64 noundef %124, ptr noundef %125)
  %127 = getelementptr inbounds i64, ptr %123, i64 %126
  %128 = load i64, ptr %127, align 8, !tbaa !9
  store i64 %128, ptr %17, align 8, !tbaa !9
  %129 = load i64, ptr %17, align 8, !tbaa !9
  %130 = sitofp i64 %129 to double
  %131 = load i64, ptr %18, align 8, !tbaa !9
  %132 = sitofp i64 %131 to double
  %133 = fmul double 1.400000e+00, %132
  %134 = fcmp olt double %130, %133
  br i1 %134, label %135, label %136

135:                                              ; preds = %116
  br label %514

136:                                              ; preds = %116
  %137 = load i64, ptr %7, align 8, !tbaa !9
  %138 = load ptr, ptr %38, align 8, !tbaa !5
  %139 = call i64 @libmetis__idxargmax(i64 noundef %137, ptr noundef %138)
  store i64 %139, ptr %13, align 8, !tbaa !9
  %140 = load ptr, ptr %37, align 8, !tbaa !5
  %141 = load i64, ptr %13, align 8, !tbaa !9
  %142 = load i64, ptr %7, align 8, !tbaa !9
  %143 = mul nsw i64 %141, %142
  %144 = getelementptr inbounds i64, ptr %140, i64 %143
  store ptr %144, ptr %39, align 8, !tbaa !5
  %145 = load i64, ptr %7, align 8, !tbaa !9
  %146 = load ptr, ptr %39, align 8, !tbaa !5
  %147 = call i64 @libmetis__idxsum(i64 noundef %145, ptr noundef %146, i64 noundef 1)
  store i64 %147, ptr %19, align 8, !tbaa !9
  store i64 0, ptr %22, align 8, !tbaa !9
  store i64 0, ptr %9, align 8, !tbaa !9
  br label %148

148:                                              ; preds = %174, %136
  %149 = load i64, ptr %9, align 8, !tbaa !9
  %150 = load i64, ptr %7, align 8, !tbaa !9
  %151 = icmp slt i64 %149, %150
  br i1 %151, label %152, label %177

152:                                              ; preds = %148
  %153 = load ptr, ptr %39, align 8, !tbaa !5
  %154 = load i64, ptr %9, align 8, !tbaa !9
  %155 = getelementptr inbounds i64, ptr %153, i64 %154
  %156 = load i64, ptr %155, align 8, !tbaa !9
  %157 = icmp sgt i64 %156, 0
  br i1 %157, label %158, label %173

158:                                              ; preds = %152
  %159 = load ptr, ptr %39, align 8, !tbaa !5
  %160 = load i64, ptr %9, align 8, !tbaa !9
  %161 = getelementptr inbounds i64, ptr %159, i64 %160
  %162 = load i64, ptr %161, align 8, !tbaa !9
  %163 = load ptr, ptr %43, align 8, !tbaa !5
  %164 = load i64, ptr %22, align 8, !tbaa !9
  %165 = getelementptr inbounds %struct.KeyValueType, ptr %163, i64 %164
  %166 = getelementptr inbounds %struct.KeyValueType, ptr %165, i32 0, i32 0
  store i64 %162, ptr %166, align 8, !tbaa !28
  %167 = load i64, ptr %9, align 8, !tbaa !9
  %168 = load ptr, ptr %43, align 8, !tbaa !5
  %169 = load i64, ptr %22, align 8, !tbaa !9
  %170 = add nsw i64 %169, 1
  store i64 %170, ptr %22, align 8, !tbaa !9
  %171 = getelementptr inbounds %struct.KeyValueType, ptr %168, i64 %169
  %172 = getelementptr inbounds %struct.KeyValueType, ptr %171, i32 0, i32 1
  store i64 %167, ptr %172, align 8, !tbaa !30
  br label %173

173:                                              ; preds = %158, %152
  br label %174

174:                                              ; preds = %173
  %175 = load i64, ptr %9, align 8, !tbaa !9
  %176 = add nsw i64 %175, 1
  store i64 %176, ptr %9, align 8, !tbaa !9
  br label %148, !llvm.loop !31

177:                                              ; preds = %148
  %178 = load i64, ptr %22, align 8, !tbaa !9
  %179 = load ptr, ptr %43, align 8, !tbaa !5
  call void @libmetis__ikeysort(i64 noundef %178, ptr noundef %179)
  store i64 0, ptr %27, align 8, !tbaa !9
  store i64 0, ptr %26, align 8, !tbaa !9
  br label %180

180:                                              ; preds = %506, %177
  %181 = load i64, ptr %26, align 8, !tbaa !9
  %182 = load i64, ptr %22, align 8, !tbaa !9
  %183 = icmp slt i64 %181, %182
  br i1 %183, label %184, label %509

184:                                              ; preds = %180
  %185 = load ptr, ptr %43, align 8, !tbaa !5
  %186 = load i64, ptr %26, align 8, !tbaa !9
  %187 = getelementptr inbounds %struct.KeyValueType, ptr %185, i64 %186
  %188 = getelementptr inbounds %struct.KeyValueType, ptr %187, i32 0, i32 0
  %189 = load i64, ptr %188, align 8, !tbaa !28
  %190 = load i64, ptr %19, align 8, !tbaa !9
  %191 = load ptr, ptr %38, align 8, !tbaa !5
  %192 = load i64, ptr %13, align 8, !tbaa !9
  %193 = getelementptr inbounds i64, ptr %191, i64 %192
  %194 = load i64, ptr %193, align 8, !tbaa !9
  %195 = mul nsw i64 2, %194
  %196 = sdiv i64 %190, %195
  %197 = icmp sgt i64 %189, %196
  br i1 %197, label %198, label %199

198:                                              ; preds = %184
  br label %509

199:                                              ; preds = %184
  %200 = load ptr, ptr %43, align 8, !tbaa !5
  %201 = load i64, ptr %26, align 8, !tbaa !9
  %202 = getelementptr inbounds %struct.KeyValueType, ptr %200, i64 %201
  %203 = getelementptr inbounds %struct.KeyValueType, ptr %202, i32 0, i32 1
  %204 = load i64, ptr %203, align 8, !tbaa !30
  store i64 %204, ptr %14, align 8, !tbaa !9
  %205 = load i64, ptr %7, align 8, !tbaa !9
  %206 = load ptr, ptr %40, align 8, !tbaa !5
  %207 = call ptr @libmetis__idxset(i64 noundef %205, i64 noundef 0, ptr noundef %206)
  store i64 0, ptr %20, align 8, !tbaa !9
  store i64 0, ptr %9, align 8, !tbaa !9
  br label %208

208:                                              ; preds = %254, %199
  %209 = load i64, ptr %9, align 8, !tbaa !9
  %210 = load i64, ptr %15, align 8, !tbaa !9
  %211 = icmp slt i64 %209, %210
  br i1 %211, label %212, label %257

212:                                              ; preds = %208
  %213 = load ptr, ptr %35, align 8, !tbaa !5
  %214 = load i64, ptr %9, align 8, !tbaa !9
  %215 = getelementptr inbounds i64, ptr %213, i64 %214
  %216 = load i64, ptr %215, align 8, !tbaa !9
  %217 = load i64, ptr %14, align 8, !tbaa !9
  %218 = icmp eq i64 %216, %217
  br i1 %218, label %219, label %253

219:                                              ; preds = %212
  %220 = load ptr, ptr %30, align 8, !tbaa !5
  %221 = load i64, ptr %9, align 8, !tbaa !9
  %222 = getelementptr inbounds i64, ptr %220, i64 %221
  %223 = load i64, ptr %222, align 8, !tbaa !9
  store i64 %223, ptr %11, align 8, !tbaa !9
  br label %224

224:                                              ; preds = %249, %219
  %225 = load i64, ptr %11, align 8, !tbaa !9
  %226 = load ptr, ptr %30, align 8, !tbaa !5
  %227 = load i64, ptr %9, align 8, !tbaa !9
  %228 = add nsw i64 %227, 1
  %229 = getelementptr inbounds i64, ptr %226, i64 %228
  %230 = load i64, ptr %229, align 8, !tbaa !9
  %231 = icmp slt i64 %225, %230
  br i1 %231, label %232, label %252

232:                                              ; preds = %224
  %233 = load ptr, ptr %35, align 8, !tbaa !5
  %234 = load ptr, ptr %31, align 8, !tbaa !5
  %235 = load i64, ptr %11, align 8, !tbaa !9
  %236 = getelementptr inbounds i64, ptr %234, i64 %235
  %237 = load i64, ptr %236, align 8, !tbaa !9
  %238 = getelementptr inbounds i64, ptr %233, i64 %237
  %239 = load i64, ptr %238, align 8, !tbaa !9
  %240 = load i64, ptr %13, align 8, !tbaa !9
  %241 = icmp eq i64 %239, %240
  br i1 %241, label %242, label %248

242:                                              ; preds = %232
  %243 = load i64, ptr %9, align 8, !tbaa !9
  %244 = load ptr, ptr %41, align 8, !tbaa !5
  %245 = load i64, ptr %20, align 8, !tbaa !9
  %246 = add nsw i64 %245, 1
  store i64 %246, ptr %20, align 8, !tbaa !9
  %247 = getelementptr inbounds i64, ptr %244, i64 %245
  store i64 %243, ptr %247, align 8, !tbaa !9
  br label %252

248:                                              ; preds = %232
  br label %249

249:                                              ; preds = %248
  %250 = load i64, ptr %11, align 8, !tbaa !9
  %251 = add nsw i64 %250, 1
  store i64 %251, ptr %11, align 8, !tbaa !9
  br label %224, !llvm.loop !32

252:                                              ; preds = %242, %224
  br label %253

253:                                              ; preds = %252, %212
  br label %254

254:                                              ; preds = %253
  %255 = load i64, ptr %9, align 8, !tbaa !9
  %256 = add nsw i64 %255, 1
  store i64 %256, ptr %9, align 8, !tbaa !9
  br label %208, !llvm.loop !33

257:                                              ; preds = %208
  store i64 0, ptr %28, align 8, !tbaa !9
  store i64 0, ptr %10, align 8, !tbaa !9
  br label %258

258:                                              ; preds = %305, %257
  %259 = load i64, ptr %10, align 8, !tbaa !9
  %260 = load i64, ptr %20, align 8, !tbaa !9
  %261 = icmp slt i64 %259, %260
  br i1 %261, label %262, label %308

262:                                              ; preds = %258
  %263 = load ptr, ptr %41, align 8, !tbaa !5
  %264 = load i64, ptr %10, align 8, !tbaa !9
  %265 = getelementptr inbounds i64, ptr %263, i64 %264
  %266 = load i64, ptr %265, align 8, !tbaa !9
  store i64 %266, ptr %9, align 8, !tbaa !9
  %267 = load ptr, ptr %32, align 8, !tbaa !5
  %268 = load i64, ptr %9, align 8, !tbaa !9
  %269 = getelementptr inbounds i64, ptr %267, i64 %268
  %270 = load i64, ptr %269, align 8, !tbaa !9
  %271 = load i64, ptr %28, align 8, !tbaa !9
  %272 = add nsw i64 %271, %270
  store i64 %272, ptr %28, align 8, !tbaa !9
  %273 = load ptr, ptr %30, align 8, !tbaa !5
  %274 = load i64, ptr %9, align 8, !tbaa !9
  %275 = getelementptr inbounds i64, ptr %273, i64 %274
  %276 = load i64, ptr %275, align 8, !tbaa !9
  store i64 %276, ptr %11, align 8, !tbaa !9
  br label %277

277:                                              ; preds = %301, %262
  %278 = load i64, ptr %11, align 8, !tbaa !9
  %279 = load ptr, ptr %30, align 8, !tbaa !5
  %280 = load i64, ptr %9, align 8, !tbaa !9
  %281 = add nsw i64 %280, 1
  %282 = getelementptr inbounds i64, ptr %279, i64 %281
  %283 = load i64, ptr %282, align 8, !tbaa !9
  %284 = icmp slt i64 %278, %283
  br i1 %284, label %285, label %304

285:                                              ; preds = %277
  %286 = load ptr, ptr %33, align 8, !tbaa !5
  %287 = load i64, ptr %11, align 8, !tbaa !9
  %288 = getelementptr inbounds i64, ptr %286, i64 %287
  %289 = load i64, ptr %288, align 8, !tbaa !9
  %290 = load ptr, ptr %40, align 8, !tbaa !5
  %291 = load ptr, ptr %35, align 8, !tbaa !5
  %292 = load ptr, ptr %31, align 8, !tbaa !5
  %293 = load i64, ptr %11, align 8, !tbaa !9
  %294 = getelementptr inbounds i64, ptr %292, i64 %293
  %295 = load i64, ptr %294, align 8, !tbaa !9
  %296 = getelementptr inbounds i64, ptr %291, i64 %295
  %297 = load i64, ptr %296, align 8, !tbaa !9
  %298 = getelementptr inbounds i64, ptr %290, i64 %297
  %299 = load i64, ptr %298, align 8, !tbaa !9
  %300 = add nsw i64 %299, %289
  store i64 %300, ptr %298, align 8, !tbaa !9
  br label %301

301:                                              ; preds = %285
  %302 = load i64, ptr %11, align 8, !tbaa !9
  %303 = add nsw i64 %302, 1
  store i64 %303, ptr %11, align 8, !tbaa !9
  br label %277, !llvm.loop !34

304:                                              ; preds = %277
  br label %305

305:                                              ; preds = %304
  %306 = load i64, ptr %10, align 8, !tbaa !9
  %307 = add nsw i64 %306, 1
  store i64 %307, ptr %10, align 8, !tbaa !9
  br label %258, !llvm.loop !35

308:                                              ; preds = %258
  %309 = load ptr, ptr %40, align 8, !tbaa !5
  %310 = load i64, ptr %14, align 8, !tbaa !9
  %311 = getelementptr inbounds i64, ptr %309, i64 %310
  store i64 0, ptr %311, align 8, !tbaa !9
  store i64 0, ptr %21, align 8, !tbaa !9
  store i64 0, ptr %9, align 8, !tbaa !9
  br label %312

312:                                              ; preds = %339, %308
  %313 = load i64, ptr %9, align 8, !tbaa !9
  %314 = load i64, ptr %7, align 8, !tbaa !9
  %315 = icmp slt i64 %313, %314
  br i1 %315, label %316, label %342

316:                                              ; preds = %312
  %317 = load ptr, ptr %40, align 8, !tbaa !5
  %318 = load i64, ptr %9, align 8, !tbaa !9
  %319 = getelementptr inbounds i64, ptr %317, i64 %318
  %320 = load i64, ptr %319, align 8, !tbaa !9
  %321 = icmp sgt i64 %320, 0
  br i1 %321, label %322, label %338

322:                                              ; preds = %316
  %323 = load ptr, ptr %40, align 8, !tbaa !5
  %324 = load i64, ptr %9, align 8, !tbaa !9
  %325 = getelementptr inbounds i64, ptr %323, i64 %324
  %326 = load i64, ptr %325, align 8, !tbaa !9
  %327 = sub nsw i64 0, %326
  %328 = load ptr, ptr %42, align 8, !tbaa !5
  %329 = load i64, ptr %21, align 8, !tbaa !9
  %330 = getelementptr inbounds %struct.KeyValueType, ptr %328, i64 %329
  %331 = getelementptr inbounds %struct.KeyValueType, ptr %330, i32 0, i32 0
  store i64 %327, ptr %331, align 8, !tbaa !28
  %332 = load i64, ptr %9, align 8, !tbaa !9
  %333 = load ptr, ptr %42, align 8, !tbaa !5
  %334 = load i64, ptr %21, align 8, !tbaa !9
  %335 = add nsw i64 %334, 1
  store i64 %335, ptr %21, align 8, !tbaa !9
  %336 = getelementptr inbounds %struct.KeyValueType, ptr %333, i64 %334
  %337 = getelementptr inbounds %struct.KeyValueType, ptr %336, i32 0, i32 1
  store i64 %332, ptr %337, align 8, !tbaa !30
  br label %338

338:                                              ; preds = %322, %316
  br label %339

339:                                              ; preds = %338
  %340 = load i64, ptr %9, align 8, !tbaa !9
  %341 = add nsw i64 %340, 1
  store i64 %341, ptr %9, align 8, !tbaa !9
  br label %312, !llvm.loop !36

342:                                              ; preds = %312
  %343 = load i64, ptr %21, align 8, !tbaa !9
  %344 = load ptr, ptr %42, align 8, !tbaa !5
  call void @libmetis__ikeysort(i64 noundef %343, ptr noundef %344)
  store i64 -1, ptr %24, align 8, !tbaa !9
  store i64 -1, ptr %23, align 8, !tbaa !9
  store i64 0, ptr %9, align 8, !tbaa !9
  br label %345

345:                                              ; preds = %467, %342
  %346 = load i64, ptr %9, align 8, !tbaa !9
  %347 = load i64, ptr %21, align 8, !tbaa !9
  %348 = icmp slt i64 %346, %347
  br i1 %348, label %349, label %470

349:                                              ; preds = %345
  %350 = load ptr, ptr %42, align 8, !tbaa !5
  %351 = load i64, ptr %9, align 8, !tbaa !9
  %352 = getelementptr inbounds %struct.KeyValueType, ptr %350, i64 %351
  %353 = getelementptr inbounds %struct.KeyValueType, ptr %352, i32 0, i32 1
  %354 = load i64, ptr %353, align 8, !tbaa !30
  store i64 %354, ptr %12, align 8, !tbaa !9
  %355 = load ptr, ptr %39, align 8, !tbaa !5
  %356 = load i64, ptr %12, align 8, !tbaa !9
  %357 = getelementptr inbounds i64, ptr %355, i64 %356
  %358 = load i64, ptr %357, align 8, !tbaa !9
  %359 = icmp sgt i64 %358, 0
  br i1 %359, label %360, label %466

360:                                              ; preds = %349
  %361 = load ptr, ptr %34, align 8, !tbaa !5
  %362 = load i64, ptr %12, align 8, !tbaa !9
  %363 = getelementptr inbounds i64, ptr %361, i64 %362
  %364 = load i64, ptr %363, align 8, !tbaa !9
  %365 = load i64, ptr %28, align 8, !tbaa !9
  %366 = add nsw i64 %364, %365
  %367 = load ptr, ptr %36, align 8, !tbaa !5
  %368 = load i64, ptr %12, align 8, !tbaa !9
  %369 = getelementptr inbounds i64, ptr %367, i64 %368
  %370 = load i64, ptr %369, align 8, !tbaa !9
  %371 = icmp sgt i64 %366, %370
  br i1 %371, label %372, label %373

372:                                              ; preds = %360
  br label %467

373:                                              ; preds = %360
  store i64 0, ptr %11, align 8, !tbaa !9
  br label %374

374:                                              ; preds = %407, %373
  %375 = load i64, ptr %11, align 8, !tbaa !9
  %376 = load i64, ptr %7, align 8, !tbaa !9
  %377 = icmp slt i64 %375, %376
  br i1 %377, label %378, label %410

378:                                              ; preds = %374
  %379 = load ptr, ptr %40, align 8, !tbaa !5
  %380 = load i64, ptr %11, align 8, !tbaa !9
  %381 = getelementptr inbounds i64, ptr %379, i64 %380
  %382 = load i64, ptr %381, align 8, !tbaa !9
  %383 = icmp sgt i64 %382, 0
  br i1 %383, label %384, label %406

384:                                              ; preds = %378
  %385 = load ptr, ptr %38, align 8, !tbaa !5
  %386 = load i64, ptr %11, align 8, !tbaa !9
  %387 = getelementptr inbounds i64, ptr %385, i64 %386
  %388 = load i64, ptr %387, align 8, !tbaa !9
  %389 = load ptr, ptr %38, align 8, !tbaa !5
  %390 = load i64, ptr %13, align 8, !tbaa !9
  %391 = getelementptr inbounds i64, ptr %389, i64 %390
  %392 = load i64, ptr %391, align 8, !tbaa !9
  %393 = sub nsw i64 %392, 1
  %394 = icmp sge i64 %388, %393
  br i1 %394, label %395, label %406

395:                                              ; preds = %384
  %396 = load ptr, ptr %37, align 8, !tbaa !5
  %397 = load i64, ptr %7, align 8, !tbaa !9
  %398 = load i64, ptr %11, align 8, !tbaa !9
  %399 = mul nsw i64 %397, %398
  %400 = load i64, ptr %12, align 8, !tbaa !9
  %401 = add nsw i64 %399, %400
  %402 = getelementptr inbounds i64, ptr %396, i64 %401
  %403 = load i64, ptr %402, align 8, !tbaa !9
  %404 = icmp eq i64 %403, 0
  br i1 %404, label %405, label %406

405:                                              ; preds = %395
  br label %410

406:                                              ; preds = %395, %384, %378
  br label %407

407:                                              ; preds = %406
  %408 = load i64, ptr %11, align 8, !tbaa !9
  %409 = add nsw i64 %408, 1
  store i64 %409, ptr %11, align 8, !tbaa !9
  br label %374, !llvm.loop !37

410:                                              ; preds = %405, %374
  %411 = load i64, ptr %11, align 8, !tbaa !9
  %412 = load i64, ptr %7, align 8, !tbaa !9
  %413 = icmp eq i64 %411, %412
  br i1 %413, label %414, label %465

414:                                              ; preds = %410
  store i64 0, ptr %25, align 8, !tbaa !9
  store i64 0, ptr %11, align 8, !tbaa !9
  br label %415

415:                                              ; preds = %439, %414
  %416 = load i64, ptr %11, align 8, !tbaa !9
  %417 = load i64, ptr %7, align 8, !tbaa !9
  %418 = icmp slt i64 %416, %417
  br i1 %418, label %419, label %442

419:                                              ; preds = %415
  %420 = load ptr, ptr %40, align 8, !tbaa !5
  %421 = load i64, ptr %11, align 8, !tbaa !9
  %422 = getelementptr inbounds i64, ptr %420, i64 %421
  %423 = load i64, ptr %422, align 8, !tbaa !9
  %424 = icmp sgt i64 %423, 0
  br i1 %424, label %425, label %438

425:                                              ; preds = %419
  %426 = load ptr, ptr %37, align 8, !tbaa !5
  %427 = load i64, ptr %7, align 8, !tbaa !9
  %428 = load i64, ptr %12, align 8, !tbaa !9
  %429 = mul nsw i64 %427, %428
  %430 = load i64, ptr %11, align 8, !tbaa !9
  %431 = add nsw i64 %429, %430
  %432 = getelementptr inbounds i64, ptr %426, i64 %431
  %433 = load i64, ptr %432, align 8, !tbaa !9
  %434 = icmp eq i64 %433, 0
  br i1 %434, label %435, label %438

435:                                              ; preds = %425
  %436 = load i64, ptr %25, align 8, !tbaa !9
  %437 = add nsw i64 %436, 1
  store i64 %437, ptr %25, align 8, !tbaa !9
  br label %438

438:                                              ; preds = %435, %425, %419
  br label %439

439:                                              ; preds = %438
  %440 = load i64, ptr %11, align 8, !tbaa !9
  %441 = add nsw i64 %440, 1
  store i64 %441, ptr %11, align 8, !tbaa !9
  br label %415, !llvm.loop !38

442:                                              ; preds = %415
  %443 = load i64, ptr %24, align 8, !tbaa !9
  %444 = icmp eq i64 %443, -1
  br i1 %444, label %445, label %459

445:                                              ; preds = %442
  %446 = load ptr, ptr %38, align 8, !tbaa !5
  %447 = load i64, ptr %12, align 8, !tbaa !9
  %448 = getelementptr inbounds i64, ptr %446, i64 %447
  %449 = load i64, ptr %448, align 8, !tbaa !9
  %450 = load i64, ptr %25, align 8, !tbaa !9
  %451 = add nsw i64 %449, %450
  %452 = load ptr, ptr %38, align 8, !tbaa !5
  %453 = load i64, ptr %13, align 8, !tbaa !9
  %454 = getelementptr inbounds i64, ptr %452, i64 %453
  %455 = load i64, ptr %454, align 8, !tbaa !9
  %456 = icmp slt i64 %451, %455
  br i1 %456, label %457, label %459

457:                                              ; preds = %445
  %458 = load i64, ptr %12, align 8, !tbaa !9
  store i64 %458, ptr %24, align 8, !tbaa !9
  br label %459

459:                                              ; preds = %457, %445, %442
  %460 = load i64, ptr %25, align 8, !tbaa !9
  %461 = icmp eq i64 %460, 0
  br i1 %461, label %462, label %464

462:                                              ; preds = %459
  %463 = load i64, ptr %12, align 8, !tbaa !9
  store i64 %463, ptr %23, align 8, !tbaa !9
  br label %470

464:                                              ; preds = %459
  br label %465

465:                                              ; preds = %464, %410
  br label %466

466:                                              ; preds = %465, %349
  br label %467

467:                                              ; preds = %466, %372
  %468 = load i64, ptr %9, align 8, !tbaa !9
  %469 = add nsw i64 %468, 1
  store i64 %469, ptr %9, align 8, !tbaa !9
  br label %345, !llvm.loop !39

470:                                              ; preds = %462, %345
  %471 = load i64, ptr %23, align 8, !tbaa !9
  %472 = icmp eq i64 %471, -1
  br i1 %472, label %473, label %478

473:                                              ; preds = %470
  %474 = load i64, ptr %24, align 8, !tbaa !9
  %475 = icmp ne i64 %474, -1
  br i1 %475, label %476, label %478

476:                                              ; preds = %473
  %477 = load i64, ptr %24, align 8, !tbaa !9
  store i64 %477, ptr %23, align 8, !tbaa !9
  br label %478

478:                                              ; preds = %476, %473, %470
  %479 = load i64, ptr %23, align 8, !tbaa !9
  %480 = icmp eq i64 %479, -1
  br i1 %480, label %481, label %482

481:                                              ; preds = %478
  br label %506

482:                                              ; preds = %478
  br label %483

483:                                              ; preds = %482
  %484 = load i64, ptr %28, align 8, !tbaa !9
  %485 = load ptr, ptr %34, align 8, !tbaa !5
  %486 = load i64, ptr %23, align 8, !tbaa !9
  %487 = getelementptr inbounds i64, ptr %485, i64 %486
  %488 = load i64, ptr %487, align 8, !tbaa !9
  %489 = add nsw i64 %488, %484
  store i64 %489, ptr %487, align 8, !tbaa !9
  %490 = load i64, ptr %28, align 8, !tbaa !9
  %491 = load ptr, ptr %34, align 8, !tbaa !5
  %492 = load i64, ptr %14, align 8, !tbaa !9
  %493 = getelementptr inbounds i64, ptr %491, i64 %492
  %494 = load i64, ptr %493, align 8, !tbaa !9
  %495 = sub nsw i64 %494, %490
  store i64 %495, ptr %493, align 8, !tbaa !9
  br label %496

496:                                              ; preds = %483
  br label %497

497:                                              ; preds = %496
  %498 = load ptr, ptr %5, align 8, !tbaa !5
  %499 = load ptr, ptr %6, align 8, !tbaa !5
  %500 = load ptr, ptr %38, align 8, !tbaa !5
  %501 = load ptr, ptr %37, align 8, !tbaa !5
  %502 = load i64, ptr %7, align 8, !tbaa !9
  %503 = load i64, ptr %23, align 8, !tbaa !9
  %504 = load i64, ptr %20, align 8, !tbaa !9
  %505 = load ptr, ptr %41, align 8, !tbaa !5
  call void @libmetis__MoveGroupMConn(ptr noundef %498, ptr noundef %499, ptr noundef %500, ptr noundef %501, i64 noundef %502, i64 noundef %503, i64 noundef %504, ptr noundef %505)
  store i64 1, ptr %27, align 8, !tbaa !9
  br label %509

506:                                              ; preds = %481
  %507 = load i64, ptr %26, align 8, !tbaa !9
  %508 = add nsw i64 %507, 1
  store i64 %508, ptr %26, align 8, !tbaa !9
  br label %180, !llvm.loop !40

509:                                              ; preds = %497, %198, %180
  %510 = load i64, ptr %27, align 8, !tbaa !9
  %511 = icmp eq i64 %510, 0
  br i1 %511, label %512, label %513

512:                                              ; preds = %509
  br label %514

513:                                              ; preds = %509
  br label %116

514:                                              ; preds = %512, %135
  %515 = load ptr, ptr %5, align 8, !tbaa !5
  %516 = load i64, ptr %7, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %515, i64 noundef %516)
  %517 = load ptr, ptr %5, align 8, !tbaa !5
  %518 = load i64, ptr %7, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %517, i64 noundef %518)
  %519 = load ptr, ptr %5, align 8, !tbaa !5
  %520 = load i64, ptr %7, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %519, i64 noundef %520)
  %521 = load ptr, ptr %5, align 8, !tbaa !5
  %522 = load i64, ptr %15, align 8, !tbaa !9
  call void @libmetis__idxwspacefree(ptr noundef %521, i64 noundef %522)
  call void (ptr, ...) @gk_free(ptr noundef %42, ptr noundef %43, ptr noundef null)
  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 8, ptr %40) #3
  call void @llvm.lifetime.end.p0(i64 8, 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 @gk_malloc(i64 noundef, ptr noundef) #1

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

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

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

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

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


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

%struct.KeyValueType = type { i64, i64 }

@.str.8 = external hidden unnamed_addr constant [30 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 ptr @libmetis__idxwspacemalloc(ptr noundef, i64 noundef) local_unnamed_addr #1

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

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

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

declare void @libmetis__idxwspacefree(ptr noundef, i64 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

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

; Function Attrs: nounwind uwtable
define dso_local void @libmetis__EliminateSubDomainEdges(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr nocapture noundef readonly %3) local_unnamed_addr #2 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #3
  %7 = load i64, ptr %1, align 8, !tbaa !5
  %8 = getelementptr inbounds i8, ptr %1, i64 16
  %9 = load ptr, ptr %8, align 8, !tbaa !12
  %10 = getelementptr inbounds i8, ptr %1, i64 40
  %11 = load ptr, ptr %10, align 8, !tbaa !13
  %12 = getelementptr inbounds i8, ptr %1, i64 24
  %13 = load ptr, ptr %12, align 8, !tbaa !14
  %14 = getelementptr inbounds i8, ptr %1, i64 48
  %15 = load ptr, ptr %14, align 8, !tbaa !15
  %16 = getelementptr inbounds i8, ptr %1, i64 128
  %17 = load ptr, ptr %16, align 8, !tbaa !16
  %18 = getelementptr inbounds i8, ptr %1, i64 136
  %19 = load ptr, ptr %18, align 8, !tbaa !17
  %20 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %2) #3
  %21 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %2) #3
  %22 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %2) #3
  %23 = tail call ptr @libmetis__idxwspacemalloc(ptr noundef %0, i64 noundef %7) #3
  %24 = getelementptr inbounds i8, ptr %0, i64 144
  %25 = load ptr, ptr %24, align 8, !tbaa !18
  %26 = shl i64 %2, 4
  %27 = tail call ptr @gk_malloc(i64 noundef %26, ptr noundef nonnull @.str.8) #3
  store ptr %27, ptr %5, align 8, !tbaa !23
  %28 = tail call ptr @gk_malloc(i64 noundef %26, ptr noundef nonnull @.str.8) #3
  store ptr %28, ptr %6, align 8, !tbaa !23
  tail call void @libmetis__ComputeSubDomainGraph(ptr noundef nonnull %1, i64 noundef %2, ptr noundef %25, ptr noundef %21)
  %29 = tail call i64 @libmetis__idxsum(i64 noundef %2, ptr noundef %19, i64 noundef 1) #3
  %30 = icmp sgt i64 %2, 0
  br i1 %30, label %.lr.ph, label %.preheader222

.lr.ph:                                           ; preds = %4
  %31 = sitofp i64 %29 to double
  %min.iters.check = icmp eq i64 %2, 1
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.lr.ph
  %.0224.ph = phi i64 [ 0, %.lr.ph ], [ %n.vec, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.lr.ph
  %n.vec = and i64 %2, 9223372036854775806
  %broadcast.splatinsert = insertelement <2 x double> poison, double %31, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %32 = getelementptr inbounds float, ptr %3, i64 %index
  %wide.load = load <2 x float>, ptr %32, align 4, !tbaa !24
  %33 = fpext <2 x float> %wide.load to <2 x double>
  %34 = fmul <2 x double> %33, <double 1.250000e+00, double 1.250000e+00>
  %35 = fmul <2 x double> %34, %broadcast.splat
  %36 = fptosi <2 x double> %35 to <2 x i64>
  %37 = getelementptr inbounds i64, ptr %20, i64 %index
  store <2 x i64> %36, ptr %37, align 8, !tbaa !25
  %index.next = add nuw i64 %index, 2
  %38 = icmp eq i64 %index.next, %n.vec
  br i1 %38, label %middle.block, label %vector.body, !llvm.loop !26

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %2
  br i1 %cmp.n, label %.preheader222, label %scalar.ph.preheader

.preheader222:                                    ; preds = %scalar.ph, %middle.block, %4
  %39 = icmp sgt i64 %7, 0
  %40 = add i64 %2, -1
  %xtraiter = and i64 %2, 1
  %41 = icmp eq i64 %40, 0
  %unroll_iter = and i64 %2, 9223372036854775806
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %xtraiter304 = and i64 %2, 1
  %42 = icmp eq i64 %40, 0
  %unroll_iter307 = and i64 %2, 9223372036854775806
  %lcmp.mod305.not = icmp eq i64 %xtraiter304, 0
  %xtraiter309 = and i64 %2, 1
  %43 = icmp eq i64 %40, 0
  %unroll_iter312 = and i64 %2, 9223372036854775806
  %lcmp.mod310.not = icmp eq i64 %xtraiter309, 0
  br label %52

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0224 = phi i64 [ %51, %scalar.ph ], [ %.0224.ph, %scalar.ph.preheader ]
  %44 = getelementptr inbounds float, ptr %3, i64 %.0224
  %45 = load float, ptr %44, align 4, !tbaa !24
  %46 = fpext float %45 to double
  %47 = fmul double %46, 1.250000e+00
  %48 = fmul double %47, %31
  %49 = fptosi double %48 to i64
  %50 = getelementptr inbounds i64, ptr %20, i64 %.0224
  store i64 %49, ptr %50, align 8, !tbaa !25
  %51 = add nuw nsw i64 %.0224, 1
  %exitcond.not = icmp eq i64 %51, %2
  br i1 %exitcond.not, label %.preheader222, label %scalar.ph, !llvm.loop !30

52:                                               ; preds = %.preheader222, %250
  %53 = tail call i64 @libmetis__idxsum(i64 noundef %2, ptr noundef %21, i64 noundef 1) #3
  %54 = sdiv i64 %53, %2
  %55 = tail call i64 @libmetis__idxargmax(i64 noundef %2, ptr noundef %21) #3
  %56 = getelementptr inbounds i64, ptr %21, i64 %55
  %57 = load i64, ptr %56, align 8, !tbaa !25
  %58 = sitofp i64 %57 to double
  %59 = sitofp i64 %54 to double
  %60 = fmul double %59, 1.400000e+00
  %61 = fcmp ogt double %60, %58
  br i1 %61, label %.critedge, label %62

62:                                               ; preds = %52
  %63 = tail call i64 @libmetis__idxargmax(i64 noundef %2, ptr noundef nonnull %21) #3
  %64 = mul nsw i64 %63, %2
  %65 = getelementptr inbounds i64, ptr %25, i64 %64
  %66 = tail call i64 @libmetis__idxsum(i64 noundef %2, ptr noundef %65, i64 noundef 1) #3
  br i1 %30, label %.lr.ph227.preheader, label %._crit_edge.thread

.lr.ph227.preheader:                              ; preds = %62
  br i1 %41, label %._crit_edge.unr-lcssa, label %.lr.ph227

._crit_edge.thread:                               ; preds = %62
  tail call void @libmetis__ikeysort(i64 noundef 0, ptr noundef %28) #3
  br label %.critedge

.lr.ph227:                                        ; preds = %.lr.ph227.preheader, %82
  %.1226 = phi i64 [ %83, %82 ], [ 0, %.lr.ph227.preheader ]
  %.0202225 = phi i64 [ %.1203.1, %82 ], [ 0, %.lr.ph227.preheader ]
  %niter = phi i64 [ %niter.next.1, %82 ], [ 0, %.lr.ph227.preheader ]
  %67 = getelementptr inbounds i64, ptr %65, i64 %.1226
  %68 = load i64, ptr %67, align 8, !tbaa !25
  %69 = icmp sgt i64 %68, 0
  br i1 %69, label %70, label %.lr.ph227.1

70:                                               ; preds = %.lr.ph227
  %71 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.0202225
  store i64 %68, ptr %71, align 8, !tbaa !31
  %72 = add nsw i64 %.0202225, 1
  %73 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.0202225, i32 1
  store i64 %.1226, ptr %73, align 8, !tbaa !33
  br label %.lr.ph227.1

.lr.ph227.1:                                      ; preds = %.lr.ph227, %70
  %.1203 = phi i64 [ %72, %70 ], [ %.0202225, %.lr.ph227 ]
  %74 = or disjoint i64 %.1226, 1
  %75 = getelementptr inbounds i64, ptr %65, i64 %74
  %76 = load i64, ptr %75, align 8, !tbaa !25
  %77 = icmp sgt i64 %76, 0
  br i1 %77, label %78, label %82

78:                                               ; preds = %.lr.ph227.1
  %79 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.1203
  store i64 %76, ptr %79, align 8, !tbaa !31
  %80 = add nsw i64 %.1203, 1
  %81 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.1203, i32 1
  store i64 %74, ptr %81, align 8, !tbaa !33
  br label %82

82:                                               ; preds = %78, %.lr.ph227.1
  %.1203.1 = phi i64 [ %80, %78 ], [ %.1203, %.lr.ph227.1 ]
  %83 = add nuw nsw i64 %.1226, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.unr-lcssa, label %.lr.ph227, !llvm.loop !34

._crit_edge.unr-lcssa:                            ; preds = %82, %.lr.ph227.preheader
  %.1203.lcssa.ph = phi i64 [ poison, %.lr.ph227.preheader ], [ %.1203.1, %82 ]
  %.1226.unr = phi i64 [ 0, %.lr.ph227.preheader ], [ %83, %82 ]
  %.0202225.unr = phi i64 [ 0, %.lr.ph227.preheader ], [ %.1203.1, %82 ]
  br i1 %lcmp.mod.not, label %._crit_edge, label %.lr.ph227.epil

.lr.ph227.epil:                                   ; preds = %._crit_edge.unr-lcssa
  %84 = getelementptr inbounds i64, ptr %65, i64 %.1226.unr
  %85 = load i64, ptr %84, align 8, !tbaa !25
  %86 = icmp sgt i64 %85, 0
  br i1 %86, label %87, label %._crit_edge

87:                                               ; preds = %.lr.ph227.epil
  %88 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.0202225.unr
  store i64 %85, ptr %88, align 8, !tbaa !31
  %89 = add nsw i64 %.0202225.unr, 1
  %90 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.0202225.unr, i32 1
  store i64 %.1226.unr, ptr %90, align 8, !tbaa !33
  br label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph227.epil, %87, %._crit_edge.unr-lcssa
  %.1203.lcssa = phi i64 [ %.1203.lcssa.ph, %._crit_edge.unr-lcssa ], [ %89, %87 ], [ %.0202225.unr, %.lr.ph227.epil ]
  tail call void @libmetis__ikeysort(i64 noundef %.1203.lcssa, ptr noundef %28) #3
  %91 = icmp sgt i64 %.1203.lcssa, 0
  br i1 %91, label %.lr.ph275, label %.critedge

.lr.ph275:                                        ; preds = %._crit_edge
  %92 = getelementptr inbounds i64, ptr %21, i64 %63
  br label %95

93:                                               ; preds = %._crit_edge267
  %94 = add nuw nsw i64 %.0212273, 1
  %exitcond288.not = icmp eq i64 %94, %.1203.lcssa
  br i1 %exitcond288.not, label %.critedge, label %95, !llvm.loop !35

95:                                               ; preds = %.lr.ph275, %93
  %.0212273 = phi i64 [ 0, %.lr.ph275 ], [ %94, %93 ]
  %96 = getelementptr inbounds %struct.KeyValueType, ptr %28, i64 %.0212273
  %97 = load i64, ptr %96, align 8, !tbaa !31
  %98 = load i64, ptr %92, align 8, !tbaa !25
  %99 = shl nsw i64 %98, 1
  %100 = sdiv i64 %66, %99
  %101 = icmp sgt i64 %97, %100
  br i1 %101, label %.critedge, label %102

102:                                              ; preds = %95
  %103 = getelementptr inbounds i8, ptr %96, i64 8
  %104 = load i64, ptr %103, align 8, !tbaa !33
  %105 = tail call ptr @libmetis__idxset(i64 noundef %2, i64 noundef 0, ptr noundef %22) #3
  br i1 %39, label %.lr.ph235, label %._crit_edge244

.preheader221:                                    ; preds = %.loopexit
  %106 = icmp sgt i64 %.1199, 0
  br i1 %106, label %.lr.ph243, label %._crit_edge244

.lr.ph235:                                        ; preds = %102, %.loopexit
  %.2232 = phi i64 [ %126, %.loopexit ], [ 0, %102 ]
  %.0198231 = phi i64 [ %.1199, %.loopexit ], [ 0, %102 ]
  %107 = getelementptr inbounds i64, ptr %17, i64 %.2232
  %108 = load i64, ptr %107, align 8, !tbaa !25
  %109 = icmp eq i64 %108, %104
  br i1 %109, label %110, label %.loopexit

110:                                              ; preds = %.lr.ph235
  %111 = getelementptr inbounds i64, ptr %9, i64 %.2232
  %112 = load i64, ptr %111, align 8, !tbaa !25
  %113 = getelementptr inbounds i8, ptr %111, i64 8
  %114 = load i64, ptr %113, align 8, !tbaa !25
  %115 = icmp slt i64 %112, %114
  br i1 %115, label %.lr.ph230, label %.loopexit

116:                                              ; preds = %.lr.ph230
  %117 = add i64 %.0194228, 1
  %exitcond281.not = icmp eq i64 %117, %114
  br i1 %exitcond281.not, label %.loopexit, label %.lr.ph230, !llvm.loop !36

.lr.ph230:                                        ; preds = %110, %116
  %.0194228 = phi i64 [ %117, %116 ], [ %112, %110 ]
  %118 = getelementptr inbounds i64, ptr %11, i64 %.0194228
  %119 = load i64, ptr %118, align 8, !tbaa !25
  %120 = getelementptr inbounds i64, ptr %17, i64 %119
  %121 = load i64, ptr %120, align 8, !tbaa !25
  %122 = icmp eq i64 %121, %63
  br i1 %122, label %123, label %116

123:                                              ; preds = %.lr.ph230
  %124 = add nsw i64 %.0198231, 1
  %125 = getelementptr inbounds i64, ptr %23, i64 %.0198231
  store i64 %.2232, ptr %125, align 8, !tbaa !25
  br label %.loopexit

.loopexit:                                        ; preds = %116, %110, %.lr.ph235, %123
  %.1199 = phi i64 [ %124, %123 ], [ %.0198231, %.lr.ph235 ], [ %.0198231, %110 ], [ %.0198231, %116 ]
  %126 = add nuw nsw i64 %.2232, 1
  %exitcond282.not = icmp eq i64 %126, %7
  br i1 %exitcond282.not, label %.preheader221, label %.lr.ph235, !llvm.loop !37

.lr.ph243:                                        ; preds = %.preheader221, %._crit_edge240
  %.0193242 = phi i64 [ %149, %._crit_edge240 ], [ 0, %.preheader221 ]
  %.0214241 = phi i64 [ %131, %._crit_edge240 ], [ 0, %.preheader221 ]
  %127 = getelementptr inbounds i64, ptr %23, i64 %.0193242
  %128 = load i64, ptr %127, align 8, !tbaa !25
  %129 = getelementptr inbounds i64, ptr %13, i64 %128
  %130 = load i64, ptr %129, align 8, !tbaa !25
  %131 = add nsw i64 %130, %.0214241
  %132 = getelementptr inbounds i64, ptr %9, i64 %128
  %133 = load i64, ptr %132, align 8, !tbaa !25
  %134 = getelementptr i8, ptr %132, i64 8
  %135 = load i64, ptr %134, align 8, !tbaa !25
  %136 = icmp slt i64 %133, %135
  br i1 %136, label %.lr.ph239, label %._crit_edge240

.lr.ph239:                                        ; preds = %.lr.ph243, %.lr.ph239
  %.1195237 = phi i64 [ %146, %.lr.ph239 ], [ %133, %.lr.ph243 ]
  %137 = getelementptr inbounds i64, ptr %15, i64 %.1195237
  %138 = load i64, ptr %137, align 8, !tbaa !25
  %139 = getelementptr inbounds i64, ptr %11, i64 %.1195237
  %140 = load i64, ptr %139, align 8, !tbaa !25
  %141 = getelementptr inbounds i64, ptr %17, i64 %140
  %142 = load i64, ptr %141, align 8, !tbaa !25
  %143 = getelementptr inbounds i64, ptr %22, i64 %142
  %144 = load i64, ptr %143, align 8, !tbaa !25
  %145 = add nsw i64 %144, %138
  store i64 %145, ptr %143, align 8, !tbaa !25
  %146 = add nsw i64 %.1195237, 1
  %147 = load i64, ptr %134, align 8, !tbaa !25
  %148 = icmp slt i64 %146, %147
  br i1 %148, label %.lr.ph239, label %._crit_edge240, !llvm.loop !38

._crit_edge240:                                   ; preds = %.lr.ph239, %.lr.ph243
  %149 = add nuw nsw i64 %.0193242, 1
  %exitcond283.not = icmp eq i64 %149, %.1199
  br i1 %exitcond283.not, label %._crit_edge244, label %.lr.ph243, !llvm.loop !39

._crit_edge244:                                   ; preds = %._crit_edge240, %102, %.preheader221
  %.0198.lcssa291 = phi i64 [ %.1199, %.preheader221 ], [ 0, %102 ], [ %.1199, %._crit_edge240 ]
  %.0214.lcssa = phi i64 [ 0, %.preheader221 ], [ 0, %102 ], [ %131, %._crit_edge240 ]
  %150 = getelementptr inbounds i64, ptr %22, i64 %104
  store i64 0, ptr %150, align 8, !tbaa !25
  br i1 %30, label %.lr.ph249.preheader, label %._crit_edge250.thread

.lr.ph249.preheader:                              ; preds = %._crit_edge244
  br i1 %42, label %._crit_edge250.unr-lcssa, label %.lr.ph249

._crit_edge250.thread:                            ; preds = %._crit_edge244
  tail call void @libmetis__ikeysort(i64 noundef 0, ptr noundef %27) #3
  br label %._crit_edge267

.lr.ph249:                                        ; preds = %.lr.ph249.preheader, %168
  %.3247 = phi i64 [ %169, %168 ], [ 0, %.lr.ph249.preheader ]
  %.0200246 = phi i64 [ %.1201.1, %168 ], [ 0, %.lr.ph249.preheader ]
  %niter308 = phi i64 [ %niter308.next.1, %168 ], [ 0, %.lr.ph249.preheader ]
  %151 = getelementptr inbounds i64, ptr %22, i64 %.3247
  %152 = load i64, ptr %151, align 8, !tbaa !25
  %153 = icmp sgt i64 %152, 0
  br i1 %153, label %154, label %.lr.ph249.1

154:                                              ; preds = %.lr.ph249
  %155 = sub nsw i64 0, %152
  %156 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.0200246
  store i64 %155, ptr %156, align 8, !tbaa !31
  %157 = add nsw i64 %.0200246, 1
  %158 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.0200246, i32 1
  store i64 %.3247, ptr %158, align 8, !tbaa !33
  br label %.lr.ph249.1

.lr.ph249.1:                                      ; preds = %.lr.ph249, %154
  %.1201 = phi i64 [ %157, %154 ], [ %.0200246, %.lr.ph249 ]
  %159 = or disjoint i64 %.3247, 1
  %160 = getelementptr inbounds i64, ptr %22, i64 %159
  %161 = load i64, ptr %160, align 8, !tbaa !25
  %162 = icmp sgt i64 %161, 0
  br i1 %162, label %163, label %168

163:                                              ; preds = %.lr.ph249.1
  %164 = sub nsw i64 0, %161
  %165 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.1201
  store i64 %164, ptr %165, align 8, !tbaa !31
  %166 = add nsw i64 %.1201, 1
  %167 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.1201, i32 1
  store i64 %159, ptr %167, align 8, !tbaa !33
  br label %168

168:                                              ; preds = %163, %.lr.ph249.1
  %.1201.1 = phi i64 [ %166, %163 ], [ %.1201, %.lr.ph249.1 ]
  %169 = add nuw nsw i64 %.3247, 2
  %niter308.next.1 = add i64 %niter308, 2
  %niter308.ncmp.1 = icmp eq i64 %niter308.next.1, %unroll_iter307
  br i1 %niter308.ncmp.1, label %._crit_edge250.unr-lcssa, label %.lr.ph249, !llvm.loop !40

._crit_edge250.unr-lcssa:                         ; preds = %168, %.lr.ph249.preheader
  %.1201.lcssa.ph = phi i64 [ poison, %.lr.ph249.preheader ], [ %.1201.1, %168 ]
  %.3247.unr = phi i64 [ 0, %.lr.ph249.preheader ], [ %169, %168 ]
  %.0200246.unr = phi i64 [ 0, %.lr.ph249.preheader ], [ %.1201.1, %168 ]
  br i1 %lcmp.mod305.not, label %._crit_edge250, label %.lr.ph249.epil

.lr.ph249.epil:                                   ; preds = %._crit_edge250.unr-lcssa
  %170 = getelementptr inbounds i64, ptr %22, i64 %.3247.unr
  %171 = load i64, ptr %170, align 8, !tbaa !25
  %172 = icmp sgt i64 %171, 0
  br i1 %172, label %173, label %._crit_edge250

173:                                              ; preds = %.lr.ph249.epil
  %174 = sub nsw i64 0, %171
  %175 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.0200246.unr
  store i64 %174, ptr %175, align 8, !tbaa !31
  %176 = add nsw i64 %.0200246.unr, 1
  %177 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.0200246.unr, i32 1
  store i64 %.3247.unr, ptr %177, align 8, !tbaa !33
  br label %._crit_edge250

._crit_edge250:                                   ; preds = %.lr.ph249.epil, %173, %._crit_edge250.unr-lcssa
  %.1201.lcssa = phi i64 [ %.1201.lcssa.ph, %._crit_edge250.unr-lcssa ], [ %176, %173 ], [ %.0200246.unr, %.lr.ph249.epil ]
  tail call void @libmetis__ikeysort(i64 noundef %.1201.lcssa, ptr noundef %27) #3
  %178 = icmp sgt i64 %.1201.lcssa, 0
  br i1 %178, label %.lr.ph266, label %._crit_edge267

.lr.ph266:                                        ; preds = %._crit_edge250, %245
  %.4264 = phi i64 [ %246, %245 ], [ 0, %._crit_edge250 ]
  %.0206263 = phi i64 [ %.2208, %245 ], [ -1, %._crit_edge250 ]
  %179 = getelementptr inbounds %struct.KeyValueType, ptr %27, i64 %.4264, i32 1
  %180 = load i64, ptr %179, align 8, !tbaa !33
  %181 = getelementptr inbounds i64, ptr %65, i64 %180
  %182 = load i64, ptr %181, align 8, !tbaa !25
  %183 = icmp sgt i64 %182, 0
  br i1 %183, label %184, label %245

184:                                              ; preds = %.lr.ph266
  %185 = getelementptr inbounds i64, ptr %19, i64 %180
  %186 = load i64, ptr %185, align 8, !tbaa !25
  %187 = add nsw i64 %186, %.0214.lcssa
  %188 = getelementptr inbounds i64, ptr %20, i64 %180
  %189 = load i64, ptr %188, align 8, !tbaa !25
  %190 = icmp sgt i64 %187, %189
  br i1 %190, label %245, label %.preheader220

.preheader220:                                    ; preds = %184
  %invariant.gep = getelementptr i64, ptr %25, i64 %180
  br i1 %30, label %.lr.ph253, label %._crit_edge254

.lr.ph253:                                        ; preds = %.preheader220, %203
  %.2196252 = phi i64 [ %204, %203 ], [ 0, %.preheader220 ]
  %191 = getelementptr inbounds i64, ptr %22, i64 %.2196252
  %192 = load i64, ptr %191, align 8, !tbaa !25
  %193 = icmp sgt i64 %192, 0
  br i1 %193, label %194, label %203

194:                                              ; preds = %.lr.ph253
  %195 = getelementptr inbounds i64, ptr %21, i64 %.2196252
  %196 = load i64, ptr %195, align 8, !tbaa !25
  %197 = load i64, ptr %92, align 8, !tbaa !25
  %198 = add nsw i64 %197, -1
  %.not = icmp slt i64 %196, %198
  br i1 %.not, label %203, label %199

199:                                              ; preds = %194
  %200 = mul nuw nsw i64 %.2196252, %2
  %gep = getelementptr i64, ptr %invariant.gep, i64 %200
  %201 = load i64, ptr %gep, align 8, !tbaa !25
  %202 = icmp eq i64 %201, 0
  br i1 %202, label %._crit_edge254, label %203

203:                                              ; preds = %.lr.ph253, %194, %199
  %204 = add nuw nsw i64 %.2196252, 1
  %exitcond285.not = icmp eq i64 %204, %2
  br i1 %exitcond285.not, label %.preheader, label %.lr.ph253, !llvm.loop !41

._crit_edge254:                                   ; preds = %199, %.preheader220
  %.2196.lcssa = phi i64 [ 0, %.preheader220 ], [ %.2196252, %199 ]
  %205 = icmp eq i64 %.2196.lcssa, %2
  br i1 %205, label %.preheader, label %245

.preheader:                                       ; preds = %203, %._crit_edge254
  br i1 %30, label %.lr.ph260, label %._crit_edge261

.lr.ph260:                                        ; preds = %.preheader
  %206 = mul nsw i64 %180, %2
  %207 = getelementptr i64, ptr %25, i64 %206
  br i1 %43, label %._crit_edge261.loopexit.unr-lcssa, label %.lr.ph260.new

.lr.ph260.new:                                    ; preds = %.lr.ph260, %226
  %.3197259 = phi i64 [ %227, %226 ], [ 0, %.lr.ph260 ]
  %.0210258 = phi i64 [ %.1211.1, %226 ], [ 0, %.lr.ph260 ]
  %niter313 = phi i64 [ %niter313.next.1, %226 ], [ 0, %.lr.ph260 ]
  %208 = getelementptr inbounds i64, ptr %22, i64 %.3197259
  %209 = load i64, ptr %208, align 8, !tbaa !25
  %210 = icmp sgt i64 %209, 0
  br i1 %210, label %211, label %216

211:                                              ; preds = %.lr.ph260.new
  %212 = getelementptr i64, ptr %207, i64 %.3197259
  %213 = load i64, ptr %212, align 8, !tbaa !25
  %214 = icmp eq i64 %213, 0
  %215 = zext i1 %214 to i64
  %spec.select = add nsw i64 %.0210258, %215
  br label %216

216:                                              ; preds = %211, %.lr.ph260.new
  %.1211 = phi i64 [ %.0210258, %.lr.ph260.new ], [ %spec.select, %211 ]
  %217 = or disjoint i64 %.3197259, 1
  %218 = getelementptr inbounds i64, ptr %22, i64 %217
  %219 = load i64, ptr %218, align 8, !tbaa !25
  %220 = icmp sgt i64 %219, 0
  br i1 %220, label %221, label %226

221:                                              ; preds = %216
  %222 = getelementptr i64, ptr %207, i64 %217
  %223 = load i64, ptr %222, align 8, !tbaa !25
  %224 = icmp eq i64 %223, 0
  %225 = zext i1 %224 to i64
  %spec.select.1 = add nsw i64 %.1211, %225
  br label %226

226:                                              ; preds = %221, %216
  %.1211.1 = phi i64 [ %.1211, %216 ], [ %spec.select.1, %221 ]
  %227 = add nuw nsw i64 %.3197259, 2
  %niter313.next.1 = add i64 %niter313, 2
  %niter313.ncmp.1 = icmp eq i64 %niter313.next.1, %unroll_iter312
  br i1 %niter313.ncmp.1, label %._crit_edge261.loopexit.unr-lcssa, label %.lr.ph260.new, !llvm.loop !42

._crit_edge261.loopexit.unr-lcssa:                ; preds = %226, %.lr.ph260
  %.1211.lcssa.ph = phi i64 [ poison, %.lr.ph260 ], [ %.1211.1, %226 ]
  %.3197259.unr = phi i64 [ 0, %.lr.ph260 ], [ %227, %226 ]
  %.0210258.unr = phi i64 [ 0, %.lr.ph260 ], [ %.1211.1, %226 ]
  br i1 %lcmp.mod310.not, label %._crit_edge261, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge261.loopexit.unr-lcssa
  %228 = getelementptr inbounds i64, ptr %22, i64 %.3197259.unr
  %229 = load i64, ptr %228, align 8, !tbaa !25
  %230 = icmp sgt i64 %229, 0
  br i1 %230, label %231, label %._crit_edge261

231:                                              ; preds = %.epil.preheader
  %232 = getelementptr i64, ptr %207, i64 %.3197259.unr
  %233 = load i64, ptr %232, align 8, !tbaa !25
  %234 = icmp eq i64 %233, 0
  %235 = zext i1 %234 to i64
  %spec.select.epil = add nsw i64 %.0210258.unr, %235
  br label %._crit_edge261

._crit_edge261:                                   ; preds = %._crit_edge261.loopexit.unr-lcssa, %231, %.epil.preheader, %.preheader
  %.0210.lcssa = phi i64 [ 0, %.preheader ], [ %.1211.lcssa.ph, %._crit_edge261.loopexit.unr-lcssa ], [ %.0210258.unr, %.epil.preheader ], [ %spec.select.epil, %231 ]
  %236 = icmp eq i64 %.0206263, -1
  br i1 %236, label %237, label %243

237:                                              ; preds = %._crit_edge261
  %238 = getelementptr inbounds i64, ptr %21, i64 %180
  %239 = load i64, ptr %238, align 8, !tbaa !25
  %240 = add nsw i64 %239, %.0210.lcssa
  %241 = load i64, ptr %92, align 8, !tbaa !25
  %242 = icmp slt i64 %240, %241
  %spec.select218 = select i1 %242, i64 %180, i64 -1
  br label %243

243:                                              ; preds = %237, %._crit_edge261
  %.1207 = phi i64 [ %.0206263, %._crit_edge261 ], [ %spec.select218, %237 ]
  %244 = icmp eq i64 %.0210.lcssa, 0
  br i1 %244, label %._crit_edge267, label %245

245:                                              ; preds = %.lr.ph266, %243, %._crit_edge254, %184
  %.2208 = phi i64 [ %.0206263, %184 ], [ %.1207, %243 ], [ %.0206263, %._crit_edge254 ], [ %.0206263, %.lr.ph266 ]
  %246 = add nuw nsw i64 %.4264, 1
  %exitcond287.not = icmp eq i64 %246, %.1201.lcssa
  br i1 %exitcond287.not, label %._crit_edge267, label %.lr.ph266, !llvm.loop !43

._crit_edge267:                                   ; preds = %245, %243, %._crit_edge250.thread, %._crit_edge250
  %.3209 = phi i64 [ -1, %._crit_edge250 ], [ -1, %._crit_edge250.thread ], [ %.1207, %243 ], [ %.2208, %245 ]
  %.0204 = phi i64 [ -1, %._crit_edge250 ], [ -1, %._crit_edge250.thread ], [ %180, %243 ], [ -1, %245 ]
  %247 = icmp eq i64 %.0204, -1
  %248 = icmp ne i64 %.3209, -1
  %or.cond = select i1 %247, i1 %248, i1 false
  %spec.select219 = select i1 %or.cond, i64 %.3209, i64 %.0204
  %249 = icmp eq i64 %spec.select219, -1
  br i1 %249, label %93, label %250

250:                                              ; preds = %._crit_edge267
  %251 = getelementptr inbounds i64, ptr %19, i64 %spec.select219
  %252 = load i64, ptr %251, align 8, !tbaa !25
  %253 = add nsw i64 %252, %.0214.lcssa
  store i64 %253, ptr %251, align 8, !tbaa !25
  %254 = getelementptr inbounds i64, ptr %19, i64 %104
  %255 = load i64, ptr %254, align 8, !tbaa !25
  %256 = sub nsw i64 %255, %.0214.lcssa
  store i64 %256, ptr %254, align 8, !tbaa !25
  tail call void @libmetis__MoveGroupMConn(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %21, ptr noundef %25, i64 noundef %2, i64 noundef %spec.select219, i64 noundef %.0198.lcssa291, ptr noundef %23)
  br label %52

.critedge:                                        ; preds = %52, %._crit_edge, %93, %95, %._crit_edge.thread
  tail call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %2) #3
  tail call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %2) #3
  tail call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %2) #3
  tail call void @libmetis__idxwspacefree(ptr noundef %0, i64 noundef %7) #3
  call void (ptr, ...) @gk_free(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef null) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  ret void
}

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

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

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

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


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