; LLVM IR from fmela/libdict :: benchmark (main)

; 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.rusage = type { %struct.timeval, %struct.timeval, %union.anon, %union.anon.0, %union.anon.1, %union.anon.2, %union.anon.3, %union.anon.4, %union.anon.5, %union.anon.6, %union.anon.7, %union.anon.8, %union.anon.9, %union.anon.10, %union.anon.11, %union.anon.12 }
%struct.timeval = type { i64, i64 }
%union.anon = type { i64 }
%union.anon.0 = type { i64 }
%union.anon.1 = type { i64 }
%union.anon.2 = type { i64 }
%union.anon.3 = type { i64 }
%union.anon.4 = type { i64 }
%union.anon.5 = type { i64 }
%union.anon.6 = type { i64 }
%union.anon.7 = type { i64 }
%union.anon.8 = type { i64 }
%union.anon.9 = type { i64 }
%union.anon.10 = type { i64 }
%union.anon.11 = type { i64 }
%union.anon.12 = type { i64 }
%struct.dict_insert_result = type { ptr, i8 }
%struct.dict_remove_result = type { ptr, ptr, i8 }
%struct.dict = type { ptr, ptr }
%struct.dict_vtable = type { i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.tree_base = type { ptr, i64, ptr, i64 }
%struct.dict_itor = type { ptr, ptr }
%struct.itor_vtable = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

@stderr = external global ptr, align 8
@.str.4 = external hidden unnamed_addr constant [26 x i8], align 1
@appname = external hidden constant [10 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [55 x i8], align 1
@dict_malloc_func = external global ptr, align 8
@.str.16 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [59 x i8], align 1
@__func__.main = external hidden unnamed_addr constant [5 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [17 x i8], align 1
@comp_count = external hidden global i64, align 8
@.str.20 = external hidden unnamed_addr constant [16 x i8], align 1
@hash_count = external hidden global i64, align 8
@.str.21 = external hidden unnamed_addr constant [16 x i8], align 1
@malloced = external hidden global i64, align 8
@.str.22 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [23 x i8], align 1
@dict_free_func = external global ptr, align 8

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @main(i32 noundef %0, ptr noundef %1) #0 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i8, align 1
  %7 = alloca i8, align 1
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i64, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca [512 x i8], align 16
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca %struct.rusage, align 8
  %20 = alloca %struct.rusage, align 8
  %21 = alloca %struct.timeval, align 8
  %22 = alloca i32, align 4
  %23 = alloca %struct.dict_insert_result, align 8
  %24 = alloca ptr, align 8
  %25 = alloca [16 x i64], align 16
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca ptr, align 8
  %31 = alloca i32, align 4
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca %struct.dict_remove_result, align 8
  %38 = alloca ptr, align 8
  store i32 0, ptr %3, align 4
  store i32 %0, ptr %4, align 4, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %6) #11
  store i8 1, ptr %6, align 1, !tbaa !11
  %39 = load i32, ptr %4, align 4, !tbaa !5
  %40 = icmp ne i32 %39, 3
  br i1 %40, label %41, label %66

41:                                               ; preds = %2
  %42 = load ptr, ptr @stderr, align 8, !tbaa !9
  %43 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %42, ptr noundef @.str.4, ptr noundef @appname) #11
  %44 = load ptr, ptr @stderr, align 8, !tbaa !9
  %45 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %44, ptr noundef @.str.5) #11
  %46 = load ptr, ptr @stderr, align 8, !tbaa !9
  %47 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %46, ptr noundef @.str.6) #11
  %48 = load ptr, ptr @stderr, align 8, !tbaa !9
  %49 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %48, ptr noundef @.str.7) #11
  %50 = load ptr, ptr @stderr, align 8, !tbaa !9
  %51 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %50, ptr noundef @.str.8) #11
  %52 = load ptr, ptr @stderr, align 8, !tbaa !9
  %53 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %52, ptr noundef @.str.9) #11
  %54 = load ptr, ptr @stderr, align 8, !tbaa !9
  %55 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %54, ptr noundef @.str.10) #11
  %56 = load ptr, ptr @stderr, align 8, !tbaa !9
  %57 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %56, ptr noundef @.str.11) #11
  %58 = load ptr, ptr @stderr, align 8, !tbaa !9
  %59 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %58, ptr noundef @.str.12) #11
  %60 = load ptr, ptr @stderr, align 8, !tbaa !9
  %61 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %60, ptr noundef @.str.13) #11
  %62 = load ptr, ptr @stderr, align 8, !tbaa !9
  %63 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %62, ptr noundef @.str.14) #11
  %64 = load ptr, ptr @stderr, align 8, !tbaa !9
  %65 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %64, ptr noundef @.str.15) #11
  call void @exit(i32 noundef 1) #12
  unreachable

66:                                               ; preds = %2
  call void @srand(i32 noundef -559038737) #11
  store ptr @xmalloc, ptr @dict_malloc_func, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %7) #11
  %67 = load ptr, ptr %5, align 8, !tbaa !9
  %68 = getelementptr inbounds ptr, ptr %67, i64 1
  %69 = load ptr, ptr %68, align 8, !tbaa !9
  %70 = getelementptr inbounds i8, ptr %69, i64 0
  %71 = load i8, ptr %70, align 1, !tbaa !13
  store i8 %71, ptr %7, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #11
  store ptr null, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #11
  %72 = load i8, ptr %7, align 1, !tbaa !13
  %73 = call ptr @create_dictionary(i8 noundef signext %72, ptr noundef %8)
  store ptr %73, ptr %9, align 8, !tbaa !9
  %74 = load ptr, ptr %9, align 8, !tbaa !9
  %75 = icmp ne ptr %74, null
  br i1 %75, label %77, label %76

76:                                               ; preds = %66
  call void (ptr, ...) @quit(ptr noundef @.str.16) #13
  unreachable

77:                                               ; preds = %66
  br label %78

78:                                               ; preds = %77
  %79 = load ptr, ptr %9, align 8, !tbaa !9
  %80 = getelementptr inbounds %struct.dict, ptr %79, i32 0, i32 1
  %81 = load ptr, ptr %80, align 8, !tbaa !14
  %82 = getelementptr inbounds %struct.dict_vtable, ptr %81, i32 0, i32 14
  %83 = load ptr, ptr %82, align 8, !tbaa !16
  %84 = load ptr, ptr %9, align 8, !tbaa !9
  %85 = getelementptr inbounds %struct.dict, ptr %84, i32 0, i32 0
  %86 = load ptr, ptr %85, align 8, !tbaa !18
  %87 = call zeroext i1 %83(ptr noundef %86)
  %88 = zext i1 %87 to i64
  %89 = call i64 @llvm.expect.i64(i64 %88, i64 1)
  %90 = icmp ne i64 %89, 0
  br i1 %90, label %94, label %91

91:                                               ; preds = %78
  %92 = load ptr, ptr @stderr, align 8, !tbaa !9
  %93 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %92, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 85, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

94:                                               ; preds = %78
  br label %95

95:                                               ; preds = %94
  br label %96

96:                                               ; preds = %95
  br label %97

97:                                               ; preds = %96
  %98 = load i64, ptr @comp_count, align 8, !tbaa !19
  %99 = icmp eq i64 %98, 0
  %100 = zext i1 %99 to i32
  %101 = sext i32 %100 to i64
  %102 = call i64 @llvm.expect.i64(i64 %101, i64 1)
  %103 = icmp ne i64 %102, 0
  br i1 %103, label %107, label %104

104:                                              ; preds = %97
  %105 = load ptr, ptr @stderr, align 8, !tbaa !9
  %106 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %105, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 86, ptr noundef @__func__.main, ptr noundef @.str.20) #11
  call void @abort() #12
  unreachable

107:                                              ; preds = %97
  br label %108

108:                                              ; preds = %107
  br label %109

109:                                              ; preds = %108
  br label %110

110:                                              ; preds = %109
  %111 = load i64, ptr @hash_count, align 8, !tbaa !19
  %112 = icmp eq i64 %111, 0
  %113 = zext i1 %112 to i32
  %114 = sext i32 %113 to i64
  %115 = call i64 @llvm.expect.i64(i64 %114, i64 1)
  %116 = icmp ne i64 %115, 0
  br i1 %116, label %120, label %117

117:                                              ; preds = %110
  %118 = load ptr, ptr @stderr, align 8, !tbaa !9
  %119 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %118, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 87, ptr noundef @__func__.main, ptr noundef @.str.21) #11
  call void @abort() #12
  unreachable

120:                                              ; preds = %110
  br label %121

121:                                              ; preds = %120
  br label %122

122:                                              ; preds = %121
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #11
  %123 = load i64, ptr @malloced, align 8, !tbaa !19
  store i64 %123, ptr %10, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #11
  %124 = load ptr, ptr %5, align 8, !tbaa !9
  %125 = getelementptr inbounds ptr, ptr %124, i64 2
  %126 = load ptr, ptr %125, align 8, !tbaa !9
  %127 = call noalias ptr @fopen(ptr noundef %126, ptr noundef @.str.22)
  store ptr %127, ptr %11, align 8, !tbaa !9
  %128 = load ptr, ptr %11, align 8, !tbaa !9
  %129 = icmp eq ptr %128, null
  br i1 %129, label %130, label %137

130:                                              ; preds = %122
  %131 = load ptr, ptr %5, align 8, !tbaa !9
  %132 = getelementptr inbounds ptr, ptr %131, i64 2
  %133 = load ptr, ptr %132, align 8, !tbaa !9
  %134 = call ptr @__errno_location() #14
  %135 = load i32, ptr %134, align 4, !tbaa !5
  %136 = call ptr @strerror(i32 noundef %135) #11
  call void (ptr, ...) @quit(ptr noundef @.str.23, ptr noundef %133, ptr noundef %136) #13
  unreachable

137:                                              ; preds = %122
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #11
  store i64 0, ptr %12, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 512, ptr %13) #11
  br label %138

138:                                              ; preds = %143, %137
  %139 = getelementptr inbounds [512 x i8], ptr %13, i64 0, i64 0
  %140 = load ptr, ptr %11, align 8, !tbaa !9
  %141 = call ptr @fgets(ptr noundef %139, i32 noundef 512, ptr noundef %140)
  %142 = icmp ne ptr %141, null
  br i1 %142, label %143, label %146

143:                                              ; preds = %138
  %144 = load i64, ptr %12, align 8, !tbaa !19
  %145 = add i64 %144, 1
  store i64 %145, ptr %12, align 8, !tbaa !19
  br label %138, !llvm.loop !21

146:                                              ; preds = %138
  %147 = load i64, ptr %12, align 8, !tbaa !19
  %148 = icmp ne i64 %147, 0
  br i1 %148, label %150, label %149

149:                                              ; preds = %146
  call void (ptr, ...) @quit(ptr noundef @.str.24) #13
  unreachable

150:                                              ; preds = %146
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #11
  %151 = load i64, ptr %12, align 8, !tbaa !19
  %152 = mul i64 8, %151
  %153 = call ptr @xmalloc(i64 noundef %152)
  store ptr %153, ptr %14, align 8, !tbaa !9
  %154 = load ptr, ptr %11, align 8, !tbaa !9
  call void @rewind(ptr noundef %154)
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #11
  store i64 0, ptr %15, align 8, !tbaa !19
  br label %155

155:                                              ; preds = %166, %150
  %156 = load i64, ptr %15, align 8, !tbaa !19
  %157 = load i64, ptr %12, align 8, !tbaa !19
  %158 = icmp ult i64 %156, %157
  br i1 %158, label %159, label %164

159:                                              ; preds = %155
  %160 = getelementptr inbounds [512 x i8], ptr %13, i64 0, i64 0
  %161 = load ptr, ptr %11, align 8, !tbaa !9
  %162 = call ptr @fgets(ptr noundef %160, i32 noundef 512, ptr noundef %161)
  %163 = icmp ne ptr %162, null
  br label %164

164:                                              ; preds = %159, %155
  %165 = phi i1 [ false, %155 ], [ %163, %159 ]
  br i1 %165, label %166, label %175

166:                                              ; preds = %164
  %167 = getelementptr inbounds [512 x i8], ptr %13, i64 0, i64 0
  %168 = call ptr @strtok(ptr noundef %167, ptr noundef @.str.25) #11
  %169 = getelementptr inbounds [512 x i8], ptr %13, i64 0, i64 0
  %170 = call ptr @xstrdup(ptr noundef %169)
  %171 = load ptr, ptr %14, align 8, !tbaa !9
  %172 = load i64, ptr %15, align 8, !tbaa !19
  %173 = add i64 %172, 1
  store i64 %173, ptr %15, align 8, !tbaa !19
  %174 = getelementptr inbounds ptr, ptr %171, i64 %172
  store ptr %170, ptr %174, align 8, !tbaa !9
  br label %155, !llvm.loop !23

175:                                              ; preds = %164
  %176 = load ptr, ptr %11, align 8, !tbaa !9
  %177 = call i32 @fclose(ptr noundef %176)
  %178 = load i64, ptr %15, align 8, !tbaa !19
  %179 = load i64, ptr %12, align 8, !tbaa !19
  %180 = icmp ult i64 %178, %179
  br i1 %180, label %181, label %184

181:                                              ; preds = %175
  %182 = load i64, ptr %15, align 8, !tbaa !19
  %183 = load i64, ptr %12, align 8, !tbaa !19
  call void (ptr, ...) @quit(ptr noundef @.str.26, i64 noundef %182, i64 noundef %183) #13
  unreachable

184:                                              ; preds = %175
  %185 = load i64, ptr %12, align 8, !tbaa !19
  %186 = load ptr, ptr %5, align 8, !tbaa !9
  %187 = getelementptr inbounds ptr, ptr %186, i64 2
  %188 = load ptr, ptr %187, align 8, !tbaa !9
  %189 = call i32 (ptr, ...) @printf(ptr noundef @.str.27, i64 noundef %185, ptr noundef %188)
  %190 = load i64, ptr %10, align 8, !tbaa !19
  store i64 %190, ptr @malloced, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #11
  store i64 0, ptr %16, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #11
  store i64 0, ptr %17, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #11
  store i64 0, ptr %18, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 144, ptr %19) #11
  call void @llvm.lifetime.start.p0(i64 144, ptr %20) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %21) #11
  call void @llvm.memset.p0.i64(ptr align 8 %21, i8 0, i64 16, i1 false)
  call void @timer_start(ptr noundef %19)
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #11
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %191

191:                                              ; preds = %263, %184
  %192 = load i32, ptr %22, align 4, !tbaa !5
  %193 = zext i32 %192 to i64
  %194 = load i64, ptr %12, align 8, !tbaa !19
  %195 = icmp ult i64 %193, %194
  br i1 %195, label %197, label %196

196:                                              ; preds = %191
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #11
  br label %266

197:                                              ; preds = %191
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #11
  %198 = load ptr, ptr %9, align 8, !tbaa !9
  %199 = getelementptr inbounds %struct.dict, ptr %198, i32 0, i32 1
  %200 = load ptr, ptr %199, align 8, !tbaa !14
  %201 = getelementptr inbounds %struct.dict_vtable, ptr %200, i32 0, i32 3
  %202 = load ptr, ptr %201, align 8, !tbaa !24
  %203 = load ptr, ptr %9, align 8, !tbaa !9
  %204 = getelementptr inbounds %struct.dict, ptr %203, i32 0, i32 0
  %205 = load ptr, ptr %204, align 8, !tbaa !18
  %206 = load ptr, ptr %14, align 8, !tbaa !9
  %207 = load i32, ptr %22, align 4, !tbaa !5
  %208 = zext i32 %207 to i64
  %209 = getelementptr inbounds ptr, ptr %206, i64 %208
  %210 = load ptr, ptr %209, align 8, !tbaa !9
  %211 = call { ptr, i8 } %202(ptr noundef %205, ptr noundef %210)
  %212 = getelementptr inbounds { ptr, i8 }, ptr %23, i32 0, i32 0
  %213 = extractvalue { ptr, i8 } %211, 0
  store ptr %213, ptr %212, align 8
  %214 = getelementptr inbounds { ptr, i8 }, ptr %23, i32 0, i32 1
  %215 = extractvalue { ptr, i8 } %211, 1
  store i8 %215, ptr %214, align 8
  %216 = getelementptr inbounds %struct.dict_insert_result, ptr %23, i32 0, i32 1
  %217 = load i8, ptr %216, align 8, !tbaa !25, !range !27, !noundef !28
  %218 = trunc i8 %217 to i1
  br i1 %218, label %226, label %219

219:                                              ; preds = %197
  %220 = load i32, ptr %22, align 4, !tbaa !5
  %221 = load ptr, ptr %14, align 8, !tbaa !9
  %222 = load i32, ptr %22, align 4, !tbaa !5
  %223 = zext i32 %222 to i64
  %224 = getelementptr inbounds ptr, ptr %221, i64 %223
  %225 = load ptr, ptr %224, align 8, !tbaa !9
  call void (ptr, ...) @quit(ptr noundef @.str.28, i32 noundef %220, ptr noundef %225) #13
  unreachable

226:                                              ; preds = %197
  br label %227

227:                                              ; preds = %226
  %228 = getelementptr inbounds %struct.dict_insert_result, ptr %23, i32 0, i32 0
  %229 = load ptr, ptr %228, align 8, !tbaa !29
  %230 = icmp ne ptr %229, null
  %231 = zext i1 %230 to i32
  %232 = sext i32 %231 to i64
  %233 = call i64 @llvm.expect.i64(i64 %232, i64 1)
  %234 = icmp ne i64 %233, 0
  br i1 %234, label %238, label %235

235:                                              ; preds = %227
  %236 = load ptr, ptr @stderr, align 8, !tbaa !9
  %237 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %236, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 126, ptr noundef @__func__.main, ptr noundef @.str.29) #11
  call void @abort() #12
  unreachable

238:                                              ; preds = %227
  br label %239

239:                                              ; preds = %238
  br label %240

240:                                              ; preds = %239
  br label %241

241:                                              ; preds = %240
  %242 = getelementptr inbounds %struct.dict_insert_result, ptr %23, i32 0, i32 0
  %243 = load ptr, ptr %242, align 8, !tbaa !29
  %244 = load ptr, ptr %243, align 8, !tbaa !9
  %245 = icmp eq ptr %244, null
  %246 = zext i1 %245 to i32
  %247 = sext i32 %246 to i64
  %248 = call i64 @llvm.expect.i64(i64 %247, i64 1)
  %249 = icmp ne i64 %248, 0
  br i1 %249, label %253, label %250

250:                                              ; preds = %241
  %251 = load ptr, ptr @stderr, align 8, !tbaa !9
  %252 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %251, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 127, ptr noundef @__func__.main, ptr noundef @.str.30) #11
  call void @abort() #12
  unreachable

253:                                              ; preds = %241
  br label %254

254:                                              ; preds = %253
  br label %255

255:                                              ; preds = %254
  %256 = load ptr, ptr %14, align 8, !tbaa !9
  %257 = load i32, ptr %22, align 4, !tbaa !5
  %258 = zext i32 %257 to i64
  %259 = getelementptr inbounds ptr, ptr %256, i64 %258
  %260 = load ptr, ptr %259, align 8, !tbaa !9
  %261 = getelementptr inbounds %struct.dict_insert_result, ptr %23, i32 0, i32 0
  %262 = load ptr, ptr %261, align 8, !tbaa !29
  store ptr %260, ptr %262, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #11
  br label %263

263:                                              ; preds = %255
  %264 = load i32, ptr %22, align 4, !tbaa !5
  %265 = add i32 %264, 1
  store i32 %265, ptr %22, align 4, !tbaa !5
  br label %191, !llvm.loop !30

266:                                              ; preds = %196
  call void @timer_end(ptr noundef %19, ptr noundef %20, ptr noundef %21)
  %267 = load ptr, ptr %8, align 8, !tbaa !9
  %268 = load i64, ptr %10, align 8, !tbaa !19
  %269 = uitofp i64 %268 to double
  %270 = fmul double %269, 1.000000e-03
  %271 = call i32 (ptr, ...) @printf(ptr noundef @.str.31, ptr noundef %267, double noundef %270)
  %272 = load ptr, ptr %8, align 8, !tbaa !9
  %273 = load i64, ptr @malloced, align 8, !tbaa !19
  %274 = uitofp i64 %273 to double
  %275 = fmul double %274, 1.000000e-03
  %276 = call i32 (ptr, ...) @printf(ptr noundef @.str.32, ptr noundef %272, double noundef %275)
  %277 = load ptr, ptr %8, align 8, !tbaa !9
  %278 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %279 = getelementptr inbounds %struct.timeval, ptr %278, i32 0, i32 0
  %280 = load i64, ptr %279, align 8, !tbaa !31
  %281 = mul nsw i64 %280, 1000000
  %282 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %283 = getelementptr inbounds %struct.timeval, ptr %282, i32 0, i32 1
  %284 = load i64, ptr %283, align 8, !tbaa !34
  %285 = add nsw i64 %281, %284
  %286 = sitofp i64 %285 to double
  %287 = fmul double %286, 0x3EB0C6F7A0B5ED8D
  %288 = load i64, ptr @comp_count, align 8, !tbaa !19
  %289 = load i64, ptr @comp_count, align 8, !tbaa !19
  %290 = uitofp i64 %289 to double
  %291 = load i64, ptr %12, align 8, !tbaa !19
  %292 = uitofp i64 %291 to double
  %293 = fdiv double %290, %292
  %294 = call i32 (ptr, ...) @printf(ptr noundef @.str.33, ptr noundef %277, double noundef %287, i64 noundef %288, double noundef %293)
  %295 = load i64, ptr @hash_count, align 8, !tbaa !19
  %296 = icmp ne i64 %295, 0
  br i1 %296, label %297, label %300

297:                                              ; preds = %266
  %298 = load i64, ptr @hash_count, align 8, !tbaa !19
  %299 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, i64 noundef %298)
  br label %300

300:                                              ; preds = %297, %266
  %301 = call i32 (ptr, ...) @printf(ptr noundef @.str.25)
  %302 = load i64, ptr @comp_count, align 8, !tbaa !19
  %303 = load i64, ptr %16, align 8, !tbaa !19
  %304 = add i64 %303, %302
  store i64 %304, ptr %16, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  %305 = load i64, ptr @hash_count, align 8, !tbaa !19
  %306 = load i64, ptr %17, align 8, !tbaa !19
  %307 = add i64 %306, %305
  store i64 %307, ptr %17, align 8, !tbaa !19
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  %308 = load ptr, ptr %9, align 8, !tbaa !9
  %309 = getelementptr inbounds %struct.dict, ptr %308, i32 0, i32 1
  %310 = load ptr, ptr %309, align 8, !tbaa !14
  %311 = getelementptr inbounds %struct.dict_vtable, ptr %310, i32 0, i32 0
  %312 = load i8, ptr %311, align 8, !tbaa !35, !range !27, !noundef !28
  %313 = trunc i8 %312 to i1
  br i1 %313, label %314, label %342

314:                                              ; preds = %300
  %315 = load i8, ptr %7, align 1, !tbaa !13
  %316 = sext i8 %315 to i32
  %317 = icmp ne i32 %316, 83
  br i1 %317, label %318, label %342

318:                                              ; preds = %314
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #11
  %319 = load ptr, ptr %9, align 8, !tbaa !9
  %320 = getelementptr inbounds %struct.dict, ptr %319, i32 0, i32 0
  %321 = load ptr, ptr %320, align 8, !tbaa !18
  store ptr %321, ptr %24, align 8, !tbaa !9
  %322 = load ptr, ptr %24, align 8, !tbaa !9
  %323 = call i64 @tree_min_path_length(ptr noundef %322)
  %324 = call i32 (ptr, ...) @printf(ptr noundef @.str.35, i64 noundef %323)
  %325 = load ptr, ptr %24, align 8, !tbaa !9
  %326 = call i64 @tree_max_path_length(ptr noundef %325)
  %327 = call i32 (ptr, ...) @printf(ptr noundef @.str.36, i64 noundef %326)
  %328 = load ptr, ptr %24, align 8, !tbaa !9
  %329 = call i64 @tree_total_path_length(ptr noundef %328)
  %330 = call i32 (ptr, ...) @printf(ptr noundef @.str.37, i64 noundef %329)
  %331 = load ptr, ptr %24, align 8, !tbaa !9
  %332 = getelementptr inbounds %struct.tree_base, ptr %331, i32 0, i32 3
  %333 = load i64, ptr %332, align 8, !tbaa !36
  %334 = call i32 (ptr, ...) @printf(ptr noundef @.str.38, i64 noundef %333)
  %335 = load ptr, ptr %24, align 8, !tbaa !9
  %336 = getelementptr inbounds %struct.tree_base, ptr %335, i32 0, i32 3
  %337 = load i64, ptr %336, align 8, !tbaa !36
  %338 = load i64, ptr %18, align 8, !tbaa !19
  %339 = add i64 %338, %337
  store i64 %339, ptr %18, align 8, !tbaa !19
  %340 = load ptr, ptr %24, align 8, !tbaa !9
  %341 = getelementptr inbounds %struct.tree_base, ptr %340, i32 0, i32 3
  store i64 0, ptr %341, align 8, !tbaa !36
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #11
  br label %387

342:                                              ; preds = %314, %300
  %343 = load i8, ptr %7, align 1, !tbaa !13
  %344 = sext i8 %343 to i32
  %345 = icmp eq i32 %344, 83
  br i1 %345, label %346, label %386

346:                                              ; preds = %342
  call void @llvm.lifetime.start.p0(i64 128, ptr %25) #11
  call void @llvm.memset.p0.i64(ptr align 16 %25, i8 0, i64 128, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #11
  %347 = load ptr, ptr %9, align 8, !tbaa !9
  %348 = getelementptr inbounds %struct.dict, ptr %347, i32 0, i32 0
  %349 = load ptr, ptr %348, align 8, !tbaa !18
  %350 = getelementptr inbounds [16 x i64], ptr %25, i64 0, i64 0
  %351 = call i64 @skiplist_link_count_histogram(ptr noundef %349, ptr noundef %350, i64 noundef 16)
  store i64 %351, ptr %26, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #11
  store i64 0, ptr %27, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #11
  store i64 0, ptr %28, align 8, !tbaa !19
  br label %352

352:                                              ; preds = %368, %346
  %353 = load i64, ptr %28, align 8, !tbaa !19
  %354 = load i64, ptr %26, align 8, !tbaa !19
  %355 = icmp ule i64 %353, %354
  br i1 %355, label %357, label %356

356:                                              ; preds = %352
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #11
  br label %371

357:                                              ; preds = %352
  %358 = load i64, ptr %28, align 8, !tbaa !19
  %359 = load i64, ptr %28, align 8, !tbaa !19
  %360 = getelementptr inbounds [16 x i64], ptr %25, i64 0, i64 %359
  %361 = load i64, ptr %360, align 8, !tbaa !19
  %362 = call i32 (ptr, ...) @printf(ptr noundef @.str.39, i64 noundef %358, i64 noundef %361)
  %363 = load i64, ptr %28, align 8, !tbaa !19
  %364 = getelementptr inbounds [16 x i64], ptr %25, i64 0, i64 %363
  %365 = load i64, ptr %364, align 8, !tbaa !19
  %366 = load i64, ptr %27, align 8, !tbaa !19
  %367 = add i64 %366, %365
  store i64 %367, ptr %27, align 8, !tbaa !19
  br label %368

368:                                              ; preds = %357
  %369 = load i64, ptr %28, align 8, !tbaa !19
  %370 = add i64 %369, 1
  store i64 %370, ptr %28, align 8, !tbaa !19
  br label %352, !llvm.loop !38

371:                                              ; preds = %356
  br label %372

372:                                              ; preds = %371
  %373 = load i64, ptr %27, align 8, !tbaa !19
  %374 = load i64, ptr %12, align 8, !tbaa !19
  %375 = icmp eq i64 %373, %374
  %376 = zext i1 %375 to i32
  %377 = sext i32 %376 to i64
  %378 = call i64 @llvm.expect.i64(i64 %377, i64 1)
  %379 = icmp ne i64 %378, 0
  br i1 %379, label %383, label %380

380:                                              ; preds = %372
  %381 = load ptr, ptr @stderr, align 8, !tbaa !9
  %382 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %381, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 158, ptr noundef @__func__.main, ptr noundef @.str.40) #11
  call void @abort() #12
  unreachable

383:                                              ; preds = %372
  br label %384

384:                                              ; preds = %383
  br label %385

385:                                              ; preds = %384
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  call void @llvm.lifetime.end.p0(i64 128, ptr %25) #11
  br label %386

386:                                              ; preds = %385, %342
  br label %387

387:                                              ; preds = %386, %318
  br label %388

388:                                              ; preds = %387
  %389 = load ptr, ptr %9, align 8, !tbaa !9
  %390 = getelementptr inbounds %struct.dict, ptr %389, i32 0, i32 1
  %391 = load ptr, ptr %390, align 8, !tbaa !14
  %392 = getelementptr inbounds %struct.dict_vtable, ptr %391, i32 0, i32 14
  %393 = load ptr, ptr %392, align 8, !tbaa !16
  %394 = load ptr, ptr %9, align 8, !tbaa !9
  %395 = getelementptr inbounds %struct.dict, ptr %394, i32 0, i32 0
  %396 = load ptr, ptr %395, align 8, !tbaa !18
  %397 = call zeroext i1 %393(ptr noundef %396)
  %398 = zext i1 %397 to i64
  %399 = call i64 @llvm.expect.i64(i64 %398, i64 1)
  %400 = icmp ne i64 %399, 0
  br i1 %400, label %404, label %401

401:                                              ; preds = %388
  %402 = load ptr, ptr @stderr, align 8, !tbaa !9
  %403 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %402, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 161, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

404:                                              ; preds = %388
  br label %405

405:                                              ; preds = %404
  br label %406

406:                                              ; preds = %405
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #11
  %407 = load ptr, ptr %9, align 8, !tbaa !9
  %408 = getelementptr inbounds %struct.dict, ptr %407, i32 0, i32 1
  %409 = load ptr, ptr %408, align 8, !tbaa !14
  %410 = getelementptr inbounds %struct.dict_vtable, ptr %409, i32 0, i32 13
  %411 = load ptr, ptr %410, align 8, !tbaa !39
  %412 = load ptr, ptr %9, align 8, !tbaa !9
  %413 = getelementptr inbounds %struct.dict, ptr %412, i32 0, i32 0
  %414 = load ptr, ptr %413, align 8, !tbaa !18
  %415 = call i64 %411(ptr noundef %414)
  store i64 %415, ptr %29, align 8, !tbaa !19
  %416 = load i64, ptr %29, align 8, !tbaa !19
  %417 = load i64, ptr %12, align 8, !tbaa !19
  %418 = icmp ne i64 %416, %417
  br i1 %418, label %419, label %422

419:                                              ; preds = %406
  %420 = load i64, ptr %29, align 8, !tbaa !19
  %421 = load i64, ptr %12, align 8, !tbaa !19
  call void (ptr, ...) @quit(ptr noundef @.str.41, i64 noundef %420, i64 noundef %421) #13
  unreachable

422:                                              ; preds = %406
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #11
  %423 = load ptr, ptr %9, align 8, !tbaa !9
  %424 = getelementptr inbounds %struct.dict, ptr %423, i32 0, i32 1
  %425 = load ptr, ptr %424, align 8, !tbaa !14
  %426 = getelementptr inbounds %struct.dict_vtable, ptr %425, i32 0, i32 1
  %427 = load ptr, ptr %426, align 8, !tbaa !40
  %428 = load ptr, ptr %9, align 8, !tbaa !9
  %429 = getelementptr inbounds %struct.dict, ptr %428, i32 0, i32 0
  %430 = load ptr, ptr %429, align 8, !tbaa !18
  %431 = call ptr %427(ptr noundef %430)
  store ptr %431, ptr %30, align 8, !tbaa !9
  call void @timer_start(ptr noundef %19)
  store i64 0, ptr %29, align 8, !tbaa !19
  br label %432

432:                                              ; preds = %422
  %433 = load ptr, ptr %30, align 8, !tbaa !9
  %434 = getelementptr inbounds %struct.dict_itor, ptr %433, i32 0, i32 1
  %435 = load ptr, ptr %434, align 8, !tbaa !41
  %436 = getelementptr inbounds %struct.itor_vtable, ptr %435, i32 0, i32 7
  %437 = load ptr, ptr %436, align 8, !tbaa !43
  %438 = load ptr, ptr %30, align 8, !tbaa !9
  %439 = getelementptr inbounds %struct.dict_itor, ptr %438, i32 0, i32 0
  %440 = load ptr, ptr %439, align 8, !tbaa !45
  %441 = call zeroext i1 %437(ptr noundef %440)
  %442 = zext i1 %441 to i64
  %443 = call i64 @llvm.expect.i64(i64 %442, i64 1)
  %444 = icmp ne i64 %443, 0
  br i1 %444, label %448, label %445

445:                                              ; preds = %432
  %446 = load ptr, ptr @stderr, align 8, !tbaa !9
  %447 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %446, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 172, ptr noundef @__func__.main, ptr noundef @.str.42) #11
  call void @abort() #12
  unreachable

448:                                              ; preds = %432
  br label %449

449:                                              ; preds = %448
  br label %450

450:                                              ; preds = %449
  br label %451

451:                                              ; preds = %504, %450
  br label %452

452:                                              ; preds = %451
  %453 = load ptr, ptr %30, align 8, !tbaa !9
  %454 = getelementptr inbounds %struct.dict_itor, ptr %453, i32 0, i32 1
  %455 = load ptr, ptr %454, align 8, !tbaa !41
  %456 = getelementptr inbounds %struct.itor_vtable, ptr %455, i32 0, i32 1
  %457 = load ptr, ptr %456, align 8, !tbaa !46
  %458 = load ptr, ptr %30, align 8, !tbaa !9
  %459 = getelementptr inbounds %struct.dict_itor, ptr %458, i32 0, i32 0
  %460 = load ptr, ptr %459, align 8, !tbaa !45
  %461 = call zeroext i1 %457(ptr noundef %460)
  %462 = zext i1 %461 to i64
  %463 = call i64 @llvm.expect.i64(i64 %462, i64 1)
  %464 = icmp ne i64 %463, 0
  br i1 %464, label %468, label %465

465:                                              ; preds = %452
  %466 = load ptr, ptr @stderr, align 8, !tbaa !9
  %467 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %466, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 174, ptr noundef @__func__.main, ptr noundef @.str.43) #11
  call void @abort() #12
  unreachable

468:                                              ; preds = %452
  br label %469

469:                                              ; preds = %468
  br label %470

470:                                              ; preds = %469
  br label %471

471:                                              ; preds = %470
  %472 = load ptr, ptr %30, align 8, !tbaa !9
  %473 = getelementptr inbounds %struct.dict_itor, ptr %472, i32 0, i32 1
  %474 = load ptr, ptr %473, align 8, !tbaa !41
  %475 = getelementptr inbounds %struct.itor_vtable, ptr %474, i32 0, i32 9
  %476 = load ptr, ptr %475, align 8, !tbaa !47
  %477 = load ptr, ptr %30, align 8, !tbaa !9
  %478 = getelementptr inbounds %struct.dict_itor, ptr %477, i32 0, i32 0
  %479 = load ptr, ptr %478, align 8, !tbaa !45
  %480 = call ptr %476(ptr noundef %479)
  %481 = load ptr, ptr %30, align 8, !tbaa !9
  %482 = getelementptr inbounds %struct.dict_itor, ptr %481, i32 0, i32 1
  %483 = load ptr, ptr %482, align 8, !tbaa !41
  %484 = getelementptr inbounds %struct.itor_vtable, ptr %483, i32 0, i32 10
  %485 = load ptr, ptr %484, align 8, !tbaa !48
  %486 = load ptr, ptr %30, align 8, !tbaa !9
  %487 = getelementptr inbounds %struct.dict_itor, ptr %486, i32 0, i32 0
  %488 = load ptr, ptr %487, align 8, !tbaa !45
  %489 = call ptr %485(ptr noundef %488)
  %490 = load ptr, ptr %489, align 8, !tbaa !9
  %491 = icmp eq ptr %480, %490
  %492 = zext i1 %491 to i32
  %493 = sext i32 %492 to i64
  %494 = call i64 @llvm.expect.i64(i64 %493, i64 1)
  %495 = icmp ne i64 %494, 0
  br i1 %495, label %499, label %496

496:                                              ; preds = %471
  %497 = load ptr, ptr @stderr, align 8, !tbaa !9
  %498 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %497, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 175, ptr noundef @__func__.main, ptr noundef @.str.44) #11
  call void @abort() #12
  unreachable

499:                                              ; preds = %471
  br label %500

500:                                              ; preds = %499
  br label %501

501:                                              ; preds = %500
  %502 = load i64, ptr %29, align 8, !tbaa !19
  %503 = add i64 %502, 1
  store i64 %503, ptr %29, align 8, !tbaa !19
  br label %504

504:                                              ; preds = %501
  %505 = load ptr, ptr %30, align 8, !tbaa !9
  %506 = getelementptr inbounds %struct.dict_itor, ptr %505, i32 0, i32 1
  %507 = load ptr, ptr %506, align 8, !tbaa !41
  %508 = getelementptr inbounds %struct.itor_vtable, ptr %507, i32 0, i32 3
  %509 = load ptr, ptr %508, align 8, !tbaa !49
  %510 = load ptr, ptr %30, align 8, !tbaa !9
  %511 = getelementptr inbounds %struct.dict_itor, ptr %510, i32 0, i32 0
  %512 = load ptr, ptr %511, align 8, !tbaa !45
  %513 = call zeroext i1 %509(ptr noundef %512)
  br i1 %513, label %451, label %514, !llvm.loop !50

514:                                              ; preds = %504
  call void @timer_end(ptr noundef %19, ptr noundef %20, ptr noundef %21)
  %515 = load ptr, ptr %8, align 8, !tbaa !9
  %516 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %517 = getelementptr inbounds %struct.timeval, ptr %516, i32 0, i32 0
  %518 = load i64, ptr %517, align 8, !tbaa !31
  %519 = mul nsw i64 %518, 1000000
  %520 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %521 = getelementptr inbounds %struct.timeval, ptr %520, i32 0, i32 1
  %522 = load i64, ptr %521, align 8, !tbaa !34
  %523 = add nsw i64 %519, %522
  %524 = sitofp i64 %523 to double
  %525 = fmul double %524, 0x3EB0C6F7A0B5ED8D
  %526 = call i32 (ptr, ...) @printf(ptr noundef @.str.45, ptr noundef %515, double noundef %525)
  %527 = load i64, ptr %29, align 8, !tbaa !19
  %528 = load i64, ptr %12, align 8, !tbaa !19
  %529 = icmp ne i64 %527, %528
  br i1 %529, label %530, label %533

530:                                              ; preds = %514
  %531 = load i64, ptr %29, align 8, !tbaa !19
  %532 = load i64, ptr %12, align 8, !tbaa !19
  call void (ptr, ...) @warn(ptr noundef @.str.46, i64 noundef %531, i64 noundef %532)
  br label %533

533:                                              ; preds = %530, %514
  br label %534

534:                                              ; preds = %533
  %535 = load ptr, ptr %9, align 8, !tbaa !9
  %536 = getelementptr inbounds %struct.dict, ptr %535, i32 0, i32 1
  %537 = load ptr, ptr %536, align 8, !tbaa !14
  %538 = getelementptr inbounds %struct.dict_vtable, ptr %537, i32 0, i32 14
  %539 = load ptr, ptr %538, align 8, !tbaa !16
  %540 = load ptr, ptr %9, align 8, !tbaa !9
  %541 = getelementptr inbounds %struct.dict, ptr %540, i32 0, i32 0
  %542 = load ptr, ptr %541, align 8, !tbaa !18
  %543 = call zeroext i1 %539(ptr noundef %542)
  %544 = zext i1 %543 to i64
  %545 = call i64 @llvm.expect.i64(i64 %544, i64 1)
  %546 = icmp ne i64 %545, 0
  br i1 %546, label %550, label %547

547:                                              ; preds = %534
  %548 = load ptr, ptr @stderr, align 8, !tbaa !9
  %549 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %548, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 185, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

550:                                              ; preds = %534
  br label %551

551:                                              ; preds = %550
  br label %552

552:                                              ; preds = %551
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  call void @timer_start(ptr noundef %19)
  store i64 0, ptr %29, align 8, !tbaa !19
  br label %553

553:                                              ; preds = %552
  %554 = load ptr, ptr %30, align 8, !tbaa !9
  %555 = getelementptr inbounds %struct.dict_itor, ptr %554, i32 0, i32 1
  %556 = load ptr, ptr %555, align 8, !tbaa !41
  %557 = getelementptr inbounds %struct.itor_vtable, ptr %556, i32 0, i32 8
  %558 = load ptr, ptr %557, align 8, !tbaa !51
  %559 = load ptr, ptr %30, align 8, !tbaa !9
  %560 = getelementptr inbounds %struct.dict_itor, ptr %559, i32 0, i32 0
  %561 = load ptr, ptr %560, align 8, !tbaa !45
  %562 = call zeroext i1 %558(ptr noundef %561)
  %563 = zext i1 %562 to i64
  %564 = call i64 @llvm.expect.i64(i64 %563, i64 1)
  %565 = icmp ne i64 %564, 0
  br i1 %565, label %569, label %566

566:                                              ; preds = %553
  %567 = load ptr, ptr @stderr, align 8, !tbaa !9
  %568 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %567, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 190, ptr noundef @__func__.main, ptr noundef @.str.47) #11
  call void @abort() #12
  unreachable

569:                                              ; preds = %553
  br label %570

570:                                              ; preds = %569
  br label %571

571:                                              ; preds = %570
  br label %572

572:                                              ; preds = %625, %571
  br label %573

573:                                              ; preds = %572
  %574 = load ptr, ptr %30, align 8, !tbaa !9
  %575 = getelementptr inbounds %struct.dict_itor, ptr %574, i32 0, i32 1
  %576 = load ptr, ptr %575, align 8, !tbaa !41
  %577 = getelementptr inbounds %struct.itor_vtable, ptr %576, i32 0, i32 1
  %578 = load ptr, ptr %577, align 8, !tbaa !46
  %579 = load ptr, ptr %30, align 8, !tbaa !9
  %580 = getelementptr inbounds %struct.dict_itor, ptr %579, i32 0, i32 0
  %581 = load ptr, ptr %580, align 8, !tbaa !45
  %582 = call zeroext i1 %578(ptr noundef %581)
  %583 = zext i1 %582 to i64
  %584 = call i64 @llvm.expect.i64(i64 %583, i64 1)
  %585 = icmp ne i64 %584, 0
  br i1 %585, label %589, label %586

586:                                              ; preds = %573
  %587 = load ptr, ptr @stderr, align 8, !tbaa !9
  %588 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %587, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 192, ptr noundef @__func__.main, ptr noundef @.str.43) #11
  call void @abort() #12
  unreachable

589:                                              ; preds = %573
  br label %590

590:                                              ; preds = %589
  br label %591

591:                                              ; preds = %590
  br label %592

592:                                              ; preds = %591
  %593 = load ptr, ptr %30, align 8, !tbaa !9
  %594 = getelementptr inbounds %struct.dict_itor, ptr %593, i32 0, i32 1
  %595 = load ptr, ptr %594, align 8, !tbaa !41
  %596 = getelementptr inbounds %struct.itor_vtable, ptr %595, i32 0, i32 9
  %597 = load ptr, ptr %596, align 8, !tbaa !47
  %598 = load ptr, ptr %30, align 8, !tbaa !9
  %599 = getelementptr inbounds %struct.dict_itor, ptr %598, i32 0, i32 0
  %600 = load ptr, ptr %599, align 8, !tbaa !45
  %601 = call ptr %597(ptr noundef %600)
  %602 = load ptr, ptr %30, align 8, !tbaa !9
  %603 = getelementptr inbounds %struct.dict_itor, ptr %602, i32 0, i32 1
  %604 = load ptr, ptr %603, align 8, !tbaa !41
  %605 = getelementptr inbounds %struct.itor_vtable, ptr %604, i32 0, i32 10
  %606 = load ptr, ptr %605, align 8, !tbaa !48
  %607 = load ptr, ptr %30, align 8, !tbaa !9
  %608 = getelementptr inbounds %struct.dict_itor, ptr %607, i32 0, i32 0
  %609 = load ptr, ptr %608, align 8, !tbaa !45
  %610 = call ptr %606(ptr noundef %609)
  %611 = load ptr, ptr %610, align 8, !tbaa !9
  %612 = icmp eq ptr %601, %611
  %613 = zext i1 %612 to i32
  %614 = sext i32 %613 to i64
  %615 = call i64 @llvm.expect.i64(i64 %614, i64 1)
  %616 = icmp ne i64 %615, 0
  br i1 %616, label %620, label %617

617:                                              ; preds = %592
  %618 = load ptr, ptr @stderr, align 8, !tbaa !9
  %619 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %618, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 193, ptr noundef @__func__.main, ptr noundef @.str.44) #11
  call void @abort() #12
  unreachable

620:                                              ; preds = %592
  br label %621

621:                                              ; preds = %620
  br label %622

622:                                              ; preds = %621
  %623 = load i64, ptr %29, align 8, !tbaa !19
  %624 = add i64 %623, 1
  store i64 %624, ptr %29, align 8, !tbaa !19
  br label %625

625:                                              ; preds = %622
  %626 = load ptr, ptr %30, align 8, !tbaa !9
  %627 = getelementptr inbounds %struct.dict_itor, ptr %626, i32 0, i32 1
  %628 = load ptr, ptr %627, align 8, !tbaa !41
  %629 = getelementptr inbounds %struct.itor_vtable, ptr %628, i32 0, i32 4
  %630 = load ptr, ptr %629, align 8, !tbaa !52
  %631 = load ptr, ptr %30, align 8, !tbaa !9
  %632 = getelementptr inbounds %struct.dict_itor, ptr %631, i32 0, i32 0
  %633 = load ptr, ptr %632, align 8, !tbaa !45
  %634 = call zeroext i1 %630(ptr noundef %633)
  br i1 %634, label %572, label %635, !llvm.loop !53

635:                                              ; preds = %625
  call void @timer_end(ptr noundef %19, ptr noundef %20, ptr noundef %21)
  %636 = load ptr, ptr %8, align 8, !tbaa !9
  %637 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %638 = getelementptr inbounds %struct.timeval, ptr %637, i32 0, i32 0
  %639 = load i64, ptr %638, align 8, !tbaa !31
  %640 = mul nsw i64 %639, 1000000
  %641 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %642 = getelementptr inbounds %struct.timeval, ptr %641, i32 0, i32 1
  %643 = load i64, ptr %642, align 8, !tbaa !34
  %644 = add nsw i64 %640, %643
  %645 = sitofp i64 %644 to double
  %646 = fmul double %645, 0x3EB0C6F7A0B5ED8D
  %647 = call i32 (ptr, ...) @printf(ptr noundef @.str.48, ptr noundef %636, double noundef %646)
  %648 = load i64, ptr %29, align 8, !tbaa !19
  %649 = load i64, ptr %12, align 8, !tbaa !19
  %650 = icmp ne i64 %648, %649
  br i1 %650, label %651, label %654

651:                                              ; preds = %635
  %652 = load i64, ptr %29, align 8, !tbaa !19
  %653 = load i64, ptr %12, align 8, !tbaa !19
  call void (ptr, ...) @warn(ptr noundef @.str.49, i64 noundef %652, i64 noundef %653)
  br label %654

654:                                              ; preds = %651, %635
  %655 = load ptr, ptr %30, align 8, !tbaa !9
  call void @dict_itor_free(ptr noundef %655)
  %656 = load i8, ptr %6, align 1, !tbaa !11, !range !27, !noundef !28
  %657 = trunc i8 %656 to i1
  br i1 %657, label %658, label %661

658:                                              ; preds = %654
  %659 = load ptr, ptr %14, align 8, !tbaa !9
  %660 = load i64, ptr %12, align 8, !tbaa !19
  call void @shuffle(ptr noundef %659, i64 noundef %660)
  br label %661

661:                                              ; preds = %658, %654
  br label %662

662:                                              ; preds = %661
  %663 = load ptr, ptr %9, align 8, !tbaa !9
  %664 = getelementptr inbounds %struct.dict, ptr %663, i32 0, i32 1
  %665 = load ptr, ptr %664, align 8, !tbaa !14
  %666 = getelementptr inbounds %struct.dict_vtable, ptr %665, i32 0, i32 14
  %667 = load ptr, ptr %666, align 8, !tbaa !16
  %668 = load ptr, ptr %9, align 8, !tbaa !9
  %669 = getelementptr inbounds %struct.dict, ptr %668, i32 0, i32 0
  %670 = load ptr, ptr %669, align 8, !tbaa !18
  %671 = call zeroext i1 %667(ptr noundef %670)
  %672 = zext i1 %671 to i64
  %673 = call i64 @llvm.expect.i64(i64 %672, i64 1)
  %674 = icmp ne i64 %673, 0
  br i1 %674, label %678, label %675

675:                                              ; preds = %662
  %676 = load ptr, ptr @stderr, align 8, !tbaa !9
  %677 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %676, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 207, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

678:                                              ; preds = %662
  br label %679

679:                                              ; preds = %678
  br label %680

680:                                              ; preds = %679
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  call void @timer_start(ptr noundef %19)
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #11
  store i32 0, ptr %31, align 4, !tbaa !5
  br label %681

681:                                              ; preds = %724, %680
  %682 = load i32, ptr %31, align 4, !tbaa !5
  %683 = zext i32 %682 to i64
  %684 = load i64, ptr %12, align 8, !tbaa !19
  %685 = icmp ult i64 %683, %684
  br i1 %685, label %687, label %686

686:                                              ; preds = %681
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #11
  br label %727

687:                                              ; preds = %681
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #11
  %688 = load ptr, ptr %9, align 8, !tbaa !9
  %689 = getelementptr inbounds %struct.dict, ptr %688, i32 0, i32 1
  %690 = load ptr, ptr %689, align 8, !tbaa !14
  %691 = getelementptr inbounds %struct.dict_vtable, ptr %690, i32 0, i32 4
  %692 = load ptr, ptr %691, align 8, !tbaa !54
  %693 = load ptr, ptr %9, align 8, !tbaa !9
  %694 = getelementptr inbounds %struct.dict, ptr %693, i32 0, i32 0
  %695 = load ptr, ptr %694, align 8, !tbaa !18
  %696 = load ptr, ptr %14, align 8, !tbaa !9
  %697 = load i32, ptr %31, align 4, !tbaa !5
  %698 = zext i32 %697 to i64
  %699 = getelementptr inbounds ptr, ptr %696, i64 %698
  %700 = load ptr, ptr %699, align 8, !tbaa !9
  %701 = call ptr %692(ptr noundef %695, ptr noundef %700)
  store ptr %701, ptr %32, align 8, !tbaa !9
  %702 = load ptr, ptr %32, align 8, !tbaa !9
  %703 = icmp ne ptr %702, null
  br i1 %703, label %706, label %704

704:                                              ; preds = %687
  %705 = getelementptr inbounds [512 x i8], ptr %13, i64 0, i64 0
  call void (ptr, ...) @quit(ptr noundef @.str.50, ptr noundef %705) #13
  unreachable

706:                                              ; preds = %687
  %707 = load ptr, ptr %32, align 8, !tbaa !9
  %708 = load ptr, ptr %707, align 8, !tbaa !9
  %709 = load ptr, ptr %14, align 8, !tbaa !9
  %710 = load i32, ptr %31, align 4, !tbaa !5
  %711 = zext i32 %710 to i64
  %712 = getelementptr inbounds ptr, ptr %709, i64 %711
  %713 = load ptr, ptr %712, align 8, !tbaa !9
  %714 = icmp ne ptr %708, %713
  br i1 %714, label %715, label %723

715:                                              ; preds = %706
  %716 = load ptr, ptr %14, align 8, !tbaa !9
  %717 = load i32, ptr %31, align 4, !tbaa !5
  %718 = zext i32 %717 to i64
  %719 = getelementptr inbounds ptr, ptr %716, i64 %718
  %720 = load ptr, ptr %719, align 8, !tbaa !9
  %721 = load ptr, ptr %32, align 8, !tbaa !9
  %722 = load ptr, ptr %721, align 8, !tbaa !9
  call void (ptr, ...) @quit(ptr noundef @.str.51, ptr noundef %720, ptr noundef %722) #13
  unreachable

723:                                              ; preds = %706
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #11
  br label %724

724:                                              ; preds = %723
  %725 = load i32, ptr %31, align 4, !tbaa !5
  %726 = add i32 %725, 1
  store i32 %726, ptr %31, align 4, !tbaa !5
  br label %681, !llvm.loop !55

727:                                              ; preds = %686
  call void @timer_end(ptr noundef %19, ptr noundef %20, ptr noundef %21)
  %728 = load ptr, ptr %8, align 8, !tbaa !9
  %729 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %730 = getelementptr inbounds %struct.timeval, ptr %729, i32 0, i32 0
  %731 = load i64, ptr %730, align 8, !tbaa !31
  %732 = mul nsw i64 %731, 1000000
  %733 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %734 = getelementptr inbounds %struct.timeval, ptr %733, i32 0, i32 1
  %735 = load i64, ptr %734, align 8, !tbaa !34
  %736 = add nsw i64 %732, %735
  %737 = sitofp i64 %736 to double
  %738 = fmul double %737, 0x3EB0C6F7A0B5ED8D
  %739 = load i64, ptr @comp_count, align 8, !tbaa !19
  %740 = load i64, ptr @comp_count, align 8, !tbaa !19
  %741 = uitofp i64 %740 to double
  %742 = load i64, ptr %12, align 8, !tbaa !19
  %743 = uitofp i64 %742 to double
  %744 = fdiv double %741, %743
  %745 = call i32 (ptr, ...) @printf(ptr noundef @.str.52, ptr noundef %728, double noundef %738, i64 noundef %739, double noundef %744)
  %746 = load i64, ptr @hash_count, align 8, !tbaa !19
  %747 = icmp ne i64 %746, 0
  br i1 %747, label %748, label %751

748:                                              ; preds = %727
  %749 = load i64, ptr @hash_count, align 8, !tbaa !19
  %750 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, i64 noundef %749)
  br label %751

751:                                              ; preds = %748, %727
  %752 = call i32 (ptr, ...) @printf(ptr noundef @.str.25)
  %753 = load i64, ptr @comp_count, align 8, !tbaa !19
  %754 = load i64, ptr %16, align 8, !tbaa !19
  %755 = add i64 %754, %753
  store i64 %755, ptr %16, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  %756 = load i64, ptr @hash_count, align 8, !tbaa !19
  %757 = load i64, ptr %17, align 8, !tbaa !19
  %758 = add i64 %757, %756
  store i64 %758, ptr %17, align 8, !tbaa !19
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  %759 = load i8, ptr %7, align 1, !tbaa !13
  %760 = sext i8 %759 to i32
  %761 = icmp ne i32 %760, 72
  br i1 %761, label %762, label %785

762:                                              ; preds = %751
  %763 = load i8, ptr %7, align 1, !tbaa !13
  %764 = sext i8 %763 to i32
  %765 = icmp ne i32 %764, 50
  br i1 %765, label %766, label %785

766:                                              ; preds = %762
  %767 = load i8, ptr %7, align 1, !tbaa !13
  %768 = sext i8 %767 to i32
  %769 = icmp ne i32 %768, 83
  br i1 %769, label %770, label %785

770:                                              ; preds = %766
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #11
  %771 = load ptr, ptr %9, align 8, !tbaa !9
  %772 = getelementptr inbounds %struct.dict, ptr %771, i32 0, i32 0
  %773 = load ptr, ptr %772, align 8, !tbaa !18
  store ptr %773, ptr %33, align 8, !tbaa !9
  %774 = load ptr, ptr %33, align 8, !tbaa !9
  %775 = getelementptr inbounds %struct.tree_base, ptr %774, i32 0, i32 3
  %776 = load i64, ptr %775, align 8, !tbaa !36
  %777 = call i32 (ptr, ...) @printf(ptr noundef @.str.53, i64 noundef %776)
  %778 = load ptr, ptr %33, align 8, !tbaa !9
  %779 = getelementptr inbounds %struct.tree_base, ptr %778, i32 0, i32 3
  %780 = load i64, ptr %779, align 8, !tbaa !36
  %781 = load i64, ptr %18, align 8, !tbaa !19
  %782 = add i64 %781, %780
  store i64 %782, ptr %18, align 8, !tbaa !19
  %783 = load ptr, ptr %33, align 8, !tbaa !9
  %784 = getelementptr inbounds %struct.tree_base, ptr %783, i32 0, i32 3
  store i64 0, ptr %784, align 8, !tbaa !36
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #11
  br label %785

785:                                              ; preds = %770, %766, %762, %751
  br label %786

786:                                              ; preds = %785
  %787 = load ptr, ptr %9, align 8, !tbaa !9
  %788 = getelementptr inbounds %struct.dict, ptr %787, i32 0, i32 1
  %789 = load ptr, ptr %788, align 8, !tbaa !14
  %790 = getelementptr inbounds %struct.dict_vtable, ptr %789, i32 0, i32 14
  %791 = load ptr, ptr %790, align 8, !tbaa !16
  %792 = load ptr, ptr %9, align 8, !tbaa !9
  %793 = getelementptr inbounds %struct.dict, ptr %792, i32 0, i32 0
  %794 = load ptr, ptr %793, align 8, !tbaa !18
  %795 = call zeroext i1 %791(ptr noundef %794)
  %796 = zext i1 %795 to i64
  %797 = call i64 @llvm.expect.i64(i64 %796, i64 1)
  %798 = icmp ne i64 %797, 0
  br i1 %798, label %802, label %799

799:                                              ; preds = %786
  %800 = load ptr, ptr @stderr, align 8, !tbaa !9
  %801 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %800, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 235, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

802:                                              ; preds = %786
  br label %803

803:                                              ; preds = %802
  br label %804

804:                                              ; preds = %803
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  call void @timer_start(ptr noundef %19)
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #11
  store i32 0, ptr %34, align 4, !tbaa !5
  br label %805

805:                                              ; preds = %856, %804
  %806 = load i32, ptr %34, align 4, !tbaa !5
  %807 = zext i32 %806 to i64
  %808 = load i64, ptr %12, align 8, !tbaa !19
  %809 = icmp ult i64 %807, %808
  br i1 %809, label %811, label %810

810:                                              ; preds = %805
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #11
  br label %859

811:                                              ; preds = %805
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #11
  %812 = call i32 @dict_rand()
  %813 = zext i32 %812 to i64
  %814 = load ptr, ptr %14, align 8, !tbaa !9
  %815 = load i32, ptr %34, align 4, !tbaa !5
  %816 = zext i32 %815 to i64
  %817 = getelementptr inbounds ptr, ptr %814, i64 %816
  %818 = load ptr, ptr %817, align 8, !tbaa !9
  %819 = call i64 @strlen(ptr noundef %818) #15
  %820 = urem i64 %813, %819
  %821 = trunc i64 %820 to i32
  store i32 %821, ptr %35, align 4, !tbaa !5
  %822 = load ptr, ptr %14, align 8, !tbaa !9
  %823 = load i32, ptr %34, align 4, !tbaa !5
  %824 = zext i32 %823 to i64
  %825 = getelementptr inbounds ptr, ptr %822, i64 %824
  %826 = load ptr, ptr %825, align 8, !tbaa !9
  %827 = load i32, ptr %35, align 4, !tbaa !5
  %828 = zext i32 %827 to i64
  %829 = getelementptr inbounds i8, ptr %826, i64 %828
  %830 = load i8, ptr %829, align 1, !tbaa !13
  %831 = add i8 %830, 1
  store i8 %831, ptr %829, align 1, !tbaa !13
  %832 = load ptr, ptr %9, align 8, !tbaa !9
  %833 = getelementptr inbounds %struct.dict, ptr %832, i32 0, i32 1
  %834 = load ptr, ptr %833, align 8, !tbaa !14
  %835 = getelementptr inbounds %struct.dict_vtable, ptr %834, i32 0, i32 4
  %836 = load ptr, ptr %835, align 8, !tbaa !54
  %837 = load ptr, ptr %9, align 8, !tbaa !9
  %838 = getelementptr inbounds %struct.dict, ptr %837, i32 0, i32 0
  %839 = load ptr, ptr %838, align 8, !tbaa !18
  %840 = load ptr, ptr %14, align 8, !tbaa !9
  %841 = load i32, ptr %34, align 4, !tbaa !5
  %842 = zext i32 %841 to i64
  %843 = getelementptr inbounds ptr, ptr %840, i64 %842
  %844 = load ptr, ptr %843, align 8, !tbaa !9
  %845 = call ptr %836(ptr noundef %839, ptr noundef %844)
  %846 = load ptr, ptr %14, align 8, !tbaa !9
  %847 = load i32, ptr %34, align 4, !tbaa !5
  %848 = zext i32 %847 to i64
  %849 = getelementptr inbounds ptr, ptr %846, i64 %848
  %850 = load ptr, ptr %849, align 8, !tbaa !9
  %851 = load i32, ptr %35, align 4, !tbaa !5
  %852 = zext i32 %851 to i64
  %853 = getelementptr inbounds i8, ptr %850, i64 %852
  %854 = load i8, ptr %853, align 1, !tbaa !13
  %855 = add i8 %854, -1
  store i8 %855, ptr %853, align 1, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #11
  br label %856

856:                                              ; preds = %811
  %857 = load i32, ptr %34, align 4, !tbaa !5
  %858 = add i32 %857, 1
  store i32 %858, ptr %34, align 4, !tbaa !5
  br label %805, !llvm.loop !56

859:                                              ; preds = %810
  call void @timer_end(ptr noundef %19, ptr noundef %20, ptr noundef %21)
  %860 = load ptr, ptr %8, align 8, !tbaa !9
  %861 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %862 = getelementptr inbounds %struct.timeval, ptr %861, i32 0, i32 0
  %863 = load i64, ptr %862, align 8, !tbaa !31
  %864 = mul nsw i64 %863, 1000000
  %865 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %866 = getelementptr inbounds %struct.timeval, ptr %865, i32 0, i32 1
  %867 = load i64, ptr %866, align 8, !tbaa !34
  %868 = add nsw i64 %864, %867
  %869 = sitofp i64 %868 to double
  %870 = fmul double %869, 0x3EB0C6F7A0B5ED8D
  %871 = load i64, ptr @comp_count, align 8, !tbaa !19
  %872 = load i64, ptr @comp_count, align 8, !tbaa !19
  %873 = uitofp i64 %872 to double
  %874 = load i64, ptr %12, align 8, !tbaa !19
  %875 = uitofp i64 %874 to double
  %876 = fdiv double %873, %875
  %877 = call i32 (ptr, ...) @printf(ptr noundef @.str.54, ptr noundef %860, double noundef %870, i64 noundef %871, double noundef %876)
  %878 = load i64, ptr @hash_count, align 8, !tbaa !19
  %879 = icmp ne i64 %878, 0
  br i1 %879, label %880, label %883

880:                                              ; preds = %859
  %881 = load i64, ptr @hash_count, align 8, !tbaa !19
  %882 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, i64 noundef %881)
  br label %883

883:                                              ; preds = %880, %859
  %884 = call i32 (ptr, ...) @printf(ptr noundef @.str.25)
  %885 = load i64, ptr @comp_count, align 8, !tbaa !19
  %886 = load i64, ptr %16, align 8, !tbaa !19
  %887 = add i64 %886, %885
  store i64 %887, ptr %16, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  %888 = load i64, ptr @hash_count, align 8, !tbaa !19
  %889 = load i64, ptr %17, align 8, !tbaa !19
  %890 = add i64 %889, %888
  store i64 %890, ptr %17, align 8, !tbaa !19
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  br label %891

891:                                              ; preds = %883
  %892 = load ptr, ptr %9, align 8, !tbaa !9
  %893 = getelementptr inbounds %struct.dict, ptr %892, i32 0, i32 1
  %894 = load ptr, ptr %893, align 8, !tbaa !14
  %895 = getelementptr inbounds %struct.dict_vtable, ptr %894, i32 0, i32 14
  %896 = load ptr, ptr %895, align 8, !tbaa !16
  %897 = load ptr, ptr %9, align 8, !tbaa !9
  %898 = getelementptr inbounds %struct.dict, ptr %897, i32 0, i32 0
  %899 = load ptr, ptr %898, align 8, !tbaa !18
  %900 = call zeroext i1 %896(ptr noundef %899)
  %901 = zext i1 %900 to i64
  %902 = call i64 @llvm.expect.i64(i64 %901, i64 1)
  %903 = icmp ne i64 %902, 0
  br i1 %903, label %907, label %904

904:                                              ; preds = %891
  %905 = load ptr, ptr @stderr, align 8, !tbaa !9
  %906 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %905, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 256, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

907:                                              ; preds = %891
  br label %908

908:                                              ; preds = %907
  br label %909

909:                                              ; preds = %908
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  %910 = load i8, ptr %6, align 1, !tbaa !11, !range !27, !noundef !28
  %911 = trunc i8 %910 to i1
  br i1 %911, label %912, label %915

912:                                              ; preds = %909
  %913 = load ptr, ptr %14, align 8, !tbaa !9
  %914 = load i64, ptr %12, align 8, !tbaa !19
  call void @shuffle(ptr noundef %913, i64 noundef %914)
  br label %915

915:                                              ; preds = %912, %909
  call void @timer_start(ptr noundef %19)
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #11
  store i32 0, ptr %36, align 4, !tbaa !5
  br label %916

916:                                              ; preds = %985, %915
  %917 = load i32, ptr %36, align 4, !tbaa !5
  %918 = zext i32 %917 to i64
  %919 = load i64, ptr %12, align 8, !tbaa !19
  %920 = icmp ult i64 %918, %919
  br i1 %920, label %922, label %921

921:                                              ; preds = %916
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #11
  br label %988

922:                                              ; preds = %916
  call void @llvm.lifetime.start.p0(i64 24, ptr %37) #11
  %923 = load ptr, ptr %9, align 8, !tbaa !9
  %924 = getelementptr inbounds %struct.dict, ptr %923, i32 0, i32 1
  %925 = load ptr, ptr %924, align 8, !tbaa !14
  %926 = getelementptr inbounds %struct.dict_vtable, ptr %925, i32 0, i32 9
  %927 = load ptr, ptr %926, align 8, !tbaa !57
  %928 = load ptr, ptr %9, align 8, !tbaa !9
  %929 = getelementptr inbounds %struct.dict, ptr %928, i32 0, i32 0
  %930 = load ptr, ptr %929, align 8, !tbaa !18
  %931 = load ptr, ptr %14, align 8, !tbaa !9
  %932 = load i32, ptr %36, align 4, !tbaa !5
  %933 = zext i32 %932 to i64
  %934 = getelementptr inbounds ptr, ptr %931, i64 %933
  %935 = load ptr, ptr %934, align 8, !tbaa !9
  call void %927(ptr dead_on_unwind writable sret(%struct.dict_remove_result) align 8 %37, ptr noundef %930, ptr noundef %935)
  %936 = getelementptr inbounds %struct.dict_remove_result, ptr %37, i32 0, i32 2
  %937 = load i8, ptr %936, align 8, !tbaa !58, !range !27, !noundef !28
  %938 = trunc i8 %937 to i1
  br i1 %938, label %946, label %939

939:                                              ; preds = %922
  %940 = load i32, ptr %36, align 4, !tbaa !5
  %941 = load ptr, ptr %14, align 8, !tbaa !9
  %942 = load i32, ptr %36, align 4, !tbaa !5
  %943 = zext i32 %942 to i64
  %944 = getelementptr inbounds ptr, ptr %941, i64 %943
  %945 = load ptr, ptr %944, align 8, !tbaa !9
  call void (ptr, ...) @quit(ptr noundef @.str.55, i32 noundef %940, ptr noundef %945) #13
  unreachable

946:                                              ; preds = %922
  br label %947

947:                                              ; preds = %946
  %948 = getelementptr inbounds %struct.dict_remove_result, ptr %37, i32 0, i32 0
  %949 = load ptr, ptr %948, align 8, !tbaa !60
  %950 = load ptr, ptr %14, align 8, !tbaa !9
  %951 = load i32, ptr %36, align 4, !tbaa !5
  %952 = zext i32 %951 to i64
  %953 = getelementptr inbounds ptr, ptr %950, i64 %952
  %954 = load ptr, ptr %953, align 8, !tbaa !9
  %955 = icmp eq ptr %949, %954
  %956 = zext i1 %955 to i32
  %957 = sext i32 %956 to i64
  %958 = call i64 @llvm.expect.i64(i64 %957, i64 1)
  %959 = icmp ne i64 %958, 0
  br i1 %959, label %963, label %960

960:                                              ; preds = %947
  %961 = load ptr, ptr @stderr, align 8, !tbaa !9
  %962 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %961, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 266, ptr noundef @__func__.main, ptr noundef @.str.56) #11
  call void @abort() #12
  unreachable

963:                                              ; preds = %947
  br label %964

964:                                              ; preds = %963
  br label %965

965:                                              ; preds = %964
  br label %966

966:                                              ; preds = %965
  %967 = getelementptr inbounds %struct.dict_remove_result, ptr %37, i32 0, i32 1
  %968 = load ptr, ptr %967, align 8, !tbaa !61
  %969 = load ptr, ptr %14, align 8, !tbaa !9
  %970 = load i32, ptr %36, align 4, !tbaa !5
  %971 = zext i32 %970 to i64
  %972 = getelementptr inbounds ptr, ptr %969, i64 %971
  %973 = load ptr, ptr %972, align 8, !tbaa !9
  %974 = icmp eq ptr %968, %973
  %975 = zext i1 %974 to i32
  %976 = sext i32 %975 to i64
  %977 = call i64 @llvm.expect.i64(i64 %976, i64 1)
  %978 = icmp ne i64 %977, 0
  br i1 %978, label %982, label %979

979:                                              ; preds = %966
  %980 = load ptr, ptr @stderr, align 8, !tbaa !9
  %981 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %980, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 267, ptr noundef @__func__.main, ptr noundef @.str.57) #11
  call void @abort() #12
  unreachable

982:                                              ; preds = %966
  br label %983

983:                                              ; preds = %982
  br label %984

984:                                              ; preds = %983
  call void @llvm.lifetime.end.p0(i64 24, ptr %37) #11
  br label %985

985:                                              ; preds = %984
  %986 = load i32, ptr %36, align 4, !tbaa !5
  %987 = add i32 %986, 1
  store i32 %987, ptr %36, align 4, !tbaa !5
  br label %916, !llvm.loop !62

988:                                              ; preds = %921
  call void @timer_end(ptr noundef %19, ptr noundef %20, ptr noundef %21)
  %989 = load ptr, ptr %8, align 8, !tbaa !9
  %990 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %991 = getelementptr inbounds %struct.timeval, ptr %990, i32 0, i32 0
  %992 = load i64, ptr %991, align 8, !tbaa !31
  %993 = mul nsw i64 %992, 1000000
  %994 = getelementptr inbounds %struct.rusage, ptr %20, i32 0, i32 0
  %995 = getelementptr inbounds %struct.timeval, ptr %994, i32 0, i32 1
  %996 = load i64, ptr %995, align 8, !tbaa !34
  %997 = add nsw i64 %993, %996
  %998 = sitofp i64 %997 to double
  %999 = fmul double %998, 0x3EB0C6F7A0B5ED8D
  %1000 = load i64, ptr @comp_count, align 8, !tbaa !19
  %1001 = load i64, ptr @comp_count, align 8, !tbaa !19
  %1002 = uitofp i64 %1001 to double
  %1003 = load i64, ptr %12, align 8, !tbaa !19
  %1004 = uitofp i64 %1003 to double
  %1005 = fdiv double %1002, %1004
  %1006 = call i32 (ptr, ...) @printf(ptr noundef @.str.58, ptr noundef %989, double noundef %999, i64 noundef %1000, double noundef %1005)
  %1007 = load i64, ptr @hash_count, align 8, !tbaa !19
  %1008 = icmp ne i64 %1007, 0
  br i1 %1008, label %1009, label %1012

1009:                                             ; preds = %988
  %1010 = load i64, ptr @hash_count, align 8, !tbaa !19
  %1011 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, i64 noundef %1010)
  br label %1012

1012:                                             ; preds = %1009, %988
  %1013 = call i32 (ptr, ...) @printf(ptr noundef @.str.25)
  %1014 = load i64, ptr @comp_count, align 8, !tbaa !19
  %1015 = load i64, ptr %16, align 8, !tbaa !19
  %1016 = add i64 %1015, %1014
  store i64 %1016, ptr %16, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  %1017 = load i64, ptr @hash_count, align 8, !tbaa !19
  %1018 = load i64, ptr %17, align 8, !tbaa !19
  %1019 = add i64 %1018, %1017
  store i64 %1019, ptr %17, align 8, !tbaa !19
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  %1020 = load i8, ptr %7, align 1, !tbaa !13
  %1021 = sext i8 %1020 to i32
  %1022 = icmp ne i32 %1021, 72
  br i1 %1022, label %1023, label %1046

1023:                                             ; preds = %1012
  %1024 = load i8, ptr %7, align 1, !tbaa !13
  %1025 = sext i8 %1024 to i32
  %1026 = icmp ne i32 %1025, 50
  br i1 %1026, label %1027, label %1046

1027:                                             ; preds = %1023
  %1028 = load i8, ptr %7, align 1, !tbaa !13
  %1029 = sext i8 %1028 to i32
  %1030 = icmp ne i32 %1029, 83
  br i1 %1030, label %1031, label %1046

1031:                                             ; preds = %1027
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #11
  %1032 = load ptr, ptr %9, align 8, !tbaa !9
  %1033 = getelementptr inbounds %struct.dict, ptr %1032, i32 0, i32 0
  %1034 = load ptr, ptr %1033, align 8, !tbaa !18
  store ptr %1034, ptr %38, align 8, !tbaa !9
  %1035 = load ptr, ptr %38, align 8, !tbaa !9
  %1036 = getelementptr inbounds %struct.tree_base, ptr %1035, i32 0, i32 3
  %1037 = load i64, ptr %1036, align 8, !tbaa !36
  %1038 = call i32 (ptr, ...) @printf(ptr noundef @.str.59, i64 noundef %1037)
  %1039 = load ptr, ptr %38, align 8, !tbaa !9
  %1040 = getelementptr inbounds %struct.tree_base, ptr %1039, i32 0, i32 3
  %1041 = load i64, ptr %1040, align 8, !tbaa !36
  %1042 = load i64, ptr %18, align 8, !tbaa !19
  %1043 = add i64 %1042, %1041
  store i64 %1043, ptr %18, align 8, !tbaa !19
  %1044 = load ptr, ptr %38, align 8, !tbaa !9
  %1045 = getelementptr inbounds %struct.tree_base, ptr %1044, i32 0, i32 3
  store i64 0, ptr %1045, align 8, !tbaa !36
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #11
  br label %1046

1046:                                             ; preds = %1031, %1027, %1023, %1012
  br label %1047

1047:                                             ; preds = %1046
  %1048 = load ptr, ptr %9, align 8, !tbaa !9
  %1049 = getelementptr inbounds %struct.dict, ptr %1048, i32 0, i32 1
  %1050 = load ptr, ptr %1049, align 8, !tbaa !14
  %1051 = getelementptr inbounds %struct.dict_vtable, ptr %1050, i32 0, i32 14
  %1052 = load ptr, ptr %1051, align 8, !tbaa !16
  %1053 = load ptr, ptr %9, align 8, !tbaa !9
  %1054 = getelementptr inbounds %struct.dict, ptr %1053, i32 0, i32 0
  %1055 = load ptr, ptr %1054, align 8, !tbaa !18
  %1056 = call zeroext i1 %1052(ptr noundef %1055)
  %1057 = zext i1 %1056 to i64
  %1058 = call i64 @llvm.expect.i64(i64 %1057, i64 1)
  %1059 = icmp ne i64 %1058, 0
  br i1 %1059, label %1063, label %1060

1060:                                             ; preds = %1047
  %1061 = load ptr, ptr @stderr, align 8, !tbaa !9
  %1062 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1061, ptr noundef @.str.17, ptr noundef @.str.18, i32 noundef 286, ptr noundef @__func__.main, ptr noundef @.str.19) #11
  call void @abort() #12
  unreachable

1063:                                             ; preds = %1047
  br label %1064

1064:                                             ; preds = %1063
  br label %1065

1065:                                             ; preds = %1064
  store i64 0, ptr @hash_count, align 8, !tbaa !19
  store i64 0, ptr @comp_count, align 8, !tbaa !19
  %1066 = load ptr, ptr %9, align 8, !tbaa !9
  %1067 = getelementptr inbounds %struct.dict, ptr %1066, i32 0, i32 1
  %1068 = load ptr, ptr %1067, align 8, !tbaa !14
  %1069 = getelementptr inbounds %struct.dict_vtable, ptr %1068, i32 0, i32 13
  %1070 = load ptr, ptr %1069, align 8, !tbaa !39
  %1071 = load ptr, ptr %9, align 8, !tbaa !9
  %1072 = getelementptr inbounds %struct.dict, ptr %1071, i32 0, i32 0
  %1073 = load ptr, ptr %1072, align 8, !tbaa !18
  %1074 = call i64 %1070(ptr noundef %1073)
  store i64 %1074, ptr %29, align 8, !tbaa !19
  %1075 = icmp ne i64 %1074, 0
  br i1 %1075, label %1076, label %1078

1076:                                             ; preds = %1065
  %1077 = load i64, ptr %29, align 8, !tbaa !19
  call void (ptr, ...) @quit(ptr noundef @.str.60, i64 noundef %1077) #13
  unreachable

1078:                                             ; preds = %1065
  %1079 = load ptr, ptr %9, align 8, !tbaa !9
  %1080 = call i64 @dict_free(ptr noundef %1079, ptr noundef @key_str_free)
  %1081 = load ptr, ptr %8, align 8, !tbaa !9
  %1082 = getelementptr inbounds %struct.timeval, ptr %21, i32 0, i32 0
  %1083 = load i64, ptr %1082, align 8, !tbaa !63
  %1084 = mul nsw i64 %1083, 1000000
  %1085 = getelementptr inbounds %struct.timeval, ptr %21, i32 0, i32 1
  %1086 = load i64, ptr %1085, align 8, !tbaa !64
  %1087 = add nsw i64 %1084, %1086
  %1088 = sitofp i64 %1087 to double
  %1089 = fmul double %1088, 0x3EB0C6F7A0B5ED8D
  %1090 = load i64, ptr %16, align 8, !tbaa !19
  %1091 = call i32 (ptr, ...) @printf(ptr noundef @.str.61, ptr noundef %1081, double noundef %1089, i64 noundef %1090)
  %1092 = load i64, ptr %17, align 8, !tbaa !19
  %1093 = icmp ne i64 %1092, 0
  br i1 %1093, label %1094, label %1097

1094:                                             ; preds = %1078
  %1095 = load i64, ptr %17, align 8, !tbaa !19
  %1096 = call i32 (ptr, ...) @printf(ptr noundef @.str.34, i64 noundef %1095)
  br label %1097

1097:                                             ; preds = %1094, %1078
  %1098 = call i32 (ptr, ...) @printf(ptr noundef @.str.25)
  %1099 = load i8, ptr %7, align 1, !tbaa !13
  %1100 = sext i8 %1099 to i32
  %1101 = icmp ne i32 %1100, 72
  br i1 %1101, label %1102, label %1113

1102:                                             ; preds = %1097
  %1103 = load i8, ptr %7, align 1, !tbaa !13
  %1104 = sext i8 %1103 to i32
  %1105 = icmp ne i32 %1104, 50
  br i1 %1105, label %1106, label %1113

1106:                                             ; preds = %1102
  %1107 = load i8, ptr %7, align 1, !tbaa !13
  %1108 = sext i8 %1107 to i32
  %1109 = icmp ne i32 %1108, 83
  br i1 %1109, label %1110, label %1113

1110:                                             ; preds = %1106
  %1111 = load i64, ptr %18, align 8, !tbaa !19
  %1112 = call i32 (ptr, ...) @printf(ptr noundef @.str.62, i64 noundef %1111)
  br label %1113

1113:                                             ; preds = %1110, %1106, %1102, %1097
  %1114 = load ptr, ptr @dict_free_func, align 8, !tbaa !9
  %1115 = load ptr, ptr %14, align 8, !tbaa !9
  call void %1114(ptr noundef %1115)
  call void @exit(i32 noundef 0) #12
  unreachable
}

; Function Attrs: nounwind
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #2

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) #3

; Function Attrs: nounwind
declare void @srand(i32 noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local ptr @xmalloc(i64 noundef) #0

; Function Attrs: nounwind uwtable
declare dso_local ptr @create_dictionary(i8 noundef signext, ptr noundef) #0

; Function Attrs: noreturn nounwind uwtable
declare dso_local void @quit(ptr noundef, ...) #4

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

; Function Attrs: noreturn nounwind
declare void @abort() #3

declare noalias ptr @fopen(ptr noundef, ptr noundef) #6

; Function Attrs: nounwind
declare ptr @strerror(i32 noundef) #2

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__errno_location() #7

declare ptr @fgets(ptr noundef, i32 noundef, ptr noundef) #6

declare void @rewind(ptr noundef) #6

; Function Attrs: nounwind
declare ptr @strtok(ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local ptr @xstrdup(ptr noundef) #0

declare i32 @fclose(ptr noundef) #6

declare i32 @printf(ptr noundef, ...) #6

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #8

; Function Attrs: nounwind uwtable
declare dso_local void @timer_start(ptr noundef) #0

; Function Attrs: nounwind uwtable
declare dso_local void @timer_end(ptr noundef, ptr noundef, ptr noundef) #0

declare i64 @tree_min_path_length(ptr noundef) #6

declare i64 @tree_max_path_length(ptr noundef) #6

declare i64 @tree_total_path_length(ptr noundef) #6

declare i64 @skiplist_link_count_histogram(ptr noundef, ptr noundef, i64 noundef) #6

; Function Attrs: nounwind uwtable
declare dso_local void @warn(ptr noundef, ...) #0

declare void @dict_itor_free(ptr noundef) #6

; Function Attrs: nounwind willreturn memory(read)
declare i64 @strlen(ptr noundef) #9

declare i64 @dict_free(ptr noundef, ptr noundef) #6

; Function Attrs: nounwind uwtable
declare dso_local void @key_str_free(ptr noundef, ptr noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @dict_rand() #10

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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 #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 = { noreturn 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 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #6 = { "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 #7 = { nounwind willreturn memory(none) "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 #8 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #9 = { nounwind willreturn memory(read) "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 #10 = { 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 #11 = { nounwind }
attributes #12 = { noreturn nounwind }
attributes #13 = { noreturn }
attributes #14 = { nounwind willreturn memory(none) }
attributes #15 = { nounwind willreturn memory(read) }

!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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!7, !7, i64 0}
!14 = !{!15, !10, i64 8}
!15 = !{!"", !10, i64 0, !10, i64 8}
!16 = !{!17, !10, i64 112}
!17 = !{!"", !12, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112}
!18 = !{!15, !10, i64 0}
!19 = !{!20, !20, i64 0}
!20 = !{!"long", !7, i64 0}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = distinct !{!23, !22}
!24 = !{!17, !10, i64 24}
!25 = !{!26, !12, i64 8}
!26 = !{!"", !10, i64 0, !12, i64 8}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!26, !10, i64 0}
!30 = distinct !{!30, !22}
!31 = !{!32, !20, i64 0}
!32 = !{!"rusage", !33, i64 0, !33, i64 16, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136}
!33 = !{!"timeval", !20, i64 0, !20, i64 8}
!34 = !{!32, !20, i64 8}
!35 = !{!17, !12, i64 0}
!36 = !{!37, !20, i64 24}
!37 = !{!"tree_base", !10, i64 0, !20, i64 8, !10, i64 16, !20, i64 24}
!38 = distinct !{!38, !22}
!39 = !{!17, !10, i64 104}
!40 = !{!17, !10, i64 8}
!41 = !{!42, !10, i64 8}
!42 = !{!"dict_itor", !10, i64 0, !10, i64 8}
!43 = !{!44, !10, i64 56}
!44 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136}
!45 = !{!42, !10, i64 0}
!46 = !{!44, !10, i64 8}
!47 = !{!44, !10, i64 72}
!48 = !{!44, !10, i64 80}
!49 = !{!44, !10, i64 24}
!50 = distinct !{!50, !22}
!51 = !{!44, !10, i64 64}
!52 = !{!44, !10, i64 32}
!53 = distinct !{!53, !22}
!54 = !{!17, !10, i64 32}
!55 = distinct !{!55, !22}
!56 = distinct !{!56, !22}
!57 = !{!17, !10, i64 72}
!58 = !{!59, !12, i64 16}
!59 = !{!"", !10, i64 0, !10, i64 8, !12, i64 16}
!60 = !{!59, !10, i64 0}
!61 = !{!59, !10, i64 8}
!62 = distinct !{!62, !22}
!63 = !{!33, !20, i64 0}
!64 = !{!33, !20, i64 8}


; 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.rusage = type { %struct.timeval, %struct.timeval, %union.anon, %union.anon.0, %union.anon.1, %union.anon.2, %union.anon.3, %union.anon.4, %union.anon.5, %union.anon.6, %union.anon.7, %union.anon.8, %union.anon.9, %union.anon.10, %union.anon.11, %union.anon.12 }
%struct.timeval = type { i64, i64 }
%union.anon = type { i64 }
%union.anon.0 = type { i64 }
%union.anon.1 = type { i64 }
%union.anon.2 = type { i64 }
%union.anon.3 = type { i64 }
%union.anon.4 = type { i64 }
%union.anon.5 = type { i64 }
%union.anon.6 = type { i64 }
%union.anon.7 = type { i64 }
%union.anon.8 = type { i64 }
%union.anon.9 = type { i64 }
%union.anon.10 = type { i64 }
%union.anon.11 = type { i64 }
%union.anon.12 = type { i64 }
%struct.dict_remove_result = type { ptr, ptr, i8 }

@stderr = external local_unnamed_addr global ptr, align 8
@.str.4 = external hidden unnamed_addr constant [26 x i8], align 1
@appname = external hidden constant [10 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [55 x i8], align 1
@dict_malloc_func = external local_unnamed_addr global ptr, align 8
@.str.16 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [59 x i8], align 1
@__func__.main = external hidden unnamed_addr constant [5 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [17 x i8], align 1
@comp_count = external hidden local_unnamed_addr global i64, align 8
@.str.20 = external hidden unnamed_addr constant [16 x i8], align 1
@hash_count = external hidden local_unnamed_addr global i64, align 8
@.str.21 = external hidden unnamed_addr constant [16 x i8], align 1
@malloced = external hidden local_unnamed_addr global i64, align 8
@.str.22 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [23 x i8], align 1
@dict_free_func = external local_unnamed_addr global ptr, align 8

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

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

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

; Function Attrs: noreturn nounwind uwtable
define dso_local noundef i32 @main(i32 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #2 {
  %3 = alloca ptr, align 8
  %4 = alloca [512 x i8], align 16
  %5 = alloca %struct.rusage, align 8
  %6 = alloca %struct.rusage, align 8
  %7 = alloca %struct.timeval, align 8
  %8 = alloca [16 x i64], align 16
  %9 = alloca %struct.dict_remove_result, align 8
  %.not = icmp eq i32 %0, 3
  br i1 %.not, label %35, label %10

10:                                               ; preds = %2
  %11 = load ptr, ptr @stderr, align 8, !tbaa !5
  %12 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %11, ptr noundef nonnull @.str.4, ptr noundef nonnull @appname) #12
  %13 = load ptr, ptr @stderr, align 8, !tbaa !5
  %14 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %13, ptr noundef nonnull @.str.5) #12
  %15 = load ptr, ptr @stderr, align 8, !tbaa !5
  %16 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %15, ptr noundef nonnull @.str.6) #12
  %17 = load ptr, ptr @stderr, align 8, !tbaa !5
  %18 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %17, ptr noundef nonnull @.str.7) #12
  %19 = load ptr, ptr @stderr, align 8, !tbaa !5
  %20 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %19, ptr noundef nonnull @.str.8) #12
  %21 = load ptr, ptr @stderr, align 8, !tbaa !5
  %22 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %21, ptr noundef nonnull @.str.9) #12
  %23 = load ptr, ptr @stderr, align 8, !tbaa !5
  %24 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %23, ptr noundef nonnull @.str.10) #12
  %25 = load ptr, ptr @stderr, align 8, !tbaa !5
  %26 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %25, ptr noundef nonnull @.str.11) #12
  %27 = load ptr, ptr @stderr, align 8, !tbaa !5
  %28 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %27, ptr noundef nonnull @.str.12) #12
  %29 = load ptr, ptr @stderr, align 8, !tbaa !5
  %30 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %29, ptr noundef nonnull @.str.13) #12
  %31 = load ptr, ptr @stderr, align 8, !tbaa !5
  %32 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %31, ptr noundef nonnull @.str.14) #12
  %33 = load ptr, ptr @stderr, align 8, !tbaa !5
  %34 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %33, ptr noundef nonnull @.str.15) #12
  tail call void @exit(i32 noundef 1) #13
  unreachable

35:                                               ; preds = %2
  tail call void @srand(i32 noundef -559038737) #14
  store ptr @xmalloc, ptr @dict_malloc_func, align 8, !tbaa !5
  %36 = getelementptr inbounds i8, ptr %1, i64 8
  %37 = load ptr, ptr %36, align 8, !tbaa !5
  %38 = load i8, ptr %37, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #14
  store ptr null, ptr %3, align 8, !tbaa !5
  %39 = call ptr @create_dictionary(i8 noundef signext %38, ptr noundef nonnull %3)
  %.not252 = icmp eq ptr %39, null
  br i1 %.not252, label %40, label %41

40:                                               ; preds = %35
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.16) #15
  unreachable

41:                                               ; preds = %35
  %42 = getelementptr inbounds i8, ptr %39, i64 8
  %43 = load ptr, ptr %42, align 8, !tbaa !10
  %44 = getelementptr inbounds i8, ptr %43, i64 112
  %45 = load ptr, ptr %44, align 8, !tbaa !12
  %46 = load ptr, ptr %39, align 8, !tbaa !15
  %47 = call zeroext i1 %45(ptr noundef %46) #14
  br i1 %47, label %51, label %48, !prof !16

48:                                               ; preds = %41
  %49 = load ptr, ptr @stderr, align 8, !tbaa !5
  %50 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %49, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 85, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

51:                                               ; preds = %41
  %52 = load i64, ptr @comp_count, align 8, !tbaa !17
  %53 = icmp eq i64 %52, 0
  br i1 %53, label %57, label %54, !prof !16

54:                                               ; preds = %51
  %55 = load ptr, ptr @stderr, align 8, !tbaa !5
  %56 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %55, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 86, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.20) #12
  call void @abort() #13
  unreachable

57:                                               ; preds = %51
  %58 = load i64, ptr @hash_count, align 8, !tbaa !17
  %59 = icmp eq i64 %58, 0
  br i1 %59, label %63, label %60, !prof !16

60:                                               ; preds = %57
  %61 = load ptr, ptr @stderr, align 8, !tbaa !5
  %62 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %61, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 87, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.21) #12
  call void @abort() #13
  unreachable

63:                                               ; preds = %57
  %64 = load i64, ptr @malloced, align 8, !tbaa !17
  %65 = getelementptr inbounds i8, ptr %1, i64 16
  %66 = load ptr, ptr %65, align 8, !tbaa !5
  %67 = call noalias ptr @fopen(ptr noundef %66, ptr noundef nonnull @.str.22)
  %68 = icmp eq ptr %67, null
  br i1 %68, label %69, label %74

69:                                               ; preds = %63
  %70 = load ptr, ptr %65, align 8, !tbaa !5
  %71 = tail call ptr @__errno_location() #16
  %72 = load i32, ptr %71, align 4, !tbaa !19
  %73 = call ptr @strerror(i32 noundef %72) #14
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.23, ptr noundef %70, ptr noundef %73) #15
  unreachable

74:                                               ; preds = %63
  call void @llvm.lifetime.start.p0(i64 512, ptr nonnull %4) #14
  br label %75

75:                                               ; preds = %75, %74
  %.0 = phi i64 [ 0, %74 ], [ %77, %75 ]
  %76 = call ptr @fgets(ptr noundef nonnull %4, i32 noundef 512, ptr noundef nonnull %67)
  %.not253 = icmp eq ptr %76, null
  %77 = add i64 %.0, 1
  br i1 %.not253, label %78, label %75, !llvm.loop !21

78:                                               ; preds = %75
  %.not254 = icmp eq i64 %.0, 0
  br i1 %.not254, label %79, label %80

79:                                               ; preds = %78
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.24) #15
  unreachable

80:                                               ; preds = %78
  %81 = shl i64 %.0, 3
  %82 = call ptr @xmalloc(i64 noundef %81)
  call void @rewind(ptr noundef nonnull %67)
  br label %83

83:                                               ; preds = %80, %85
  %.0223287 = phi i64 [ 0, %80 ], [ %88, %85 ]
  %84 = call ptr @fgets(ptr noundef nonnull %4, i32 noundef 512, ptr noundef nonnull %67)
  %.not255 = icmp eq ptr %84, null
  br i1 %.not255, label %90, label %85

85:                                               ; preds = %83
  %86 = call ptr @strtok(ptr noundef nonnull %4, ptr noundef nonnull @.str.25) #14
  %87 = call ptr @xstrdup(ptr noundef nonnull %4)
  %88 = add nuw i64 %.0223287, 1
  %89 = getelementptr inbounds ptr, ptr %82, i64 %.0223287
  store ptr %87, ptr %89, align 8, !tbaa !5
  %exitcond.not = icmp eq i64 %88, %.0
  br i1 %exitcond.not, label %92, label %83, !llvm.loop !23

90:                                               ; preds = %83
  %91 = call i32 @fclose(ptr noundef nonnull %67)
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.26, i64 noundef %.0223287, i64 noundef %.0) #15
  unreachable

92:                                               ; preds = %85
  %93 = call i32 @fclose(ptr noundef nonnull %67)
  %94 = load ptr, ptr %65, align 8, !tbaa !5
  %95 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.27, i64 noundef %.0, ptr noundef %94)
  store i64 %64, ptr @malloced, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 144, ptr nonnull %5) #14
  call void @llvm.lifetime.start.p0(i64 144, ptr nonnull %6) #14
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #14
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %7, i8 0, i64 16, i1 false)
  call void @timer_start(ptr noundef nonnull %5)
  br label %120

96:                                               ; preds = %144
  call void @timer_end(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %97 = load ptr, ptr %3, align 8, !tbaa !5
  %98 = uitofp i64 %64 to double
  %99 = fmul double %98, 1.000000e-03
  %100 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.31, ptr noundef %97, double noundef %99)
  %101 = load ptr, ptr %3, align 8, !tbaa !5
  %102 = load i64, ptr @malloced, align 8, !tbaa !17
  %103 = uitofp i64 %102 to double
  %104 = fmul double %103, 1.000000e-03
  %105 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.32, ptr noundef %101, double noundef %104)
  %106 = load ptr, ptr %3, align 8, !tbaa !5
  %107 = load i64, ptr %6, align 8, !tbaa !24
  %108 = mul nsw i64 %107, 1000000
  %109 = getelementptr inbounds i8, ptr %6, i64 8
  %110 = load i64, ptr %109, align 8, !tbaa !27
  %111 = add nsw i64 %108, %110
  %112 = sitofp i64 %111 to double
  %113 = fmul double %112, 0x3EB0C6F7A0B5ED8D
  %114 = load i64, ptr @comp_count, align 8, !tbaa !17
  %115 = uitofp i64 %114 to double
  %116 = uitofp nneg i64 %.0 to double
  %117 = fdiv double %115, %116
  %118 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, ptr noundef %106, double noundef %113, i64 noundef %114, double noundef %117)
  %119 = load i64, ptr @hash_count, align 8, !tbaa !17
  %.not256 = icmp eq i64 %119, 0
  br i1 %.not256, label %151, label %149

120:                                              ; preds = %92, %144
  %121 = phi i64 [ 0, %92 ], [ %147, %144 ]
  %.0231288 = phi i32 [ 0, %92 ], [ %146, %144 ]
  %122 = load ptr, ptr %42, align 8, !tbaa !10
  %123 = getelementptr inbounds i8, ptr %122, i64 24
  %124 = load ptr, ptr %123, align 8, !tbaa !28
  %125 = load ptr, ptr %39, align 8, !tbaa !15
  %126 = getelementptr inbounds ptr, ptr %82, i64 %121
  %127 = load ptr, ptr %126, align 8, !tbaa !5
  %128 = call { ptr, i8 } %124(ptr noundef %125, ptr noundef %127) #14
  %129 = extractvalue { ptr, i8 } %128, 0
  %130 = extractvalue { ptr, i8 } %128, 1
  %131 = trunc i8 %130 to i1
  br i1 %131, label %134, label %132

132:                                              ; preds = %120
  %133 = load ptr, ptr %126, align 8, !tbaa !5
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.28, i32 noundef %.0231288, ptr noundef %133) #15
  unreachable

134:                                              ; preds = %120
  %.not268 = icmp eq ptr %129, null
  br i1 %.not268, label %135, label %138, !prof !29

135:                                              ; preds = %134
  %136 = load ptr, ptr @stderr, align 8, !tbaa !5
  %137 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %136, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 126, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.29) #12
  call void @abort() #13
  unreachable

138:                                              ; preds = %134
  %139 = load ptr, ptr %129, align 8, !tbaa !5
  %140 = icmp eq ptr %139, null
  br i1 %140, label %144, label %141, !prof !16

141:                                              ; preds = %138
  %142 = load ptr, ptr @stderr, align 8, !tbaa !5
  %143 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %142, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 127, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.30) #12
  call void @abort() #13
  unreachable

144:                                              ; preds = %138
  %145 = load ptr, ptr %126, align 8, !tbaa !5
  store ptr %145, ptr %129, align 8, !tbaa !5
  %146 = add i32 %.0231288, 1
  %147 = zext i32 %146 to i64
  %148 = icmp ugt i64 %.0, %147
  br i1 %148, label %120, label %96, !llvm.loop !30

149:                                              ; preds = %96
  %150 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, i64 noundef %119)
  br label %151

151:                                              ; preds = %149, %96
  %152 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25)
  %153 = load i64, ptr @comp_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  %154 = load i64, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  %155 = load ptr, ptr %42, align 8, !tbaa !10
  %156 = load i8, ptr %155, align 8, !tbaa !31, !range !32, !noundef !33
  %157 = trunc nuw i8 %156 to i1
  %158 = icmp ne i8 %38, 83
  %or.cond = and i1 %158, %157
  br i1 %or.cond, label %159, label %171

159:                                              ; preds = %151
  %160 = load ptr, ptr %39, align 8, !tbaa !15
  %161 = call i64 @tree_min_path_length(ptr noundef %160) #14
  %162 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.35, i64 noundef %161)
  %163 = call i64 @tree_max_path_length(ptr noundef %160) #14
  %164 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.36, i64 noundef %163)
  %165 = call i64 @tree_total_path_length(ptr noundef %160) #14
  %166 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.37, i64 noundef %165)
  %167 = getelementptr inbounds i8, ptr %160, i64 24
  %168 = load i64, ptr %167, align 8, !tbaa !34
  %169 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.38, i64 noundef %168)
  %170 = load i64, ptr %167, align 8, !tbaa !34
  store i64 0, ptr %167, align 8, !tbaa !34
  br label %189

171:                                              ; preds = %151
  %172 = icmp eq i8 %38, 83
  br i1 %172, label %173, label %189

173:                                              ; preds = %171
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %8) #14
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(128) %8, i8 0, i64 128, i1 false)
  %174 = load ptr, ptr %39, align 8, !tbaa !15
  %175 = call i64 @skiplist_link_count_histogram(ptr noundef %174, ptr noundef nonnull %8, i64 noundef 16) #14
  br label %178

176:                                              ; preds = %178
  %177 = icmp eq i64 %183, %.0
  br i1 %177, label %188, label %185, !prof !16

178:                                              ; preds = %173, %178
  %.0229290 = phi i64 [ 0, %173 ], [ %184, %178 ]
  %.0230289 = phi i64 [ 0, %173 ], [ %183, %178 ]
  %179 = getelementptr inbounds [16 x i64], ptr %8, i64 0, i64 %.0229290
  %180 = load i64, ptr %179, align 8, !tbaa !17
  %181 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.39, i64 noundef %.0229290, i64 noundef %180)
  %182 = load i64, ptr %179, align 8, !tbaa !17
  %183 = add i64 %182, %.0230289
  %184 = add i64 %.0229290, 1
  %.not257 = icmp ugt i64 %184, %175
  br i1 %.not257, label %176, label %178, !llvm.loop !36

185:                                              ; preds = %176
  %186 = load ptr, ptr @stderr, align 8, !tbaa !5
  %187 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %186, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 158, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.40) #12
  call void @abort() #13
  unreachable

188:                                              ; preds = %176
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %8) #14
  br label %189

189:                                              ; preds = %159, %188, %171
  %.0226 = phi i64 [ %170, %159 ], [ 0, %188 ], [ 0, %171 ]
  %190 = load ptr, ptr %42, align 8, !tbaa !10
  %191 = getelementptr inbounds i8, ptr %190, i64 112
  %192 = load ptr, ptr %191, align 8, !tbaa !12
  %193 = load ptr, ptr %39, align 8, !tbaa !15
  %194 = call zeroext i1 %192(ptr noundef %193) #14
  br i1 %194, label %198, label %195, !prof !16

195:                                              ; preds = %189
  %196 = load ptr, ptr @stderr, align 8, !tbaa !5
  %197 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %196, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 161, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

198:                                              ; preds = %189
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  %199 = load ptr, ptr %42, align 8, !tbaa !10
  %200 = getelementptr inbounds i8, ptr %199, i64 104
  %201 = load ptr, ptr %200, align 8, !tbaa !37
  %202 = load ptr, ptr %39, align 8, !tbaa !15
  %203 = call i64 %201(ptr noundef %202) #14
  %.not258 = icmp eq i64 %203, %.0
  br i1 %.not258, label %205, label %204

204:                                              ; preds = %198
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.41, i64 noundef %203, i64 noundef %.0) #15
  unreachable

205:                                              ; preds = %198
  %206 = load ptr, ptr %42, align 8, !tbaa !10
  %207 = getelementptr inbounds i8, ptr %206, i64 8
  %208 = load ptr, ptr %207, align 8, !tbaa !38
  %209 = load ptr, ptr %39, align 8, !tbaa !15
  %210 = call ptr %208(ptr noundef %209) #14
  call void @timer_start(ptr noundef nonnull %5)
  %211 = getelementptr inbounds i8, ptr %210, i64 8
  %212 = load ptr, ptr %211, align 8, !tbaa !39
  %213 = getelementptr inbounds i8, ptr %212, i64 56
  %214 = load ptr, ptr %213, align 8, !tbaa !41
  %215 = load ptr, ptr %210, align 8, !tbaa !43
  %216 = call zeroext i1 %214(ptr noundef %215) #14
  br i1 %216, label %.preheader270, label %217, !prof !16

217:                                              ; preds = %205
  %218 = load ptr, ptr @stderr, align 8, !tbaa !5
  %219 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %218, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 172, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.42) #12
  call void @abort() #13
  unreachable

.preheader270:                                    ; preds = %205, %244
  %.0227 = phi i64 [ %245, %244 ], [ 0, %205 ]
  %220 = load ptr, ptr %211, align 8, !tbaa !39
  %221 = getelementptr inbounds i8, ptr %220, i64 8
  %222 = load ptr, ptr %221, align 8, !tbaa !44
  %223 = load ptr, ptr %210, align 8, !tbaa !43
  %224 = call zeroext i1 %222(ptr noundef %223) #14
  br i1 %224, label %228, label %225, !prof !16

225:                                              ; preds = %.preheader270
  %226 = load ptr, ptr @stderr, align 8, !tbaa !5
  %227 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %226, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 174, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.43) #12
  call void @abort() #13
  unreachable

228:                                              ; preds = %.preheader270
  %229 = load ptr, ptr %211, align 8, !tbaa !39
  %230 = getelementptr inbounds i8, ptr %229, i64 72
  %231 = load ptr, ptr %230, align 8, !tbaa !45
  %232 = load ptr, ptr %210, align 8, !tbaa !43
  %233 = call ptr %231(ptr noundef %232) #14
  %234 = load ptr, ptr %211, align 8, !tbaa !39
  %235 = getelementptr inbounds i8, ptr %234, i64 80
  %236 = load ptr, ptr %235, align 8, !tbaa !46
  %237 = load ptr, ptr %210, align 8, !tbaa !43
  %238 = call ptr %236(ptr noundef %237) #14
  %239 = load ptr, ptr %238, align 8, !tbaa !5
  %240 = icmp eq ptr %233, %239
  br i1 %240, label %244, label %241, !prof !16

241:                                              ; preds = %228
  %242 = load ptr, ptr @stderr, align 8, !tbaa !5
  %243 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %242, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 175, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.44) #12
  call void @abort() #13
  unreachable

244:                                              ; preds = %228
  %245 = add i64 %.0227, 1
  %246 = load ptr, ptr %211, align 8, !tbaa !39
  %247 = getelementptr inbounds i8, ptr %246, i64 24
  %248 = load ptr, ptr %247, align 8, !tbaa !47
  %249 = load ptr, ptr %210, align 8, !tbaa !43
  %250 = call zeroext i1 %248(ptr noundef %249) #14
  br i1 %250, label %.preheader270, label %251, !llvm.loop !48

251:                                              ; preds = %244
  call void @timer_end(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %252 = load ptr, ptr %3, align 8, !tbaa !5
  %253 = load i64, ptr %6, align 8, !tbaa !24
  %254 = mul nsw i64 %253, 1000000
  %255 = load i64, ptr %109, align 8, !tbaa !27
  %256 = add nsw i64 %254, %255
  %257 = sitofp i64 %256 to double
  %258 = fmul double %257, 0x3EB0C6F7A0B5ED8D
  %259 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.45, ptr noundef %252, double noundef %258)
  %.not259 = icmp eq i64 %245, %.0
  br i1 %.not259, label %261, label %260

260:                                              ; preds = %251
  call void (ptr, ...) @warn(ptr noundef nonnull @.str.46, i64 noundef %245, i64 noundef %.0)
  br label %261

261:                                              ; preds = %251, %260
  %262 = load ptr, ptr %42, align 8, !tbaa !10
  %263 = getelementptr inbounds i8, ptr %262, i64 112
  %264 = load ptr, ptr %263, align 8, !tbaa !12
  %265 = load ptr, ptr %39, align 8, !tbaa !15
  %266 = call zeroext i1 %264(ptr noundef %265) #14
  br i1 %266, label %270, label %267, !prof !16

267:                                              ; preds = %261
  %268 = load ptr, ptr @stderr, align 8, !tbaa !5
  %269 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %268, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 185, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

270:                                              ; preds = %261
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  call void @timer_start(ptr noundef nonnull %5)
  %271 = load ptr, ptr %211, align 8, !tbaa !39
  %272 = getelementptr inbounds i8, ptr %271, i64 64
  %273 = load ptr, ptr %272, align 8, !tbaa !49
  %274 = load ptr, ptr %210, align 8, !tbaa !43
  %275 = call zeroext i1 %273(ptr noundef %274) #14
  br i1 %275, label %.preheader, label %276, !prof !16

276:                                              ; preds = %270
  %277 = load ptr, ptr @stderr, align 8, !tbaa !5
  %278 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %277, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 190, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.47) #12
  call void @abort() #13
  unreachable

.preheader:                                       ; preds = %270, %303
  %.1228 = phi i64 [ %304, %303 ], [ 0, %270 ]
  %279 = load ptr, ptr %211, align 8, !tbaa !39
  %280 = getelementptr inbounds i8, ptr %279, i64 8
  %281 = load ptr, ptr %280, align 8, !tbaa !44
  %282 = load ptr, ptr %210, align 8, !tbaa !43
  %283 = call zeroext i1 %281(ptr noundef %282) #14
  br i1 %283, label %287, label %284, !prof !16

284:                                              ; preds = %.preheader
  %285 = load ptr, ptr @stderr, align 8, !tbaa !5
  %286 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %285, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 192, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.43) #12
  call void @abort() #13
  unreachable

287:                                              ; preds = %.preheader
  %288 = load ptr, ptr %211, align 8, !tbaa !39
  %289 = getelementptr inbounds i8, ptr %288, i64 72
  %290 = load ptr, ptr %289, align 8, !tbaa !45
  %291 = load ptr, ptr %210, align 8, !tbaa !43
  %292 = call ptr %290(ptr noundef %291) #14
  %293 = load ptr, ptr %211, align 8, !tbaa !39
  %294 = getelementptr inbounds i8, ptr %293, i64 80
  %295 = load ptr, ptr %294, align 8, !tbaa !46
  %296 = load ptr, ptr %210, align 8, !tbaa !43
  %297 = call ptr %295(ptr noundef %296) #14
  %298 = load ptr, ptr %297, align 8, !tbaa !5
  %299 = icmp eq ptr %292, %298
  br i1 %299, label %303, label %300, !prof !16

300:                                              ; preds = %287
  %301 = load ptr, ptr @stderr, align 8, !tbaa !5
  %302 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %301, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 193, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.44) #12
  call void @abort() #13
  unreachable

303:                                              ; preds = %287
  %304 = add i64 %.1228, 1
  %305 = load ptr, ptr %211, align 8, !tbaa !39
  %306 = getelementptr inbounds i8, ptr %305, i64 32
  %307 = load ptr, ptr %306, align 8, !tbaa !50
  %308 = load ptr, ptr %210, align 8, !tbaa !43
  %309 = call zeroext i1 %307(ptr noundef %308) #14
  br i1 %309, label %.preheader, label %310, !llvm.loop !51

310:                                              ; preds = %303
  call void @timer_end(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %311 = load ptr, ptr %3, align 8, !tbaa !5
  %312 = load i64, ptr %6, align 8, !tbaa !24
  %313 = mul nsw i64 %312, 1000000
  %314 = load i64, ptr %109, align 8, !tbaa !27
  %315 = add nsw i64 %313, %314
  %316 = sitofp i64 %315 to double
  %317 = fmul double %316, 0x3EB0C6F7A0B5ED8D
  %318 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.48, ptr noundef %311, double noundef %317)
  %.not260 = icmp eq i64 %304, %.0
  br i1 %.not260, label %320, label %319

319:                                              ; preds = %310
  call void (ptr, ...) @warn(ptr noundef nonnull @.str.49, i64 noundef %304, i64 noundef %.0)
  br label %320

320:                                              ; preds = %319, %310
  call void @dict_itor_free(ptr noundef nonnull %210) #14
  call void @shuffle(ptr noundef %82, i64 noundef %.0)
  %321 = load ptr, ptr %42, align 8, !tbaa !10
  %322 = getelementptr inbounds i8, ptr %321, i64 112
  %323 = load ptr, ptr %322, align 8, !tbaa !12
  %324 = load ptr, ptr %39, align 8, !tbaa !15
  %325 = call zeroext i1 %323(ptr noundef %324) #14
  br i1 %325, label %329, label %326, !prof !16

326:                                              ; preds = %320
  %327 = load ptr, ptr @stderr, align 8, !tbaa !5
  %328 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %327, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 207, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

329:                                              ; preds = %320
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  call void @timer_start(ptr noundef nonnull %5)
  br label %347

330:                                              ; preds = %357
  %331 = add i32 %.0225291, 1
  %332 = zext i32 %331 to i64
  %333 = icmp ugt i64 %.0, %332
  br i1 %333, label %347, label %334, !llvm.loop !52

334:                                              ; preds = %330
  call void @timer_end(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %335 = load ptr, ptr %3, align 8, !tbaa !5
  %336 = load i64, ptr %6, align 8, !tbaa !24
  %337 = mul nsw i64 %336, 1000000
  %338 = load i64, ptr %109, align 8, !tbaa !27
  %339 = add nsw i64 %337, %338
  %340 = sitofp i64 %339 to double
  %341 = fmul double %340, 0x3EB0C6F7A0B5ED8D
  %342 = load i64, ptr @comp_count, align 8, !tbaa !17
  %343 = uitofp i64 %342 to double
  %344 = fdiv double %343, %116
  %345 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.52, ptr noundef %335, double noundef %341, i64 noundef %342, double noundef %344)
  %346 = load i64, ptr @hash_count, align 8, !tbaa !17
  %.not261 = icmp eq i64 %346, 0
  br i1 %.not261, label %363, label %361

347:                                              ; preds = %329, %330
  %348 = phi i64 [ 0, %329 ], [ %332, %330 ]
  %.0225291 = phi i32 [ 0, %329 ], [ %331, %330 ]
  %349 = load ptr, ptr %42, align 8, !tbaa !10
  %350 = getelementptr inbounds i8, ptr %349, i64 32
  %351 = load ptr, ptr %350, align 8, !tbaa !53
  %352 = load ptr, ptr %39, align 8, !tbaa !15
  %353 = getelementptr inbounds ptr, ptr %82, i64 %348
  %354 = load ptr, ptr %353, align 8, !tbaa !5
  %355 = call ptr %351(ptr noundef %352, ptr noundef %354) #14
  %.not266 = icmp eq ptr %355, null
  br i1 %.not266, label %356, label %357

356:                                              ; preds = %347
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.50, ptr noundef nonnull %4) #15
  unreachable

357:                                              ; preds = %347
  %358 = load ptr, ptr %355, align 8, !tbaa !5
  %359 = load ptr, ptr %353, align 8, !tbaa !5
  %.not267 = icmp eq ptr %358, %359
  br i1 %.not267, label %330, label %360

360:                                              ; preds = %357
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.51, ptr noundef %359, ptr noundef %358) #15
  unreachable

361:                                              ; preds = %334
  %362 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, i64 noundef %346)
  br label %363

363:                                              ; preds = %361, %334
  %364 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25)
  %365 = load i64, ptr @comp_count, align 8, !tbaa !17
  %366 = add i64 %365, %153
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  %367 = load i64, ptr @hash_count, align 8, !tbaa !17
  %368 = add i64 %367, %154
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  switch i8 %38, label %369 [
    i8 83, label %376
    i8 72, label %376
    i8 50, label %376
  ]

369:                                              ; preds = %363
  %370 = load ptr, ptr %39, align 8, !tbaa !15
  %371 = getelementptr inbounds i8, ptr %370, i64 24
  %372 = load i64, ptr %371, align 8, !tbaa !34
  %373 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.53, i64 noundef %372)
  %374 = load i64, ptr %371, align 8, !tbaa !34
  %375 = add i64 %374, %.0226
  store i64 0, ptr %371, align 8, !tbaa !34
  br label %376

376:                                              ; preds = %363, %363, %363, %369
  %.1 = phi i64 [ %375, %369 ], [ %.0226, %363 ], [ %.0226, %363 ], [ %.0226, %363 ]
  %377 = load ptr, ptr %42, align 8, !tbaa !10
  %378 = getelementptr inbounds i8, ptr %377, i64 112
  %379 = load ptr, ptr %378, align 8, !tbaa !12
  %380 = load ptr, ptr %39, align 8, !tbaa !15
  %381 = call zeroext i1 %379(ptr noundef %380) #14
  br i1 %381, label %385, label %382, !prof !16

382:                                              ; preds = %376
  %383 = load ptr, ptr @stderr, align 8, !tbaa !5
  %384 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %383, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 235, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

385:                                              ; preds = %376
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  call void @timer_start(ptr noundef nonnull %5)
  br label %399

386:                                              ; preds = %399
  call void @timer_end(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %387 = load ptr, ptr %3, align 8, !tbaa !5
  %388 = load i64, ptr %6, align 8, !tbaa !24
  %389 = mul nsw i64 %388, 1000000
  %390 = load i64, ptr %109, align 8, !tbaa !27
  %391 = add nsw i64 %389, %390
  %392 = sitofp i64 %391 to double
  %393 = fmul double %392, 0x3EB0C6F7A0B5ED8D
  %394 = load i64, ptr @comp_count, align 8, !tbaa !17
  %395 = uitofp i64 %394 to double
  %396 = fdiv double %395, %116
  %397 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.54, ptr noundef %387, double noundef %393, i64 noundef %394, double noundef %396)
  %398 = load i64, ptr @hash_count, align 8, !tbaa !17
  %.not262 = icmp eq i64 %398, 0
  br i1 %.not262, label %425, label %423

399:                                              ; preds = %385, %399
  %400 = phi i64 [ 0, %385 ], [ %421, %399 ]
  %.0224292 = phi i32 [ 0, %385 ], [ %420, %399 ]
  %401 = call i32 @dict_rand()
  %402 = zext i32 %401 to i64
  %403 = getelementptr inbounds ptr, ptr %82, i64 %400
  %404 = load ptr, ptr %403, align 8, !tbaa !5
  %405 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %404) #17
  %406 = urem i64 %402, %405
  %407 = getelementptr inbounds i8, ptr %404, i64 %406
  %408 = load i8, ptr %407, align 1, !tbaa !9
  %409 = add i8 %408, 1
  store i8 %409, ptr %407, align 1, !tbaa !9
  %410 = load ptr, ptr %42, align 8, !tbaa !10
  %411 = getelementptr inbounds i8, ptr %410, i64 32
  %412 = load ptr, ptr %411, align 8, !tbaa !53
  %413 = load ptr, ptr %39, align 8, !tbaa !15
  %414 = load ptr, ptr %403, align 8, !tbaa !5
  %415 = call ptr %412(ptr noundef %413, ptr noundef %414) #14
  %416 = load ptr, ptr %403, align 8, !tbaa !5
  %417 = getelementptr inbounds i8, ptr %416, i64 %406
  %418 = load i8, ptr %417, align 1, !tbaa !9
  %419 = add i8 %418, -1
  store i8 %419, ptr %417, align 1, !tbaa !9
  %420 = add i32 %.0224292, 1
  %421 = zext i32 %420 to i64
  %422 = icmp ugt i64 %.0, %421
  br i1 %422, label %399, label %386, !llvm.loop !54

423:                                              ; preds = %386
  %424 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, i64 noundef %398)
  br label %425

425:                                              ; preds = %423, %386
  %426 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25)
  %427 = load i64, ptr @comp_count, align 8, !tbaa !17
  %428 = add i64 %366, %427
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  %429 = load i64, ptr @hash_count, align 8, !tbaa !17
  %430 = add i64 %368, %429
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  %431 = load ptr, ptr %42, align 8, !tbaa !10
  %432 = getelementptr inbounds i8, ptr %431, i64 112
  %433 = load ptr, ptr %432, align 8, !tbaa !12
  %434 = load ptr, ptr %39, align 8, !tbaa !15
  %435 = call zeroext i1 %433(ptr noundef %434) #14
  br i1 %435, label %439, label %436, !prof !16

436:                                              ; preds = %425
  %437 = load ptr, ptr @stderr, align 8, !tbaa !5
  %438 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %437, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 256, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

439:                                              ; preds = %425
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  call void @shuffle(ptr noundef nonnull %82, i64 noundef %.0)
  call void @timer_start(ptr noundef nonnull %5)
  %440 = getelementptr inbounds i8, ptr %9, i64 16
  %441 = getelementptr inbounds i8, ptr %9, i64 8
  br label %455

442:                                              ; preds = %480
  call void @timer_end(ptr noundef nonnull %5, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %443 = load ptr, ptr %3, align 8, !tbaa !5
  %444 = load i64, ptr %6, align 8, !tbaa !24
  %445 = mul nsw i64 %444, 1000000
  %446 = load i64, ptr %109, align 8, !tbaa !27
  %447 = add nsw i64 %445, %446
  %448 = sitofp i64 %447 to double
  %449 = fmul double %448, 0x3EB0C6F7A0B5ED8D
  %450 = load i64, ptr @comp_count, align 8, !tbaa !17
  %451 = uitofp i64 %450 to double
  %452 = fdiv double %451, %116
  %453 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.58, ptr noundef %443, double noundef %449, i64 noundef %450, double noundef %452)
  %454 = load i64, ptr @hash_count, align 8, !tbaa !17
  %.not263 = icmp eq i64 %454, 0
  br i1 %.not263, label %486, label %484

455:                                              ; preds = %439, %480
  %456 = phi i64 [ 0, %439 ], [ %482, %480 ]
  %.0222293 = phi i32 [ 0, %439 ], [ %481, %480 ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %9) #14
  %457 = load ptr, ptr %42, align 8, !tbaa !10
  %458 = getelementptr inbounds i8, ptr %457, i64 72
  %459 = load ptr, ptr %458, align 8, !tbaa !55
  %460 = load ptr, ptr %39, align 8, !tbaa !15
  %461 = getelementptr inbounds ptr, ptr %82, i64 %456
  %462 = load ptr, ptr %461, align 8, !tbaa !5
  call void %459(ptr dead_on_unwind nonnull writable sret(%struct.dict_remove_result) align 8 %9, ptr noundef %460, ptr noundef %462) #14
  %463 = load i8, ptr %440, align 8, !tbaa !56, !range !32, !noundef !33
  %464 = trunc nuw i8 %463 to i1
  br i1 %464, label %467, label %465

465:                                              ; preds = %455
  %466 = load ptr, ptr %461, align 8, !tbaa !5
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.55, i32 noundef %.0222293, ptr noundef %466) #15
  unreachable

467:                                              ; preds = %455
  %468 = load ptr, ptr %9, align 8, !tbaa !58
  %469 = load ptr, ptr %461, align 8, !tbaa !5
  %470 = icmp eq ptr %468, %469
  br i1 %470, label %474, label %471, !prof !16

471:                                              ; preds = %467
  %472 = load ptr, ptr @stderr, align 8, !tbaa !5
  %473 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %472, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 266, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.56) #12
  call void @abort() #13
  unreachable

474:                                              ; preds = %467
  %475 = load ptr, ptr %441, align 8, !tbaa !59
  %476 = icmp eq ptr %475, %468
  br i1 %476, label %480, label %477, !prof !16

477:                                              ; preds = %474
  %478 = load ptr, ptr @stderr, align 8, !tbaa !5
  %479 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %478, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 267, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.57) #12
  call void @abort() #13
  unreachable

480:                                              ; preds = %474
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %9) #14
  %481 = add i32 %.0222293, 1
  %482 = zext i32 %481 to i64
  %483 = icmp ugt i64 %.0, %482
  br i1 %483, label %455, label %442, !llvm.loop !60

484:                                              ; preds = %442
  %485 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, i64 noundef %454)
  br label %486

486:                                              ; preds = %484, %442
  %487 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25)
  %488 = load i64, ptr @comp_count, align 8, !tbaa !17
  %489 = add i64 %428, %488
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  %490 = load i64, ptr @hash_count, align 8, !tbaa !17
  %491 = add i64 %430, %490
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  switch i8 %38, label %492 [
    i8 83, label %499
    i8 72, label %499
    i8 50, label %499
  ]

492:                                              ; preds = %486
  %493 = load ptr, ptr %39, align 8, !tbaa !15
  %494 = getelementptr inbounds i8, ptr %493, i64 24
  %495 = load i64, ptr %494, align 8, !tbaa !34
  %496 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.59, i64 noundef %495)
  %497 = load i64, ptr %494, align 8, !tbaa !34
  %498 = add i64 %497, %.1
  store i64 0, ptr %494, align 8, !tbaa !34
  br label %499

499:                                              ; preds = %486, %486, %486, %492
  %.2 = phi i64 [ %498, %492 ], [ %.1, %486 ], [ %.1, %486 ], [ %.1, %486 ]
  %500 = load ptr, ptr %42, align 8, !tbaa !10
  %501 = getelementptr inbounds i8, ptr %500, i64 112
  %502 = load ptr, ptr %501, align 8, !tbaa !12
  %503 = load ptr, ptr %39, align 8, !tbaa !15
  %504 = call zeroext i1 %502(ptr noundef %503) #14
  br i1 %504, label %508, label %505, !prof !16

505:                                              ; preds = %499
  %506 = load ptr, ptr @stderr, align 8, !tbaa !5
  %507 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %506, ptr noundef nonnull @.str.17, ptr noundef nonnull @.str.18, i32 noundef 286, ptr noundef nonnull @__func__.main, ptr noundef nonnull @.str.19) #12
  call void @abort() #13
  unreachable

508:                                              ; preds = %499
  store i64 0, ptr @hash_count, align 8, !tbaa !17
  store i64 0, ptr @comp_count, align 8, !tbaa !17
  %509 = load ptr, ptr %42, align 8, !tbaa !10
  %510 = getelementptr inbounds i8, ptr %509, i64 104
  %511 = load ptr, ptr %510, align 8, !tbaa !37
  %512 = load ptr, ptr %39, align 8, !tbaa !15
  %513 = call i64 %511(ptr noundef %512) #14
  %.not264 = icmp eq i64 %513, 0
  br i1 %.not264, label %515, label %514

514:                                              ; preds = %508
  call void (ptr, ...) @quit(ptr noundef nonnull @.str.60, i64 noundef %513) #15
  unreachable

515:                                              ; preds = %508
  %516 = call i64 @dict_free(ptr noundef nonnull %39, ptr noundef nonnull @key_str_free) #14
  %517 = load ptr, ptr %3, align 8, !tbaa !5
  %518 = load i64, ptr %7, align 8, !tbaa !61
  %519 = mul nsw i64 %518, 1000000
  %520 = getelementptr inbounds i8, ptr %7, i64 8
  %521 = load i64, ptr %520, align 8, !tbaa !62
  %522 = add nsw i64 %519, %521
  %523 = sitofp i64 %522 to double
  %524 = fmul double %523, 0x3EB0C6F7A0B5ED8D
  %525 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.61, ptr noundef %517, double noundef %524, i64 noundef %489)
  %.not265 = icmp eq i64 %491, 0
  br i1 %.not265, label %528, label %526

526:                                              ; preds = %515
  %527 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.34, i64 noundef %491)
  br label %528

528:                                              ; preds = %526, %515
  %529 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25)
  switch i8 %38, label %530 [
    i8 83, label %532
    i8 72, label %532
    i8 50, label %532
  ]

530:                                              ; preds = %528
  %531 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.62, i64 noundef %.2)
  br label %532

532:                                              ; preds = %528, %528, %528, %530
  %533 = load ptr, ptr @dict_free_func, align 8, !tbaa !5
  call void %533(ptr noundef nonnull %82) #14
  call void @exit(i32 noundef 0) #13
  unreachable
}

; Function Attrs: nofree nounwind
declare noundef i32 @fprintf(ptr nocapture noundef, ptr nocapture noundef readonly, ...) local_unnamed_addr #3

; Function Attrs: noreturn nounwind
declare void @exit(i32 noundef) local_unnamed_addr #4

; Function Attrs: nounwind
declare void @srand(i32 noundef) local_unnamed_addr #5

; Function Attrs: nounwind uwtable
declare dso_local ptr @xmalloc(i64 noundef) #0

; Function Attrs: nounwind uwtable
declare dso_local ptr @create_dictionary(i8 noundef signext, ptr noundef) local_unnamed_addr #0

; Function Attrs: noreturn nounwind uwtable
declare dso_local void @quit(ptr noundef, ...) local_unnamed_addr #2

; Function Attrs: noreturn nounwind
declare void @abort() local_unnamed_addr #4

; Function Attrs: nofree nounwind
declare noalias noundef ptr @fopen(ptr nocapture noundef readonly, ptr nocapture noundef readonly) local_unnamed_addr #3

; Function Attrs: nounwind
declare ptr @strerror(i32 noundef) local_unnamed_addr #5

; Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
declare ptr @__errno_location() local_unnamed_addr #6

; Function Attrs: nofree nounwind
declare noundef ptr @fgets(ptr noundef, i32 noundef, ptr nocapture noundef) local_unnamed_addr #3

; Function Attrs: nofree nounwind
declare void @rewind(ptr nocapture noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nofree nounwind willreturn
declare ptr @strtok(ptr noundef, ptr nocapture noundef readonly) local_unnamed_addr #7

; Function Attrs: nounwind uwtable
declare dso_local ptr @xstrdup(ptr noundef) local_unnamed_addr #0

; Function Attrs: nofree nounwind
declare noundef i32 @fclose(ptr nocapture noundef) local_unnamed_addr #3

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #3

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #8

; Function Attrs: nounwind uwtable
declare dso_local void @timer_start(ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @timer_end(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare i64 @tree_min_path_length(ptr noundef) local_unnamed_addr #9

declare i64 @tree_max_path_length(ptr noundef) local_unnamed_addr #9

declare i64 @tree_total_path_length(ptr noundef) local_unnamed_addr #9

declare i64 @skiplist_link_count_histogram(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #9

; Function Attrs: nounwind uwtable
declare dso_local void @warn(ptr noundef, ...) local_unnamed_addr #0

declare void @dict_itor_free(ptr noundef) local_unnamed_addr #9

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i64 @strlen(ptr nocapture noundef) local_unnamed_addr #10

declare i64 @dict_free(ptr noundef, ptr noundef) local_unnamed_addr #9

; Function Attrs: nounwind uwtable
declare dso_local void @key_str_free(ptr noundef, ptr noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @dict_rand() local_unnamed_addr #11

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { noreturn 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 = { nofree 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 = { 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 #5 = { 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 #6 = { mustprogress nofree nosync nounwind willreturn memory(none) "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 #7 = { mustprogress nofree nounwind willreturn "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 #8 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #9 = { "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 #10 = { mustprogress nofree nounwind willreturn memory(argmem: read) "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 #11 = { 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 #12 = { cold nounwind }
attributes #13 = { noreturn nounwind }
attributes #14 = { nounwind }
attributes #15 = { noreturn }
attributes #16 = { nounwind willreturn memory(none) }
attributes #17 = { nounwind willreturn memory(read) }

!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 = !{!7, !7, i64 0}
!10 = !{!11, !6, i64 8}
!11 = !{!"", !6, i64 0, !6, i64 8}
!12 = !{!13, !6, i64 112}
!13 = !{!"", !14, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112}
!14 = !{!"_Bool", !7, i64 0}
!15 = !{!11, !6, i64 0}
!16 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!17 = !{!18, !18, i64 0}
!18 = !{!"long", !7, i64 0}
!19 = !{!20, !20, i64 0}
!20 = !{!"int", !7, i64 0}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = distinct !{!23, !22}
!24 = !{!25, !18, i64 0}
!25 = !{!"rusage", !26, i64 0, !26, i64 16, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136}
!26 = !{!"timeval", !18, i64 0, !18, i64 8}
!27 = !{!25, !18, i64 8}
!28 = !{!13, !6, i64 24}
!29 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!30 = distinct !{!30, !22}
!31 = !{!13, !14, i64 0}
!32 = !{i8 0, i8 2}
!33 = !{}
!34 = !{!35, !18, i64 24}
!35 = !{!"tree_base", !6, i64 0, !18, i64 8, !6, i64 16, !18, i64 24}
!36 = distinct !{!36, !22}
!37 = !{!13, !6, i64 104}
!38 = !{!13, !6, i64 8}
!39 = !{!40, !6, i64 8}
!40 = !{!"dict_itor", !6, i64 0, !6, i64 8}
!41 = !{!42, !6, i64 56}
!42 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136}
!43 = !{!40, !6, i64 0}
!44 = !{!42, !6, i64 8}
!45 = !{!42, !6, i64 72}
!46 = !{!42, !6, i64 80}
!47 = !{!42, !6, i64 24}
!48 = distinct !{!48, !22}
!49 = !{!42, !6, i64 64}
!50 = !{!42, !6, i64 32}
!51 = distinct !{!51, !22}
!52 = distinct !{!52, !22}
!53 = !{!13, !6, i64 32}
!54 = distinct !{!54, !22}
!55 = !{!13, !6, i64 72}
!56 = !{!57, !14, i64 16}
!57 = !{!"", !6, i64 0, !6, i64 8, !14, i64 16}
!58 = !{!57, !6, i64 0}
!59 = !{!57, !6, i64 8}
!60 = distinct !{!60, !22}
!61 = !{!26, !18, i64 0}
!62 = !{!26, !18, i64 8}


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