; LLVM IR from GGiecold-zz/Cluster_Ensembles :: src/Cluster_Ensembles/Hypergraph_Partitioning/metis-5.1.0/libmetis (coarsen)

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

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

declare double @gk_CPUSeconds() #1

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

36:                                               ; preds = %2
  %37 = call double @gk_CPUSeconds()
  %38 = load ptr, ptr %3, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.ctrl_t, ptr %38, i32 0, i32 29
  %40 = load double, ptr %39, align 8, !tbaa !16
  %41 = fsub double %40, %37
  store double %41, ptr %39, align 8, !tbaa !16
  br label %42

42:                                               ; preds = %36, %2
  %43 = load ptr, ptr %4, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.graph_t, ptr %43, i32 0, i32 0
  %45 = load i32, ptr %44, align 8, !tbaa !17
  store i32 %45, ptr %12, align 4, !tbaa !19
  %46 = load ptr, ptr %4, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.graph_t, ptr %46, i32 0, i32 2
  %48 = load i32, ptr %47, align 8, !tbaa !20
  store i32 %48, ptr %13, align 4, !tbaa !19
  %49 = load ptr, ptr %4, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.graph_t, ptr %49, i32 0, i32 3
  %51 = load ptr, ptr %50, align 8, !tbaa !21
  store ptr %51, ptr %19, align 8, !tbaa !5
  %52 = load ptr, ptr %4, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.graph_t, ptr %52, i32 0, i32 4
  %54 = load ptr, ptr %53, align 8, !tbaa !22
  store ptr %54, ptr %20, align 8, !tbaa !5
  %55 = load ptr, ptr %4, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.graph_t, ptr %55, i32 0, i32 6
  %57 = load ptr, ptr %56, align 8, !tbaa !23
  store ptr %57, ptr %21, align 8, !tbaa !5
  %58 = load ptr, ptr %4, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.graph_t, ptr %58, i32 0, i32 7
  %60 = load ptr, ptr %59, align 8, !tbaa !24
  store ptr %60, ptr %22, align 8, !tbaa !5
  %61 = load ptr, ptr %4, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.graph_t, ptr %61, i32 0, i32 16
  %63 = load ptr, ptr %62, align 8, !tbaa !25
  store ptr %63, ptr %25, align 8, !tbaa !5
  %64 = load ptr, ptr %3, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.ctrl_t, ptr %64, i32 0, i32 19
  %66 = load ptr, ptr %65, align 8, !tbaa !26
  store ptr %66, ptr %23, align 8, !tbaa !5
  %67 = load i32, ptr %12, align 4, !tbaa !19
  %68 = sext i32 %67 to i64
  %69 = load ptr, ptr %3, align 8, !tbaa !5
  %70 = load i32, ptr %12, align 4, !tbaa !19
  %71 = call ptr @libmetis__iwspacemalloc(ptr noundef %69, i32 noundef %70)
  %72 = call ptr @libmetis__iset(i64 noundef %68, i32 noundef -1, ptr noundef %71)
  store ptr %72, ptr %24, align 8, !tbaa !5
  %73 = load ptr, ptr %3, align 8, !tbaa !5
  %74 = load i32, ptr %12, align 4, !tbaa !19
  %75 = call ptr @libmetis__iwspacemalloc(ptr noundef %73, i32 noundef %74)
  store ptr %75, ptr %27, align 8, !tbaa !5
  %76 = load ptr, ptr %3, align 8, !tbaa !5
  %77 = load i32, ptr %12, align 4, !tbaa !19
  %78 = call ptr @libmetis__iwspacemalloc(ptr noundef %76, i32 noundef %77)
  store ptr %78, ptr %28, align 8, !tbaa !5
  %79 = load ptr, ptr %3, align 8, !tbaa !5
  %80 = load i32, ptr %12, align 4, !tbaa !19
  %81 = call ptr @libmetis__iwspacemalloc(ptr noundef %79, i32 noundef %80)
  store ptr %81, ptr %26, align 8, !tbaa !5
  %82 = load i32, ptr %12, align 4, !tbaa !19
  %83 = load ptr, ptr %28, align 8, !tbaa !5
  %84 = load i32, ptr %12, align 4, !tbaa !19
  %85 = sdiv i32 %84, 8
  call void @libmetis__irandArrayPermute(i32 noundef %82, ptr noundef %83, i32 noundef %85, i32 noundef 1)
  %86 = load ptr, ptr %19, align 8, !tbaa !5
  %87 = load i32, ptr %12, align 4, !tbaa !19
  %88 = sext i32 %87 to i64
  %89 = getelementptr inbounds i32, ptr %86, i64 %88
  %90 = load i32, ptr %89, align 4, !tbaa !19
  %91 = load i32, ptr %12, align 4, !tbaa !19
  %92 = sdiv i32 %90, %91
  %93 = sitofp i32 %92 to double
  %94 = fmul double 0x3FE6666666666666, %93
  %95 = fptosi double %94 to i32
  store i32 %95, ptr %18, align 4, !tbaa !19
  store i32 0, ptr %5, align 4, !tbaa !19
  br label %96

96:                                               ; preds = %136, %42
  %97 = load i32, ptr %5, align 4, !tbaa !19
  %98 = load i32, ptr %12, align 4, !tbaa !19
  %99 = icmp slt i32 %97, %98
  br i1 %99, label %100, label %139

100:                                              ; preds = %96
  %101 = load ptr, ptr %19, align 8, !tbaa !5
  %102 = load i32, ptr %5, align 4, !tbaa !19
  %103 = add nsw i32 %102, 1
  %104 = sext i32 %103 to i64
  %105 = getelementptr inbounds i32, ptr %101, i64 %104
  %106 = load i32, ptr %105, align 4, !tbaa !19
  %107 = load ptr, ptr %19, align 8, !tbaa !5
  %108 = load i32, ptr %5, align 4, !tbaa !19
  %109 = sext i32 %108 to i64
  %110 = getelementptr inbounds i32, ptr %107, i64 %109
  %111 = load i32, ptr %110, align 4, !tbaa !19
  %112 = sub nsw i32 %106, %111
  %113 = load i32, ptr %18, align 4, !tbaa !19
  %114 = icmp sgt i32 %112, %113
  br i1 %114, label %115, label %117

115:                                              ; preds = %100
  %116 = load i32, ptr %18, align 4, !tbaa !19
  br label %130

117:                                              ; preds = %100
  %118 = load ptr, ptr %19, align 8, !tbaa !5
  %119 = load i32, ptr %5, align 4, !tbaa !19
  %120 = add nsw i32 %119, 1
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds i32, ptr %118, i64 %121
  %123 = load i32, ptr %122, align 4, !tbaa !19
  %124 = load ptr, ptr %19, align 8, !tbaa !5
  %125 = load i32, ptr %5, align 4, !tbaa !19
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds i32, ptr %124, i64 %126
  %128 = load i32, ptr %127, align 4, !tbaa !19
  %129 = sub nsw i32 %123, %128
  br label %130

130:                                              ; preds = %117, %115
  %131 = phi i32 [ %116, %115 ], [ %129, %117 ]
  %132 = load ptr, ptr %26, align 8, !tbaa !5
  %133 = load i32, ptr %5, align 4, !tbaa !19
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds i32, ptr %132, i64 %134
  store i32 %131, ptr %135, align 4, !tbaa !19
  br label %136

136:                                              ; preds = %130
  %137 = load i32, ptr %5, align 4, !tbaa !19
  %138 = add nsw i32 %137, 1
  store i32 %138, ptr %5, align 4, !tbaa !19
  br label %96, !llvm.loop !27

139:                                              ; preds = %96
  %140 = load ptr, ptr %3, align 8, !tbaa !5
  %141 = load i32, ptr %12, align 4, !tbaa !19
  %142 = load i32, ptr %18, align 4, !tbaa !19
  %143 = load ptr, ptr %26, align 8, !tbaa !5
  %144 = load ptr, ptr %28, align 8, !tbaa !5
  %145 = load ptr, ptr %27, align 8, !tbaa !5
  call void @libmetis__BucketSortKeysInc(ptr noundef %140, i32 noundef %141, i32 noundef %142, ptr noundef %143, ptr noundef %144, ptr noundef %145)
  store i32 0, ptr %14, align 4, !tbaa !19
  store i32 0, ptr %17, align 4, !tbaa !19
  store i32 0, ptr %6, align 4, !tbaa !19
  br label %146

146:                                              ; preds = %467, %139
  %147 = load i32, ptr %6, align 4, !tbaa !19
  %148 = load i32, ptr %12, align 4, !tbaa !19
  %149 = icmp slt i32 %147, %148
  br i1 %149, label %150, label %470

150:                                              ; preds = %146
  %151 = load ptr, ptr %27, align 8, !tbaa !5
  %152 = load i32, ptr %6, align 4, !tbaa !19
  %153 = sext i32 %152 to i64
  %154 = getelementptr inbounds i32, ptr %151, i64 %153
  %155 = load i32, ptr %154, align 4, !tbaa !19
  store i32 %155, ptr %5, align 4, !tbaa !19
  %156 = load ptr, ptr %24, align 8, !tbaa !5
  %157 = load i32, ptr %5, align 4, !tbaa !19
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds i32, ptr %156, i64 %158
  %160 = load i32, ptr %159, align 4, !tbaa !19
  %161 = icmp eq i32 %160, -1
  br i1 %161, label %162, label %466

162:                                              ; preds = %150
  %163 = load i32, ptr %5, align 4, !tbaa !19
  store i32 %163, ptr %15, align 4, !tbaa !19
  store i32 -1, ptr %16, align 4, !tbaa !19
  %164 = load i32, ptr %13, align 4, !tbaa !19
  %165 = icmp eq i32 %164, 1
  br i1 %165, label %166, label %176

166:                                              ; preds = %162
  %167 = load ptr, ptr %20, align 8, !tbaa !5
  %168 = load i32, ptr %5, align 4, !tbaa !19
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds i32, ptr %167, i64 %169
  %171 = load i32, ptr %170, align 4, !tbaa !19
  %172 = load ptr, ptr %23, align 8, !tbaa !5
  %173 = getelementptr inbounds i32, ptr %172, i64 0
  %174 = load i32, ptr %173, align 4, !tbaa !19
  %175 = icmp slt i32 %171, %174
  br i1 %175, label %187, label %441

176:                                              ; preds = %162
  %177 = load i32, ptr %13, align 4, !tbaa !19
  %178 = load ptr, ptr %20, align 8, !tbaa !5
  %179 = load i32, ptr %5, align 4, !tbaa !19
  %180 = load i32, ptr %13, align 4, !tbaa !19
  %181 = mul nsw i32 %179, %180
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds i32, ptr %178, i64 %182
  %184 = load ptr, ptr %23, align 8, !tbaa !5
  %185 = call i32 @libmetis__ivecle(i32 noundef %177, ptr noundef %183, ptr noundef %184)
  %186 = icmp ne i32 %185, 0
  br i1 %186, label %187, label %441

187:                                              ; preds = %176, %166
  %188 = load ptr, ptr %19, align 8, !tbaa !5
  %189 = load i32, ptr %5, align 4, !tbaa !19
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds i32, ptr %188, i64 %190
  %192 = load i32, ptr %191, align 4, !tbaa !19
  %193 = load ptr, ptr %19, align 8, !tbaa !5
  %194 = load i32, ptr %5, align 4, !tbaa !19
  %195 = add nsw i32 %194, 1
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds i32, ptr %193, i64 %196
  %198 = load i32, ptr %197, align 4, !tbaa !19
  %199 = icmp eq i32 %192, %198
  br i1 %199, label %200, label %234

200:                                              ; preds = %187
  %201 = load i32, ptr %6, align 4, !tbaa !19
  %202 = load i32, ptr %17, align 4, !tbaa !19
  %203 = icmp sge i32 %201, %202
  br i1 %203, label %204, label %206

204:                                              ; preds = %200
  %205 = load i32, ptr %6, align 4, !tbaa !19
  br label %208

206:                                              ; preds = %200
  %207 = load i32, ptr %17, align 4, !tbaa !19
  br label %208

208:                                              ; preds = %206, %204
  %209 = phi i32 [ %205, %204 ], [ %207, %206 ]
  %210 = add nsw i32 %209, 1
  store i32 %210, ptr %17, align 4, !tbaa !19
  br label %211

211:                                              ; preds = %230, %208
  %212 = load i32, ptr %17, align 4, !tbaa !19
  %213 = load i32, ptr %12, align 4, !tbaa !19
  %214 = icmp slt i32 %212, %213
  br i1 %214, label %215, label %233

215:                                              ; preds = %211
  %216 = load ptr, ptr %27, align 8, !tbaa !5
  %217 = load i32, ptr %17, align 4, !tbaa !19
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds i32, ptr %216, i64 %218
  %220 = load i32, ptr %219, align 4, !tbaa !19
  store i32 %220, ptr %8, align 4, !tbaa !19
  %221 = load ptr, ptr %24, align 8, !tbaa !5
  %222 = load i32, ptr %8, align 4, !tbaa !19
  %223 = sext i32 %222 to i64
  %224 = getelementptr inbounds i32, ptr %221, i64 %223
  %225 = load i32, ptr %224, align 4, !tbaa !19
  %226 = icmp eq i32 %225, -1
  br i1 %226, label %227, label %229

227:                                              ; preds = %215
  %228 = load i32, ptr %8, align 4, !tbaa !19
  store i32 %228, ptr %15, align 4, !tbaa !19
  br label %233

229:                                              ; preds = %215
  br label %230

230:                                              ; preds = %229
  %231 = load i32, ptr %17, align 4, !tbaa !19
  %232 = add nsw i32 %231, 1
  store i32 %232, ptr %17, align 4, !tbaa !19
  br label %211, !llvm.loop !29

233:                                              ; preds = %227, %211
  br label %440

234:                                              ; preds = %187
  %235 = load i32, ptr %13, align 4, !tbaa !19
  %236 = icmp eq i32 %235, 1
  br i1 %236, label %237, label %318

237:                                              ; preds = %234
  %238 = load ptr, ptr %19, align 8, !tbaa !5
  %239 = load i32, ptr %5, align 4, !tbaa !19
  %240 = sext i32 %239 to i64
  %241 = getelementptr inbounds i32, ptr %238, i64 %240
  %242 = load i32, ptr %241, align 4, !tbaa !19
  store i32 %242, ptr %8, align 4, !tbaa !19
  br label %243

243:                                              ; preds = %296, %237
  %244 = load i32, ptr %8, align 4, !tbaa !19
  %245 = load ptr, ptr %19, align 8, !tbaa !5
  %246 = load i32, ptr %5, align 4, !tbaa !19
  %247 = add nsw i32 %246, 1
  %248 = sext i32 %247 to i64
  %249 = getelementptr inbounds i32, ptr %245, i64 %248
  %250 = load i32, ptr %249, align 4, !tbaa !19
  %251 = icmp slt i32 %244, %250
  br i1 %251, label %252, label %299

252:                                              ; preds = %243
  %253 = load ptr, ptr %21, align 8, !tbaa !5
  %254 = load i32, ptr %8, align 4, !tbaa !19
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds i32, ptr %253, i64 %255
  %257 = load i32, ptr %256, align 4, !tbaa !19
  store i32 %257, ptr %11, align 4, !tbaa !19
  %258 = load ptr, ptr %24, align 8, !tbaa !5
  %259 = load i32, ptr %11, align 4, !tbaa !19
  %260 = sext i32 %259 to i64
  %261 = getelementptr inbounds i32, ptr %258, i64 %260
  %262 = load i32, ptr %261, align 4, !tbaa !19
  %263 = icmp eq i32 %262, -1
  br i1 %263, label %264, label %295

264:                                              ; preds = %252
  %265 = load i32, ptr %16, align 4, !tbaa !19
  %266 = load ptr, ptr %22, align 8, !tbaa !5
  %267 = load i32, ptr %8, align 4, !tbaa !19
  %268 = sext i32 %267 to i64
  %269 = getelementptr inbounds i32, ptr %266, i64 %268
  %270 = load i32, ptr %269, align 4, !tbaa !19
  %271 = icmp slt i32 %265, %270
  br i1 %271, label %272, label %295

272:                                              ; preds = %264
  %273 = load ptr, ptr %20, align 8, !tbaa !5
  %274 = load i32, ptr %5, align 4, !tbaa !19
  %275 = sext i32 %274 to i64
  %276 = getelementptr inbounds i32, ptr %273, i64 %275
  %277 = load i32, ptr %276, align 4, !tbaa !19
  %278 = load ptr, ptr %20, align 8, !tbaa !5
  %279 = load i32, ptr %11, align 4, !tbaa !19
  %280 = sext i32 %279 to i64
  %281 = getelementptr inbounds i32, ptr %278, i64 %280
  %282 = load i32, ptr %281, align 4, !tbaa !19
  %283 = add nsw i32 %277, %282
  %284 = load ptr, ptr %23, align 8, !tbaa !5
  %285 = getelementptr inbounds i32, ptr %284, i64 0
  %286 = load i32, ptr %285, align 4, !tbaa !19
  %287 = icmp sle i32 %283, %286
  br i1 %287, label %288, label %295

288:                                              ; preds = %272
  %289 = load i32, ptr %11, align 4, !tbaa !19
  store i32 %289, ptr %15, align 4, !tbaa !19
  %290 = load ptr, ptr %22, align 8, !tbaa !5
  %291 = load i32, ptr %8, align 4, !tbaa !19
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds i32, ptr %290, i64 %292
  %294 = load i32, ptr %293, align 4, !tbaa !19
  store i32 %294, ptr %16, align 4, !tbaa !19
  br label %295

295:                                              ; preds = %288, %272, %264, %252
  br label %296

296:                                              ; preds = %295
  %297 = load i32, ptr %8, align 4, !tbaa !19
  %298 = add nsw i32 %297, 1
  store i32 %298, ptr %8, align 4, !tbaa !19
  br label %243, !llvm.loop !30

299:                                              ; preds = %243
  %300 = load i32, ptr %15, align 4, !tbaa !19
  %301 = load i32, ptr %5, align 4, !tbaa !19
  %302 = icmp eq i32 %300, %301
  br i1 %302, label %303, label %317

303:                                              ; preds = %299
  %304 = load ptr, ptr %20, align 8, !tbaa !5
  %305 = load i32, ptr %5, align 4, !tbaa !19
  %306 = sext i32 %305 to i64
  %307 = getelementptr inbounds i32, ptr %304, i64 %306
  %308 = load i32, ptr %307, align 4, !tbaa !19
  %309 = mul nsw i32 3, %308
  %310 = load ptr, ptr %23, align 8, !tbaa !5
  %311 = getelementptr inbounds i32, ptr %310, i64 0
  %312 = load i32, ptr %311, align 4, !tbaa !19
  %313 = icmp slt i32 %309, %312
  br i1 %313, label %314, label %317

314:                                              ; preds = %303
  %315 = load i64, ptr %29, align 8, !tbaa !9
  %316 = add i64 %315, 1
  store i64 %316, ptr %29, align 8, !tbaa !9
  store i32 -1, ptr %15, align 4, !tbaa !19
  br label %317

317:                                              ; preds = %314, %303, %299
  br label %439

318:                                              ; preds = %234
  %319 = load ptr, ptr %19, align 8, !tbaa !5
  %320 = load i32, ptr %5, align 4, !tbaa !19
  %321 = sext i32 %320 to i64
  %322 = getelementptr inbounds i32, ptr %319, i64 %321
  %323 = load i32, ptr %322, align 4, !tbaa !19
  store i32 %323, ptr %8, align 4, !tbaa !19
  br label %324

324:                                              ; preds = %411, %318
  %325 = load i32, ptr %8, align 4, !tbaa !19
  %326 = load ptr, ptr %19, align 8, !tbaa !5
  %327 = load i32, ptr %5, align 4, !tbaa !19
  %328 = add nsw i32 %327, 1
  %329 = sext i32 %328 to i64
  %330 = getelementptr inbounds i32, ptr %326, i64 %329
  %331 = load i32, ptr %330, align 4, !tbaa !19
  %332 = icmp slt i32 %325, %331
  br i1 %332, label %333, label %414

333:                                              ; preds = %324
  %334 = load ptr, ptr %21, align 8, !tbaa !5
  %335 = load i32, ptr %8, align 4, !tbaa !19
  %336 = sext i32 %335 to i64
  %337 = getelementptr inbounds i32, ptr %334, i64 %336
  %338 = load i32, ptr %337, align 4, !tbaa !19
  store i32 %338, ptr %11, align 4, !tbaa !19
  %339 = load ptr, ptr %24, align 8, !tbaa !5
  %340 = load i32, ptr %11, align 4, !tbaa !19
  %341 = sext i32 %340 to i64
  %342 = getelementptr inbounds i32, ptr %339, i64 %341
  %343 = load i32, ptr %342, align 4, !tbaa !19
  %344 = icmp eq i32 %343, -1
  br i1 %344, label %345, label %410

345:                                              ; preds = %333
  %346 = load i32, ptr %13, align 4, !tbaa !19
  %347 = load ptr, ptr %20, align 8, !tbaa !5
  %348 = load i32, ptr %5, align 4, !tbaa !19
  %349 = load i32, ptr %13, align 4, !tbaa !19
  %350 = mul nsw i32 %348, %349
  %351 = sext i32 %350 to i64
  %352 = getelementptr inbounds i32, ptr %347, i64 %351
  %353 = load ptr, ptr %20, align 8, !tbaa !5
  %354 = load i32, ptr %11, align 4, !tbaa !19
  %355 = load i32, ptr %13, align 4, !tbaa !19
  %356 = mul nsw i32 %354, %355
  %357 = sext i32 %356 to i64
  %358 = getelementptr inbounds i32, ptr %353, i64 %357
  %359 = load ptr, ptr %23, align 8, !tbaa !5
  %360 = call i32 @libmetis__ivecaxpylez(i32 noundef %346, i32 noundef 1, ptr noundef %352, ptr noundef %358, ptr noundef %359)
  %361 = icmp ne i32 %360, 0
  br i1 %361, label %362, label %410

362:                                              ; preds = %345
  %363 = load i32, ptr %16, align 4, !tbaa !19
  %364 = load ptr, ptr %22, align 8, !tbaa !5
  %365 = load i32, ptr %8, align 4, !tbaa !19
  %366 = sext i32 %365 to i64
  %367 = getelementptr inbounds i32, ptr %364, i64 %366
  %368 = load i32, ptr %367, align 4, !tbaa !19
  %369 = icmp slt i32 %363, %368
  br i1 %369, label %403, label %370

370:                                              ; preds = %362
  %371 = load i32, ptr %16, align 4, !tbaa !19
  %372 = load ptr, ptr %22, align 8, !tbaa !5
  %373 = load i32, ptr %8, align 4, !tbaa !19
  %374 = sext i32 %373 to i64
  %375 = getelementptr inbounds i32, ptr %372, i64 %374
  %376 = load i32, ptr %375, align 4, !tbaa !19
  %377 = icmp eq i32 %371, %376
  br i1 %377, label %378, label %410

378:                                              ; preds = %370
  %379 = load i32, ptr %13, align 4, !tbaa !19
  %380 = load ptr, ptr %4, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.graph_t, ptr %380, i32 0, i32 9
  %382 = load ptr, ptr %381, align 8, !tbaa !31
  %383 = load ptr, ptr %20, align 8, !tbaa !5
  %384 = load i32, ptr %5, align 4, !tbaa !19
  %385 = load i32, ptr %13, align 4, !tbaa !19
  %386 = mul nsw i32 %384, %385
  %387 = sext i32 %386 to i64
  %388 = getelementptr inbounds i32, ptr %383, i64 %387
  %389 = load ptr, ptr %20, align 8, !tbaa !5
  %390 = load i32, ptr %15, align 4, !tbaa !19
  %391 = load i32, ptr %13, align 4, !tbaa !19
  %392 = mul nsw i32 %390, %391
  %393 = sext i32 %392 to i64
  %394 = getelementptr inbounds i32, ptr %389, i64 %393
  %395 = load ptr, ptr %20, align 8, !tbaa !5
  %396 = load i32, ptr %11, align 4, !tbaa !19
  %397 = load i32, ptr %13, align 4, !tbaa !19
  %398 = mul nsw i32 %396, %397
  %399 = sext i32 %398 to i64
  %400 = getelementptr inbounds i32, ptr %395, i64 %399
  %401 = call i32 @libmetis__BetterVBalance(i32 noundef %379, ptr noundef %382, ptr noundef %388, ptr noundef %394, ptr noundef %400)
  %402 = icmp ne i32 %401, 0
  br i1 %402, label %403, label %410

403:                                              ; preds = %378, %362
  %404 = load i32, ptr %11, align 4, !tbaa !19
  store i32 %404, ptr %15, align 4, !tbaa !19
  %405 = load ptr, ptr %22, align 8, !tbaa !5
  %406 = load i32, ptr %8, align 4, !tbaa !19
  %407 = sext i32 %406 to i64
  %408 = getelementptr inbounds i32, ptr %405, i64 %407
  %409 = load i32, ptr %408, align 4, !tbaa !19
  store i32 %409, ptr %16, align 4, !tbaa !19
  br label %410

410:                                              ; preds = %403, %378, %370, %345, %333
  br label %411

411:                                              ; preds = %410
  %412 = load i32, ptr %8, align 4, !tbaa !19
  %413 = add nsw i32 %412, 1
  store i32 %413, ptr %8, align 4, !tbaa !19
  br label %324, !llvm.loop !32

414:                                              ; preds = %324
  %415 = load i32, ptr %15, align 4, !tbaa !19
  %416 = load i32, ptr %5, align 4, !tbaa !19
  %417 = icmp eq i32 %415, %416
  br i1 %417, label %418, label %438

418:                                              ; preds = %414
  %419 = load i32, ptr %13, align 4, !tbaa !19
  %420 = load ptr, ptr %20, align 8, !tbaa !5
  %421 = load i32, ptr %5, align 4, !tbaa !19
  %422 = load i32, ptr %13, align 4, !tbaa !19
  %423 = mul nsw i32 %421, %422
  %424 = sext i32 %423 to i64
  %425 = getelementptr inbounds i32, ptr %420, i64 %424
  %426 = load ptr, ptr %20, align 8, !tbaa !5
  %427 = load i32, ptr %5, align 4, !tbaa !19
  %428 = load i32, ptr %13, align 4, !tbaa !19
  %429 = mul nsw i32 %427, %428
  %430 = sext i32 %429 to i64
  %431 = getelementptr inbounds i32, ptr %426, i64 %430
  %432 = load ptr, ptr %23, align 8, !tbaa !5
  %433 = call i32 @libmetis__ivecaxpylez(i32 noundef %419, i32 noundef 2, ptr noundef %425, ptr noundef %431, ptr noundef %432)
  %434 = icmp ne i32 %433, 0
  br i1 %434, label %435, label %438

435:                                              ; preds = %418
  %436 = load i64, ptr %29, align 8, !tbaa !9
  %437 = add i64 %436, 1
  store i64 %437, ptr %29, align 8, !tbaa !9
  store i32 -1, ptr %15, align 4, !tbaa !19
  br label %438

438:                                              ; preds = %435, %418, %414
  br label %439

439:                                              ; preds = %438, %317
  br label %440

440:                                              ; preds = %439, %233
  br label %441

441:                                              ; preds = %440, %176, %166
  %442 = load i32, ptr %15, align 4, !tbaa !19
  %443 = icmp ne i32 %442, -1
  br i1 %443, label %444, label %465

444:                                              ; preds = %441
  %445 = load i32, ptr %14, align 4, !tbaa !19
  %446 = add nsw i32 %445, 1
  store i32 %446, ptr %14, align 4, !tbaa !19
  %447 = load ptr, ptr %25, align 8, !tbaa !5
  %448 = load i32, ptr %15, align 4, !tbaa !19
  %449 = sext i32 %448 to i64
  %450 = getelementptr inbounds i32, ptr %447, i64 %449
  store i32 %445, ptr %450, align 4, !tbaa !19
  %451 = load ptr, ptr %25, align 8, !tbaa !5
  %452 = load i32, ptr %5, align 4, !tbaa !19
  %453 = sext i32 %452 to i64
  %454 = getelementptr inbounds i32, ptr %451, i64 %453
  store i32 %445, ptr %454, align 4, !tbaa !19
  %455 = load i32, ptr %15, align 4, !tbaa !19
  %456 = load ptr, ptr %24, align 8, !tbaa !5
  %457 = load i32, ptr %5, align 4, !tbaa !19
  %458 = sext i32 %457 to i64
  %459 = getelementptr inbounds i32, ptr %456, i64 %458
  store i32 %455, ptr %459, align 4, !tbaa !19
  %460 = load i32, ptr %5, align 4, !tbaa !19
  %461 = load ptr, ptr %24, align 8, !tbaa !5
  %462 = load i32, ptr %15, align 4, !tbaa !19
  %463 = sext i32 %462 to i64
  %464 = getelementptr inbounds i32, ptr %461, i64 %463
  store i32 %460, ptr %464, align 4, !tbaa !19
  br label %465

465:                                              ; preds = %444, %441
  br label %466

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

467:                                              ; preds = %466
  %468 = load i32, ptr %6, align 4, !tbaa !19
  %469 = add nsw i32 %468, 1
  store i32 %469, ptr %6, align 4, !tbaa !19
  br label %146, !llvm.loop !33

470:                                              ; preds = %146
  %471 = load ptr, ptr %3, align 8, !tbaa !5
  %472 = getelementptr inbounds %struct.ctrl_t, ptr %471, i32 0, i32 8
  %473 = load i32, ptr %472, align 8, !tbaa !34
  %474 = icmp ne i32 %473, 0
  br i1 %474, label %490, label %475

475:                                              ; preds = %470
  %476 = load i64, ptr %29, align 8, !tbaa !9
  %477 = uitofp i64 %476 to double
  %478 = load i32, ptr %12, align 4, !tbaa !19
  %479 = sitofp i32 %478 to double
  %480 = fmul double 1.000000e-01, %479
  %481 = fcmp ogt double %477, %480
  br i1 %481, label %482, label %490

482:                                              ; preds = %475
  %483 = load ptr, ptr %3, align 8, !tbaa !5
  %484 = load ptr, ptr %4, align 8, !tbaa !5
  %485 = load ptr, ptr %27, align 8, !tbaa !5
  %486 = load ptr, ptr %24, align 8, !tbaa !5
  %487 = load i32, ptr %14, align 4, !tbaa !19
  %488 = load i64, ptr %29, align 8, !tbaa !9
  %489 = call i32 @libmetis__Match_2Hop(ptr noundef %483, ptr noundef %484, ptr noundef %485, ptr noundef %486, i32 noundef %487, i64 noundef %488)
  store i32 %489, ptr %14, align 4, !tbaa !19
  br label %490

490:                                              ; preds = %482, %475, %470
  store i32 0, ptr %14, align 4, !tbaa !19
  store i32 0, ptr %5, align 4, !tbaa !19
  br label %491

491:                                              ; preds = %539, %490
  %492 = load i32, ptr %5, align 4, !tbaa !19
  %493 = load i32, ptr %12, align 4, !tbaa !19
  %494 = icmp slt i32 %492, %493
  br i1 %494, label %495, label %542

495:                                              ; preds = %491
  %496 = load ptr, ptr %24, align 8, !tbaa !5
  %497 = load i32, ptr %5, align 4, !tbaa !19
  %498 = sext i32 %497 to i64
  %499 = getelementptr inbounds i32, ptr %496, i64 %498
  %500 = load i32, ptr %499, align 4, !tbaa !19
  %501 = icmp eq i32 %500, -1
  br i1 %501, label %502, label %514

502:                                              ; preds = %495
  %503 = load i32, ptr %5, align 4, !tbaa !19
  %504 = load ptr, ptr %24, align 8, !tbaa !5
  %505 = load i32, ptr %5, align 4, !tbaa !19
  %506 = sext i32 %505 to i64
  %507 = getelementptr inbounds i32, ptr %504, i64 %506
  store i32 %503, ptr %507, align 4, !tbaa !19
  %508 = load i32, ptr %14, align 4, !tbaa !19
  %509 = add nsw i32 %508, 1
  store i32 %509, ptr %14, align 4, !tbaa !19
  %510 = load ptr, ptr %25, align 8, !tbaa !5
  %511 = load i32, ptr %5, align 4, !tbaa !19
  %512 = sext i32 %511 to i64
  %513 = getelementptr inbounds i32, ptr %510, i64 %512
  store i32 %508, ptr %513, align 4, !tbaa !19
  br label %538

514:                                              ; preds = %495
  %515 = load i32, ptr %5, align 4, !tbaa !19
  %516 = load ptr, ptr %24, align 8, !tbaa !5
  %517 = load i32, ptr %5, align 4, !tbaa !19
  %518 = sext i32 %517 to i64
  %519 = getelementptr inbounds i32, ptr %516, i64 %518
  %520 = load i32, ptr %519, align 4, !tbaa !19
  %521 = icmp sle i32 %515, %520
  br i1 %521, label %522, label %537

522:                                              ; preds = %514
  %523 = load i32, ptr %14, align 4, !tbaa !19
  %524 = add nsw i32 %523, 1
  store i32 %524, ptr %14, align 4, !tbaa !19
  %525 = load ptr, ptr %25, align 8, !tbaa !5
  %526 = load ptr, ptr %24, align 8, !tbaa !5
  %527 = load i32, ptr %5, align 4, !tbaa !19
  %528 = sext i32 %527 to i64
  %529 = getelementptr inbounds i32, ptr %526, i64 %528
  %530 = load i32, ptr %529, align 4, !tbaa !19
  %531 = sext i32 %530 to i64
  %532 = getelementptr inbounds i32, ptr %525, i64 %531
  store i32 %523, ptr %532, align 4, !tbaa !19
  %533 = load ptr, ptr %25, align 8, !tbaa !5
  %534 = load i32, ptr %5, align 4, !tbaa !19
  %535 = sext i32 %534 to i64
  %536 = getelementptr inbounds i32, ptr %533, i64 %535
  store i32 %523, ptr %536, align 4, !tbaa !19
  br label %537

537:                                              ; preds = %522, %514
  br label %538

538:                                              ; preds = %537, %502
  br label %539

539:                                              ; preds = %538
  %540 = load i32, ptr %5, align 4, !tbaa !19
  %541 = add nsw i32 %540, 1
  store i32 %541, ptr %5, align 4, !tbaa !19
  br label %491, !llvm.loop !35

542:                                              ; preds = %491
  %543 = load ptr, ptr %3, align 8, !tbaa !5
  %544 = getelementptr inbounds %struct.ctrl_t, ptr %543, i32 0, i32 2
  %545 = load i32, ptr %544, align 8, !tbaa !11
  %546 = and i32 %545, 2
  %547 = icmp ne i32 %546, 0
  br i1 %547, label %548, label %554

548:                                              ; preds = %542
  %549 = call double @gk_CPUSeconds()
  %550 = load ptr, ptr %3, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.ctrl_t, ptr %550, i32 0, i32 29
  %552 = load double, ptr %551, align 8, !tbaa !16
  %553 = fadd double %552, %549
  store double %553, ptr %551, align 8, !tbaa !16
  br label %554

554:                                              ; preds = %548, %542
  %555 = load ptr, ptr %3, align 8, !tbaa !5
  %556 = load ptr, ptr %4, align 8, !tbaa !5
  %557 = load i32, ptr %14, align 4, !tbaa !19
  %558 = load ptr, ptr %24, align 8, !tbaa !5
  call void @libmetis__CreateCoarseGraph(ptr noundef %555, ptr noundef %556, i32 noundef %557, ptr noundef %558)
  %559 = load ptr, ptr %3, align 8, !tbaa !5
  call void @libmetis__wspacepop(ptr noundef %559)
  %560 = load i32, ptr %14, align 4, !tbaa !19
  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 4, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #3
  ret i32 %560
}

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

declare void @libmetis__wspacepush(ptr noundef) #1

declare ptr @libmetis__iset(i64 noundef, i32 noundef, ptr noundef) #1

declare ptr @libmetis__iwspacemalloc(ptr noundef, i32 noundef) #1

declare void @libmetis__irandArrayPermute(i32 noundef, ptr noundef, i32 noundef, i32 noundef) #1

declare i32 @libmetis__ivecle(i32 noundef, ptr noundef, ptr noundef) #1

declare i32 @libmetis__ivecaxpylez(i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) #1

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

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

declare void @libmetis__wspacepop(ptr noundef) #1

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

declare i32 @libmetis__BetterVBalance(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr 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, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !13, i64 8}
!12 = !{!"ctrl_t", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !13, i64 44, !13, i64 48, !13, i64 52, !13, i64 56, !13, i64 60, !13, i64 64, !13, i64 68, !13, i64 72, !6, i64 80, !13, i64 88, !13, i64 92, !14, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !14, i64 128, !15, i64 136, !15, i64 144, !15, i64 152, !15, i64 160, !15, i64 168, !15, i64 176, !15, i64 184, !15, i64 192, !15, i64 200, !15, i64 208, !15, i64 216, !15, i64 224, !6, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !6, i64 264, !6, i64 272, !6, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !6, i64 312, !6, i64 320}
!13 = !{!"int", !7, i64 0}
!14 = !{!"float", !7, i64 0}
!15 = !{!"double", !7, i64 0}
!16 = !{!12, !15, i64 152}
!17 = !{!18, !13, i64 0}
!18 = !{!"graph_t", !13, i64 0, !13, i64 4, !13, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !13, i64 72, !13, i64 76, !13, i64 80, !13, i64 84, !13, i64 88, !6, i64 96, !6, i64 104, !13, i64 112, !13, i64 116, !6, i64 120, !6, i64 128, !13, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208}
!19 = !{!13, !13, i64 0}
!20 = !{!18, !13, i64 8}
!21 = !{!18, !6, i64 16}
!22 = !{!18, !6, i64 24}
!23 = !{!18, !6, i64 40}
!24 = !{!18, !6, i64 48}
!25 = !{!18, !6, i64 104}
!26 = !{!12, !6, i64 80}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = distinct !{!29, !28}
!30 = distinct !{!30, !28}
!31 = !{!18, !6, i64 64}
!32 = distinct !{!32, !28}
!33 = distinct !{!33, !28}
!34 = !{!12, !13, i64 32}
!35 = distinct !{!35, !28}


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

declare double @gk_CPUSeconds() local_unnamed_addr #0

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

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

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

._crit_edge.thread:                               ; preds = %11
  tail call void @libmetis__BucketSortKeysInc(ptr noundef nonnull %0, i32 noundef %12, i32 noundef %39, ptr noundef %32, ptr noundef %31, ptr noundef %30) #3
  br label %._crit_edge275

.lr.ph.preheader:                                 ; preds = %11
  %wide.trip.count = zext nneg i32 %12 to i64
  %min.iters.check = icmp ult i32 %12, 8
  br i1 %min.iters.check, label %.lr.ph.preheader315, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph.preheader
  %41 = shl nuw nsw i64 %wide.trip.count, 2
  %scevgep = getelementptr i8, ptr %32, i64 %41
  %42 = getelementptr i8, ptr %16, i64 %41
  %scevgep311 = getelementptr i8, ptr %42, i64 4
  %bound0 = icmp ult ptr %32, %scevgep311
  %bound1 = icmp ult ptr %16, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph.preheader315, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %wide.trip.count, 2147483640
  %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %39, i64 0
  %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %43 = or disjoint i64 %index, 1
  %44 = getelementptr inbounds i32, ptr %16, i64 %43
  %45 = getelementptr inbounds i8, ptr %44, i64 16
  %wide.load = load <4 x i32>, ptr %44, align 4, !tbaa !24, !alias.scope !25
  %wide.load312 = load <4 x i32>, ptr %45, align 4, !tbaa !24, !alias.scope !25
  %46 = getelementptr inbounds i32, ptr %16, i64 %index
  %47 = getelementptr inbounds i8, ptr %46, i64 16
  %wide.load313 = load <4 x i32>, ptr %46, align 4, !tbaa !24, !alias.scope !25
  %wide.load314 = load <4 x i32>, ptr %47, align 4, !tbaa !24, !alias.scope !25
  %48 = sub nsw <4 x i32> %wide.load, %wide.load313
  %49 = sub nsw <4 x i32> %wide.load312, %wide.load314
  %50 = tail call <4 x i32> @llvm.smin.v4i32(<4 x i32> %48, <4 x i32> %broadcast.splat)
  %51 = tail call <4 x i32> @llvm.smin.v4i32(<4 x i32> %49, <4 x i32> %broadcast.splat)
  %52 = getelementptr inbounds i32, ptr %32, i64 %index
  %53 = getelementptr inbounds i8, ptr %52, i64 16
  store <4 x i32> %50, ptr %52, align 4, !tbaa !24, !alias.scope !28, !noalias !25
  store <4 x i32> %51, ptr %53, align 4, !tbaa !24, !alias.scope !28, !noalias !25
  %index.next = add nuw i64 %index, 8
  %54 = icmp eq i64 %index.next, %n.vec
  br i1 %54, label %middle.block, label %vector.body, !llvm.loop !30

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %._crit_edge, label %.lr.ph.preheader315

.lr.ph.preheader315:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph.preheader
  %indvars.iv.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph.preheader ], [ %n.vec, %middle.block ]
  %xtraiter = and i64 %wide.trip.count, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol

.lr.ph.prol:                                      ; preds = %.lr.ph.preheader315
  %indvars.iv.next.prol = or disjoint i64 %indvars.iv.ph, 1
  %55 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv.next.prol
  %56 = load i32, ptr %55, align 4, !tbaa !24
  %57 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv.ph
  %58 = load i32, ptr %57, align 4, !tbaa !24
  %59 = sub nsw i32 %56, %58
  %..prol = tail call i32 @llvm.smin.i32(i32 %59, i32 %39)
  %60 = getelementptr inbounds i32, ptr %32, i64 %indvars.iv.ph
  store i32 %..prol, ptr %60, align 4, !tbaa !24
  br label %.lr.ph.prol.loopexit

.lr.ph.prol.loopexit:                             ; preds = %.lr.ph.prol, %.lr.ph.preheader315
  %indvars.iv.unr = phi i64 [ %indvars.iv.ph, %.lr.ph.preheader315 ], [ %indvars.iv.next.prol, %.lr.ph.prol ]
  %61 = add nsw i64 %wide.trip.count, -1
  %62 = icmp eq i64 %indvars.iv.ph, %61
  br i1 %62, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.prol.loopexit, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next.1, %.lr.ph ], [ %indvars.iv.unr, %.lr.ph.prol.loopexit ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %63 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv.next
  %64 = load i32, ptr %63, align 4, !tbaa !24
  %65 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv
  %66 = load i32, ptr %65, align 4, !tbaa !24
  %67 = sub nsw i32 %64, %66
  %. = tail call i32 @llvm.smin.i32(i32 %67, i32 %39)
  %68 = getelementptr inbounds i32, ptr %32, i64 %indvars.iv
  store i32 %., ptr %68, align 4, !tbaa !24
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %69 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv.next.1
  %70 = load i32, ptr %69, align 4, !tbaa !24
  %71 = getelementptr inbounds i32, ptr %16, i64 %indvars.iv.next
  %72 = load i32, ptr %71, align 4, !tbaa !24
  %73 = sub nsw i32 %70, %72
  %..1 = tail call i32 @llvm.smin.i32(i32 %73, i32 %39)
  %74 = getelementptr inbounds i32, ptr %32, i64 %indvars.iv.next
  store i32 %..1, ptr %74, align 4, !tbaa !24
  %exitcond.not.1 = icmp eq i64 %indvars.iv.next.1, %wide.trip.count
  br i1 %exitcond.not.1, label %._crit_edge, label %.lr.ph, !llvm.loop !34

._crit_edge:                                      ; preds = %.lr.ph.prol.loopexit, %.lr.ph, %middle.block
  tail call void @libmetis__BucketSortKeysInc(ptr noundef %0, i32 noundef %12, i32 noundef %39, ptr noundef nonnull %32, ptr noundef %31, ptr noundef %30) #3
  br i1 %40, label %.lr.ph274, label %._crit_edge275

.lr.ph274:                                        ; preds = %._crit_edge
  %75 = icmp eq i32 %14, 1
  %76 = getelementptr inbounds i8, ptr %1, i64 64
  %wide.trip.count299 = zext nneg i32 %12 to i64
  br label %77

77:                                               ; preds = %.lr.ph274, %.thread
  %indvars.iv296 = phi i64 [ 0, %.lr.ph274 ], [ %indvars.iv.next297, %.thread ]
  %.0272 = phi i64 [ 0, %.lr.ph274 ], [ %.2, %.thread ]
  %.0210269 = phi i32 [ 0, %.lr.ph274 ], [ %.1211, %.thread ]
  %.0221268 = phi i32 [ 0, %.lr.ph274 ], [ %.3224, %.thread ]
  %78 = getelementptr inbounds i32, ptr %30, i64 %indvars.iv296
  %79 = load i32, ptr %78, align 4, !tbaa !24
  %80 = sext i32 %79 to i64
  %81 = getelementptr inbounds i32, ptr %29, i64 %80
  %82 = load i32, ptr %81, align 4, !tbaa !24
  %83 = icmp eq i32 %82, -1
  br i1 %83, label %84, label %.thread

84:                                               ; preds = %77
  br i1 %75, label %85, label %90

85:                                               ; preds = %84
  %86 = getelementptr inbounds i32, ptr %18, i64 %80
  %87 = load i32, ptr %86, align 4, !tbaa !24
  %88 = load i32, ptr %26, align 4, !tbaa !24
  %89 = icmp slt i32 %87, %88
  br i1 %89, label %95, label %select.unfold250

90:                                               ; preds = %84
  %91 = mul nsw i32 %79, %14
  %92 = sext i32 %91 to i64
  %93 = getelementptr inbounds i32, ptr %18, i64 %92
  %94 = tail call i32 @libmetis__ivecle(i32 noundef %14, ptr noundef %93, ptr noundef %26) #3
  %.not238 = icmp eq i32 %94, 0
  br i1 %.not238, label %select.unfold250, label %.thread307

95:                                               ; preds = %85
  %96 = getelementptr inbounds i32, ptr %16, i64 %80
  %97 = load i32, ptr %96, align 4, !tbaa !24
  %98 = getelementptr i8, ptr %96, i64 4
  %99 = load i32, ptr %98, align 4, !tbaa !24
  %100 = icmp eq i32 %97, %99
  br i1 %100, label %106, label %.preheader

.thread307:                                       ; preds = %90
  %101 = getelementptr inbounds i32, ptr %16, i64 %80
  %102 = load i32, ptr %101, align 4, !tbaa !24
  %103 = getelementptr i8, ptr %101, i64 4
  %104 = load i32, ptr %103, align 4, !tbaa !24
  %105 = icmp eq i32 %102, %104
  br i1 %105, label %106, label %.preheader255

106:                                              ; preds = %.thread307, %95
  %107 = trunc nuw nsw i64 %indvars.iv296 to i32
  %smax = tail call i32 @llvm.smax.i32(i32 %.0221268, i32 %107)
  %108 = zext nneg i32 %smax to i64
  br label %109

109:                                              ; preds = %112, %106
  %indvars.iv293 = phi i64 [ %indvars.iv.next294, %112 ], [ %108, %106 ]
  %indvars.iv.next294 = add nuw nsw i64 %indvars.iv293, 1
  %110 = trunc nuw i64 %indvars.iv.next294 to i32
  %111 = icmp sgt i32 %12, %110
  br i1 %111, label %112, label %select.unfold250

112:                                              ; preds = %109
  %113 = getelementptr inbounds i32, ptr %30, i64 %indvars.iv.next294
  %114 = load i32, ptr %113, align 4, !tbaa !24
  %115 = sext i32 %114 to i64
  %116 = getelementptr inbounds i32, ptr %29, i64 %115
  %117 = load i32, ptr %116, align 4, !tbaa !24
  %118 = icmp eq i32 %117, -1
  br i1 %118, label %select.unfold250, label %109, !llvm.loop !35

.preheader255:                                    ; preds = %.thread307
  %119 = icmp slt i32 %102, %104
  br i1 %119, label %.lr.ph260, label %._crit_edge261.thread

.lr.ph260:                                        ; preds = %.preheader255
  %120 = mul nsw i32 %79, %14
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds i32, ptr %18, i64 %121
  %123 = sext i32 %102 to i64
  br label %152

.preheader:                                       ; preds = %95
  %124 = icmp slt i32 %97, %99
  br i1 %124, label %.lr.ph265, label %._crit_edge266.thread

.lr.ph265:                                        ; preds = %.preheader
  %125 = getelementptr inbounds i32, ptr %18, i64 %80
  %126 = sext i32 %97 to i64
  %wide.trip.count291 = sext i32 %99 to i64
  br label %127

127:                                              ; preds = %.lr.ph265, %144
  %indvars.iv288 = phi i64 [ %126, %.lr.ph265 ], [ %indvars.iv.next289, %144 ]
  %.0213263 = phi i32 [ %79, %.lr.ph265 ], [ %.1214, %144 ]
  %.0217262 = phi i32 [ -1, %.lr.ph265 ], [ %.1218, %144 ]
  %128 = getelementptr inbounds i32, ptr %20, i64 %indvars.iv288
  %129 = load i32, ptr %128, align 4, !tbaa !24
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds i32, ptr %29, i64 %130
  %132 = load i32, ptr %131, align 4, !tbaa !24
  %133 = icmp eq i32 %132, -1
  br i1 %133, label %134, label %144

134:                                              ; preds = %127
  %135 = getelementptr inbounds i32, ptr %22, i64 %indvars.iv288
  %136 = load i32, ptr %135, align 4, !tbaa !24
  %137 = icmp slt i32 %.0217262, %136
  br i1 %137, label %138, label %144

138:                                              ; preds = %134
  %139 = load i32, ptr %125, align 4, !tbaa !24
  %140 = getelementptr inbounds i32, ptr %18, i64 %130
  %141 = load i32, ptr %140, align 4, !tbaa !24
  %142 = add nsw i32 %141, %139
  %143 = load i32, ptr %26, align 4, !tbaa !24
  %.not242 = icmp sgt i32 %142, %143
  %spec.select = select i1 %.not242, i32 %.0217262, i32 %136
  %spec.select245 = select i1 %.not242, i32 %.0213263, i32 %129
  br label %144

144:                                              ; preds = %138, %127, %134
  %.1218 = phi i32 [ %.0217262, %134 ], [ %.0217262, %127 ], [ %spec.select, %138 ]
  %.1214 = phi i32 [ %.0213263, %134 ], [ %.0213263, %127 ], [ %spec.select245, %138 ]
  %indvars.iv.next289 = add nsw i64 %indvars.iv288, 1
  %exitcond292.not = icmp eq i64 %indvars.iv.next289, %wide.trip.count291
  br i1 %exitcond292.not, label %._crit_edge266, label %127, !llvm.loop !36

._crit_edge266:                                   ; preds = %144
  %145 = icmp eq i32 %.1214, %79
  br i1 %145, label %._crit_edge266.thread, label %select.unfold250

._crit_edge266.thread:                            ; preds = %.preheader, %._crit_edge266
  %146 = getelementptr inbounds i32, ptr %18, i64 %80
  %147 = load i32, ptr %146, align 4, !tbaa !24
  %148 = mul nsw i32 %147, 3
  %149 = load i32, ptr %26, align 4, !tbaa !24
  %150 = icmp slt i32 %148, %149
  %151 = add i64 %.0272, 1
  br i1 %150, label %.thread, label %select.unfold250

152:                                              ; preds = %.lr.ph260, %176
  %indvars.iv285 = phi i64 [ %123, %.lr.ph260 ], [ %indvars.iv.next286, %176 ]
  %.2215258 = phi i32 [ %79, %.lr.ph260 ], [ %.3216, %176 ]
  %.2219257 = phi i32 [ -1, %.lr.ph260 ], [ %.3220, %176 ]
  %153 = getelementptr inbounds i32, ptr %20, i64 %indvars.iv285
  %154 = load i32, ptr %153, align 4, !tbaa !24
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds i32, ptr %29, i64 %155
  %157 = load i32, ptr %156, align 4, !tbaa !24
  %158 = icmp eq i32 %157, -1
  br i1 %158, label %159, label %176

159:                                              ; preds = %152
  %160 = mul nsw i32 %154, %14
  %161 = sext i32 %160 to i64
  %162 = getelementptr inbounds i32, ptr %18, i64 %161
  %163 = tail call i32 @libmetis__ivecaxpylez(i32 noundef %14, i32 noundef 1, ptr noundef %122, ptr noundef %162, ptr noundef %26) #3
  %.not240 = icmp eq i32 %163, 0
  br i1 %.not240, label %176, label %164

164:                                              ; preds = %159
  %165 = getelementptr inbounds i32, ptr %22, i64 %indvars.iv285
  %166 = load i32, ptr %165, align 4, !tbaa !24
  %167 = icmp slt i32 %.2219257, %166
  br i1 %167, label %176, label %168

168:                                              ; preds = %164
  %169 = icmp eq i32 %.2219257, %166
  br i1 %169, label %170, label %176

170:                                              ; preds = %168
  %171 = load ptr, ptr %76, align 8, !tbaa !37
  %172 = mul nsw i32 %.2215258, %14
  %173 = sext i32 %172 to i64
  %174 = getelementptr inbounds i32, ptr %18, i64 %173
  %175 = tail call i32 @libmetis__BetterVBalance(i32 noundef %14, ptr noundef %171, ptr noundef %122, ptr noundef %174, ptr noundef %162) #3
  %.not241 = icmp eq i32 %175, 0
  br i1 %.not241, label %176, label %._crit_edge306

._crit_edge306:                                   ; preds = %170
  %.pre = load i32, ptr %165, align 4, !tbaa !24
  br label %176

176:                                              ; preds = %164, %._crit_edge306, %152, %159, %168, %170
  %.3220 = phi i32 [ %.2219257, %170 ], [ %.2219257, %168 ], [ %.2219257, %159 ], [ %.2219257, %152 ], [ %.pre, %._crit_edge306 ], [ %166, %164 ]
  %.3216 = phi i32 [ %.2215258, %170 ], [ %.2215258, %168 ], [ %.2215258, %159 ], [ %.2215258, %152 ], [ %154, %._crit_edge306 ], [ %154, %164 ]
  %indvars.iv.next286 = add nsw i64 %indvars.iv285, 1
  %177 = load i32, ptr %103, align 4, !tbaa !24
  %178 = sext i32 %177 to i64
  %179 = icmp slt i64 %indvars.iv.next286, %178
  br i1 %179, label %152, label %._crit_edge261, !llvm.loop !38

._crit_edge261:                                   ; preds = %176
  %180 = icmp eq i32 %.3216, %79
  br i1 %180, label %._crit_edge261.thread, label %select.unfold250

._crit_edge261.thread:                            ; preds = %.preheader255, %._crit_edge261
  %181 = mul nsw i32 %79, %14
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds i32, ptr %18, i64 %182
  %184 = tail call i32 @libmetis__ivecaxpylez(i32 noundef %14, i32 noundef 2, ptr noundef %183, ptr noundef %183, ptr noundef %26) #3
  %.not239 = icmp eq i32 %184, 0
  %185 = add i64 %.0272, 1
  br i1 %.not239, label %select.unfold250, label %.thread

select.unfold250:                                 ; preds = %112, %109, %._crit_edge261.thread, %._crit_edge266.thread, %._crit_edge261, %._crit_edge266, %90, %85
  %.2223 = phi i32 [ %.0221268, %._crit_edge266 ], [ %.0221268, %._crit_edge261 ], [ %.0221268, %85 ], [ %.0221268, %90 ], [ %.0221268, %._crit_edge266.thread ], [ %.0221268, %._crit_edge261.thread ], [ %110, %109 ], [ %110, %112 ]
  %.4 = phi i32 [ %.1214, %._crit_edge266 ], [ %.3216, %._crit_edge261 ], [ %79, %85 ], [ %79, %90 ], [ %79, %._crit_edge266.thread ], [ %79, %._crit_edge261.thread ], [ %114, %112 ], [ %79, %109 ]
  %.not244 = icmp eq i32 %.4, -1
  br i1 %.not244, label %.thread, label %186

186:                                              ; preds = %select.unfold250
  %187 = add nsw i32 %.0210269, 1
  %188 = sext i32 %.4 to i64
  %189 = getelementptr inbounds i32, ptr %24, i64 %188
  store i32 %.0210269, ptr %189, align 4, !tbaa !24
  %190 = getelementptr inbounds i32, ptr %24, i64 %80
  store i32 %.0210269, ptr %190, align 4, !tbaa !24
  store i32 %.4, ptr %81, align 4, !tbaa !24
  %191 = getelementptr inbounds i32, ptr %29, i64 %188
  store i32 %79, ptr %191, align 4, !tbaa !24
  br label %.thread

.thread:                                          ; preds = %._crit_edge266.thread, %._crit_edge261.thread, %77, %186, %select.unfold250
  %.3224 = phi i32 [ %.2223, %186 ], [ %.2223, %select.unfold250 ], [ %.0221268, %77 ], [ %.0221268, %._crit_edge261.thread ], [ %.0221268, %._crit_edge266.thread ]
  %.1211 = phi i32 [ %187, %186 ], [ %.0210269, %select.unfold250 ], [ %.0210269, %77 ], [ %.0210269, %._crit_edge261.thread ], [ %.0210269, %._crit_edge266.thread ]
  %.2 = phi i64 [ %.0272, %186 ], [ %.0272, %select.unfold250 ], [ %.0272, %77 ], [ %185, %._crit_edge261.thread ], [ %151, %._crit_edge266.thread ]
  %indvars.iv.next297 = add nuw nsw i64 %indvars.iv296, 1
  %exitcond300.not = icmp eq i64 %indvars.iv.next297, %wide.trip.count299
  br i1 %exitcond300.not, label %._crit_edge275, label %77, !llvm.loop !39

._crit_edge275:                                   ; preds = %.thread, %._crit_edge.thread, %._crit_edge
  %.0210.lcssa = phi i32 [ 0, %._crit_edge ], [ 0, %._crit_edge.thread ], [ %.1211, %.thread ]
  %.0.lcssa = phi i64 [ 0, %._crit_edge ], [ 0, %._crit_edge.thread ], [ %.2, %.thread ]
  %192 = getelementptr inbounds i8, ptr %0, i64 32
  %193 = load i32, ptr %192, align 8, !tbaa !40
  %.not235 = icmp eq i32 %193, 0
  br i1 %.not235, label %194, label %201

194:                                              ; preds = %._crit_edge275
  %195 = uitofp i64 %.0.lcssa to double
  %196 = sitofp i32 %12 to double
  %197 = fmul double %196, 1.000000e-01
  %198 = fcmp olt double %197, %195
  br i1 %198, label %199, label %201

199:                                              ; preds = %194
  %200 = tail call i32 @libmetis__Match_2Hop(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef %30, ptr noundef %29, i32 noundef %.0210.lcssa, i64 noundef %.0.lcssa)
  br label %201

201:                                              ; preds = %199, %194, %._crit_edge275
  br i1 %40, label %.lr.ph281.preheader, label %._crit_edge282

.lr.ph281.preheader:                              ; preds = %201
  %wide.trip.count304 = zext nneg i32 %12 to i64
  br label %.lr.ph281

.lr.ph281:                                        ; preds = %.lr.ph281.preheader, %212
  %indvars.iv301 = phi i64 [ 0, %.lr.ph281.preheader ], [ %indvars.iv.next302, %212 ]
  %.2212278 = phi i32 [ 0, %.lr.ph281.preheader ], [ %.3, %212 ]
  %202 = getelementptr inbounds i32, ptr %29, i64 %indvars.iv301
  %203 = load i32, ptr %202, align 4, !tbaa !24
  %204 = icmp eq i32 %203, -1
  br i1 %204, label %205, label %207

205:                                              ; preds = %.lr.ph281
  %206 = trunc nuw nsw i64 %indvars.iv301 to i32
  store i32 %206, ptr %202, align 4, !tbaa !24
  br label %.sink.split

207:                                              ; preds = %.lr.ph281
  %208 = sext i32 %203 to i64
  %.not237 = icmp sgt i64 %indvars.iv301, %208
  br i1 %.not237, label %212, label %209

209:                                              ; preds = %207
  %210 = getelementptr inbounds i32, ptr %24, i64 %208
  store i32 %.2212278, ptr %210, align 4, !tbaa !24
  br label %.sink.split

.sink.split:                                      ; preds = %209, %205
  %.3.ph = add nsw i32 %.2212278, 1
  %211 = getelementptr inbounds i32, ptr %24, i64 %indvars.iv301
  store i32 %.2212278, ptr %211, align 4, !tbaa !24
  br label %212

212:                                              ; preds = %.sink.split, %207
  %.3 = phi i32 [ %.2212278, %207 ], [ %.3.ph, %.sink.split ]
  %indvars.iv.next302 = add nuw nsw i64 %indvars.iv301, 1
  %exitcond305.not = icmp eq i64 %indvars.iv.next302, %wide.trip.count304
  br i1 %exitcond305.not, label %._crit_edge282, label %.lr.ph281, !llvm.loop !41

._crit_edge282:                                   ; preds = %212, %201
  %.2212.lcssa = phi i32 [ 0, %201 ], [ %.3, %212 ]
  %213 = load i32, ptr %3, align 8, !tbaa !5
  %214 = and i32 %213, 2
  %.not236 = icmp eq i32 %214, 0
  br i1 %.not236, label %220, label %215

215:                                              ; preds = %._crit_edge282
  %216 = tail call double @gk_CPUSeconds() #3
  %217 = getelementptr inbounds i8, ptr %0, i64 152
  %218 = load double, ptr %217, align 8, !tbaa !14
  %219 = fadd double %216, %218
  store double %219, ptr %217, align 8, !tbaa !14
  br label %220

220:                                              ; preds = %215, %._crit_edge282
  tail call void @libmetis__CreateCoarseGraph(ptr noundef nonnull %0, ptr noundef nonnull %1, i32 noundef %.2212.lcssa, ptr noundef %29)
  tail call void @libmetis__wspacepop(ptr noundef nonnull %0) #3
  ret i32 %.2212.lcssa
}

declare void @libmetis__wspacepush(ptr noundef) local_unnamed_addr #0

declare ptr @libmetis__iset(i64 noundef, i32 noundef, ptr noundef) local_unnamed_addr #0

declare ptr @libmetis__iwspacemalloc(ptr noundef, i32 noundef) local_unnamed_addr #0

declare void @libmetis__irandArrayPermute(i32 noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

declare i32 @libmetis__ivecle(i32 noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare i32 @libmetis__ivecaxpylez(i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
declare dso_local void @libmetis__CreateCoarseGraph(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

declare void @libmetis__wspacepop(ptr noundef) local_unnamed_addr #0

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

declare i32 @libmetis__BetterVBalance(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

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

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

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

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

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

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


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