; LLVM IR from fmela/libdict :: demo (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.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.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 }

@.str = external hidden unnamed_addr constant [17 x i8], align 1
@appname = external hidden constant [5 x i8], align 1
@dict_malloc_func = external global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [3 x i8], align 1
@stdout = external global ptr, align 8
@stdin = external global ptr, align 8
@.str.4 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [8 x i8], align 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 ptr, align 8
  %7 = alloca [512 x i8], align 16
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca %struct.dict_insert_result, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca %struct.dict_remove_result, align 8
  %19 = alloca ptr, align 8
  %20 = 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
  %21 = load i32, ptr %4, align 4, !tbaa !5
  %22 = icmp ne i32 %21, 2
  br i1 %22, label %23, label %24

23:                                               ; preds = %2
  call void (ptr, ...) @quit(ptr noundef @.str, ptr noundef @appname) #8
  unreachable

24:                                               ; preds = %2
  %25 = call i64 @time(ptr noundef null) #9
  %26 = trunc i64 %25 to i32
  call void @srand(i32 noundef %26) #9
  store ptr @xmalloc, ptr @dict_malloc_func, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #9
  store ptr null, ptr %6, align 8, !tbaa !9
  %27 = load ptr, ptr %5, align 8, !tbaa !9
  %28 = getelementptr inbounds ptr, ptr %27, i32 1
  store ptr %28, ptr %5, align 8, !tbaa !9
  %29 = load ptr, ptr %5, align 8, !tbaa !9
  %30 = getelementptr inbounds ptr, ptr %29, i64 0
  %31 = load ptr, ptr %30, align 8, !tbaa !9
  %32 = getelementptr inbounds i8, ptr %31, i64 0
  %33 = load i8, ptr %32, align 1, !tbaa !11
  %34 = sext i8 %33 to i32
  switch i32 %34, label %53 [
    i32 104, label %35
    i32 112, label %37
    i32 114, label %39
    i32 116, label %41
    i32 115, label %43
    i32 119, label %45
    i32 83, label %47
    i32 72, label %49
    i32 50, label %51
  ]

35:                                               ; preds = %24
  %36 = call ptr @hb_dict_new(ptr noundef @strcmp)
  store ptr %36, ptr %6, align 8, !tbaa !9
  br label %54

37:                                               ; preds = %24
  %38 = call ptr @pr_dict_new(ptr noundef @strcmp)
  store ptr %38, ptr %6, align 8, !tbaa !9
  br label %54

39:                                               ; preds = %24
  %40 = call ptr @rb_dict_new(ptr noundef @strcmp)
  store ptr %40, ptr %6, align 8, !tbaa !9
  br label %54

41:                                               ; preds = %24
  %42 = call ptr @tr_dict_new(ptr noundef @strcmp, ptr noundef null)
  store ptr %42, ptr %6, align 8, !tbaa !9
  br label %54

43:                                               ; preds = %24
  %44 = call ptr @sp_dict_new(ptr noundef @strcmp)
  store ptr %44, ptr %6, align 8, !tbaa !9
  br label %54

45:                                               ; preds = %24
  %46 = call ptr @wb_dict_new(ptr noundef @strcmp)
  store ptr %46, ptr %6, align 8, !tbaa !9
  br label %54

47:                                               ; preds = %24
  %48 = call ptr @skiplist_dict_new(ptr noundef @strcmp, i32 noundef 10)
  store ptr %48, ptr %6, align 8, !tbaa !9
  br label %54

49:                                               ; preds = %24
  %50 = call ptr @hashtable_dict_new(ptr noundef @strcmp, ptr noundef @dict_str_hash, i32 noundef 997)
  store ptr %50, ptr %6, align 8, !tbaa !9
  br label %54

51:                                               ; preds = %24
  %52 = call ptr @hashtable2_dict_new(ptr noundef @strcmp, ptr noundef @dict_str_hash, i32 noundef 997)
  store ptr %52, ptr %6, align 8, !tbaa !9
  br label %54

53:                                               ; preds = %24
  call void (ptr, ...) @quit(ptr noundef @.str.1) #8
  unreachable

54:                                               ; preds = %51, %49, %47, %45, %43, %41, %39, %37, %35
  %55 = load ptr, ptr %6, align 8, !tbaa !9
  %56 = icmp ne ptr %55, null
  br i1 %56, label %58, label %57

57:                                               ; preds = %54
  call void (ptr, ...) @quit(ptr noundef @.str.2) #8
  unreachable

58:                                               ; preds = %54
  br label %59

59:                                               ; preds = %666, %664, %58
  %60 = load ptr, ptr %6, align 8, !tbaa !9
  %61 = getelementptr inbounds %struct.dict, ptr %60, i32 0, i32 1
  %62 = load ptr, ptr %61, align 8, !tbaa !12
  %63 = getelementptr inbounds %struct.dict_vtable, ptr %62, i32 0, i32 14
  %64 = load ptr, ptr %63, align 8, !tbaa !14
  %65 = load ptr, ptr %6, align 8, !tbaa !9
  %66 = getelementptr inbounds %struct.dict, ptr %65, i32 0, i32 0
  %67 = load ptr, ptr %66, align 8, !tbaa !17
  %68 = call zeroext i1 %64(ptr noundef %67)
  %69 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  %70 = load ptr, ptr @stdout, align 8, !tbaa !9
  %71 = call i32 @fflush(ptr noundef %70)
  call void @llvm.lifetime.start.p0(i64 512, ptr %7) #9
  %72 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %73 = load ptr, ptr @stdin, align 8, !tbaa !9
  %74 = call ptr @fgets(ptr noundef %72, i32 noundef 512, ptr noundef %73)
  %75 = icmp eq ptr %74, null
  br i1 %75, label %76, label %77

76:                                               ; preds = %59
  store i32 3, ptr %8, align 4
  br label %664

77:                                               ; preds = %59
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #9
  %78 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %79 = call ptr @strchr(ptr noundef %78, i32 noundef 10) #10
  store ptr %79, ptr %9, align 8, !tbaa !9
  %80 = icmp ne ptr %79, null
  br i1 %80, label %81, label %83

81:                                               ; preds = %77
  %82 = load ptr, ptr %9, align 8, !tbaa !9
  store i8 0, ptr %82, align 1, !tbaa !11
  br label %83

83:                                               ; preds = %81, %77
  %84 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  store ptr %84, ptr %9, align 8, !tbaa !9
  br label %85

85:                                               ; preds = %105, %83
  %86 = load ptr, ptr %9, align 8, !tbaa !9
  %87 = load i8, ptr %86, align 1, !tbaa !11
  %88 = sext i8 %87 to i32
  %89 = icmp ne i32 %88, 0
  br i1 %89, label %90, label %102

90:                                               ; preds = %85
  %91 = call ptr @__ctype_b_loc() #11
  %92 = load ptr, ptr %91, align 8, !tbaa !9
  %93 = load ptr, ptr %9, align 8, !tbaa !9
  %94 = load i8, ptr %93, align 1, !tbaa !11
  %95 = sext i8 %94 to i32
  %96 = sext i32 %95 to i64
  %97 = getelementptr inbounds i16, ptr %92, i64 %96
  %98 = load i16, ptr %97, align 2, !tbaa !18
  %99 = zext i16 %98 to i32
  %100 = and i32 %99, 8192
  %101 = icmp ne i32 %100, 0
  br label %102

102:                                              ; preds = %90, %85
  %103 = phi i1 [ false, %85 ], [ %101, %90 ]
  br i1 %103, label %104, label %108

104:                                              ; preds = %102
  br label %105

105:                                              ; preds = %104
  %106 = load ptr, ptr %9, align 8, !tbaa !9
  %107 = getelementptr inbounds i8, ptr %106, i32 1
  store ptr %107, ptr %9, align 8, !tbaa !9
  br label %85, !llvm.loop !20

108:                                              ; preds = %102
  %109 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %110 = load ptr, ptr %9, align 8, !tbaa !9
  %111 = icmp ne ptr %109, %110
  br i1 %111, label %112, label %116

112:                                              ; preds = %108
  %113 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %114 = load ptr, ptr %9, align 8, !tbaa !9
  %115 = call ptr @strcpy(ptr noundef %113, ptr noundef %114) #9
  br label %116

116:                                              ; preds = %112, %108
  %117 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %118 = call ptr @strtok(ptr noundef %117, ptr noundef @.str.4) #9
  %119 = icmp ne ptr %118, null
  br i1 %119, label %120, label %122

120:                                              ; preds = %116
  %121 = call ptr @strtok(ptr noundef null, ptr noundef @.str.4) #9
  br label %123

122:                                              ; preds = %116
  br label %123

123:                                              ; preds = %122, %120
  %124 = phi ptr [ %121, %120 ], [ null, %122 ]
  store ptr %124, ptr %10, align 8, !tbaa !9
  %125 = icmp ne ptr %124, null
  br i1 %125, label %126, label %128

126:                                              ; preds = %123
  %127 = call ptr @strtok(ptr noundef null, ptr noundef @.str.4) #9
  br label %129

128:                                              ; preds = %123
  br label %129

129:                                              ; preds = %128, %126
  %130 = phi ptr [ %127, %126 ], [ null, %128 ]
  store ptr %130, ptr %11, align 8, !tbaa !9
  %131 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %132 = load i8, ptr %131, align 16, !tbaa !11
  %133 = sext i8 %132 to i32
  %134 = icmp eq i32 %133, 0
  br i1 %134, label %135, label %136

135:                                              ; preds = %129
  store i32 4, ptr %8, align 4
  br label %663

136:                                              ; preds = %129
  %137 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %138 = call i32 @strcmp(ptr noundef %137, ptr noundef @.str.5) #10
  %139 = icmp eq i32 %138, 0
  br i1 %139, label %140, label %181

140:                                              ; preds = %136
  %141 = load ptr, ptr %11, align 8, !tbaa !9
  %142 = icmp ne ptr %141, null
  br i1 %142, label %145, label %143

143:                                              ; preds = %140
  %144 = call i32 (ptr, ...) @printf(ptr noundef @.str.6)
  store i32 4, ptr %8, align 4
  br label %663

145:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 16, ptr %12) #9
  %146 = load ptr, ptr %6, align 8, !tbaa !9
  %147 = getelementptr inbounds %struct.dict, ptr %146, i32 0, i32 1
  %148 = load ptr, ptr %147, align 8, !tbaa !12
  %149 = getelementptr inbounds %struct.dict_vtable, ptr %148, i32 0, i32 3
  %150 = load ptr, ptr %149, align 8, !tbaa !22
  %151 = load ptr, ptr %6, align 8, !tbaa !9
  %152 = getelementptr inbounds %struct.dict, ptr %151, i32 0, i32 0
  %153 = load ptr, ptr %152, align 8, !tbaa !17
  %154 = load ptr, ptr %10, align 8, !tbaa !9
  %155 = call ptr @xstrdup(ptr noundef %154)
  %156 = call { ptr, i8 } %150(ptr noundef %153, ptr noundef %155)
  %157 = getelementptr inbounds { ptr, i8 }, ptr %12, i32 0, i32 0
  %158 = extractvalue { ptr, i8 } %156, 0
  store ptr %158, ptr %157, align 8
  %159 = getelementptr inbounds { ptr, i8 }, ptr %12, i32 0, i32 1
  %160 = extractvalue { ptr, i8 } %156, 1
  store i8 %160, ptr %159, align 8
  %161 = getelementptr inbounds %struct.dict_insert_result, ptr %12, i32 0, i32 1
  %162 = load i8, ptr %161, align 8, !tbaa !23, !range !25, !noundef !26
  %163 = trunc i8 %162 to i1
  br i1 %163, label %164, label %174

164:                                              ; preds = %145
  %165 = load ptr, ptr %11, align 8, !tbaa !9
  %166 = call ptr @xstrdup(ptr noundef %165)
  %167 = getelementptr inbounds %struct.dict_insert_result, ptr %12, i32 0, i32 0
  %168 = load ptr, ptr %167, align 8, !tbaa !27
  store ptr %166, ptr %168, align 8, !tbaa !9
  %169 = load ptr, ptr %10, align 8, !tbaa !9
  %170 = getelementptr inbounds %struct.dict_insert_result, ptr %12, i32 0, i32 0
  %171 = load ptr, ptr %170, align 8, !tbaa !27
  %172 = load ptr, ptr %171, align 8, !tbaa !9
  %173 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef %169, ptr noundef %172)
  br label %180

174:                                              ; preds = %145
  %175 = load ptr, ptr %10, align 8, !tbaa !9
  %176 = getelementptr inbounds %struct.dict_insert_result, ptr %12, i32 0, i32 0
  %177 = load ptr, ptr %176, align 8, !tbaa !27
  %178 = load ptr, ptr %177, align 8, !tbaa !9
  %179 = call i32 (ptr, ...) @printf(ptr noundef @.str.8, ptr noundef %175, ptr noundef %178)
  br label %180

180:                                              ; preds = %174, %164
  call void @llvm.lifetime.end.p0(i64 16, ptr %12) #9
  br label %662

181:                                              ; preds = %136
  %182 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %183 = call i32 @strcmp(ptr noundef %182, ptr noundef @.str.9) #10
  %184 = icmp eq i32 %183, 0
  br i1 %184, label %185, label %212

185:                                              ; preds = %181
  %186 = load ptr, ptr %11, align 8, !tbaa !9
  %187 = icmp ne ptr %186, null
  br i1 %187, label %188, label %190

188:                                              ; preds = %185
  %189 = call i32 (ptr, ...) @printf(ptr noundef @.str.10)
  store i32 4, ptr %8, align 4
  br label %663

190:                                              ; preds = %185
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %191 = load ptr, ptr %6, align 8, !tbaa !9
  %192 = getelementptr inbounds %struct.dict, ptr %191, i32 0, i32 1
  %193 = load ptr, ptr %192, align 8, !tbaa !12
  %194 = getelementptr inbounds %struct.dict_vtable, ptr %193, i32 0, i32 4
  %195 = load ptr, ptr %194, align 8, !tbaa !28
  %196 = load ptr, ptr %6, align 8, !tbaa !9
  %197 = getelementptr inbounds %struct.dict, ptr %196, i32 0, i32 0
  %198 = load ptr, ptr %197, align 8, !tbaa !17
  %199 = load ptr, ptr %10, align 8, !tbaa !9
  %200 = call ptr %195(ptr noundef %198, ptr noundef %199)
  store ptr %200, ptr %13, align 8, !tbaa !9
  %201 = load ptr, ptr %13, align 8, !tbaa !9
  %202 = icmp ne ptr %201, null
  br i1 %202, label %203, label %208

203:                                              ; preds = %190
  %204 = load ptr, ptr %10, align 8, !tbaa !9
  %205 = load ptr, ptr %13, align 8, !tbaa !9
  %206 = load ptr, ptr %205, align 8, !tbaa !9
  %207 = call i32 (ptr, ...) @printf(ptr noundef @.str.11, ptr noundef %204, ptr noundef %206)
  br label %211

208:                                              ; preds = %190
  %209 = load ptr, ptr %10, align 8, !tbaa !9
  %210 = call i32 (ptr, ...) @printf(ptr noundef @.str.12, ptr noundef %209)
  br label %211

211:                                              ; preds = %208, %203
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  br label %661

212:                                              ; preds = %181
  %213 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %214 = call i32 @strcmp(ptr noundef %213, ptr noundef @.str.13) #10
  %215 = icmp eq i32 %214, 0
  br i1 %215, label %216, label %262

216:                                              ; preds = %212
  %217 = load ptr, ptr %11, align 8, !tbaa !9
  %218 = icmp ne ptr %217, null
  br i1 %218, label %219, label %221

219:                                              ; preds = %216
  %220 = call i32 (ptr, ...) @printf(ptr noundef @.str.14)
  store i32 4, ptr %8, align 4
  br label %663

221:                                              ; preds = %216
  %222 = load ptr, ptr %6, align 8, !tbaa !9
  %223 = getelementptr inbounds %struct.dict, ptr %222, i32 0, i32 1
  %224 = load ptr, ptr %223, align 8, !tbaa !12
  %225 = getelementptr inbounds %struct.dict_vtable, ptr %224, i32 0, i32 0
  %226 = load i8, ptr %225, align 8, !tbaa !29, !range !25, !noundef !26
  %227 = trunc i8 %226 to i1
  br i1 %227, label %230, label %228

228:                                              ; preds = %221
  %229 = call i32 (ptr, ...) @printf(ptr noundef @.str.15)
  store i32 4, ptr %8, align 4
  br label %663

230:                                              ; preds = %221
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #9
  %231 = load ptr, ptr %6, align 8, !tbaa !9
  %232 = getelementptr inbounds %struct.dict, ptr %231, i32 0, i32 1
  %233 = load ptr, ptr %232, align 8, !tbaa !12
  %234 = getelementptr inbounds %struct.dict_vtable, ptr %233, i32 0, i32 5
  %235 = load ptr, ptr %234, align 8, !tbaa !30
  %236 = icmp ne ptr %235, null
  br i1 %236, label %237, label %248

237:                                              ; preds = %230
  %238 = load ptr, ptr %6, align 8, !tbaa !9
  %239 = getelementptr inbounds %struct.dict, ptr %238, i32 0, i32 1
  %240 = load ptr, ptr %239, align 8, !tbaa !12
  %241 = getelementptr inbounds %struct.dict_vtable, ptr %240, i32 0, i32 5
  %242 = load ptr, ptr %241, align 8, !tbaa !30
  %243 = load ptr, ptr %6, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.dict, ptr %243, i32 0, i32 0
  %245 = load ptr, ptr %244, align 8, !tbaa !17
  %246 = load ptr, ptr %10, align 8, !tbaa !9
  %247 = call ptr %242(ptr noundef %245, ptr noundef %246)
  br label %249

248:                                              ; preds = %230
  br label %249

249:                                              ; preds = %248, %237
  %250 = phi ptr [ %247, %237 ], [ null, %248 ]
  store ptr %250, ptr %14, align 8, !tbaa !9
  %251 = load ptr, ptr %14, align 8, !tbaa !9
  %252 = icmp ne ptr %251, null
  br i1 %252, label %253, label %258

253:                                              ; preds = %249
  %254 = load ptr, ptr %10, align 8, !tbaa !9
  %255 = load ptr, ptr %14, align 8, !tbaa !9
  %256 = load ptr, ptr %255, align 8, !tbaa !9
  %257 = call i32 (ptr, ...) @printf(ptr noundef @.str.16, ptr noundef %254, ptr noundef %256)
  br label %261

258:                                              ; preds = %249
  %259 = load ptr, ptr %10, align 8, !tbaa !9
  %260 = call i32 (ptr, ...) @printf(ptr noundef @.str.17, ptr noundef %259)
  br label %261

261:                                              ; preds = %258, %253
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  br label %660

262:                                              ; preds = %212
  %263 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %264 = call i32 @strcmp(ptr noundef %263, ptr noundef @.str.18) #10
  %265 = icmp eq i32 %264, 0
  br i1 %265, label %266, label %312

266:                                              ; preds = %262
  %267 = load ptr, ptr %11, align 8, !tbaa !9
  %268 = icmp ne ptr %267, null
  br i1 %268, label %269, label %271

269:                                              ; preds = %266
  %270 = call i32 (ptr, ...) @printf(ptr noundef @.str.19)
  store i32 4, ptr %8, align 4
  br label %663

271:                                              ; preds = %266
  %272 = load ptr, ptr %6, align 8, !tbaa !9
  %273 = getelementptr inbounds %struct.dict, ptr %272, i32 0, i32 1
  %274 = load ptr, ptr %273, align 8, !tbaa !12
  %275 = getelementptr inbounds %struct.dict_vtable, ptr %274, i32 0, i32 0
  %276 = load i8, ptr %275, align 8, !tbaa !29, !range !25, !noundef !26
  %277 = trunc i8 %276 to i1
  br i1 %277, label %280, label %278

278:                                              ; preds = %271
  %279 = call i32 (ptr, ...) @printf(ptr noundef @.str.15)
  store i32 4, ptr %8, align 4
  br label %663

280:                                              ; preds = %271
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #9
  %281 = load ptr, ptr %6, align 8, !tbaa !9
  %282 = getelementptr inbounds %struct.dict, ptr %281, i32 0, i32 1
  %283 = load ptr, ptr %282, align 8, !tbaa !12
  %284 = getelementptr inbounds %struct.dict_vtable, ptr %283, i32 0, i32 6
  %285 = load ptr, ptr %284, align 8, !tbaa !31
  %286 = icmp ne ptr %285, null
  br i1 %286, label %287, label %298

287:                                              ; preds = %280
  %288 = load ptr, ptr %6, align 8, !tbaa !9
  %289 = getelementptr inbounds %struct.dict, ptr %288, i32 0, i32 1
  %290 = load ptr, ptr %289, align 8, !tbaa !12
  %291 = getelementptr inbounds %struct.dict_vtable, ptr %290, i32 0, i32 6
  %292 = load ptr, ptr %291, align 8, !tbaa !31
  %293 = load ptr, ptr %6, align 8, !tbaa !9
  %294 = getelementptr inbounds %struct.dict, ptr %293, i32 0, i32 0
  %295 = load ptr, ptr %294, align 8, !tbaa !17
  %296 = load ptr, ptr %10, align 8, !tbaa !9
  %297 = call ptr %292(ptr noundef %295, ptr noundef %296)
  br label %299

298:                                              ; preds = %280
  br label %299

299:                                              ; preds = %298, %287
  %300 = phi ptr [ %297, %287 ], [ null, %298 ]
  store ptr %300, ptr %15, align 8, !tbaa !9
  %301 = load ptr, ptr %15, align 8, !tbaa !9
  %302 = icmp ne ptr %301, null
  br i1 %302, label %303, label %308

303:                                              ; preds = %299
  %304 = load ptr, ptr %10, align 8, !tbaa !9
  %305 = load ptr, ptr %15, align 8, !tbaa !9
  %306 = load ptr, ptr %305, align 8, !tbaa !9
  %307 = call i32 (ptr, ...) @printf(ptr noundef @.str.20, ptr noundef %304, ptr noundef %306)
  br label %311

308:                                              ; preds = %299
  %309 = load ptr, ptr %10, align 8, !tbaa !9
  %310 = call i32 (ptr, ...) @printf(ptr noundef @.str.21, ptr noundef %309)
  br label %311

311:                                              ; preds = %308, %303
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #9
  br label %659

312:                                              ; preds = %262
  %313 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %314 = call i32 @strcmp(ptr noundef %313, ptr noundef @.str.22) #10
  %315 = icmp eq i32 %314, 0
  br i1 %315, label %316, label %362

316:                                              ; preds = %312
  %317 = load ptr, ptr %11, align 8, !tbaa !9
  %318 = icmp ne ptr %317, null
  br i1 %318, label %319, label %321

319:                                              ; preds = %316
  %320 = call i32 (ptr, ...) @printf(ptr noundef @.str.23)
  store i32 4, ptr %8, align 4
  br label %663

321:                                              ; preds = %316
  %322 = load ptr, ptr %6, align 8, !tbaa !9
  %323 = getelementptr inbounds %struct.dict, ptr %322, i32 0, i32 1
  %324 = load ptr, ptr %323, align 8, !tbaa !12
  %325 = getelementptr inbounds %struct.dict_vtable, ptr %324, i32 0, i32 0
  %326 = load i8, ptr %325, align 8, !tbaa !29, !range !25, !noundef !26
  %327 = trunc i8 %326 to i1
  br i1 %327, label %330, label %328

328:                                              ; preds = %321
  %329 = call i32 (ptr, ...) @printf(ptr noundef @.str.15)
  store i32 4, ptr %8, align 4
  br label %663

330:                                              ; preds = %321
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #9
  %331 = load ptr, ptr %6, align 8, !tbaa !9
  %332 = getelementptr inbounds %struct.dict, ptr %331, i32 0, i32 1
  %333 = load ptr, ptr %332, align 8, !tbaa !12
  %334 = getelementptr inbounds %struct.dict_vtable, ptr %333, i32 0, i32 7
  %335 = load ptr, ptr %334, align 8, !tbaa !32
  %336 = icmp ne ptr %335, null
  br i1 %336, label %337, label %348

337:                                              ; preds = %330
  %338 = load ptr, ptr %6, align 8, !tbaa !9
  %339 = getelementptr inbounds %struct.dict, ptr %338, i32 0, i32 1
  %340 = load ptr, ptr %339, align 8, !tbaa !12
  %341 = getelementptr inbounds %struct.dict_vtable, ptr %340, i32 0, i32 7
  %342 = load ptr, ptr %341, align 8, !tbaa !32
  %343 = load ptr, ptr %6, align 8, !tbaa !9
  %344 = getelementptr inbounds %struct.dict, ptr %343, i32 0, i32 0
  %345 = load ptr, ptr %344, align 8, !tbaa !17
  %346 = load ptr, ptr %10, align 8, !tbaa !9
  %347 = call ptr %342(ptr noundef %345, ptr noundef %346)
  br label %349

348:                                              ; preds = %330
  br label %349

349:                                              ; preds = %348, %337
  %350 = phi ptr [ %347, %337 ], [ null, %348 ]
  store ptr %350, ptr %16, align 8, !tbaa !9
  %351 = load ptr, ptr %16, align 8, !tbaa !9
  %352 = icmp ne ptr %351, null
  br i1 %352, label %353, label %358

353:                                              ; preds = %349
  %354 = load ptr, ptr %10, align 8, !tbaa !9
  %355 = load ptr, ptr %16, align 8, !tbaa !9
  %356 = load ptr, ptr %355, align 8, !tbaa !9
  %357 = call i32 (ptr, ...) @printf(ptr noundef @.str.24, ptr noundef %354, ptr noundef %356)
  br label %361

358:                                              ; preds = %349
  %359 = load ptr, ptr %10, align 8, !tbaa !9
  %360 = call i32 (ptr, ...) @printf(ptr noundef @.str.25, ptr noundef %359)
  br label %361

361:                                              ; preds = %358, %353
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #9
  br label %658

362:                                              ; preds = %312
  %363 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %364 = call i32 @strcmp(ptr noundef %363, ptr noundef @.str.26) #10
  %365 = icmp eq i32 %364, 0
  br i1 %365, label %366, label %412

366:                                              ; preds = %362
  %367 = load ptr, ptr %11, align 8, !tbaa !9
  %368 = icmp ne ptr %367, null
  br i1 %368, label %369, label %371

369:                                              ; preds = %366
  %370 = call i32 (ptr, ...) @printf(ptr noundef @.str.27)
  store i32 4, ptr %8, align 4
  br label %663

371:                                              ; preds = %366
  %372 = load ptr, ptr %6, align 8, !tbaa !9
  %373 = getelementptr inbounds %struct.dict, ptr %372, i32 0, i32 1
  %374 = load ptr, ptr %373, align 8, !tbaa !12
  %375 = getelementptr inbounds %struct.dict_vtable, ptr %374, i32 0, i32 0
  %376 = load i8, ptr %375, align 8, !tbaa !29, !range !25, !noundef !26
  %377 = trunc i8 %376 to i1
  br i1 %377, label %380, label %378

378:                                              ; preds = %371
  %379 = call i32 (ptr, ...) @printf(ptr noundef @.str.15)
  store i32 4, ptr %8, align 4
  br label %663

380:                                              ; preds = %371
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #9
  %381 = load ptr, ptr %6, align 8, !tbaa !9
  %382 = getelementptr inbounds %struct.dict, ptr %381, i32 0, i32 1
  %383 = load ptr, ptr %382, align 8, !tbaa !12
  %384 = getelementptr inbounds %struct.dict_vtable, ptr %383, i32 0, i32 8
  %385 = load ptr, ptr %384, align 8, !tbaa !33
  %386 = icmp ne ptr %385, null
  br i1 %386, label %387, label %398

387:                                              ; preds = %380
  %388 = load ptr, ptr %6, align 8, !tbaa !9
  %389 = getelementptr inbounds %struct.dict, ptr %388, i32 0, i32 1
  %390 = load ptr, ptr %389, align 8, !tbaa !12
  %391 = getelementptr inbounds %struct.dict_vtable, ptr %390, i32 0, i32 8
  %392 = load ptr, ptr %391, align 8, !tbaa !33
  %393 = load ptr, ptr %6, align 8, !tbaa !9
  %394 = getelementptr inbounds %struct.dict, ptr %393, i32 0, i32 0
  %395 = load ptr, ptr %394, align 8, !tbaa !17
  %396 = load ptr, ptr %10, align 8, !tbaa !9
  %397 = call ptr %392(ptr noundef %395, ptr noundef %396)
  br label %399

398:                                              ; preds = %380
  br label %399

399:                                              ; preds = %398, %387
  %400 = phi ptr [ %397, %387 ], [ null, %398 ]
  store ptr %400, ptr %17, align 8, !tbaa !9
  %401 = load ptr, ptr %17, align 8, !tbaa !9
  %402 = icmp ne ptr %401, null
  br i1 %402, label %403, label %408

403:                                              ; preds = %399
  %404 = load ptr, ptr %10, align 8, !tbaa !9
  %405 = load ptr, ptr %17, align 8, !tbaa !9
  %406 = load ptr, ptr %405, align 8, !tbaa !9
  %407 = call i32 (ptr, ...) @printf(ptr noundef @.str.28, ptr noundef %404, ptr noundef %406)
  br label %411

408:                                              ; preds = %399
  %409 = load ptr, ptr %10, align 8, !tbaa !9
  %410 = call i32 (ptr, ...) @printf(ptr noundef @.str.29, ptr noundef %409)
  br label %411

411:                                              ; preds = %408, %403
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #9
  br label %657

412:                                              ; preds = %362
  %413 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %414 = call i32 @strcmp(ptr noundef %413, ptr noundef @.str.30) #10
  %415 = icmp eq i32 %414, 0
  br i1 %415, label %416, label %451

416:                                              ; preds = %412
  %417 = load ptr, ptr %10, align 8, !tbaa !9
  %418 = icmp ne ptr %417, null
  br i1 %418, label %419, label %422

419:                                              ; preds = %416
  %420 = load ptr, ptr %11, align 8, !tbaa !9
  %421 = icmp ne ptr %420, null
  br i1 %421, label %422, label %424

422:                                              ; preds = %419, %416
  %423 = call i32 (ptr, ...) @printf(ptr noundef @.str.31)
  store i32 4, ptr %8, align 4
  br label %663

424:                                              ; preds = %419
  call void @llvm.lifetime.start.p0(i64 24, ptr %18) #9
  %425 = load ptr, ptr %6, align 8, !tbaa !9
  %426 = getelementptr inbounds %struct.dict, ptr %425, i32 0, i32 1
  %427 = load ptr, ptr %426, align 8, !tbaa !12
  %428 = getelementptr inbounds %struct.dict_vtable, ptr %427, i32 0, i32 9
  %429 = load ptr, ptr %428, align 8, !tbaa !34
  %430 = load ptr, ptr %6, align 8, !tbaa !9
  %431 = getelementptr inbounds %struct.dict, ptr %430, i32 0, i32 0
  %432 = load ptr, ptr %431, align 8, !tbaa !17
  %433 = load ptr, ptr %10, align 8, !tbaa !9
  call void %429(ptr dead_on_unwind writable sret(%struct.dict_remove_result) align 8 %18, ptr noundef %432, ptr noundef %433)
  %434 = getelementptr inbounds %struct.dict_remove_result, ptr %18, i32 0, i32 2
  %435 = load i8, ptr %434, align 8, !tbaa !35, !range !25, !noundef !26
  %436 = trunc i8 %435 to i1
  br i1 %436, label %437, label %447

437:                                              ; preds = %424
  %438 = getelementptr inbounds %struct.dict_remove_result, ptr %18, i32 0, i32 0
  %439 = load ptr, ptr %438, align 8, !tbaa !37
  %440 = getelementptr inbounds %struct.dict_remove_result, ptr %18, i32 0, i32 1
  %441 = load ptr, ptr %440, align 8, !tbaa !38
  %442 = call i32 (ptr, ...) @printf(ptr noundef @.str.32, ptr noundef %439, ptr noundef %441)
  %443 = getelementptr inbounds %struct.dict_remove_result, ptr %18, i32 0, i32 0
  %444 = load ptr, ptr %443, align 8, !tbaa !37
  call void @free(ptr noundef %444) #9
  %445 = getelementptr inbounds %struct.dict_remove_result, ptr %18, i32 0, i32 1
  %446 = load ptr, ptr %445, align 8, !tbaa !38
  call void @free(ptr noundef %446) #9
  br label %450

447:                                              ; preds = %424
  %448 = load ptr, ptr %10, align 8, !tbaa !9
  %449 = call i32 (ptr, ...) @printf(ptr noundef @.str.33, ptr noundef %448)
  br label %450

450:                                              ; preds = %447, %437
  call void @llvm.lifetime.end.p0(i64 24, ptr %18) #9
  br label %656

451:                                              ; preds = %412
  %452 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %453 = call i32 @strcmp(ptr noundef %452, ptr noundef @.str.34) #10
  %454 = icmp eq i32 %453, 0
  br i1 %454, label %455, label %522

455:                                              ; preds = %451
  %456 = load ptr, ptr %10, align 8, !tbaa !9
  %457 = icmp ne ptr %456, null
  br i1 %457, label %458, label %460

458:                                              ; preds = %455
  %459 = call i32 (ptr, ...) @printf(ptr noundef @.str.35)
  store i32 4, ptr %8, align 4
  br label %663

460:                                              ; preds = %455
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #9
  %461 = load ptr, ptr %6, align 8, !tbaa !9
  %462 = getelementptr inbounds %struct.dict, ptr %461, i32 0, i32 1
  %463 = load ptr, ptr %462, align 8, !tbaa !12
  %464 = getelementptr inbounds %struct.dict_vtable, ptr %463, i32 0, i32 1
  %465 = load ptr, ptr %464, align 8, !tbaa !39
  %466 = load ptr, ptr %6, align 8, !tbaa !9
  %467 = getelementptr inbounds %struct.dict, ptr %466, i32 0, i32 0
  %468 = load ptr, ptr %467, align 8, !tbaa !17
  %469 = call ptr %465(ptr noundef %468)
  store ptr %469, ptr %19, align 8, !tbaa !9
  %470 = load ptr, ptr %19, align 8, !tbaa !9
  %471 = getelementptr inbounds %struct.dict_itor, ptr %470, i32 0, i32 1
  %472 = load ptr, ptr %471, align 8, !tbaa !40
  %473 = getelementptr inbounds %struct.itor_vtable, ptr %472, i32 0, i32 7
  %474 = load ptr, ptr %473, align 8, !tbaa !42
  %475 = load ptr, ptr %19, align 8, !tbaa !9
  %476 = getelementptr inbounds %struct.dict_itor, ptr %475, i32 0, i32 0
  %477 = load ptr, ptr %476, align 8, !tbaa !44
  %478 = call zeroext i1 %474(ptr noundef %477)
  br label %479

479:                                              ; preds = %510, %460
  %480 = load ptr, ptr %19, align 8, !tbaa !9
  %481 = getelementptr inbounds %struct.dict_itor, ptr %480, i32 0, i32 1
  %482 = load ptr, ptr %481, align 8, !tbaa !40
  %483 = getelementptr inbounds %struct.itor_vtable, ptr %482, i32 0, i32 1
  %484 = load ptr, ptr %483, align 8, !tbaa !45
  %485 = load ptr, ptr %19, align 8, !tbaa !9
  %486 = getelementptr inbounds %struct.dict_itor, ptr %485, i32 0, i32 0
  %487 = load ptr, ptr %486, align 8, !tbaa !44
  %488 = call zeroext i1 %484(ptr noundef %487)
  br i1 %488, label %489, label %520

489:                                              ; preds = %479
  %490 = load ptr, ptr %19, align 8, !tbaa !9
  %491 = getelementptr inbounds %struct.dict_itor, ptr %490, i32 0, i32 1
  %492 = load ptr, ptr %491, align 8, !tbaa !40
  %493 = getelementptr inbounds %struct.itor_vtable, ptr %492, i32 0, i32 9
  %494 = load ptr, ptr %493, align 8, !tbaa !46
  %495 = load ptr, ptr %19, align 8, !tbaa !9
  %496 = getelementptr inbounds %struct.dict_itor, ptr %495, i32 0, i32 0
  %497 = load ptr, ptr %496, align 8, !tbaa !44
  %498 = call ptr %494(ptr noundef %497)
  %499 = load ptr, ptr %19, align 8, !tbaa !9
  %500 = getelementptr inbounds %struct.dict_itor, ptr %499, i32 0, i32 1
  %501 = load ptr, ptr %500, align 8, !tbaa !40
  %502 = getelementptr inbounds %struct.itor_vtable, ptr %501, i32 0, i32 10
  %503 = load ptr, ptr %502, align 8, !tbaa !47
  %504 = load ptr, ptr %19, align 8, !tbaa !9
  %505 = getelementptr inbounds %struct.dict_itor, ptr %504, i32 0, i32 0
  %506 = load ptr, ptr %505, align 8, !tbaa !44
  %507 = call ptr %503(ptr noundef %506)
  %508 = load ptr, ptr %507, align 8, !tbaa !9
  %509 = call i32 (ptr, ...) @printf(ptr noundef @.str.36, ptr noundef %498, ptr noundef %508)
  br label %510

510:                                              ; preds = %489
  %511 = load ptr, ptr %19, align 8, !tbaa !9
  %512 = getelementptr inbounds %struct.dict_itor, ptr %511, i32 0, i32 1
  %513 = load ptr, ptr %512, align 8, !tbaa !40
  %514 = getelementptr inbounds %struct.itor_vtable, ptr %513, i32 0, i32 3
  %515 = load ptr, ptr %514, align 8, !tbaa !48
  %516 = load ptr, ptr %19, align 8, !tbaa !9
  %517 = getelementptr inbounds %struct.dict_itor, ptr %516, i32 0, i32 0
  %518 = load ptr, ptr %517, align 8, !tbaa !44
  %519 = call zeroext i1 %515(ptr noundef %518)
  br label %479, !llvm.loop !49

520:                                              ; preds = %479
  %521 = load ptr, ptr %19, align 8, !tbaa !9
  call void @dict_itor_free(ptr noundef %521)
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #9
  br label %655

522:                                              ; preds = %451
  %523 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %524 = call i32 @strcmp(ptr noundef %523, ptr noundef @.str.37) #10
  %525 = icmp eq i32 %524, 0
  br i1 %525, label %526, label %593

526:                                              ; preds = %522
  %527 = load ptr, ptr %10, align 8, !tbaa !9
  %528 = icmp ne ptr %527, null
  br i1 %528, label %529, label %531

529:                                              ; preds = %526
  %530 = call i32 (ptr, ...) @printf(ptr noundef @.str.38)
  store i32 4, ptr %8, align 4
  br label %663

531:                                              ; preds = %526
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #9
  %532 = load ptr, ptr %6, align 8, !tbaa !9
  %533 = getelementptr inbounds %struct.dict, ptr %532, i32 0, i32 1
  %534 = load ptr, ptr %533, align 8, !tbaa !12
  %535 = getelementptr inbounds %struct.dict_vtable, ptr %534, i32 0, i32 1
  %536 = load ptr, ptr %535, align 8, !tbaa !39
  %537 = load ptr, ptr %6, align 8, !tbaa !9
  %538 = getelementptr inbounds %struct.dict, ptr %537, i32 0, i32 0
  %539 = load ptr, ptr %538, align 8, !tbaa !17
  %540 = call ptr %536(ptr noundef %539)
  store ptr %540, ptr %20, align 8, !tbaa !9
  %541 = load ptr, ptr %20, align 8, !tbaa !9
  %542 = getelementptr inbounds %struct.dict_itor, ptr %541, i32 0, i32 1
  %543 = load ptr, ptr %542, align 8, !tbaa !40
  %544 = getelementptr inbounds %struct.itor_vtable, ptr %543, i32 0, i32 8
  %545 = load ptr, ptr %544, align 8, !tbaa !50
  %546 = load ptr, ptr %20, align 8, !tbaa !9
  %547 = getelementptr inbounds %struct.dict_itor, ptr %546, i32 0, i32 0
  %548 = load ptr, ptr %547, align 8, !tbaa !44
  %549 = call zeroext i1 %545(ptr noundef %548)
  br label %550

550:                                              ; preds = %581, %531
  %551 = load ptr, ptr %20, align 8, !tbaa !9
  %552 = getelementptr inbounds %struct.dict_itor, ptr %551, i32 0, i32 1
  %553 = load ptr, ptr %552, align 8, !tbaa !40
  %554 = getelementptr inbounds %struct.itor_vtable, ptr %553, i32 0, i32 1
  %555 = load ptr, ptr %554, align 8, !tbaa !45
  %556 = load ptr, ptr %20, align 8, !tbaa !9
  %557 = getelementptr inbounds %struct.dict_itor, ptr %556, i32 0, i32 0
  %558 = load ptr, ptr %557, align 8, !tbaa !44
  %559 = call zeroext i1 %555(ptr noundef %558)
  br i1 %559, label %560, label %591

560:                                              ; preds = %550
  %561 = load ptr, ptr %20, align 8, !tbaa !9
  %562 = getelementptr inbounds %struct.dict_itor, ptr %561, i32 0, i32 1
  %563 = load ptr, ptr %562, align 8, !tbaa !40
  %564 = getelementptr inbounds %struct.itor_vtable, ptr %563, i32 0, i32 9
  %565 = load ptr, ptr %564, align 8, !tbaa !46
  %566 = load ptr, ptr %20, align 8, !tbaa !9
  %567 = getelementptr inbounds %struct.dict_itor, ptr %566, i32 0, i32 0
  %568 = load ptr, ptr %567, align 8, !tbaa !44
  %569 = call ptr %565(ptr noundef %568)
  %570 = load ptr, ptr %20, align 8, !tbaa !9
  %571 = getelementptr inbounds %struct.dict_itor, ptr %570, i32 0, i32 1
  %572 = load ptr, ptr %571, align 8, !tbaa !40
  %573 = getelementptr inbounds %struct.itor_vtable, ptr %572, i32 0, i32 10
  %574 = load ptr, ptr %573, align 8, !tbaa !47
  %575 = load ptr, ptr %20, align 8, !tbaa !9
  %576 = getelementptr inbounds %struct.dict_itor, ptr %575, i32 0, i32 0
  %577 = load ptr, ptr %576, align 8, !tbaa !44
  %578 = call ptr %574(ptr noundef %577)
  %579 = load ptr, ptr %578, align 8, !tbaa !9
  %580 = call i32 (ptr, ...) @printf(ptr noundef @.str.36, ptr noundef %569, ptr noundef %579)
  br label %581

581:                                              ; preds = %560
  %582 = load ptr, ptr %20, align 8, !tbaa !9
  %583 = getelementptr inbounds %struct.dict_itor, ptr %582, i32 0, i32 1
  %584 = load ptr, ptr %583, align 8, !tbaa !40
  %585 = getelementptr inbounds %struct.itor_vtable, ptr %584, i32 0, i32 4
  %586 = load ptr, ptr %585, align 8, !tbaa !51
  %587 = load ptr, ptr %20, align 8, !tbaa !9
  %588 = getelementptr inbounds %struct.dict_itor, ptr %587, i32 0, i32 0
  %589 = load ptr, ptr %588, align 8, !tbaa !44
  %590 = call zeroext i1 %586(ptr noundef %589)
  br label %550, !llvm.loop !52

591:                                              ; preds = %550
  %592 = load ptr, ptr %20, align 8, !tbaa !9
  call void @dict_itor_free(ptr noundef %592)
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #9
  br label %654

593:                                              ; preds = %522
  %594 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %595 = call i32 @strcmp(ptr noundef %594, ptr noundef @.str.39) #10
  %596 = icmp eq i32 %595, 0
  br i1 %596, label %597, label %612

597:                                              ; preds = %593
  %598 = load ptr, ptr %10, align 8, !tbaa !9
  %599 = icmp ne ptr %598, null
  br i1 %599, label %600, label %602

600:                                              ; preds = %597
  %601 = call i32 (ptr, ...) @printf(ptr noundef @.str.40)
  store i32 4, ptr %8, align 4
  br label %663

602:                                              ; preds = %597
  %603 = load ptr, ptr %6, align 8, !tbaa !9
  %604 = getelementptr inbounds %struct.dict, ptr %603, i32 0, i32 1
  %605 = load ptr, ptr %604, align 8, !tbaa !12
  %606 = getelementptr inbounds %struct.dict_vtable, ptr %605, i32 0, i32 10
  %607 = load ptr, ptr %606, align 8, !tbaa !53
  %608 = load ptr, ptr %6, align 8, !tbaa !9
  %609 = getelementptr inbounds %struct.dict, ptr %608, i32 0, i32 0
  %610 = load ptr, ptr %609, align 8, !tbaa !17
  %611 = call i64 %607(ptr noundef %610, ptr noundef @key_val_free)
  br label %653

612:                                              ; preds = %593
  %613 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %614 = call i32 @strcmp(ptr noundef %613, ptr noundef @.str.41) #10
  %615 = icmp eq i32 %614, 0
  br i1 %615, label %616, label %632

616:                                              ; preds = %612
  %617 = load ptr, ptr %10, align 8, !tbaa !9
  %618 = icmp ne ptr %617, null
  br i1 %618, label %619, label %621

619:                                              ; preds = %616
  %620 = call i32 (ptr, ...) @printf(ptr noundef @.str.42)
  store i32 4, ptr %8, align 4
  br label %663

621:                                              ; preds = %616
  %622 = load ptr, ptr %6, align 8, !tbaa !9
  %623 = getelementptr inbounds %struct.dict, ptr %622, i32 0, i32 1
  %624 = load ptr, ptr %623, align 8, !tbaa !12
  %625 = getelementptr inbounds %struct.dict_vtable, ptr %624, i32 0, i32 13
  %626 = load ptr, ptr %625, align 8, !tbaa !54
  %627 = load ptr, ptr %6, align 8, !tbaa !9
  %628 = getelementptr inbounds %struct.dict, ptr %627, i32 0, i32 0
  %629 = load ptr, ptr %628, align 8, !tbaa !17
  %630 = call i64 %626(ptr noundef %629)
  %631 = call i32 (ptr, ...) @printf(ptr noundef @.str.43, i64 noundef %630)
  br label %652

632:                                              ; preds = %612
  %633 = getelementptr inbounds [512 x i8], ptr %7, i64 0, i64 0
  %634 = call i32 @strcmp(ptr noundef %633, ptr noundef @.str.44) #10
  %635 = icmp eq i32 %634, 0
  br i1 %635, label %636, label %637

636:                                              ; preds = %632
  store i32 3, ptr %8, align 4
  br label %663

637:                                              ; preds = %632
  %638 = call i32 (ptr, ...) @printf(ptr noundef @.str.45)
  %639 = call i32 (ptr, ...) @printf(ptr noundef @.str.46)
  %640 = call i32 (ptr, ...) @printf(ptr noundef @.str.47)
  %641 = call i32 (ptr, ...) @printf(ptr noundef @.str.48)
  %642 = call i32 (ptr, ...) @printf(ptr noundef @.str.49)
  %643 = call i32 (ptr, ...) @printf(ptr noundef @.str.50)
  %644 = call i32 (ptr, ...) @printf(ptr noundef @.str.51)
  %645 = call i32 (ptr, ...) @printf(ptr noundef @.str.52)
  %646 = call i32 (ptr, ...) @printf(ptr noundef @.str.53)
  %647 = call i32 (ptr, ...) @printf(ptr noundef @.str.54)
  %648 = call i32 (ptr, ...) @printf(ptr noundef @.str.55)
  %649 = call i32 (ptr, ...) @printf(ptr noundef @.str.56)
  %650 = call i32 (ptr, ...) @printf(ptr noundef @.str.57)
  br label %651

651:                                              ; preds = %637
  br label %652

652:                                              ; preds = %651, %621
  br label %653

653:                                              ; preds = %652, %602
  br label %654

654:                                              ; preds = %653, %591
  br label %655

655:                                              ; preds = %654, %520
  br label %656

656:                                              ; preds = %655, %450
  br label %657

657:                                              ; preds = %656, %411
  br label %658

658:                                              ; preds = %657, %361
  br label %659

659:                                              ; preds = %658, %311
  br label %660

660:                                              ; preds = %659, %261
  br label %661

661:                                              ; preds = %660, %211
  br label %662

662:                                              ; preds = %661, %180
  store i32 0, ptr %8, align 4
  br label %663

663:                                              ; preds = %662, %636, %619, %600, %529, %458, %422, %378, %369, %328, %319, %278, %269, %228, %219, %188, %143, %135
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  br label %664

664:                                              ; preds = %663, %76
  call void @llvm.lifetime.end.p0(i64 512, ptr %7) #9
  %665 = load i32, ptr %8, align 4
  switch i32 %665, label %670 [
    i32 0, label %666
    i32 3, label %667
    i32 4, label %59
  ]

666:                                              ; preds = %664
  br label %59

667:                                              ; preds = %664
  %668 = load ptr, ptr %6, align 8, !tbaa !9
  %669 = call i64 @dict_free(ptr noundef %668, ptr noundef @key_val_free)
  call void @exit(i32 noundef 0) #12
  unreachable

670:                                              ; preds = %664
  unreachable
}

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

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

; Function Attrs: nounwind
declare i64 @time(ptr noundef) #2

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

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

declare ptr @hb_dict_new(ptr noundef) #4

; Function Attrs: nounwind willreturn memory(read)
declare i32 @strcmp(ptr noundef, ptr noundef) #5

declare ptr @pr_dict_new(ptr noundef) #4

declare ptr @rb_dict_new(ptr noundef) #4

declare ptr @tr_dict_new(ptr noundef, ptr noundef) #4

declare ptr @sp_dict_new(ptr noundef) #4

declare ptr @wb_dict_new(ptr noundef) #4

declare ptr @skiplist_dict_new(ptr noundef, i32 noundef) #4

declare ptr @hashtable_dict_new(ptr noundef, ptr noundef, i32 noundef) #4

declare i32 @dict_str_hash(ptr noundef) #4

declare ptr @hashtable2_dict_new(ptr noundef, ptr noundef, i32 noundef) #4

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

declare i32 @fflush(ptr noundef) #4

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

; Function Attrs: nounwind willreturn memory(read)
declare ptr @strchr(ptr noundef, i32 noundef) #5

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__ctype_b_loc() #6

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

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

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

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

; Function Attrs: nounwind
declare void @free(ptr noundef) #2

declare void @dict_itor_free(ptr noundef) #4

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"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 = !{!7, !7, i64 0}
!12 = !{!13, !10, i64 8}
!13 = !{!"", !10, i64 0, !10, i64 8}
!14 = !{!15, !10, i64 112}
!15 = !{!"", !16, 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}
!16 = !{!"_Bool", !7, i64 0}
!17 = !{!13, !10, i64 0}
!18 = !{!19, !19, i64 0}
!19 = !{!"short", !7, i64 0}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = !{!15, !10, i64 24}
!23 = !{!24, !16, i64 8}
!24 = !{!"", !10, i64 0, !16, i64 8}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!24, !10, i64 0}
!28 = !{!15, !10, i64 32}
!29 = !{!15, !16, i64 0}
!30 = !{!15, !10, i64 40}
!31 = !{!15, !10, i64 48}
!32 = !{!15, !10, i64 56}
!33 = !{!15, !10, i64 64}
!34 = !{!15, !10, i64 72}
!35 = !{!36, !16, i64 16}
!36 = !{!"", !10, i64 0, !10, i64 8, !16, i64 16}
!37 = !{!36, !10, i64 0}
!38 = !{!36, !10, i64 8}
!39 = !{!15, !10, i64 8}
!40 = !{!41, !10, i64 8}
!41 = !{!"dict_itor", !10, i64 0, !10, i64 8}
!42 = !{!43, !10, i64 56}
!43 = !{!"", !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}
!44 = !{!41, !10, i64 0}
!45 = !{!43, !10, i64 8}
!46 = !{!43, !10, i64 72}
!47 = !{!43, !10, i64 80}
!48 = !{!43, !10, i64 24}
!49 = distinct !{!49, !21}
!50 = !{!43, !10, i64 64}
!51 = !{!43, !10, i64 32}
!52 = distinct !{!52, !21}
!53 = !{!15, !10, i64 80}
!54 = !{!15, !10, i64 104}


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

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

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

5:                                                ; preds = %2
  tail call void (ptr, ...) @quit(ptr noundef nonnull @.str, ptr noundef nonnull @appname) #12
  unreachable

6:                                                ; preds = %2
  %7 = tail call i64 @time(ptr noundef null) #13
  %8 = trunc i64 %7 to i32
  tail call void @srand(i32 noundef %8) #13
  store ptr @xmalloc, ptr @dict_malloc_func, align 8, !tbaa !5
  %9 = getelementptr inbounds i8, ptr %1, i64 8
  %10 = load ptr, ptr %9, align 8, !tbaa !5
  %11 = load i8, ptr %10, align 1, !tbaa !9
  switch i8 %11, label %30 [
    i8 104, label %12
    i8 112, label %14
    i8 114, label %16
    i8 116, label %18
    i8 115, label %20
    i8 119, label %22
    i8 83, label %24
    i8 72, label %26
    i8 50, label %28
  ]

12:                                               ; preds = %6
  %13 = tail call ptr @hb_dict_new(ptr noundef nonnull @strcmp) #13
  br label %31

14:                                               ; preds = %6
  %15 = tail call ptr @pr_dict_new(ptr noundef nonnull @strcmp) #13
  br label %31

16:                                               ; preds = %6
  %17 = tail call ptr @rb_dict_new(ptr noundef nonnull @strcmp) #13
  br label %31

18:                                               ; preds = %6
  %19 = tail call ptr @tr_dict_new(ptr noundef nonnull @strcmp, ptr noundef null) #13
  br label %31

20:                                               ; preds = %6
  %21 = tail call ptr @sp_dict_new(ptr noundef nonnull @strcmp) #13
  br label %31

22:                                               ; preds = %6
  %23 = tail call ptr @wb_dict_new(ptr noundef nonnull @strcmp) #13
  br label %31

24:                                               ; preds = %6
  %25 = tail call ptr @skiplist_dict_new(ptr noundef nonnull @strcmp, i32 noundef 10) #13
  br label %31

26:                                               ; preds = %6
  %27 = tail call ptr @hashtable_dict_new(ptr noundef nonnull @strcmp, ptr noundef nonnull @dict_str_hash, i32 noundef 997) #13
  br label %31

28:                                               ; preds = %6
  %29 = tail call ptr @hashtable2_dict_new(ptr noundef nonnull @strcmp, ptr noundef nonnull @dict_str_hash, i32 noundef 997) #13
  br label %31

30:                                               ; preds = %6
  tail call void (ptr, ...) @quit(ptr noundef nonnull @.str.1) #12
  unreachable

31:                                               ; preds = %28, %26, %24, %22, %20, %18, %16, %14, %12
  %.0 = phi ptr [ %29, %28 ], [ %27, %26 ], [ %25, %24 ], [ %23, %22 ], [ %21, %20 ], [ %19, %18 ], [ %17, %16 ], [ %15, %14 ], [ %13, %12 ]
  %.not127 = icmp eq ptr %.0, null
  br i1 %.not127, label %35, label %.preheader

.preheader:                                       ; preds = %31
  %32 = getelementptr inbounds i8, ptr %.0, i64 8
  %33 = getelementptr inbounds i8, ptr %4, i64 16
  %34 = getelementptr inbounds i8, ptr %4, i64 8
  br label %36

35:                                               ; preds = %31
  tail call void (ptr, ...) @quit(ptr noundef nonnull @.str.2) #12
  unreachable

36:                                               ; preds = %.preheader, %356
  %37 = load ptr, ptr %32, align 8, !tbaa !10
  %38 = getelementptr inbounds i8, ptr %37, i64 112
  %39 = load ptr, ptr %38, align 8, !tbaa !12
  %40 = load ptr, ptr %.0, align 8, !tbaa !15
  %41 = call zeroext i1 %39(ptr noundef %40) #13
  %42 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  %43 = load ptr, ptr @stdout, align 8, !tbaa !5
  %44 = call i32 @fflush(ptr noundef %43)
  call void @llvm.lifetime.start.p0(i64 512, ptr nonnull %3) #13
  %45 = load ptr, ptr @stdin, align 8, !tbaa !5
  %46 = call ptr @fgets(ptr noundef nonnull %3, i32 noundef 512, ptr noundef %45)
  %47 = icmp eq ptr %46, null
  br i1 %47, label %357, label %48

48:                                               ; preds = %36
  %49 = call ptr @strchr(ptr noundef nonnull dereferenceable(1) %3, i32 noundef 10) #14
  %.not128 = icmp eq ptr %49, null
  br i1 %.not128, label %51, label %50

50:                                               ; preds = %48
  store i8 0, ptr %49, align 1, !tbaa !9
  br label %51

51:                                               ; preds = %50, %48
  %52 = load i8, ptr %3, align 16, !tbaa !9
  %.not129163 = icmp eq i8 %52, 0
  br i1 %.not129163, label %.critedge.thread, label %.lr.ph

.lr.ph:                                           ; preds = %51
  %53 = tail call ptr @__ctype_b_loc() #15
  %54 = load ptr, ptr %53, align 8, !tbaa !5
  br label %55

55:                                               ; preds = %.lr.ph, %61
  %56 = phi i8 [ %52, %.lr.ph ], [ %63, %61 ]
  %.0112164 = phi ptr [ %3, %.lr.ph ], [ %62, %61 ]
  %57 = sext i8 %56 to i64
  %58 = getelementptr inbounds i16, ptr %54, i64 %57
  %59 = load i16, ptr %58, align 2, !tbaa !16
  %60 = and i16 %59, 8192
  %.not130 = icmp eq i16 %60, 0
  br i1 %.not130, label %.critedge, label %61

61:                                               ; preds = %55
  %62 = getelementptr inbounds i8, ptr %.0112164, i64 1
  %63 = load i8, ptr %62, align 1, !tbaa !9
  %.not129 = icmp eq i8 %63, 0
  br i1 %.not129, label %.critedge.thread173, label %55, !llvm.loop !18

.critedge:                                        ; preds = %55
  %.not131 = icmp eq ptr %3, %.0112164
  br i1 %.not131, label %.critedge.thread, label %.critedge.thread173

.critedge.thread173:                              ; preds = %61, %.critedge
  %.0112.lcssa176 = phi ptr [ %.0112164, %.critedge ], [ %62, %61 ]
  %64 = call ptr @strcpy(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) %.0112.lcssa176) #13
  br label %.critedge.thread

.critedge.thread:                                 ; preds = %51, %.critedge.thread173, %.critedge
  %65 = call ptr @strtok(ptr noundef nonnull %3, ptr noundef nonnull @.str.4) #13
  %.not132 = icmp eq ptr %65, null
  br i1 %.not132, label %.thread, label %66

66:                                               ; preds = %.critedge.thread
  %67 = call ptr @strtok(ptr noundef null, ptr noundef nonnull @.str.4) #13
  %.not133 = icmp eq ptr %67, null
  br i1 %.not133, label %.thread, label %68

68:                                               ; preds = %66
  %69 = call ptr @strtok(ptr noundef null, ptr noundef nonnull @.str.4) #13
  br label %.thread

.thread:                                          ; preds = %.critedge.thread, %66, %68
  %.not133150 = phi i1 [ false, %68 ], [ true, %66 ], [ true, %.critedge.thread ]
  %70 = phi ptr [ %67, %68 ], [ null, %66 ], [ null, %.critedge.thread ]
  %71 = phi ptr [ %69, %68 ], [ null, %66 ], [ null, %.critedge.thread ]
  %72 = load i8, ptr %3, align 16, !tbaa !9
  %73 = icmp eq i8 %72, 0
  br i1 %73, label %356, label %74

74:                                               ; preds = %.thread
  %75 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.5) #14
  %76 = icmp eq i32 %75, 0
  br i1 %76, label %77, label %96

77:                                               ; preds = %74
  %.not148 = icmp eq ptr %71, null
  br i1 %.not148, label %78, label %80

78:                                               ; preds = %77
  %79 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.6)
  br label %356

80:                                               ; preds = %77
  %81 = load ptr, ptr %32, align 8, !tbaa !10
  %82 = getelementptr inbounds i8, ptr %81, i64 24
  %83 = load ptr, ptr %82, align 8, !tbaa !20
  %84 = load ptr, ptr %.0, align 8, !tbaa !15
  %85 = call ptr @xstrdup(ptr noundef %70)
  %86 = call { ptr, i8 } %83(ptr noundef %84, ptr noundef %85) #13
  %87 = extractvalue { ptr, i8 } %86, 0
  %88 = extractvalue { ptr, i8 } %86, 1
  %89 = trunc i8 %88 to i1
  br i1 %89, label %90, label %93

90:                                               ; preds = %80
  %91 = call ptr @xstrdup(ptr noundef nonnull %71)
  store ptr %91, ptr %87, align 8, !tbaa !5
  %92 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, ptr noundef %70, ptr noundef %91)
  br label %356

93:                                               ; preds = %80
  %94 = load ptr, ptr %87, align 8, !tbaa !5
  %95 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8, ptr noundef %70, ptr noundef %94)
  br label %356

96:                                               ; preds = %74
  %97 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.9) #14
  %98 = icmp eq i32 %97, 0
  br i1 %98, label %99, label %113

99:                                               ; preds = %96
  %.not146 = icmp eq ptr %71, null
  br i1 %.not146, label %102, label %100

100:                                              ; preds = %99
  %101 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.10)
  br label %356

102:                                              ; preds = %99
  %103 = load ptr, ptr %32, align 8, !tbaa !10
  %104 = getelementptr inbounds i8, ptr %103, i64 32
  %105 = load ptr, ptr %104, align 8, !tbaa !21
  %106 = load ptr, ptr %.0, align 8, !tbaa !15
  %107 = call ptr %105(ptr noundef %106, ptr noundef %70) #13
  %.not147 = icmp eq ptr %107, null
  br i1 %.not147, label %111, label %108

108:                                              ; preds = %102
  %109 = load ptr, ptr %107, align 8, !tbaa !5
  %110 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.11, ptr noundef %70, ptr noundef %109)
  br label %356

111:                                              ; preds = %102
  %112 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.12, ptr noundef %70)
  br label %356

113:                                              ; preds = %96
  %114 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.13) #14
  %115 = icmp eq i32 %114, 0
  br i1 %115, label %116, label %135

116:                                              ; preds = %113
  %.not143 = icmp eq ptr %71, null
  br i1 %.not143, label %119, label %117

117:                                              ; preds = %116
  %118 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.14)
  br label %356

119:                                              ; preds = %116
  %120 = load ptr, ptr %32, align 8, !tbaa !10
  %121 = load i8, ptr %120, align 8, !tbaa !22, !range !23, !noundef !24
  %122 = trunc nuw i8 %121 to i1
  br i1 %122, label %125, label %123

123:                                              ; preds = %119
  %124 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15)
  br label %356

125:                                              ; preds = %119
  %126 = getelementptr inbounds i8, ptr %120, i64 40
  %127 = load ptr, ptr %126, align 8, !tbaa !25
  %.not144 = icmp eq ptr %127, null
  br i1 %.not144, label %.thread151, label %128

128:                                              ; preds = %125
  %129 = load ptr, ptr %.0, align 8, !tbaa !15
  %130 = call ptr %127(ptr noundef %129, ptr noundef %70) #13
  %.not145 = icmp eq ptr %130, null
  br i1 %.not145, label %.thread151, label %131

131:                                              ; preds = %128
  %132 = load ptr, ptr %130, align 8, !tbaa !5
  %133 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.16, ptr noundef %70, ptr noundef %132)
  br label %356

.thread151:                                       ; preds = %125, %128
  %134 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.17, ptr noundef %70)
  br label %356

135:                                              ; preds = %113
  %136 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.18) #14
  %137 = icmp eq i32 %136, 0
  br i1 %137, label %138, label %157

138:                                              ; preds = %135
  %.not140 = icmp eq ptr %71, null
  br i1 %.not140, label %141, label %139

139:                                              ; preds = %138
  %140 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.19)
  br label %356

141:                                              ; preds = %138
  %142 = load ptr, ptr %32, align 8, !tbaa !10
  %143 = load i8, ptr %142, align 8, !tbaa !22, !range !23, !noundef !24
  %144 = trunc nuw i8 %143 to i1
  br i1 %144, label %147, label %145

145:                                              ; preds = %141
  %146 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15)
  br label %356

147:                                              ; preds = %141
  %148 = getelementptr inbounds i8, ptr %142, i64 48
  %149 = load ptr, ptr %148, align 8, !tbaa !26
  %.not141 = icmp eq ptr %149, null
  br i1 %.not141, label %.thread153, label %150

150:                                              ; preds = %147
  %151 = load ptr, ptr %.0, align 8, !tbaa !15
  %152 = call ptr %149(ptr noundef %151, ptr noundef %70) #13
  %.not142 = icmp eq ptr %152, null
  br i1 %.not142, label %.thread153, label %153

153:                                              ; preds = %150
  %154 = load ptr, ptr %152, align 8, !tbaa !5
  %155 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.20, ptr noundef %70, ptr noundef %154)
  br label %356

.thread153:                                       ; preds = %147, %150
  %156 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.21, ptr noundef %70)
  br label %356

157:                                              ; preds = %135
  %158 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.22) #14
  %159 = icmp eq i32 %158, 0
  br i1 %159, label %160, label %179

160:                                              ; preds = %157
  %.not137 = icmp eq ptr %71, null
  br i1 %.not137, label %163, label %161

161:                                              ; preds = %160
  %162 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.23)
  br label %356

163:                                              ; preds = %160
  %164 = load ptr, ptr %32, align 8, !tbaa !10
  %165 = load i8, ptr %164, align 8, !tbaa !22, !range !23, !noundef !24
  %166 = trunc nuw i8 %165 to i1
  br i1 %166, label %169, label %167

167:                                              ; preds = %163
  %168 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15)
  br label %356

169:                                              ; preds = %163
  %170 = getelementptr inbounds i8, ptr %164, i64 56
  %171 = load ptr, ptr %170, align 8, !tbaa !27
  %.not138 = icmp eq ptr %171, null
  br i1 %.not138, label %.thread155, label %172

172:                                              ; preds = %169
  %173 = load ptr, ptr %.0, align 8, !tbaa !15
  %174 = call ptr %171(ptr noundef %173, ptr noundef %70) #13
  %.not139 = icmp eq ptr %174, null
  br i1 %.not139, label %.thread155, label %175

175:                                              ; preds = %172
  %176 = load ptr, ptr %174, align 8, !tbaa !5
  %177 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.24, ptr noundef %70, ptr noundef %176)
  br label %356

.thread155:                                       ; preds = %169, %172
  %178 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.25, ptr noundef %70)
  br label %356

179:                                              ; preds = %157
  %180 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.26) #14
  %181 = icmp eq i32 %180, 0
  br i1 %181, label %182, label %201

182:                                              ; preds = %179
  %.not134 = icmp eq ptr %71, null
  br i1 %.not134, label %185, label %183

183:                                              ; preds = %182
  %184 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.27)
  br label %356

185:                                              ; preds = %182
  %186 = load ptr, ptr %32, align 8, !tbaa !10
  %187 = load i8, ptr %186, align 8, !tbaa !22, !range !23, !noundef !24
  %188 = trunc nuw i8 %187 to i1
  br i1 %188, label %191, label %189

189:                                              ; preds = %185
  %190 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.15)
  br label %356

191:                                              ; preds = %185
  %192 = getelementptr inbounds i8, ptr %186, i64 64
  %193 = load ptr, ptr %192, align 8, !tbaa !28
  %.not135 = icmp eq ptr %193, null
  br i1 %.not135, label %.thread157, label %194

194:                                              ; preds = %191
  %195 = load ptr, ptr %.0, align 8, !tbaa !15
  %196 = call ptr %193(ptr noundef %195, ptr noundef %70) #13
  %.not136 = icmp eq ptr %196, null
  br i1 %.not136, label %.thread157, label %197

197:                                              ; preds = %194
  %198 = load ptr, ptr %196, align 8, !tbaa !5
  %199 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.28, ptr noundef %70, ptr noundef %198)
  br label %356

.thread157:                                       ; preds = %191, %194
  %200 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.29, ptr noundef %70)
  br label %356

201:                                              ; preds = %179
  %202 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.30) #14
  %203 = icmp eq i32 %202, 0
  br i1 %203, label %204, label %224

204:                                              ; preds = %201
  %205 = icmp ne ptr %71, null
  %or.cond = select i1 %.not133150, i1 true, i1 %205
  br i1 %or.cond, label %206, label %208

206:                                              ; preds = %204
  %207 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.31)
  br label %356

208:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %4) #13
  %209 = load ptr, ptr %32, align 8, !tbaa !10
  %210 = getelementptr inbounds i8, ptr %209, i64 72
  %211 = load ptr, ptr %210, align 8, !tbaa !29
  %212 = load ptr, ptr %.0, align 8, !tbaa !15
  call void %211(ptr dead_on_unwind nonnull writable sret(%struct.dict_remove_result) align 8 %4, ptr noundef %212, ptr noundef %70) #13
  %213 = load i8, ptr %33, align 8, !tbaa !30, !range !23, !noundef !24
  %214 = trunc nuw i8 %213 to i1
  br i1 %214, label %215, label %221

215:                                              ; preds = %208
  %216 = load ptr, ptr %4, align 8, !tbaa !32
  %217 = load ptr, ptr %34, align 8, !tbaa !33
  %218 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.32, ptr noundef %216, ptr noundef %217)
  %219 = load ptr, ptr %4, align 8, !tbaa !32
  call void @free(ptr noundef %219) #13
  %220 = load ptr, ptr %34, align 8, !tbaa !33
  call void @free(ptr noundef %220) #13
  br label %223

221:                                              ; preds = %208
  %222 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.33, ptr noundef %70)
  br label %223

223:                                              ; preds = %221, %215
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %4) #13
  br label %356

224:                                              ; preds = %201
  %225 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.34) #14
  %226 = icmp eq i32 %225, 0
  br i1 %226, label %227, label %269

227:                                              ; preds = %224
  br i1 %.not133150, label %230, label %228

228:                                              ; preds = %227
  %229 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.35)
  br label %356

230:                                              ; preds = %227
  %231 = load ptr, ptr %32, align 8, !tbaa !10
  %232 = getelementptr inbounds i8, ptr %231, i64 8
  %233 = load ptr, ptr %232, align 8, !tbaa !34
  %234 = load ptr, ptr %.0, align 8, !tbaa !15
  %235 = call ptr %233(ptr noundef %234) #13
  %236 = getelementptr inbounds i8, ptr %235, i64 8
  %237 = load ptr, ptr %236, align 8, !tbaa !35
  %238 = getelementptr inbounds i8, ptr %237, i64 56
  %239 = load ptr, ptr %238, align 8, !tbaa !37
  %240 = load ptr, ptr %235, align 8, !tbaa !39
  %241 = call zeroext i1 %239(ptr noundef %240) #13
  %242 = load ptr, ptr %236, align 8, !tbaa !35
  %243 = getelementptr inbounds i8, ptr %242, i64 8
  %244 = load ptr, ptr %243, align 8, !tbaa !40
  %245 = load ptr, ptr %235, align 8, !tbaa !39
  %246 = call zeroext i1 %244(ptr noundef %245) #13
  br i1 %246, label %.lr.ph169, label %._crit_edge170

.lr.ph169:                                        ; preds = %230, %.lr.ph169
  %247 = load ptr, ptr %236, align 8, !tbaa !35
  %248 = getelementptr inbounds i8, ptr %247, i64 72
  %249 = load ptr, ptr %248, align 8, !tbaa !41
  %250 = load ptr, ptr %235, align 8, !tbaa !39
  %251 = call ptr %249(ptr noundef %250) #13
  %252 = load ptr, ptr %236, align 8, !tbaa !35
  %253 = getelementptr inbounds i8, ptr %252, i64 80
  %254 = load ptr, ptr %253, align 8, !tbaa !42
  %255 = load ptr, ptr %235, align 8, !tbaa !39
  %256 = call ptr %254(ptr noundef %255) #13
  %257 = load ptr, ptr %256, align 8, !tbaa !5
  %258 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.36, ptr noundef %251, ptr noundef %257)
  %259 = load ptr, ptr %236, align 8, !tbaa !35
  %260 = getelementptr inbounds i8, ptr %259, i64 24
  %261 = load ptr, ptr %260, align 8, !tbaa !43
  %262 = load ptr, ptr %235, align 8, !tbaa !39
  %263 = call zeroext i1 %261(ptr noundef %262) #13
  %264 = load ptr, ptr %236, align 8, !tbaa !35
  %265 = getelementptr inbounds i8, ptr %264, i64 8
  %266 = load ptr, ptr %265, align 8, !tbaa !40
  %267 = load ptr, ptr %235, align 8, !tbaa !39
  %268 = call zeroext i1 %266(ptr noundef %267) #13
  br i1 %268, label %.lr.ph169, label %._crit_edge170, !llvm.loop !44

._crit_edge170:                                   ; preds = %.lr.ph169, %230
  call void @dict_itor_free(ptr noundef nonnull %235) #13
  br label %356

269:                                              ; preds = %224
  %270 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.37) #14
  %271 = icmp eq i32 %270, 0
  br i1 %271, label %272, label %314

272:                                              ; preds = %269
  br i1 %.not133150, label %275, label %273

273:                                              ; preds = %272
  %274 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.38)
  br label %356

275:                                              ; preds = %272
  %276 = load ptr, ptr %32, align 8, !tbaa !10
  %277 = getelementptr inbounds i8, ptr %276, i64 8
  %278 = load ptr, ptr %277, align 8, !tbaa !34
  %279 = load ptr, ptr %.0, align 8, !tbaa !15
  %280 = call ptr %278(ptr noundef %279) #13
  %281 = getelementptr inbounds i8, ptr %280, i64 8
  %282 = load ptr, ptr %281, align 8, !tbaa !35
  %283 = getelementptr inbounds i8, ptr %282, i64 64
  %284 = load ptr, ptr %283, align 8, !tbaa !45
  %285 = load ptr, ptr %280, align 8, !tbaa !39
  %286 = call zeroext i1 %284(ptr noundef %285) #13
  %287 = load ptr, ptr %281, align 8, !tbaa !35
  %288 = getelementptr inbounds i8, ptr %287, i64 8
  %289 = load ptr, ptr %288, align 8, !tbaa !40
  %290 = load ptr, ptr %280, align 8, !tbaa !39
  %291 = call zeroext i1 %289(ptr noundef %290) #13
  br i1 %291, label %.lr.ph167, label %._crit_edge

.lr.ph167:                                        ; preds = %275, %.lr.ph167
  %292 = load ptr, ptr %281, align 8, !tbaa !35
  %293 = getelementptr inbounds i8, ptr %292, i64 72
  %294 = load ptr, ptr %293, align 8, !tbaa !41
  %295 = load ptr, ptr %280, align 8, !tbaa !39
  %296 = call ptr %294(ptr noundef %295) #13
  %297 = load ptr, ptr %281, align 8, !tbaa !35
  %298 = getelementptr inbounds i8, ptr %297, i64 80
  %299 = load ptr, ptr %298, align 8, !tbaa !42
  %300 = load ptr, ptr %280, align 8, !tbaa !39
  %301 = call ptr %299(ptr noundef %300) #13
  %302 = load ptr, ptr %301, align 8, !tbaa !5
  %303 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.36, ptr noundef %296, ptr noundef %302)
  %304 = load ptr, ptr %281, align 8, !tbaa !35
  %305 = getelementptr inbounds i8, ptr %304, i64 32
  %306 = load ptr, ptr %305, align 8, !tbaa !46
  %307 = load ptr, ptr %280, align 8, !tbaa !39
  %308 = call zeroext i1 %306(ptr noundef %307) #13
  %309 = load ptr, ptr %281, align 8, !tbaa !35
  %310 = getelementptr inbounds i8, ptr %309, i64 8
  %311 = load ptr, ptr %310, align 8, !tbaa !40
  %312 = load ptr, ptr %280, align 8, !tbaa !39
  %313 = call zeroext i1 %311(ptr noundef %312) #13
  br i1 %313, label %.lr.ph167, label %._crit_edge, !llvm.loop !47

._crit_edge:                                      ; preds = %.lr.ph167, %275
  call void @dict_itor_free(ptr noundef nonnull %280) #13
  br label %356

314:                                              ; preds = %269
  %315 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.39) #14
  %316 = icmp eq i32 %315, 0
  br i1 %316, label %317, label %326

317:                                              ; preds = %314
  br i1 %.not133150, label %320, label %318

318:                                              ; preds = %317
  %319 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.40)
  br label %356

320:                                              ; preds = %317
  %321 = load ptr, ptr %32, align 8, !tbaa !10
  %322 = getelementptr inbounds i8, ptr %321, i64 80
  %323 = load ptr, ptr %322, align 8, !tbaa !48
  %324 = load ptr, ptr %.0, align 8, !tbaa !15
  %325 = call i64 %323(ptr noundef %324, ptr noundef nonnull @key_val_free) #13
  br label %356

326:                                              ; preds = %314
  %327 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.41) #14
  %328 = icmp eq i32 %327, 0
  br i1 %328, label %329, label %339

329:                                              ; preds = %326
  br i1 %.not133150, label %332, label %330

330:                                              ; preds = %329
  %331 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.42)
  br label %356

332:                                              ; preds = %329
  %333 = load ptr, ptr %32, align 8, !tbaa !10
  %334 = getelementptr inbounds i8, ptr %333, i64 104
  %335 = load ptr, ptr %334, align 8, !tbaa !49
  %336 = load ptr, ptr %.0, align 8, !tbaa !15
  %337 = call i64 %335(ptr noundef %336) #13
  %338 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.43, i64 noundef %337)
  br label %356

339:                                              ; preds = %326
  %340 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %3, ptr noundef nonnull dereferenceable(1) @.str.44) #14
  %341 = icmp eq i32 %340, 0
  br i1 %341, label %357, label %342

342:                                              ; preds = %339
  %343 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.45)
  %344 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.46)
  %345 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.47)
  %346 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.48)
  %347 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.49)
  %348 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.50)
  %349 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.51)
  %350 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.52)
  %351 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.53)
  %352 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.54)
  %353 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.55)
  %354 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.56)
  %355 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.57)
  br label %356

356:                                              ; preds = %78, %100, %117, %123, %139, %145, %161, %167, %183, %189, %206, %228, %273, %318, %330, %.thread, %197, %.thread157, %175, %.thread155, %153, %.thread153, %131, %.thread151, %108, %111, %90, %93, %._crit_edge170, %320, %342, %332, %._crit_edge, %223
  call void @llvm.lifetime.end.p0(i64 512, ptr nonnull %3) #13
  br label %36

357:                                              ; preds = %36, %339
  call void @llvm.lifetime.end.p0(i64 512, ptr nonnull %3) #13
  %358 = call i64 @dict_free(ptr noundef nonnull %.0, ptr noundef nonnull @key_val_free) #13
  call void @exit(i32 noundef 0) #16
  unreachable
}

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

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

; Function Attrs: nounwind
declare i64 @time(ptr noundef) local_unnamed_addr #1

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

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

declare ptr @hb_dict_new(ptr noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare i32 @strcmp(ptr nocapture noundef, ptr nocapture noundef) #5

declare ptr @pr_dict_new(ptr noundef) local_unnamed_addr #4

declare ptr @rb_dict_new(ptr noundef) local_unnamed_addr #4

declare ptr @tr_dict_new(ptr noundef, ptr noundef) local_unnamed_addr #4

declare ptr @sp_dict_new(ptr noundef) local_unnamed_addr #4

declare ptr @wb_dict_new(ptr noundef) local_unnamed_addr #4

declare ptr @skiplist_dict_new(ptr noundef, i32 noundef) local_unnamed_addr #4

declare ptr @hashtable_dict_new(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

declare i32 @dict_str_hash(ptr noundef) #4

declare ptr @hashtable2_dict_new(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

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

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare ptr @strchr(ptr noundef, i32 noundef) local_unnamed_addr #5

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: readwrite)
declare ptr @strcpy(ptr noalias noundef returned writeonly, ptr noalias nocapture noundef readonly) local_unnamed_addr #8

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

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

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

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #10

declare void @dict_itor_free(ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare hidden void @key_val_free(ptr noundef, ptr noundef) #2

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

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

attributes #0 = { 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 #1 = { 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 #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { "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 = { 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 #6 = { 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 #7 = { 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 #8 = { mustprogress nofree nounwind willreturn memory(argmem: readwrite) "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 #9 = { 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 #10 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { 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 #12 = { noreturn }
attributes #13 = { nounwind }
attributes #14 = { nounwind willreturn memory(read) }
attributes #15 = { nounwind willreturn memory(none) }
attributes #16 = { noreturn nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!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 = !{!17, !17, i64 0}
!17 = !{!"short", !7, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!13, !6, i64 24}
!21 = !{!13, !6, i64 32}
!22 = !{!13, !14, i64 0}
!23 = !{i8 0, i8 2}
!24 = !{}
!25 = !{!13, !6, i64 40}
!26 = !{!13, !6, i64 48}
!27 = !{!13, !6, i64 56}
!28 = !{!13, !6, i64 64}
!29 = !{!13, !6, i64 72}
!30 = !{!31, !14, i64 16}
!31 = !{!"", !6, i64 0, !6, i64 8, !14, i64 16}
!32 = !{!31, !6, i64 0}
!33 = !{!31, !6, i64 8}
!34 = !{!13, !6, i64 8}
!35 = !{!36, !6, i64 8}
!36 = !{!"dict_itor", !6, i64 0, !6, i64 8}
!37 = !{!38, !6, i64 56}
!38 = !{!"", !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}
!39 = !{!36, !6, i64 0}
!40 = !{!38, !6, i64 8}
!41 = !{!38, !6, i64 72}
!42 = !{!38, !6, i64 80}
!43 = !{!38, !6, i64 24}
!44 = distinct !{!44, !19}
!45 = !{!38, !6, i64 64}
!46 = !{!38, !6, i64 32}
!47 = distinct !{!47, !19}
!48 = !{!13, !6, i64 80}
!49 = !{!13, !6, i64 104}


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