; LLVM IR from kalininalab/rinminer :: rinminer (rinminer)

; 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.extension_t = type { ptr, ptr, i32, %struct.dfs_code_t }
%struct.dfs_code_t = type { i16, i16, i32, i32, %struct.edge_label_t, i32 }
%struct.edge_label_t = type { i32, i32 }
%struct.subgraph_t = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i32, ptr }
%struct.db_mapping_t = type { ptr, i32, i16, i32 }
%struct.mapping_t = type { ptr, ptr, i32, %struct.mapping_info_t }
%struct.mapping_info_t = type { i32, float }
%struct.database_t = type { ptr, i32, i32, i32 }
%struct.database_entry_t = type { ptr, ptr, ptr, i32, i32, i32, i32 }
%struct.neighbor_t = type { i16, %struct.edge_label_t, i32 }

@.str.5 = external hidden unnamed_addr constant [74 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [34 x i8], align 1
@__PRETTY_FUNCTION__.find_canonical_extension = external hidden unnamed_addr constant [65 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [77 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [75 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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @map(ptr noundef, ptr noundef, i16 noundef zeroext) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i16 @reverse_map(ptr noundef, ptr noundef, i16 noundef zeroext) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @rightmost_path_search(ptr noundef, i32 noundef, i16 noundef zeroext) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @contains_edge(ptr noundef, i16 noundef zeroext, i16 noundef zeroext, ptr noundef, i32 noundef) #1

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #3

; Function Attrs: nounwind uwtable
define dso_local void @find_canonical_extension(ptr dead_on_unwind noalias writable sret(%struct.extension_t) align 8 %0, ptr noundef %1, ptr noundef %2) #4 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca %struct.dfs_code_t, align 4
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i16, align 2
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca %struct.dfs_code_t, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca i16, align 2
  %19 = alloca i32, align 4
  %20 = alloca i16, align 2
  %21 = alloca i16, align 2
  %22 = alloca i32, align 4
  %23 = alloca ptr, align 8
  %24 = alloca i16, align 2
  %25 = alloca %struct.dfs_code_t, align 4
  %26 = alloca %struct.dfs_code_t, align 4
  %27 = alloca %struct.dfs_code_t, align 4
  %28 = alloca %struct.dfs_code_t, align 4
  store ptr %1, ptr %4, align 8, !tbaa !5
  store ptr %2, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  store i32 0, ptr %6, align 4, !tbaa !9
  %29 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %30 = getelementptr inbounds %struct.dfs_code_t, ptr %7, i32 0, i32 0
  store i16 -2, ptr %30, align 4, !tbaa !11
  %31 = getelementptr inbounds %struct.dfs_code_t, ptr %7, i32 0, i32 1
  store i16 -3, ptr %31, align 2, !tbaa !15
  %32 = getelementptr inbounds %struct.dfs_code_t, ptr %7, i32 0, i32 2
  store i32 2147483647, ptr %32, align 4, !tbaa !16
  %33 = getelementptr inbounds %struct.dfs_code_t, ptr %7, i32 0, i32 3
  store i32 2147483647, ptr %33, align 4, !tbaa !17
  %34 = getelementptr inbounds %struct.dfs_code_t, ptr %7, i32 0, i32 4
  %35 = getelementptr inbounds %struct.edge_label_t, ptr %34, i32 0, i32 0
  store i32 2147483647, ptr %35, align 4, !tbaa !18
  %36 = getelementptr inbounds %struct.edge_label_t, ptr %34, i32 0, i32 1
  store i32 2147483647, ptr %36, align 4, !tbaa !19
  %37 = getelementptr inbounds %struct.dfs_code_t, ptr %7, i32 0, i32 5
  store i32 2, ptr %37, align 4, !tbaa !20
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %29, ptr align 4 %7, i64 24, i1 false), !tbaa.struct !21
  %38 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %39 = getelementptr inbounds %struct.dfs_code_t, ptr %38, i32 0, i32 0
  store i16 0, ptr %39, align 4, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %40 = load ptr, ptr %5, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.subgraph_t, ptr %40, i32 0, i32 3
  %42 = load ptr, ptr %41, align 8, !tbaa !25
  %43 = getelementptr inbounds %struct.db_mapping_t, ptr %42, i64 0
  store ptr %43, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  %44 = load ptr, ptr %8, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.db_mapping_t, ptr %44, i32 0, i32 0
  %46 = load ptr, ptr %45, align 8, !tbaa !27
  store ptr %46, ptr %9, align 8, !tbaa !5
  br label %47

47:                                               ; preds = %290, %3
  %48 = load ptr, ptr %9, align 8, !tbaa !5
  %49 = icmp ne ptr %48, null
  br i1 %49, label %51, label %50

50:                                               ; preds = %47
  store i32 2, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  br label %294

51:                                               ; preds = %47
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  %52 = load ptr, ptr %9, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.mapping_t, ptr %52, i32 0, i32 1
  %54 = load ptr, ptr %53, align 8, !tbaa !29
  store ptr %54, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %12) #5
  %55 = load ptr, ptr %8, align 8, !tbaa !5
  %56 = load ptr, ptr %11, align 8, !tbaa !5
  %57 = load ptr, ptr %5, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.subgraph_t, ptr %57, i32 0, i32 18
  %59 = load i16, ptr %58, align 8, !tbaa !33
  %60 = call i32 @map(ptr noundef %55, ptr noundef %56, i16 noundef zeroext %59)
  %61 = trunc i32 %60 to i16
  store i16 %61, ptr %12, align 2, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.database_t, ptr %62, i32 0, i32 0
  %64 = load ptr, ptr %63, align 8, !tbaa !34
  %65 = getelementptr inbounds %struct.database_entry_t, ptr %64, i64 0
  %66 = getelementptr inbounds %struct.database_entry_t, ptr %65, i32 0, i32 2
  %67 = load ptr, ptr %66, align 8, !tbaa !36
  %68 = load i16, ptr %12, align 2, !tbaa !22
  %69 = zext i16 %68 to i64
  %70 = getelementptr inbounds ptr, ptr %67, i64 %69
  %71 = load ptr, ptr %70, align 8, !tbaa !5
  store ptr %71, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  %72 = load ptr, ptr %4, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.database_t, ptr %72, i32 0, i32 0
  %74 = load ptr, ptr %73, align 8, !tbaa !34
  %75 = getelementptr inbounds %struct.database_entry_t, ptr %74, i64 0
  %76 = getelementptr inbounds %struct.database_entry_t, ptr %75, i32 0, i32 1
  %77 = load ptr, ptr %76, align 8, !tbaa !38
  %78 = load i16, ptr %12, align 2, !tbaa !22
  %79 = zext i16 %78 to i64
  %80 = getelementptr inbounds i32, ptr %77, i64 %79
  %81 = load i32, ptr %80, align 4, !tbaa !9
  store i32 %81, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 24, ptr %15) #5
  %82 = load ptr, ptr %5, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.subgraph_t, ptr %82, i32 0, i32 18
  %84 = load i16, ptr %83, align 8, !tbaa !33
  %85 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 0
  store i16 %84, ptr %85, align 4, !tbaa !11
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.subgraph_t, ptr %86, i32 0, i32 1
  %88 = load ptr, ptr %87, align 8, !tbaa !39
  %89 = load ptr, ptr %5, align 8, !tbaa !5
  %90 = getelementptr inbounds %struct.subgraph_t, ptr %89, i32 0, i32 18
  %91 = load i16, ptr %90, align 8, !tbaa !33
  %92 = zext i16 %91 to i64
  %93 = getelementptr inbounds i32, ptr %88, i64 %92
  %94 = load i32, ptr %93, align 4, !tbaa !9
  %95 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 2
  store i32 %94, ptr %95, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  store i32 0, ptr %16, align 4, !tbaa !9
  br label %96

96:                                               ; preds = %168, %51
  %97 = load i32, ptr %16, align 4, !tbaa !9
  %98 = load i32, ptr %14, align 4, !tbaa !9
  %99 = icmp ult i32 %97, %98
  br i1 %99, label %101, label %100

100:                                              ; preds = %96
  store i32 5, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  br label %171

101:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %102 = load ptr, ptr %13, align 8, !tbaa !5
  %103 = load i32, ptr %16, align 4, !tbaa !9
  %104 = zext i32 %103 to i64
  %105 = getelementptr inbounds %struct.neighbor_t, ptr %102, i64 %104
  store ptr %105, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %18) #5
  %106 = load ptr, ptr %8, align 8, !tbaa !5
  %107 = load ptr, ptr %11, align 8, !tbaa !5
  %108 = load ptr, ptr %17, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.neighbor_t, ptr %108, i32 0, i32 0
  %110 = load i16, ptr %109, align 4, !tbaa !40
  %111 = call zeroext i16 @reverse_map(ptr noundef %106, ptr noundef %107, i16 noundef zeroext %110)
  store i16 %111, ptr %18, align 2, !tbaa !22
  %112 = load i16, ptr %18, align 2, !tbaa !22
  %113 = zext i16 %112 to i32
  %114 = icmp eq i32 %113, 65535
  br i1 %114, label %115, label %116

115:                                              ; preds = %101
  store i32 7, ptr %10, align 4
  br label %165

116:                                              ; preds = %101
  %117 = load ptr, ptr %5, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.subgraph_t, ptr %117, i32 0, i32 2
  %119 = load ptr, ptr %118, align 8, !tbaa !42
  %120 = load ptr, ptr %5, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.subgraph_t, ptr %120, i32 0, i32 13
  %122 = load i32, ptr %121, align 4, !tbaa !43
  %123 = load i16, ptr %18, align 2, !tbaa !22
  %124 = call i32 @rightmost_path_search(ptr noundef %119, i32 noundef %122, i16 noundef zeroext %123)
  %125 = icmp eq i32 %124, -1
  br i1 %125, label %126, label %127

126:                                              ; preds = %116
  store i32 7, ptr %10, align 4
  br label %165

127:                                              ; preds = %116
  %128 = load ptr, ptr %5, align 8, !tbaa !5
  %129 = load ptr, ptr %5, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.subgraph_t, ptr %129, i32 0, i32 18
  %131 = load i16, ptr %130, align 8, !tbaa !33
  %132 = load i16, ptr %18, align 2, !tbaa !22
  %133 = load ptr, ptr %17, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.neighbor_t, ptr %133, i32 0, i32 1
  %135 = load ptr, ptr %17, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.neighbor_t, ptr %135, i32 0, i32 2
  %137 = load i32, ptr %136, align 4, !tbaa !44
  %138 = call i32 @contains_edge(ptr noundef %128, i16 noundef zeroext %131, i16 noundef zeroext %132, ptr noundef %134, i32 noundef %137)
  %139 = icmp ne i32 %138, 0
  br i1 %139, label %140, label %141

140:                                              ; preds = %127
  store i32 7, ptr %10, align 4
  br label %165

141:                                              ; preds = %127
  %142 = load i16, ptr %18, align 2, !tbaa !22
  %143 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 1
  store i16 %142, ptr %143, align 2, !tbaa !15
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.subgraph_t, ptr %144, i32 0, i32 1
  %146 = load ptr, ptr %145, align 8, !tbaa !39
  %147 = load i16, ptr %18, align 2, !tbaa !22
  %148 = zext i16 %147 to i64
  %149 = getelementptr inbounds i32, ptr %146, i64 %148
  %150 = load i32, ptr %149, align 4, !tbaa !9
  %151 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 3
  store i32 %150, ptr %151, align 4, !tbaa !17
  %152 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 4
  %153 = load ptr, ptr %17, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.neighbor_t, ptr %153, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %152, ptr align 4 %154, i64 8, i1 false), !tbaa.struct !45
  %155 = load ptr, ptr %17, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.neighbor_t, ptr %155, i32 0, i32 2
  %157 = load i32, ptr %156, align 4, !tbaa !44
  %158 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 5
  store i32 %157, ptr %158, align 4, !tbaa !20
  %159 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %160 = call i32 @compare_code(ptr noundef %15, ptr noundef %159)
  %161 = icmp eq i32 %160, -1
  br i1 %161, label %162, label %164

162:                                              ; preds = %141
  %163 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %163, ptr align 4 %15, i64 24, i1 false), !tbaa.struct !21
  store i32 1, ptr %6, align 4, !tbaa !9
  br label %164

164:                                              ; preds = %162, %141
  store i32 0, ptr %10, align 4
  br label %165

165:                                              ; preds = %164, %140, %126, %115
  call void @llvm.lifetime.end.p0(i64 2, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  %166 = load i32, ptr %10, align 4
  switch i32 %166, label %359 [
    i32 0, label %167
    i32 7, label %168
  ]

167:                                              ; preds = %165
  br label %168

168:                                              ; preds = %167, %165
  %169 = load i32, ptr %16, align 4, !tbaa !9
  %170 = add i32 %169, 1
  store i32 %170, ptr %16, align 4, !tbaa !9
  br label %96, !llvm.loop !46

171:                                              ; preds = %100
  %172 = load i32, ptr %6, align 4, !tbaa !9
  %173 = icmp ne i32 %172, 0
  br i1 %173, label %174, label %175

174:                                              ; preds = %171
  store i32 4, ptr %10, align 4
  br label %287

175:                                              ; preds = %171
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  %176 = load ptr, ptr %5, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.subgraph_t, ptr %176, i32 0, i32 13
  %178 = load i32, ptr %177, align 4, !tbaa !43
  store i32 %178, ptr %19, align 4, !tbaa !9
  br label %179

179:                                              ; preds = %285, %175
  %180 = load i32, ptr %19, align 4, !tbaa !9
  %181 = add i32 %180, -1
  store i32 %181, ptr %19, align 4, !tbaa !9
  %182 = icmp ugt i32 %180, 0
  br i1 %182, label %184, label %183

183:                                              ; preds = %179
  store i32 8, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  br label %286

184:                                              ; preds = %179
  call void @llvm.lifetime.start.p0(i64 2, ptr %20) #5
  %185 = load ptr, ptr %5, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.subgraph_t, ptr %185, i32 0, i32 2
  %187 = load ptr, ptr %186, align 8, !tbaa !42
  %188 = load i32, ptr %19, align 4, !tbaa !9
  %189 = zext i32 %188 to i64
  %190 = getelementptr inbounds i16, ptr %187, i64 %189
  %191 = load i16, ptr %190, align 2, !tbaa !22
  store i16 %191, ptr %20, align 2, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 2, ptr %21) #5
  %192 = load ptr, ptr %8, align 8, !tbaa !5
  %193 = load ptr, ptr %11, align 8, !tbaa !5
  %194 = load i16, ptr %20, align 2, !tbaa !22
  %195 = call i32 @map(ptr noundef %192, ptr noundef %193, i16 noundef zeroext %194)
  %196 = trunc i32 %195 to i16
  store i16 %196, ptr %21, align 2, !tbaa !22
  %197 = load ptr, ptr %4, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.database_t, ptr %197, i32 0, i32 0
  %199 = load ptr, ptr %198, align 8, !tbaa !34
  %200 = getelementptr inbounds %struct.database_entry_t, ptr %199, i64 0
  %201 = getelementptr inbounds %struct.database_entry_t, ptr %200, i32 0, i32 2
  %202 = load ptr, ptr %201, align 8, !tbaa !36
  %203 = load i16, ptr %21, align 2, !tbaa !22
  %204 = zext i16 %203 to i64
  %205 = getelementptr inbounds ptr, ptr %202, i64 %204
  %206 = load ptr, ptr %205, align 8, !tbaa !5
  store ptr %206, ptr %13, align 8, !tbaa !5
  %207 = load ptr, ptr %4, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.database_t, ptr %207, i32 0, i32 0
  %209 = load ptr, ptr %208, align 8, !tbaa !34
  %210 = getelementptr inbounds %struct.database_entry_t, ptr %209, i64 0
  %211 = getelementptr inbounds %struct.database_entry_t, ptr %210, i32 0, i32 1
  %212 = load ptr, ptr %211, align 8, !tbaa !38
  %213 = load i16, ptr %21, align 2, !tbaa !22
  %214 = zext i16 %213 to i64
  %215 = getelementptr inbounds i32, ptr %212, i64 %214
  %216 = load i32, ptr %215, align 4, !tbaa !9
  store i32 %216, ptr %14, align 4, !tbaa !9
  %217 = load i16, ptr %20, align 2, !tbaa !22
  %218 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 0
  store i16 %217, ptr %218, align 4, !tbaa !11
  %219 = load ptr, ptr %4, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.database_t, ptr %219, i32 0, i32 0
  %221 = load ptr, ptr %220, align 8, !tbaa !34
  %222 = getelementptr inbounds %struct.database_entry_t, ptr %221, i64 0
  %223 = getelementptr inbounds %struct.database_entry_t, ptr %222, i32 0, i32 0
  %224 = load ptr, ptr %223, align 8, !tbaa !48
  %225 = load i16, ptr %21, align 2, !tbaa !22
  %226 = zext i16 %225 to i64
  %227 = getelementptr inbounds i32, ptr %224, i64 %226
  %228 = load i32, ptr %227, align 4, !tbaa !9
  %229 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 2
  store i32 %228, ptr %229, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #5
  store i32 0, ptr %22, align 4, !tbaa !9
  br label %230

230:                                              ; preds = %282, %184
  %231 = load i32, ptr %22, align 4, !tbaa !9
  %232 = load i32, ptr %14, align 4, !tbaa !9
  %233 = icmp ult i32 %231, %232
  br i1 %233, label %235, label %234

234:                                              ; preds = %230
  store i32 10, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #5
  br label %285

235:                                              ; preds = %230
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  %236 = load ptr, ptr %13, align 8, !tbaa !5
  %237 = load i32, ptr %22, align 4, !tbaa !9
  %238 = zext i32 %237 to i64
  %239 = getelementptr inbounds %struct.neighbor_t, ptr %236, i64 %238
  store ptr %239, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %24) #5
  %240 = load ptr, ptr %23, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.neighbor_t, ptr %240, i32 0, i32 0
  %242 = load i16, ptr %241, align 4, !tbaa !40
  store i16 %242, ptr %24, align 2, !tbaa !22
  %243 = load ptr, ptr %8, align 8, !tbaa !5
  %244 = load ptr, ptr %11, align 8, !tbaa !5
  %245 = load i16, ptr %24, align 2, !tbaa !22
  %246 = call zeroext i16 @reverse_map(ptr noundef %243, ptr noundef %244, i16 noundef zeroext %245)
  %247 = zext i16 %246 to i32
  %248 = icmp eq i32 %247, 65535
  br i1 %248, label %249, label %281

249:                                              ; preds = %235
  %250 = load ptr, ptr %5, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.subgraph_t, ptr %250, i32 0, i32 18
  %252 = load i16, ptr %251, align 8, !tbaa !33
  %253 = zext i16 %252 to i32
  %254 = add nsw i32 %253, 1
  %255 = trunc i32 %254 to i16
  %256 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 1
  store i16 %255, ptr %256, align 2, !tbaa !15
  %257 = load ptr, ptr %4, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.database_t, ptr %257, i32 0, i32 0
  %259 = load ptr, ptr %258, align 8, !tbaa !34
  %260 = getelementptr inbounds %struct.database_entry_t, ptr %259, i64 0
  %261 = getelementptr inbounds %struct.database_entry_t, ptr %260, i32 0, i32 0
  %262 = load ptr, ptr %261, align 8, !tbaa !48
  %263 = load i16, ptr %24, align 2, !tbaa !22
  %264 = zext i16 %263 to i64
  %265 = getelementptr inbounds i32, ptr %262, i64 %264
  %266 = load i32, ptr %265, align 4, !tbaa !9
  %267 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 3
  store i32 %266, ptr %267, align 4, !tbaa !17
  %268 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 4
  %269 = load ptr, ptr %23, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.neighbor_t, ptr %269, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %268, ptr align 4 %270, i64 8, i1 false), !tbaa.struct !45
  %271 = load ptr, ptr %23, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.neighbor_t, ptr %271, i32 0, i32 2
  %273 = load i32, ptr %272, align 4, !tbaa !44
  %274 = getelementptr inbounds %struct.dfs_code_t, ptr %15, i32 0, i32 5
  store i32 %273, ptr %274, align 4, !tbaa !20
  %275 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %276 = call i32 @compare_code(ptr noundef %15, ptr noundef %275)
  %277 = icmp eq i32 %276, -1
  br i1 %277, label %278, label %280

278:                                              ; preds = %249
  %279 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %279, ptr align 4 %15, i64 24, i1 false), !tbaa.struct !21
  br label %280

280:                                              ; preds = %278, %249
  br label %281

281:                                              ; preds = %280, %235
  call void @llvm.lifetime.end.p0(i64 2, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  br label %282

282:                                              ; preds = %281
  %283 = load i32, ptr %22, align 4, !tbaa !9
  %284 = add i32 %283, 1
  store i32 %284, ptr %22, align 4, !tbaa !9
  br label %230, !llvm.loop !49

285:                                              ; preds = %234
  call void @llvm.lifetime.end.p0(i64 2, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %20) #5
  br label %179, !llvm.loop !50

286:                                              ; preds = %183
  store i32 0, ptr %10, align 4
  br label %287

287:                                              ; preds = %286, %174
  call void @llvm.lifetime.end.p0(i64 24, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 2, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  %288 = load i32, ptr %10, align 4
  switch i32 %288, label %359 [
    i32 0, label %289
    i32 4, label %290
  ]

289:                                              ; preds = %287
  br label %290

290:                                              ; preds = %289, %287
  %291 = load ptr, ptr %9, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.mapping_t, ptr %291, i32 0, i32 0
  %293 = load ptr, ptr %292, align 8, !tbaa !51
  store ptr %293, ptr %9, align 8, !tbaa !5
  br label %47, !llvm.loop !52

294:                                              ; preds = %50
  %295 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %296 = getelementptr inbounds %struct.dfs_code_t, ptr %295, i32 0, i32 1
  %297 = load i16, ptr %296, align 2, !tbaa !53
  %298 = zext i16 %297 to i32
  %299 = getelementptr inbounds %struct.dfs_code_t, ptr %25, i32 0, i32 0
  store i16 -2, ptr %299, align 4, !tbaa !11
  %300 = getelementptr inbounds %struct.dfs_code_t, ptr %25, i32 0, i32 1
  store i16 -3, ptr %300, align 2, !tbaa !15
  %301 = getelementptr inbounds %struct.dfs_code_t, ptr %25, i32 0, i32 2
  store i32 2147483647, ptr %301, align 4, !tbaa !16
  %302 = getelementptr inbounds %struct.dfs_code_t, ptr %25, i32 0, i32 3
  store i32 2147483647, ptr %302, align 4, !tbaa !17
  %303 = getelementptr inbounds %struct.dfs_code_t, ptr %25, i32 0, i32 4
  %304 = getelementptr inbounds %struct.edge_label_t, ptr %303, i32 0, i32 0
  store i32 2147483647, ptr %304, align 4, !tbaa !18
  %305 = getelementptr inbounds %struct.edge_label_t, ptr %303, i32 0, i32 1
  store i32 2147483647, ptr %305, align 4, !tbaa !19
  %306 = getelementptr inbounds %struct.dfs_code_t, ptr %25, i32 0, i32 5
  store i32 2, ptr %306, align 4, !tbaa !20
  %307 = icmp ne i32 %298, 65533
  br i1 %307, label %308, label %309

308:                                              ; preds = %294
  br label %310

309:                                              ; preds = %294
  call void @__assert_fail(ptr noundef @.str.8, ptr noundef @.str.5, i32 noundef 2188, ptr noundef @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

310:                                              ; preds = %308
  %311 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %312 = getelementptr inbounds %struct.dfs_code_t, ptr %311, i32 0, i32 3
  %313 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 0
  store i16 -2, ptr %313, align 4, !tbaa !11
  %314 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 1
  store i16 -3, ptr %314, align 2, !tbaa !15
  %315 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 2
  store i32 2147483647, ptr %315, align 4, !tbaa !16
  %316 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 3
  store i32 2147483647, ptr %316, align 4, !tbaa !17
  %317 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 4
  %318 = getelementptr inbounds %struct.edge_label_t, ptr %317, i32 0, i32 0
  store i32 2147483647, ptr %318, align 4, !tbaa !18
  %319 = getelementptr inbounds %struct.edge_label_t, ptr %317, i32 0, i32 1
  store i32 2147483647, ptr %319, align 4, !tbaa !19
  %320 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 5
  store i32 2, ptr %320, align 4, !tbaa !20
  %321 = getelementptr inbounds %struct.dfs_code_t, ptr %26, i32 0, i32 3
  %322 = call i32 @vertex_label_compare(ptr noundef %312, ptr noundef %321)
  %323 = icmp slt i32 %322, 0
  br i1 %323, label %324, label %325

324:                                              ; preds = %310
  br label %326

325:                                              ; preds = %310
  call void @__assert_fail(ptr noundef @.str.9, ptr noundef @.str.5, i32 noundef 2189, ptr noundef @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

326:                                              ; preds = %324
  %327 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %328 = getelementptr inbounds %struct.dfs_code_t, ptr %327, i32 0, i32 2
  %329 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 0
  store i16 -2, ptr %329, align 4, !tbaa !11
  %330 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 1
  store i16 -3, ptr %330, align 2, !tbaa !15
  %331 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 2
  store i32 2147483647, ptr %331, align 4, !tbaa !16
  %332 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 3
  store i32 2147483647, ptr %332, align 4, !tbaa !17
  %333 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 4
  %334 = getelementptr inbounds %struct.edge_label_t, ptr %333, i32 0, i32 0
  store i32 2147483647, ptr %334, align 4, !tbaa !18
  %335 = getelementptr inbounds %struct.edge_label_t, ptr %333, i32 0, i32 1
  store i32 2147483647, ptr %335, align 4, !tbaa !19
  %336 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 5
  store i32 2, ptr %336, align 4, !tbaa !20
  %337 = getelementptr inbounds %struct.dfs_code_t, ptr %27, i32 0, i32 2
  %338 = call i32 @vertex_label_compare(ptr noundef %328, ptr noundef %337)
  %339 = icmp slt i32 %338, 0
  br i1 %339, label %340, label %341

340:                                              ; preds = %326
  br label %342

341:                                              ; preds = %326
  call void @__assert_fail(ptr noundef @.str.10, ptr noundef @.str.5, i32 noundef 2190, ptr noundef @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

342:                                              ; preds = %340
  %343 = getelementptr inbounds %struct.extension_t, ptr %0, i32 0, i32 3
  %344 = getelementptr inbounds %struct.dfs_code_t, ptr %343, i32 0, i32 4
  %345 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 0
  store i16 -2, ptr %345, align 4, !tbaa !11
  %346 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 1
  store i16 -3, ptr %346, align 2, !tbaa !15
  %347 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 2
  store i32 2147483647, ptr %347, align 4, !tbaa !16
  %348 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 3
  store i32 2147483647, ptr %348, align 4, !tbaa !17
  %349 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 4
  %350 = getelementptr inbounds %struct.edge_label_t, ptr %349, i32 0, i32 0
  store i32 2147483647, ptr %350, align 4, !tbaa !18
  %351 = getelementptr inbounds %struct.edge_label_t, ptr %349, i32 0, i32 1
  store i32 2147483647, ptr %351, align 4, !tbaa !19
  %352 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 5
  store i32 2, ptr %352, align 4, !tbaa !20
  %353 = getelementptr inbounds %struct.dfs_code_t, ptr %28, i32 0, i32 4
  %354 = call i32 @edge_label_compare(ptr noundef %344, ptr noundef %353)
  %355 = icmp slt i32 %354, 0
  br i1 %355, label %356, label %357

356:                                              ; preds = %342
  br label %358

357:                                              ; preds = %342
  call void @__assert_fail(ptr noundef @.str.11, ptr noundef @.str.5, i32 noundef 2191, ptr noundef @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

358:                                              ; preds = %356
  store i32 1, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  ret void

359:                                              ; preds = %287, %165
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @compare_code(ptr noundef, ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @vertex_label_compare(ptr noundef, ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @edge_label_compare(ptr noundef, ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint 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 nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 #5 = { nounwind }
attributes #6 = { noreturn 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 = !{!"int", !7, i64 0}
!11 = !{!12, !13, i64 0}
!12 = !{!"dfs_code_t", !13, i64 0, !13, i64 2, !10, i64 4, !10, i64 8, !14, i64 12, !10, i64 20}
!13 = !{!"short", !7, i64 0}
!14 = !{!"edge_label_t", !10, i64 0, !10, i64 4}
!15 = !{!12, !13, i64 2}
!16 = !{!12, !10, i64 4}
!17 = !{!12, !10, i64 8}
!18 = !{!14, !10, i64 0}
!19 = !{!14, !10, i64 4}
!20 = !{!12, !10, i64 20}
!21 = !{i64 0, i64 2, !22, i64 2, i64 2, !22, i64 4, i64 4, !9, i64 8, i64 4, !9, i64 12, i64 4, !9, i64 16, i64 4, !9, i64 20, i64 4, !9}
!22 = !{!13, !13, i64 0}
!23 = !{!24, !13, i64 20}
!24 = !{!"extension_t", !6, i64 0, !6, i64 8, !10, i64 16, !12, i64 20}
!25 = !{!26, !6, i64 24}
!26 = !{!"subgraph_t", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !13, i64 104, !10, i64 108, !6, i64 112}
!27 = !{!28, !6, i64 0}
!28 = !{!"db_mapping_t", !6, i64 0, !10, i64 8, !13, i64 12, !10, i64 16}
!29 = !{!30, !6, i64 8}
!30 = !{!"mapping_t", !6, i64 0, !6, i64 8, !10, i64 16, !31, i64 20}
!31 = !{!"mapping_info_t", !10, i64 0, !32, i64 4}
!32 = !{!"float", !7, i64 0}
!33 = !{!26, !13, i64 104}
!34 = !{!35, !6, i64 0}
!35 = !{!"database_t", !6, i64 0, !10, i64 8, !10, i64 12, !10, i64 16}
!36 = !{!37, !6, i64 16}
!37 = !{!"database_entry_t", !6, i64 0, !6, i64 8, !6, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36}
!38 = !{!37, !6, i64 8}
!39 = !{!26, !6, i64 8}
!40 = !{!41, !13, i64 0}
!41 = !{!"neighbor_t", !13, i64 0, !14, i64 4, !10, i64 12}
!42 = !{!26, !6, i64 16}
!43 = !{!26, !10, i64 84}
!44 = !{!41, !10, i64 12}
!45 = !{i64 0, i64 4, !9, i64 4, i64 4, !9}
!46 = distinct !{!46, !47}
!47 = !{!"llvm.loop.mustprogress"}
!48 = !{!37, !6, i64 0}
!49 = distinct !{!49, !47}
!50 = distinct !{!50, !47}
!51 = !{!30, !6, i64 0}
!52 = distinct !{!52, !47}
!53 = !{!24, !13, i64 22}


; 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.extension_t = type { ptr, ptr, i32, %struct.dfs_code_t }
%struct.dfs_code_t = type { i16, i16, i32, i32, %struct.edge_label_t, i32 }
%struct.edge_label_t = type { i32, i32 }
%struct.neighbor_t = type { i16, %struct.edge_label_t, i32 }

@.str.5 = external hidden unnamed_addr constant [74 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [34 x i8], align 1
@__PRETTY_FUNCTION__.find_canonical_extension = external hidden unnamed_addr constant [65 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [77 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [75 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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @map(ptr noundef, ptr noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i16 @reverse_map(ptr noundef, ptr noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @rightmost_path_search(ptr noundef, i32 noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @contains_edge(ptr noundef, i16 noundef zeroext, i16 noundef zeroext, ptr noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local void @find_canonical_extension(ptr dead_on_unwind noalias writable sret(%struct.extension_t) align 8 %0, ptr nocapture noundef readonly %1, ptr noundef %2) local_unnamed_addr #4 {
  %4 = alloca %struct.dfs_code_t, align 4
  %5 = alloca %struct.dfs_code_t, align 4
  %6 = alloca %struct.dfs_code_t, align 4
  %7 = alloca %struct.dfs_code_t, align 4
  %8 = getelementptr inbounds i8, ptr %0, i64 20
  %.sroa.246.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 22
  store i16 -3, ptr %.sroa.246.0..sroa_idx, align 2, !tbaa !5
  %.sroa.347.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 24
  %.sroa.448.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 28
  %.sroa.549.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 32
  store <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, ptr %.sroa.347.0..sroa_idx, align 8, !tbaa !9
  %.sroa.7.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  store i32 2, ptr %.sroa.7.0..sroa_idx, align 8, !tbaa !9
  store i16 0, ptr %8, align 4, !tbaa !11
  %9 = getelementptr inbounds i8, ptr %2, i64 24
  %10 = load ptr, ptr %9, align 8, !tbaa !16
  %.07188 = load ptr, ptr %10, align 8, !tbaa !18
  %.not89 = icmp eq ptr %.07188, null
  br i1 %.not89, label %._crit_edge94.thread, label %.lr.ph93

.lr.ph93:                                         ; preds = %3
  %11 = getelementptr inbounds i8, ptr %2, i64 104
  %12 = getelementptr inbounds i8, ptr %2, i64 8
  %13 = getelementptr inbounds i8, ptr %4, i64 4
  %14 = getelementptr inbounds i8, ptr %2, i64 16
  %15 = getelementptr inbounds i8, ptr %2, i64 84
  %16 = getelementptr inbounds i8, ptr %4, i64 2
  %17 = getelementptr inbounds i8, ptr %4, i64 8
  %18 = getelementptr inbounds i8, ptr %4, i64 12
  %19 = getelementptr inbounds i8, ptr %4, i64 20
  br label %21

._crit_edge94:                                    ; preds = %.loopexit79
  %.pre = load i16, ptr %.sroa.246.0..sroa_idx, align 2, !tbaa !19
  %20 = icmp eq i16 %.pre, -3
  br i1 %20, label %._crit_edge94.thread, label %110

21:                                               ; preds = %.lr.ph93, %.loopexit79
  %.07191 = phi ptr [ %.07188, %.lr.ph93 ], [ %.071, %.loopexit79 ]
  %.090 = phi i32 [ 0, %.lr.ph93 ], [ %.1.lcssa, %.loopexit79 ]
  %22 = getelementptr inbounds i8, ptr %.07191, i64 8
  %23 = load ptr, ptr %22, align 8, !tbaa !20
  %24 = load i16, ptr %11, align 8, !tbaa !24
  %25 = call i32 @map(ptr noundef nonnull %10, ptr noundef %23, i16 noundef zeroext %24)
  %26 = load ptr, ptr %1, align 8, !tbaa !25
  %27 = getelementptr inbounds i8, ptr %26, i64 16
  %28 = load ptr, ptr %27, align 8, !tbaa !27
  %29 = and i32 %25, 65535
  %30 = zext nneg i32 %29 to i64
  %31 = getelementptr inbounds ptr, ptr %28, i64 %30
  %32 = load ptr, ptr %31, align 8, !tbaa !18
  %33 = getelementptr inbounds i8, ptr %26, i64 8
  %34 = load ptr, ptr %33, align 8, !tbaa !29
  %35 = getelementptr inbounds i32, ptr %34, i64 %30
  %36 = load i32, ptr %35, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %4) #5
  %37 = load i16, ptr %11, align 8, !tbaa !24
  store i16 %37, ptr %4, align 4, !tbaa !30
  %38 = load ptr, ptr %12, align 8, !tbaa !31
  %39 = zext i16 %37 to i64
  %40 = getelementptr inbounds i32, ptr %38, i64 %39
  %41 = load i32, ptr %40, align 4, !tbaa !9
  store i32 %41, ptr %13, align 4, !tbaa !32
  %.not95 = icmp eq i32 %36, 0
  br i1 %.not95, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %21
  %wide.trip.count = zext i32 %36 to i64
  br label %.lr.ph

._crit_edge:                                      ; preds = %67, %21
  %.1.lcssa = phi i32 [ %.090, %21 ], [ %.3, %67 ]
  %.not76 = icmp eq i32 %.1.lcssa, 0
  br i1 %.not76, label %68, label %.loopexit79

.lr.ph:                                           ; preds = %.lr.ph.preheader, %67
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %67 ]
  %.181 = phi i32 [ %.090, %.lr.ph.preheader ], [ %.3, %67 ]
  %42 = getelementptr inbounds %struct.neighbor_t, ptr %32, i64 %indvars.iv
  %43 = load i16, ptr %42, align 4, !tbaa !33
  %44 = call zeroext i16 @reverse_map(ptr noundef nonnull %10, ptr noundef %23, i16 noundef zeroext %43)
  %45 = icmp eq i16 %44, -1
  br i1 %45, label %67, label %46

46:                                               ; preds = %.lr.ph
  %47 = load ptr, ptr %14, align 8, !tbaa !35
  %48 = load i32, ptr %15, align 4, !tbaa !36
  %49 = call i32 @rightmost_path_search(ptr noundef %47, i32 noundef %48, i16 noundef zeroext %44)
  %50 = icmp eq i32 %49, -1
  br i1 %50, label %67, label %51

51:                                               ; preds = %46
  %52 = load i16, ptr %11, align 8, !tbaa !24
  %53 = getelementptr inbounds i8, ptr %42, i64 4
  %54 = getelementptr inbounds i8, ptr %42, i64 12
  %55 = load i32, ptr %54, align 4, !tbaa !37
  %56 = call i32 @contains_edge(ptr noundef nonnull %2, i16 noundef zeroext %52, i16 noundef zeroext %44, ptr noundef nonnull %53, i32 noundef %55)
  %.not78 = icmp eq i32 %56, 0
  br i1 %.not78, label %57, label %67

57:                                               ; preds = %51
  store i16 %44, ptr %16, align 2, !tbaa !38
  %58 = load ptr, ptr %12, align 8, !tbaa !31
  %59 = zext i16 %44 to i64
  %60 = getelementptr inbounds i32, ptr %58, i64 %59
  %61 = load i32, ptr %60, align 4, !tbaa !9
  store i32 %61, ptr %17, align 4, !tbaa !39
  %62 = load i64, ptr %53, align 4
  store i64 %62, ptr %18, align 4
  %63 = load i32, ptr %54, align 4, !tbaa !37
  store i32 %63, ptr %19, align 4, !tbaa !40
  %64 = call i32 @compare_code(ptr noundef nonnull %4, ptr noundef nonnull %8)
  %65 = icmp eq i32 %64, -1
  br i1 %65, label %66, label %67

66:                                               ; preds = %57
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) %8, ptr noundef nonnull align 4 dereferenceable(24) %4, i64 24, i1 false), !tbaa.struct !41
  br label %67

67:                                               ; preds = %57, %66, %51, %46, %.lr.ph
  %.3 = phi i32 [ %.181, %.lr.ph ], [ %.181, %46 ], [ %.181, %51 ], [ 1, %66 ], [ %.181, %57 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !42

68:                                               ; preds = %._crit_edge
  %69 = load i32, ptr %15, align 4, !tbaa !36
  %.not7785 = icmp eq i32 %69, 0
  br i1 %.not7785, label %.loopexit79, label %.lr.ph87.preheader

.lr.ph87.preheader:                               ; preds = %68
  %70 = zext i32 %69 to i64
  br label %.lr.ph87

.loopexit:                                        ; preds = %109, %.lr.ph87
  %.not77.wide = icmp eq i64 %71, 0
  br i1 %.not77.wide, label %.loopexit79, label %.lr.ph87, !llvm.loop !44

.lr.ph87:                                         ; preds = %.lr.ph87.preheader, %.loopexit
  %indvars.iv103 = phi i64 [ %70, %.lr.ph87.preheader ], [ %71, %.loopexit ]
  %71 = add nsw i64 %indvars.iv103, -1
  %72 = load ptr, ptr %14, align 8, !tbaa !35
  %73 = getelementptr inbounds i16, ptr %72, i64 %71
  %74 = load i16, ptr %73, align 2, !tbaa !5
  %75 = call i32 @map(ptr noundef nonnull %10, ptr noundef %23, i16 noundef zeroext %74)
  %76 = load ptr, ptr %1, align 8, !tbaa !25
  %77 = getelementptr inbounds i8, ptr %76, i64 16
  %78 = load ptr, ptr %77, align 8, !tbaa !27
  %79 = and i32 %75, 65535
  %80 = zext nneg i32 %79 to i64
  %81 = getelementptr inbounds ptr, ptr %78, i64 %80
  %82 = load ptr, ptr %81, align 8, !tbaa !18
  %83 = getelementptr inbounds i8, ptr %76, i64 8
  %84 = load ptr, ptr %83, align 8, !tbaa !29
  %85 = getelementptr inbounds i32, ptr %84, i64 %80
  %86 = load i32, ptr %85, align 4, !tbaa !9
  store i16 %74, ptr %4, align 4, !tbaa !30
  %87 = load ptr, ptr %76, align 8, !tbaa !45
  %88 = getelementptr inbounds i32, ptr %87, i64 %80
  %89 = load i32, ptr %88, align 4, !tbaa !9
  store i32 %89, ptr %13, align 4, !tbaa !32
  %.not96 = icmp eq i32 %86, 0
  br i1 %.not96, label %.loopexit, label %.lr.ph84.preheader

.lr.ph84.preheader:                               ; preds = %.lr.ph87
  %wide.trip.count101 = zext i32 %86 to i64
  br label %.lr.ph84

.lr.ph84:                                         ; preds = %.lr.ph84.preheader, %109
  %indvars.iv98 = phi i64 [ 0, %.lr.ph84.preheader ], [ %indvars.iv.next99, %109 ]
  %90 = getelementptr inbounds %struct.neighbor_t, ptr %82, i64 %indvars.iv98
  %91 = load i16, ptr %90, align 4, !tbaa !33
  %92 = call zeroext i16 @reverse_map(ptr noundef nonnull %10, ptr noundef %23, i16 noundef zeroext %91)
  %93 = icmp eq i16 %92, -1
  br i1 %93, label %94, label %109

94:                                               ; preds = %.lr.ph84
  %95 = load i16, ptr %11, align 8, !tbaa !24
  %96 = add i16 %95, 1
  store i16 %96, ptr %16, align 2, !tbaa !38
  %97 = load ptr, ptr %1, align 8, !tbaa !25
  %98 = load ptr, ptr %97, align 8, !tbaa !45
  %99 = zext i16 %91 to i64
  %100 = getelementptr inbounds i32, ptr %98, i64 %99
  %101 = load i32, ptr %100, align 4, !tbaa !9
  store i32 %101, ptr %17, align 4, !tbaa !39
  %102 = getelementptr inbounds i8, ptr %90, i64 4
  %103 = load i64, ptr %102, align 4
  store i64 %103, ptr %18, align 4
  %104 = getelementptr inbounds i8, ptr %90, i64 12
  %105 = load i32, ptr %104, align 4, !tbaa !37
  store i32 %105, ptr %19, align 4, !tbaa !40
  %106 = call i32 @compare_code(ptr noundef nonnull %4, ptr noundef nonnull %8)
  %107 = icmp eq i32 %106, -1
  br i1 %107, label %108, label %109

108:                                              ; preds = %94
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) %8, ptr noundef nonnull align 4 dereferenceable(24) %4, i64 24, i1 false), !tbaa.struct !41
  br label %109

109:                                              ; preds = %94, %108, %.lr.ph84
  %indvars.iv.next99 = add nuw nsw i64 %indvars.iv98, 1
  %exitcond102.not = icmp eq i64 %indvars.iv.next99, %wide.trip.count101
  br i1 %exitcond102.not, label %.loopexit, label %.lr.ph84, !llvm.loop !46

.loopexit79:                                      ; preds = %.loopexit, %68, %._crit_edge
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %4) #5
  %.071 = load ptr, ptr %.07191, align 8, !tbaa !18
  %.not = icmp eq ptr %.071, null
  br i1 %.not, label %._crit_edge94, label %21, !llvm.loop !47

._crit_edge94.thread:                             ; preds = %3, %._crit_edge94
  call void @__assert_fail(ptr noundef nonnull @.str.8, ptr noundef nonnull @.str.5, i32 noundef 2188, ptr noundef nonnull @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

110:                                              ; preds = %._crit_edge94
  store i16 -2, ptr %5, align 4, !tbaa !30
  %111 = getelementptr inbounds i8, ptr %5, i64 2
  store i16 -3, ptr %111, align 2, !tbaa !38
  %112 = getelementptr inbounds i8, ptr %5, i64 4
  %113 = getelementptr inbounds i8, ptr %5, i64 8
  store <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, ptr %112, align 4, !tbaa !9
  %114 = getelementptr inbounds i8, ptr %5, i64 20
  store i32 2, ptr %114, align 4, !tbaa !40
  %115 = call i32 @vertex_label_compare(ptr noundef nonnull %.sroa.448.0..sroa_idx, ptr noundef nonnull %113)
  %116 = icmp slt i32 %115, 0
  br i1 %116, label %118, label %117

117:                                              ; preds = %110
  call void @__assert_fail(ptr noundef nonnull @.str.9, ptr noundef nonnull @.str.5, i32 noundef 2189, ptr noundef nonnull @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

118:                                              ; preds = %110
  store i16 -2, ptr %6, align 4, !tbaa !30
  %119 = getelementptr inbounds i8, ptr %6, i64 2
  store i16 -3, ptr %119, align 2, !tbaa !38
  %120 = getelementptr inbounds i8, ptr %6, i64 4
  store <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, ptr %120, align 4, !tbaa !9
  %121 = getelementptr inbounds i8, ptr %6, i64 20
  store i32 2, ptr %121, align 4, !tbaa !40
  %122 = call i32 @vertex_label_compare(ptr noundef nonnull %.sroa.347.0..sroa_idx, ptr noundef nonnull %120)
  %123 = icmp slt i32 %122, 0
  br i1 %123, label %125, label %124

124:                                              ; preds = %118
  call void @__assert_fail(ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.5, i32 noundef 2190, ptr noundef nonnull @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

125:                                              ; preds = %118
  store i16 -2, ptr %7, align 4, !tbaa !30
  %126 = getelementptr inbounds i8, ptr %7, i64 2
  store i16 -3, ptr %126, align 2, !tbaa !38
  %127 = getelementptr inbounds i8, ptr %7, i64 4
  %128 = getelementptr inbounds i8, ptr %7, i64 12
  store <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, ptr %127, align 4, !tbaa !9
  %129 = getelementptr inbounds i8, ptr %7, i64 20
  store i32 2, ptr %129, align 4, !tbaa !40
  %130 = call i32 @edge_label_compare(ptr noundef nonnull %.sroa.549.0..sroa_idx, ptr noundef nonnull %128)
  %131 = icmp slt i32 %130, 0
  br i1 %131, label %133, label %132

132:                                              ; preds = %125
  call void @__assert_fail(ptr noundef nonnull @.str.11, ptr noundef nonnull @.str.5, i32 noundef 2191, ptr noundef nonnull @__PRETTY_FUNCTION__.find_canonical_extension) #6
  unreachable

133:                                              ; preds = %125
  ret void
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @compare_code(ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @vertex_label_compare(ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @edge_label_compare(ptr noundef, ptr noundef) local_unnamed_addr #1

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint 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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 #5 = { nounwind }
attributes #6 = { noreturn 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 = !{!"short", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 20}
!12 = !{!"extension_t", !13, i64 0, !13, i64 8, !10, i64 16, !14, i64 20}
!13 = !{!"any pointer", !7, i64 0}
!14 = !{!"dfs_code_t", !6, i64 0, !6, i64 2, !10, i64 4, !10, i64 8, !15, i64 12, !10, i64 20}
!15 = !{!"edge_label_t", !10, i64 0, !10, i64 4}
!16 = !{!17, !13, i64 24}
!17 = !{!"subgraph_t", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !13, i64 32, !13, i64 40, !13, i64 48, !13, i64 56, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !6, i64 104, !10, i64 108, !13, i64 112}
!18 = !{!13, !13, i64 0}
!19 = !{!12, !6, i64 22}
!20 = !{!21, !13, i64 8}
!21 = !{!"mapping_t", !13, i64 0, !13, i64 8, !10, i64 16, !22, i64 20}
!22 = !{!"mapping_info_t", !10, i64 0, !23, i64 4}
!23 = !{!"float", !7, i64 0}
!24 = !{!17, !6, i64 104}
!25 = !{!26, !13, i64 0}
!26 = !{!"database_t", !13, i64 0, !10, i64 8, !10, i64 12, !10, i64 16}
!27 = !{!28, !13, i64 16}
!28 = !{!"database_entry_t", !13, i64 0, !13, i64 8, !13, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36}
!29 = !{!28, !13, i64 8}
!30 = !{!14, !6, i64 0}
!31 = !{!17, !13, i64 8}
!32 = !{!14, !10, i64 4}
!33 = !{!34, !6, i64 0}
!34 = !{!"neighbor_t", !6, i64 0, !15, i64 4, !10, i64 12}
!35 = !{!17, !13, i64 16}
!36 = !{!17, !10, i64 84}
!37 = !{!34, !10, i64 12}
!38 = !{!14, !6, i64 2}
!39 = !{!14, !10, i64 8}
!40 = !{!14, !10, i64 20}
!41 = !{i64 0, i64 2, !5, i64 2, i64 2, !5, i64 4, i64 4, !9, i64 8, i64 4, !9, i64 12, i64 4, !9, i64 16, i64 4, !9, i64 20, i64 4, !9}
!42 = distinct !{!42, !43}
!43 = !{!"llvm.loop.mustprogress"}
!44 = distinct !{!44, !43}
!45 = !{!28, !13, i64 0}
!46 = distinct !{!46, !43}
!47 = distinct !{!47, !43}


; Effective O3 passes: CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass