; LLVM IR from davidesantangelo/krep :: krep (search_file)

; 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.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }
%struct.stat = type { i64, i64, i64, i32, i32, i32, i32, i64, i64, i64, i64, %struct.timespec, %struct.timespec, %struct.timespec, [3 x i64] }
%struct.timespec = type { i64, i64 }
%struct.re_pattern_buffer = type { ptr, i64, i64, i64, ptr, ptr, i64, i8 }
%struct.regmatch_t = type { i32, i32 }
%struct.thread_data_t = type { i32, ptr, ptr, i64, ptr, i64, i8 }
%struct.match_result_t = type { ptr, i64, i64 }
%struct.match_position_t = type { i64, i64 }

@stderr = external global ptr, align 8
@only_matching = external hidden global i8, align 1
@.str.69 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.91 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.92 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.93 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.94 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [49 x i8], align 1
@stdin = external global ptr, align 8
@.str.101 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.104 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.106 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.107 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.108 = external hidden unnamed_addr constant [5 x i8], align 1
@global_match_found_flag = external hidden global i8, align 1
@.str.109 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.110 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.111 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.112 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.113 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.114 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.115 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.116 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.117 = external hidden unnamed_addr constant [59 x i8], align 1
@global_thread_pool = external hidden global ptr, align 8
@.str.118 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.119 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.120 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.121 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.122 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.123 = external hidden unnamed_addr constant [7 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
declare dso_local ptr @match_result_init(i64 noundef) #1

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #2

declare void @perror(ptr noundef) #3

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

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

; Function Attrs: inlinehint nounwind uwtable
declare dso_local zeroext i1 @match_result_add(ptr noundef, i64 noundef, i64 noundef) #5

; Function Attrs: nounwind allocsize(1)
declare ptr @realloc(ptr noundef, i64 noundef) #6

; Function Attrs: nounwind uwtable
declare dso_local void @match_result_free(ptr noundef) #1

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

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

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

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

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

declare i32 @regexec(ptr noundef, ptr noundef, i64 noundef, ptr noundef, i32 noundef) #3

declare i64 @regerror(i32 noundef, ptr noundef, ptr noundef, i64 noundef) #3

; Function Attrs: nounwind uwtable
declare dso_local ptr @search_chunk_thread(ptr noundef) #1

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

declare ptr @ac_trie_build(ptr noundef) #3

; Function Attrs: nounwind
declare i32 @sprintf(ptr noundef, ptr noundef, ...) #4

declare i32 @regcomp(ptr noundef, ptr noundef, i32 noundef) #3

declare void @regfree(ptr noundef) #3

declare void @ac_trie_free(ptr noundef) #3

; Function Attrs: nounwind uwtable
define dso_local i32 @search_file(ptr noundef %0, ptr noundef %1, i32 noundef %2) #1 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca %struct.search_params, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca %struct.stat, align 8
  %13 = alloca i64, 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.re_pattern_buffer, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i32, align 4
  %25 = alloca i64, align 8
  %26 = alloca i64, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca i8, align 1
  %33 = alloca i8, align 1
  %34 = alloca i8, align 1
  %35 = alloca ptr, align 8
  %36 = alloca %struct.re_pattern_buffer, align 8
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca i64, align 8
  %40 = alloca i64, align 8
  %41 = alloca ptr, align 8
  %42 = alloca i64, align 8
  %43 = alloca i32, align 4
  %44 = alloca %struct.regmatch_t, align 4
  %45 = alloca i8, align 1
  %46 = alloca i8, align 1
  %47 = alloca ptr, align 8
  %48 = alloca i64, align 8
  %49 = alloca i64, align 8
  %50 = alloca ptr, align 8
  %51 = alloca i64, align 8
  %52 = alloca i64, align 8
  %53 = alloca ptr, align 8
  %54 = alloca i32, align 4
  %55 = alloca i32, align 4
  %56 = alloca [256 x i8], align 16
  %57 = alloca %struct.search_params, align 8
  %58 = alloca i32, align 4
  %59 = alloca i32, align 4
  %60 = alloca i64, align 8
  %61 = alloca i32, align 4
  %62 = alloca i64, align 8
  %63 = alloca i64, align 8
  %64 = alloca i64, align 8
  %65 = alloca i32, align 4
  %66 = alloca i64, align 8
  %67 = alloca i64, align 8
  %68 = alloca i32, align 4
  %69 = alloca i32, align 4
  %70 = alloca i64, align 8
  %71 = alloca i32, align 4
  %72 = alloca i64, align 8
  %73 = alloca i64, align 8
  %74 = alloca i64, align 8
  %75 = alloca i32, align 4
  %76 = alloca i8, align 1
  %77 = alloca i32, align 4
  %78 = alloca i32, align 4
  %79 = alloca i64, align 8
  %80 = alloca i64, align 8
  %81 = alloca i64, align 8
  %82 = alloca i64, align 8
  %83 = alloca i64, align 8
  %84 = alloca i64, align 8
  %85 = alloca i8, align 1
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 72, ptr %8) #11
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %8, ptr align 8 %86, i64 72, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #11
  store ptr null, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #11
  store i32 1, ptr %10, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #11
  store i32 -1, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 144, ptr %12) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #11
  store i64 0, ptr %13, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #11
  store ptr inttoptr (i64 -1 to ptr), ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #11
  store ptr null, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #11
  store ptr null, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #11
  store ptr null, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 64, ptr %18) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #11
  store ptr null, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #11
  store i32 0, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #11
  store i64 0, ptr %21, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #11
  %87 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 13
  %88 = load i64, ptr %87, align 8, !tbaa !16
  store i64 %88, ptr %22, align 8, !tbaa !12
  %89 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %90 = load i8, ptr %89, align 1, !tbaa !18, !range !19, !noundef !20
  %91 = trunc i8 %90 to i1
  br i1 %91, label %138, label %92

92:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #11
  store i64 0, ptr %23, align 8, !tbaa !12
  br label %93

93:                                               ; preds = %132, %92
  %94 = load i64, ptr %23, align 8, !tbaa !12
  %95 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %96 = load i64, ptr %95, align 8, !tbaa !21
  %97 = icmp ult i64 %94, %96
  br i1 %97, label %99, label %98

98:                                               ; preds = %93
  store i32 2, ptr %24, align 4
  br label %135

99:                                               ; preds = %93
  %100 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %101 = load ptr, ptr %100, align 8, !tbaa !22
  %102 = load i64, ptr %23, align 8, !tbaa !12
  %103 = getelementptr inbounds i64, ptr %101, i64 %102
  %104 = load i64, ptr %103, align 8, !tbaa !12
  %105 = icmp eq i64 %104, 0
  br i1 %105, label %106, label %115

106:                                              ; preds = %99
  %107 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %108 = load i64, ptr %107, align 8, !tbaa !21
  %109 = icmp ugt i64 %108, 1
  br i1 %109, label %110, label %114

110:                                              ; preds = %106
  %111 = load ptr, ptr @stderr, align 8, !tbaa !5
  %112 = load ptr, ptr %6, align 8, !tbaa !5
  %113 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %111, ptr noundef @.str.97, ptr noundef %112) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %135

114:                                              ; preds = %106
  br label %132

115:                                              ; preds = %99
  %116 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %117 = load ptr, ptr %116, align 8, !tbaa !22
  %118 = load i64, ptr %23, align 8, !tbaa !12
  %119 = getelementptr inbounds i64, ptr %117, i64 %118
  %120 = load i64, ptr %119, align 8, !tbaa !12
  %121 = icmp ugt i64 %120, 1024
  br i1 %121, label %122, label %131

122:                                              ; preds = %115
  %123 = load ptr, ptr @stderr, align 8, !tbaa !5
  %124 = load ptr, ptr %6, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %126 = load ptr, ptr %125, align 8, !tbaa !23
  %127 = load i64, ptr %23, align 8, !tbaa !12
  %128 = getelementptr inbounds ptr, ptr %126, i64 %127
  %129 = load ptr, ptr %128, align 8, !tbaa !5
  %130 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %123, ptr noundef @.str.98, ptr noundef %124, ptr noundef %129, i32 noundef 1024) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %135

131:                                              ; preds = %115
  br label %132

132:                                              ; preds = %131, %114
  %133 = load i64, ptr %23, align 8, !tbaa !12
  %134 = add i64 %133, 1
  store i64 %134, ptr %23, align 8, !tbaa !12
  br label %93, !llvm.loop !24

135:                                              ; preds = %122, %110, %98
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #11
  %136 = load i32, ptr %24, align 4
  switch i32 %136, label %1484 [
    i32 2, label %137
  ]

137:                                              ; preds = %135
  br label %138

138:                                              ; preds = %137, %3
  %139 = load ptr, ptr %6, align 8, !tbaa !5
  %140 = call i32 @strcmp(ptr noundef %139, ptr noundef @.str.99) #12
  %141 = icmp eq i32 %140, 0
  br i1 %141, label %142, label %251

142:                                              ; preds = %138
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #11
  store i64 4194304, ptr %25, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #11
  store i64 0, ptr %26, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #11
  %143 = load i64, ptr %25, align 8, !tbaa !12
  %144 = call noalias ptr @malloc(i64 noundef %143) #13
  store ptr %144, ptr %27, align 8, !tbaa !5
  %145 = load ptr, ptr %27, align 8, !tbaa !5
  %146 = icmp ne ptr %145, null
  br i1 %146, label %150, label %147

147:                                              ; preds = %142
  %148 = load ptr, ptr @stderr, align 8, !tbaa !5
  %149 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %148, ptr noundef @.str.100) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %250

150:                                              ; preds = %142
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #11
  store i64 65536, ptr %28, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #11
  br label %151

151:                                              ; preds = %185, %150
  %152 = load ptr, ptr %27, align 8, !tbaa !5
  %153 = load i64, ptr %26, align 8, !tbaa !12
  %154 = getelementptr inbounds i8, ptr %152, i64 %153
  %155 = load i64, ptr %28, align 8, !tbaa !12
  %156 = load ptr, ptr @stdin, align 8, !tbaa !5
  %157 = call i64 @fread(ptr noundef %154, i64 noundef 1, i64 noundef %155, ptr noundef %156)
  store i64 %157, ptr %29, align 8, !tbaa !12
  %158 = icmp ugt i64 %157, 0
  br i1 %158, label %159, label %186

159:                                              ; preds = %151
  %160 = load i64, ptr %29, align 8, !tbaa !12
  %161 = load i64, ptr %26, align 8, !tbaa !12
  %162 = add i64 %161, %160
  store i64 %162, ptr %26, align 8, !tbaa !12
  %163 = load i64, ptr %26, align 8, !tbaa !12
  %164 = load i64, ptr %28, align 8, !tbaa !12
  %165 = add i64 %163, %164
  %166 = load i64, ptr %25, align 8, !tbaa !12
  %167 = icmp ugt i64 %165, %166
  br i1 %167, label %168, label %185

168:                                              ; preds = %159
  %169 = load i64, ptr %25, align 8, !tbaa !12
  %170 = mul i64 %169, 2
  store i64 %170, ptr %25, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #11
  %171 = load ptr, ptr %27, align 8, !tbaa !5
  %172 = load i64, ptr %25, align 8, !tbaa !12
  %173 = call ptr @realloc(ptr noundef %171, i64 noundef %172) #14
  store ptr %173, ptr %30, align 8, !tbaa !5
  %174 = load ptr, ptr %30, align 8, !tbaa !5
  %175 = icmp ne ptr %174, null
  br i1 %175, label %180, label %176

176:                                              ; preds = %168
  %177 = load ptr, ptr @stderr, align 8, !tbaa !5
  %178 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %177, ptr noundef @.str.101) #11
  %179 = load ptr, ptr %27, align 8, !tbaa !5
  call void @free(ptr noundef %179) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %182

180:                                              ; preds = %168
  %181 = load ptr, ptr %30, align 8, !tbaa !5
  store ptr %181, ptr %27, align 8, !tbaa !5
  store i32 0, ptr %24, align 4
  br label %182

182:                                              ; preds = %180, %176
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #11
  %183 = load i32, ptr %24, align 4
  switch i32 %183, label %249 [
    i32 0, label %184
  ]

184:                                              ; preds = %182
  br label %185

185:                                              ; preds = %184, %159
  br label %151, !llvm.loop !26

186:                                              ; preds = %151
  %187 = load ptr, ptr @stdin, align 8, !tbaa !5
  %188 = call i32 @ferror(ptr noundef %187) #11
  %189 = icmp ne i32 %188, 0
  br i1 %189, label %190, label %197

190:                                              ; preds = %186
  %191 = load ptr, ptr @stderr, align 8, !tbaa !5
  %192 = call ptr @__errno_location() #15
  %193 = load i32, ptr %192, align 4, !tbaa !9
  %194 = call ptr @strerror(i32 noundef %193) #11
  %195 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %191, ptr noundef @.str.102, ptr noundef %194) #11
  %196 = load ptr, ptr %27, align 8, !tbaa !5
  call void @free(ptr noundef %196) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %249

197:                                              ; preds = %186
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #11
  %198 = load ptr, ptr %27, align 8, !tbaa !5
  %199 = load i64, ptr %26, align 8, !tbaa !12
  %200 = add i64 %199, 1
  %201 = call ptr @realloc(ptr noundef %198, i64 noundef %200) #14
  store ptr %201, ptr %31, align 8, !tbaa !5
  %202 = load ptr, ptr %31, align 8, !tbaa !5
  %203 = icmp ne ptr %202, null
  br i1 %203, label %208, label %204

204:                                              ; preds = %197
  %205 = load ptr, ptr @stderr, align 8, !tbaa !5
  %206 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %205, ptr noundef @.str.103) #11
  %207 = load ptr, ptr %27, align 8, !tbaa !5
  call void @free(ptr noundef %207) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %248

208:                                              ; preds = %197
  %209 = load ptr, ptr %31, align 8, !tbaa !5
  store ptr %209, ptr %27, align 8, !tbaa !5
  %210 = load ptr, ptr %27, align 8, !tbaa !5
  %211 = load i64, ptr %26, align 8, !tbaa !12
  %212 = getelementptr inbounds i8, ptr %210, i64 %211
  store i8 0, ptr %212, align 1, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 1, ptr %32) #11
  %213 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %214 = load i64, ptr %213, align 8, !tbaa !21
  %215 = icmp ugt i64 %214, 1
  br i1 %215, label %216, label %221

216:                                              ; preds = %208
  %217 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %218 = load i8, ptr %217, align 1, !tbaa !18, !range !19, !noundef !20
  %219 = trunc i8 %218 to i1
  %220 = xor i1 %219, true
  br label %221

221:                                              ; preds = %216, %208
  %222 = phi i1 [ false, %208 ], [ %220, %216 ]
  %223 = zext i1 %222 to i8
  store i8 %223, ptr %32, align 1, !tbaa !14
  %224 = load i8, ptr %32, align 1, !tbaa !14, !range !19, !noundef !20
  %225 = trunc i8 %224 to i1
  br i1 %225, label %226, label %237

226:                                              ; preds = %221
  %227 = call ptr @ac_trie_build(ptr noundef %8)
  store ptr %227, ptr %9, align 8, !tbaa !5
  %228 = load ptr, ptr %9, align 8, !tbaa !5
  %229 = icmp ne ptr %228, null
  br i1 %229, label %234, label %230

230:                                              ; preds = %226
  %231 = load ptr, ptr @stderr, align 8, !tbaa !5
  %232 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %231, ptr noundef @.str.104) #11
  %233 = load ptr, ptr %27, align 8, !tbaa !5
  call void @free(ptr noundef %233) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %247

234:                                              ; preds = %226
  %235 = load ptr, ptr %9, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 12
  store ptr %235, ptr %236, align 8, !tbaa !28
  br label %237

237:                                              ; preds = %234, %221
  %238 = load ptr, ptr %27, align 8, !tbaa !5
  %239 = call i32 @search_string(ptr noundef %8, ptr noundef %238)
  store i32 %239, ptr %10, align 4, !tbaa !9
  %240 = load ptr, ptr %27, align 8, !tbaa !5
  call void @free(ptr noundef %240) #11
  %241 = load ptr, ptr %9, align 8, !tbaa !5
  %242 = icmp ne ptr %241, null
  br i1 %242, label %243, label %245

243:                                              ; preds = %237
  %244 = load ptr, ptr %9, align 8, !tbaa !5
  call void @ac_trie_free(ptr noundef %244)
  br label %245

245:                                              ; preds = %243, %237
  %246 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %246, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %247

247:                                              ; preds = %245, %230
  call void @llvm.lifetime.end.p0(i64 1, ptr %32) #11
  br label %248

248:                                              ; preds = %247, %204
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #11
  br label %249

249:                                              ; preds = %248, %190, %182
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #11
  br label %250

250:                                              ; preds = %249, %147
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #11
  br label %1484

251:                                              ; preds = %138
  %252 = load ptr, ptr %6, align 8, !tbaa !5
  %253 = call i32 (ptr, i32, ...) @open(ptr noundef %252, i32 noundef 524288)
  store i32 %253, ptr %11, align 4, !tbaa !9
  %254 = load i32, ptr %11, align 4, !tbaa !9
  %255 = icmp eq i32 %254, -1
  br i1 %255, label %256, label %263

256:                                              ; preds = %251
  %257 = load ptr, ptr @stderr, align 8, !tbaa !5
  %258 = load ptr, ptr %6, align 8, !tbaa !5
  %259 = call ptr @__errno_location() #15
  %260 = load i32, ptr %259, align 4, !tbaa !9
  %261 = call ptr @strerror(i32 noundef %260) #11
  %262 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %257, ptr noundef @.str.105, ptr noundef %258, ptr noundef %261) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %1484

263:                                              ; preds = %251
  %264 = load i32, ptr %11, align 4, !tbaa !9
  %265 = call i32 @fstat(i32 noundef %264, ptr noundef %12) #11
  %266 = icmp eq i32 %265, -1
  br i1 %266, label %267, label %276

267:                                              ; preds = %263
  %268 = load ptr, ptr @stderr, align 8, !tbaa !5
  %269 = load ptr, ptr %6, align 8, !tbaa !5
  %270 = call ptr @__errno_location() #15
  %271 = load i32, ptr %270, align 4, !tbaa !9
  %272 = call ptr @strerror(i32 noundef %271) #11
  %273 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %268, ptr noundef @.str.105, ptr noundef %269, ptr noundef %272) #11
  %274 = load i32, ptr %11, align 4, !tbaa !9
  %275 = call i32 @close(i32 noundef %274)
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %1484

276:                                              ; preds = %263
  %277 = getelementptr inbounds %struct.stat, ptr %12, i32 0, i32 8
  %278 = load i64, ptr %277, align 8, !tbaa !29
  store i64 %278, ptr %13, align 8, !tbaa !12
  %279 = load i64, ptr %13, align 8, !tbaa !12
  %280 = icmp eq i64 %279, 0
  br i1 %280, label %281, label %472

281:                                              ; preds = %276
  %282 = load i32, ptr %11, align 4, !tbaa !9
  %283 = call i32 @close(i32 noundef %282)
  call void @llvm.lifetime.start.p0(i64 1, ptr %33) #11
  store i8 0, ptr %33, align 1, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 1, ptr %34) #11
  %284 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %285 = load i64, ptr %284, align 8, !tbaa !21
  %286 = icmp ugt i64 %285, 1
  br i1 %286, label %287, label %292

287:                                              ; preds = %281
  %288 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %289 = load i8, ptr %288, align 1, !tbaa !18, !range !19, !noundef !20
  %290 = trunc i8 %289 to i1
  %291 = xor i1 %290, true
  br label %292

292:                                              ; preds = %287, %281
  %293 = phi i1 [ false, %281 ], [ %291, %287 ]
  %294 = zext i1 %293 to i8
  store i8 %294, ptr %34, align 1, !tbaa !14
  %295 = load i8, ptr %34, align 1, !tbaa !14, !range !19, !noundef !20
  %296 = trunc i8 %295 to i1
  br i1 %296, label %297, label %308

297:                                              ; preds = %292
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #11
  %298 = call ptr @ac_trie_build(ptr noundef %8)
  store ptr %298, ptr %35, align 8, !tbaa !5
  %299 = load ptr, ptr %35, align 8, !tbaa !5
  %300 = call zeroext i1 @ac_trie_root_has_outputs(ptr noundef %299)
  br i1 %300, label %301, label %302

301:                                              ; preds = %297
  store i8 1, ptr %33, align 1, !tbaa !14
  br label %302

302:                                              ; preds = %301, %297
  %303 = load ptr, ptr %35, align 8, !tbaa !5
  %304 = icmp ne ptr %303, null
  br i1 %304, label %305, label %307

305:                                              ; preds = %302
  %306 = load ptr, ptr %35, align 8, !tbaa !5
  call void @ac_trie_free(ptr noundef %306)
  br label %307

307:                                              ; preds = %305, %302
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #11
  br label %433

308:                                              ; preds = %292
  %309 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %310 = load i8, ptr %309, align 1, !tbaa !18, !range !19, !noundef !20
  %311 = trunc i8 %310 to i1
  br i1 %311, label %312, label %420

312:                                              ; preds = %308
  call void @llvm.lifetime.start.p0(i64 64, ptr %36) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #11
  store ptr null, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #11
  store ptr null, ptr %38, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %314 = load i64, ptr %313, align 8, !tbaa !21
  %315 = icmp ugt i64 %314, 1
  br i1 %315, label %316, label %379

316:                                              ; preds = %312
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #11
  store i64 0, ptr %39, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #11
  store i64 0, ptr %40, align 8, !tbaa !12
  br label %317

317:                                              ; preds = %332, %316
  %318 = load i64, ptr %40, align 8, !tbaa !12
  %319 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %320 = load i64, ptr %319, align 8, !tbaa !21
  %321 = icmp ult i64 %318, %320
  br i1 %321, label %323, label %322

322:                                              ; preds = %317
  store i32 7, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #11
  br label %335

323:                                              ; preds = %317
  %324 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %325 = load ptr, ptr %324, align 8, !tbaa !22
  %326 = load i64, ptr %40, align 8, !tbaa !12
  %327 = getelementptr inbounds i64, ptr %325, i64 %326
  %328 = load i64, ptr %327, align 8, !tbaa !12
  %329 = add i64 %328, 3
  %330 = load i64, ptr %39, align 8, !tbaa !12
  %331 = add i64 %330, %329
  store i64 %331, ptr %39, align 8, !tbaa !12
  br label %332

332:                                              ; preds = %323
  %333 = load i64, ptr %40, align 8, !tbaa !12
  %334 = add i64 %333, 1
  store i64 %334, ptr %40, align 8, !tbaa !12
  br label %317, !llvm.loop !32

335:                                              ; preds = %322
  %336 = load i64, ptr %39, align 8, !tbaa !12
  %337 = add i64 %336, 1
  %338 = call noalias ptr @malloc(i64 noundef %337) #13
  store ptr %338, ptr %38, align 8, !tbaa !5
  %339 = load ptr, ptr %38, align 8, !tbaa !5
  %340 = icmp ne ptr %339, null
  br i1 %340, label %341, label %378

341:                                              ; preds = %335
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #11
  %342 = load ptr, ptr %38, align 8, !tbaa !5
  store ptr %342, ptr %41, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #11
  store i64 0, ptr %42, align 8, !tbaa !12
  br label %343

343:                                              ; preds = %372, %341
  %344 = load i64, ptr %42, align 8, !tbaa !12
  %345 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %346 = load i64, ptr %345, align 8, !tbaa !21
  %347 = icmp ult i64 %344, %346
  br i1 %347, label %349, label %348

348:                                              ; preds = %343
  store i32 10, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #11
  br label %375

349:                                              ; preds = %343
  %350 = load ptr, ptr %41, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %352 = load ptr, ptr %351, align 8, !tbaa !23
  %353 = load i64, ptr %42, align 8, !tbaa !12
  %354 = getelementptr inbounds ptr, ptr %352, i64 %353
  %355 = load ptr, ptr %354, align 8, !tbaa !5
  %356 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %350, ptr noundef @.str.91, ptr noundef %355) #11
  %357 = load ptr, ptr %41, align 8, !tbaa !5
  %358 = sext i32 %356 to i64
  %359 = getelementptr inbounds i8, ptr %357, i64 %358
  store ptr %359, ptr %41, align 8, !tbaa !5
  %360 = load i64, ptr %42, align 8, !tbaa !12
  %361 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %362 = load i64, ptr %361, align 8, !tbaa !21
  %363 = sub i64 %362, 1
  %364 = icmp ult i64 %360, %363
  br i1 %364, label %365, label %371

365:                                              ; preds = %349
  %366 = load ptr, ptr %41, align 8, !tbaa !5
  %367 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %366, ptr noundef @.str.92) #11
  %368 = load ptr, ptr %41, align 8, !tbaa !5
  %369 = sext i32 %367 to i64
  %370 = getelementptr inbounds i8, ptr %368, i64 %369
  store ptr %370, ptr %41, align 8, !tbaa !5
  br label %371

371:                                              ; preds = %365, %349
  br label %372

372:                                              ; preds = %371
  %373 = load i64, ptr %42, align 8, !tbaa !12
  %374 = add i64 %373, 1
  store i64 %374, ptr %42, align 8, !tbaa !12
  br label %343, !llvm.loop !33

375:                                              ; preds = %348
  %376 = load ptr, ptr %41, align 8, !tbaa !5
  store i8 0, ptr %376, align 1, !tbaa !27
  %377 = load ptr, ptr %38, align 8, !tbaa !5
  store ptr %377, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #11
  br label %378

378:                                              ; preds = %375, %335
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #11
  br label %391

379:                                              ; preds = %312
  %380 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %381 = load i64, ptr %380, align 8, !tbaa !21
  %382 = icmp eq i64 %381, 1
  br i1 %382, label %383, label %388

383:                                              ; preds = %379
  %384 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %385 = load ptr, ptr %384, align 8, !tbaa !23
  %386 = getelementptr inbounds ptr, ptr %385, i64 0
  %387 = load ptr, ptr %386, align 8, !tbaa !5
  store ptr %387, ptr %37, align 8, !tbaa !5
  br label %390

388:                                              ; preds = %379
  %389 = load ptr, ptr %38, align 8, !tbaa !5
  call void @free(ptr noundef %389) #11
  store i32 1, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %417

390:                                              ; preds = %383
  br label %391

391:                                              ; preds = %390, %378
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #11
  %392 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 5
  %393 = load i8, ptr %392, align 8, !tbaa !34, !range !19, !noundef !20
  %394 = trunc i8 %393 to i1
  %395 = zext i1 %394 to i64
  %396 = select i1 %394, i32 0, i32 2
  %397 = or i32 5, %396
  store i32 %397, ptr %43, align 4, !tbaa !9
  %398 = load ptr, ptr %37, align 8, !tbaa !5
  %399 = load i32, ptr %43, align 4, !tbaa !9
  %400 = call i32 @regcomp(ptr noundef %36, ptr noundef %398, i32 noundef %399)
  %401 = icmp eq i32 %400, 0
  br i1 %401, label %402, label %415

402:                                              ; preds = %391
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #11
  %403 = call i32 @regexec(ptr noundef %36, ptr noundef @.str.69, i64 noundef 1, ptr noundef %44, i32 noundef 0)
  %404 = icmp eq i32 %403, 0
  br i1 %404, label %405, label %414

405:                                              ; preds = %402
  %406 = getelementptr inbounds %struct.regmatch_t, ptr %44, i32 0, i32 0
  %407 = load i32, ptr %406, align 4, !tbaa !35
  %408 = icmp eq i32 %407, 0
  br i1 %408, label %409, label %414

409:                                              ; preds = %405
  %410 = getelementptr inbounds %struct.regmatch_t, ptr %44, i32 0, i32 1
  %411 = load i32, ptr %410, align 4, !tbaa !37
  %412 = icmp eq i32 %411, 0
  br i1 %412, label %413, label %414

413:                                              ; preds = %409
  store i8 1, ptr %33, align 1, !tbaa !14
  br label %414

414:                                              ; preds = %413, %409, %405, %402
  call void @regfree(ptr noundef %36)
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #11
  br label %415

415:                                              ; preds = %414, %391
  %416 = load ptr, ptr %38, align 8, !tbaa !5
  call void @free(ptr noundef %416) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #11
  store i32 0, ptr %24, align 4
  br label %417

417:                                              ; preds = %415, %388
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr %36) #11
  %418 = load i32, ptr %24, align 4
  switch i32 %418, label %471 [
    i32 0, label %419
  ]

419:                                              ; preds = %417
  br label %432

420:                                              ; preds = %308
  %421 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %422 = load i64, ptr %421, align 8, !tbaa !21
  %423 = icmp eq i64 %422, 1
  br i1 %423, label %424, label %431

424:                                              ; preds = %420
  %425 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %426 = load ptr, ptr %425, align 8, !tbaa !22
  %427 = getelementptr inbounds i64, ptr %426, i64 0
  %428 = load i64, ptr %427, align 8, !tbaa !12
  %429 = icmp eq i64 %428, 0
  br i1 %429, label %430, label %431

430:                                              ; preds = %424
  store i8 1, ptr %33, align 1, !tbaa !14
  br label %431

431:                                              ; preds = %430, %424, %420
  br label %432

432:                                              ; preds = %431, %419
  br label %433

433:                                              ; preds = %432, %307
  %434 = load i8, ptr %33, align 1, !tbaa !14, !range !19, !noundef !20
  %435 = trunc i8 %434 to i1
  br i1 %435, label %436, label %459

436:                                              ; preds = %433
  %437 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 7
  %438 = load i8, ptr %437, align 2, !tbaa !38, !range !19, !noundef !20
  %439 = trunc i8 %438 to i1
  br i1 %439, label %444, label %440

440:                                              ; preds = %436
  %441 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 8
  %442 = load i8, ptr %441, align 1, !tbaa !39, !range !19, !noundef !20
  %443 = trunc i8 %442 to i1
  br i1 %443, label %444, label %447

444:                                              ; preds = %440, %436
  %445 = load ptr, ptr %6, align 8, !tbaa !5
  %446 = call i32 (ptr, ...) @printf(ptr noundef @.str.106, ptr noundef %445)
  br label %457

447:                                              ; preds = %440
  %448 = load i8, ptr @only_matching, align 1, !tbaa !14, !range !19, !noundef !20
  %449 = trunc i8 %448 to i1
  br i1 %449, label %450, label %453

450:                                              ; preds = %447
  %451 = load ptr, ptr %6, align 8, !tbaa !5
  %452 = call i32 (ptr, ...) @printf(ptr noundef @.str.107, ptr noundef %451)
  br label %456

453:                                              ; preds = %447
  %454 = load ptr, ptr %6, align 8, !tbaa !5
  %455 = call i32 (ptr, ...) @printf(ptr noundef @.str.108, ptr noundef %454)
  br label %456

456:                                              ; preds = %453, %450
  br label %457

457:                                              ; preds = %456, %444
  store i8 1, ptr %45, align 1, !tbaa !14
  %458 = load i8, ptr %45, align 1
  store atomic i8 %458, ptr @global_match_found_flag seq_cst, align 1
  store i32 0, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %471

459:                                              ; preds = %433
  %460 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 7
  %461 = load i8, ptr %460, align 2, !tbaa !38, !range !19, !noundef !20
  %462 = trunc i8 %461 to i1
  br i1 %462, label %467, label %463

463:                                              ; preds = %459
  %464 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 8
  %465 = load i8, ptr %464, align 1, !tbaa !39, !range !19, !noundef !20
  %466 = trunc i8 %465 to i1
  br i1 %466, label %467, label %470

467:                                              ; preds = %463, %459
  %468 = load ptr, ptr %6, align 8, !tbaa !5
  %469 = call i32 (ptr, ...) @printf(ptr noundef @.str.109, ptr noundef %468)
  br label %470

470:                                              ; preds = %467, %463
  store i32 1, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %471

471:                                              ; preds = %470, %457, %417
  call void @llvm.lifetime.end.p0(i64 1, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %33) #11
  br label %1484

472:                                              ; preds = %276
  %473 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %474 = load i8, ptr %473, align 1, !tbaa !18, !range !19, !noundef !20
  %475 = trunc i8 %474 to i1
  br i1 %475, label %501, label %476

476:                                              ; preds = %472
  %477 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %478 = load i64, ptr %477, align 8, !tbaa !21
  %479 = icmp eq i64 %478, 1
  br i1 %479, label %480, label %501

480:                                              ; preds = %476
  %481 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %482 = load ptr, ptr %481, align 8, !tbaa !22
  %483 = getelementptr inbounds i64, ptr %482, i64 0
  %484 = load i64, ptr %483, align 8, !tbaa !12
  %485 = load i64, ptr %13, align 8, !tbaa !12
  %486 = icmp ugt i64 %484, %485
  br i1 %486, label %487, label %501

487:                                              ; preds = %480
  %488 = load i32, ptr %11, align 4, !tbaa !9
  %489 = call i32 @close(i32 noundef %488)
  %490 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 7
  %491 = load i8, ptr %490, align 2, !tbaa !38, !range !19, !noundef !20
  %492 = trunc i8 %491 to i1
  br i1 %492, label %497, label %493

493:                                              ; preds = %487
  %494 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 8
  %495 = load i8, ptr %494, align 1, !tbaa !39, !range !19, !noundef !20
  %496 = trunc i8 %495 to i1
  br i1 %496, label %497, label %500

497:                                              ; preds = %493, %487
  %498 = load ptr, ptr %6, align 8, !tbaa !5
  %499 = call i32 (ptr, ...) @printf(ptr noundef @.str.109, ptr noundef %498)
  br label %500

500:                                              ; preds = %497, %493
  store i32 1, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %1484

501:                                              ; preds = %480, %476, %472
  call void @llvm.lifetime.start.p0(i64 1, ptr %46) #11
  %502 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %503 = load i64, ptr %502, align 8, !tbaa !21
  %504 = icmp ugt i64 %503, 1
  br i1 %504, label %505, label %510

505:                                              ; preds = %501
  %506 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %507 = load i8, ptr %506, align 1, !tbaa !18, !range !19, !noundef !20
  %508 = trunc i8 %507 to i1
  %509 = xor i1 %508, true
  br label %510

510:                                              ; preds = %505, %501
  %511 = phi i1 [ false, %501 ], [ %509, %505 ]
  %512 = zext i1 %511 to i8
  store i8 %512, ptr %46, align 1, !tbaa !14
  %513 = load i8, ptr %46, align 1, !tbaa !14, !range !19, !noundef !20
  %514 = trunc i8 %513 to i1
  br i1 %514, label %515, label %526

515:                                              ; preds = %510
  %516 = call ptr @ac_trie_build(ptr noundef %8)
  store ptr %516, ptr %9, align 8, !tbaa !5
  %517 = load ptr, ptr %9, align 8, !tbaa !5
  %518 = icmp ne ptr %517, null
  br i1 %518, label %523, label %519

519:                                              ; preds = %515
  %520 = load ptr, ptr @stderr, align 8, !tbaa !5
  %521 = load ptr, ptr %6, align 8, !tbaa !5
  %522 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %520, ptr noundef @.str.110, ptr noundef %521) #11
  store i32 2, ptr %10, align 4, !tbaa !9
  br label %1450

523:                                              ; preds = %515
  %524 = load ptr, ptr %9, align 8, !tbaa !5
  %525 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 12
  store ptr %524, ptr %525, align 8, !tbaa !28
  br label %526

526:                                              ; preds = %523, %510
  %527 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %528 = load i8, ptr %527, align 1, !tbaa !18, !range !19, !noundef !20
  %529 = trunc i8 %528 to i1
  br i1 %529, label %530, label %710

530:                                              ; preds = %526
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #11
  store ptr null, ptr %47, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %532 = load i64, ptr %531, align 8, !tbaa !21
  %533 = icmp ugt i64 %532, 1
  br i1 %533, label %534, label %628

534:                                              ; preds = %530
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #11
  store i64 0, ptr %48, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #11
  store i64 0, ptr %49, align 8, !tbaa !12
  br label %535

535:                                              ; preds = %557, %534
  %536 = load i64, ptr %49, align 8, !tbaa !12
  %537 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %538 = load i64, ptr %537, align 8, !tbaa !21
  %539 = icmp ult i64 %536, %538
  br i1 %539, label %541, label %540

540:                                              ; preds = %535
  store i32 14, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #11
  br label %560

541:                                              ; preds = %535
  %542 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %543 = load ptr, ptr %542, align 8, !tbaa !22
  %544 = load i64, ptr %49, align 8, !tbaa !12
  %545 = getelementptr inbounds i64, ptr %543, i64 %544
  %546 = load i64, ptr %545, align 8, !tbaa !12
  %547 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 10
  %548 = load i8, ptr %547, align 1, !tbaa !40, !range !19, !noundef !20
  %549 = trunc i8 %548 to i1
  %550 = zext i1 %549 to i64
  %551 = select i1 %549, i32 6, i32 2
  %552 = sext i32 %551 to i64
  %553 = add i64 %546, %552
  %554 = add i64 %553, 1
  %555 = load i64, ptr %48, align 8, !tbaa !12
  %556 = add i64 %555, %554
  store i64 %556, ptr %48, align 8, !tbaa !12
  br label %557

557:                                              ; preds = %541
  %558 = load i64, ptr %49, align 8, !tbaa !12
  %559 = add i64 %558, 1
  store i64 %559, ptr %49, align 8, !tbaa !12
  br label %535, !llvm.loop !41

560:                                              ; preds = %540
  %561 = load i64, ptr %48, align 8, !tbaa !12
  %562 = add i64 %561, 1
  %563 = call noalias ptr @malloc(i64 noundef %562) #13
  store ptr %563, ptr %19, align 8, !tbaa !5
  %564 = load ptr, ptr %19, align 8, !tbaa !5
  %565 = icmp ne ptr %564, null
  br i1 %565, label %572, label %566

566:                                              ; preds = %560
  %567 = load ptr, ptr @stderr, align 8, !tbaa !5
  %568 = load ptr, ptr %6, align 8, !tbaa !5
  %569 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %567, ptr noundef @.str.111, ptr noundef %568) #11
  %570 = load i32, ptr %11, align 4, !tbaa !9
  %571 = call i32 @close(i32 noundef %570)
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %625

572:                                              ; preds = %560
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #11
  %573 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %573, ptr %50, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #11
  store i64 0, ptr %51, align 8, !tbaa !12
  br label %574

574:                                              ; preds = %619, %572
  %575 = load i64, ptr %51, align 8, !tbaa !12
  %576 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %577 = load i64, ptr %576, align 8, !tbaa !21
  %578 = icmp ult i64 %575, %577
  br i1 %578, label %580, label %579

579:                                              ; preds = %574
  store i32 17, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #11
  br label %622

580:                                              ; preds = %574
  %581 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 10
  %582 = load i8, ptr %581, align 1, !tbaa !40, !range !19, !noundef !20
  %583 = trunc i8 %582 to i1
  br i1 %583, label %584, label %595

584:                                              ; preds = %580
  %585 = load ptr, ptr %50, align 8, !tbaa !5
  %586 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %587 = load ptr, ptr %586, align 8, !tbaa !23
  %588 = load i64, ptr %51, align 8, !tbaa !12
  %589 = getelementptr inbounds ptr, ptr %587, i64 %588
  %590 = load ptr, ptr %589, align 8, !tbaa !5
  %591 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %585, ptr noundef @.str.90, ptr noundef %590) #11
  %592 = load ptr, ptr %50, align 8, !tbaa !5
  %593 = sext i32 %591 to i64
  %594 = getelementptr inbounds i8, ptr %592, i64 %593
  store ptr %594, ptr %50, align 8, !tbaa !5
  br label %606

595:                                              ; preds = %580
  %596 = load ptr, ptr %50, align 8, !tbaa !5
  %597 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %598 = load ptr, ptr %597, align 8, !tbaa !23
  %599 = load i64, ptr %51, align 8, !tbaa !12
  %600 = getelementptr inbounds ptr, ptr %598, i64 %599
  %601 = load ptr, ptr %600, align 8, !tbaa !5
  %602 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %596, ptr noundef @.str.91, ptr noundef %601) #11
  %603 = load ptr, ptr %50, align 8, !tbaa !5
  %604 = sext i32 %602 to i64
  %605 = getelementptr inbounds i8, ptr %603, i64 %604
  store ptr %605, ptr %50, align 8, !tbaa !5
  br label %606

606:                                              ; preds = %595, %584
  %607 = load i64, ptr %51, align 8, !tbaa !12
  %608 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %609 = load i64, ptr %608, align 8, !tbaa !21
  %610 = sub i64 %609, 1
  %611 = icmp ult i64 %607, %610
  br i1 %611, label %612, label %618

612:                                              ; preds = %606
  %613 = load ptr, ptr %50, align 8, !tbaa !5
  %614 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %613, ptr noundef @.str.92) #11
  %615 = load ptr, ptr %50, align 8, !tbaa !5
  %616 = sext i32 %614 to i64
  %617 = getelementptr inbounds i8, ptr %615, i64 %616
  store ptr %617, ptr %50, align 8, !tbaa !5
  br label %618

618:                                              ; preds = %612, %606
  br label %619

619:                                              ; preds = %618
  %620 = load i64, ptr %51, align 8, !tbaa !12
  %621 = add i64 %620, 1
  store i64 %621, ptr %51, align 8, !tbaa !12
  br label %574, !llvm.loop !42

622:                                              ; preds = %579
  %623 = load ptr, ptr %50, align 8, !tbaa !5
  store i8 0, ptr %623, align 1, !tbaa !27
  %624 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %624, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #11
  store i32 0, ptr %24, align 4
  br label %625

625:                                              ; preds = %622, %566
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #11
  %626 = load i32, ptr %24, align 4
  switch i32 %626, label %707 [
    i32 0, label %627
  ]

627:                                              ; preds = %625
  br label %675

628:                                              ; preds = %530
  %629 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %630 = load i64, ptr %629, align 8, !tbaa !21
  %631 = icmp eq i64 %630, 1
  br i1 %631, label %632, label %671

632:                                              ; preds = %628
  %633 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 10
  %634 = load i8, ptr %633, align 1, !tbaa !40, !range !19, !noundef !20
  %635 = trunc i8 %634 to i1
  br i1 %635, label %636, label %665

636:                                              ; preds = %632
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #11
  %637 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %638 = load ptr, ptr %637, align 8, !tbaa !23
  %639 = getelementptr inbounds ptr, ptr %638, i64 0
  %640 = load ptr, ptr %639, align 8, !tbaa !5
  %641 = call i64 @strlen(ptr noundef %640) #12
  store i64 %641, ptr %52, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #11
  %642 = load i64, ptr %52, align 8, !tbaa !12
  %643 = add i64 %642, 7
  %644 = call noalias ptr @malloc(i64 noundef %643) #13
  store ptr %644, ptr %53, align 8, !tbaa !5
  %645 = load ptr, ptr %53, align 8, !tbaa !5
  %646 = icmp ne ptr %645, null
  br i1 %646, label %652, label %647

647:                                              ; preds = %636
  %648 = load ptr, ptr @stderr, align 8, !tbaa !5
  %649 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %648, ptr noundef @.str.93) #11
  %650 = load i32, ptr %11, align 4, !tbaa !9
  %651 = call i32 @close(i32 noundef %650)
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %662

652:                                              ; preds = %636
  %653 = load ptr, ptr %53, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %655 = load ptr, ptr %654, align 8, !tbaa !23
  %656 = getelementptr inbounds ptr, ptr %655, i64 0
  %657 = load ptr, ptr %656, align 8, !tbaa !5
  %658 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %653, ptr noundef @.str.94, ptr noundef %657) #11
  %659 = load ptr, ptr %53, align 8, !tbaa !5
  store ptr %659, ptr %47, align 8, !tbaa !5
  %660 = load ptr, ptr %19, align 8, !tbaa !5
  call void @free(ptr noundef %660) #11
  %661 = load ptr, ptr %53, align 8, !tbaa !5
  store ptr %661, ptr %19, align 8, !tbaa !5
  store i32 0, ptr %24, align 4
  br label %662

662:                                              ; preds = %652, %647
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #11
  %663 = load i32, ptr %24, align 4
  switch i32 %663, label %707 [
    i32 0, label %664
  ]

664:                                              ; preds = %662
  br label %670

665:                                              ; preds = %632
  %666 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 2
  %667 = load ptr, ptr %666, align 8, !tbaa !23
  %668 = getelementptr inbounds ptr, ptr %667, i64 0
  %669 = load ptr, ptr %668, align 8, !tbaa !5
  store ptr %669, ptr %47, align 8, !tbaa !5
  br label %670

670:                                              ; preds = %665, %664
  br label %674

671:                                              ; preds = %628
  %672 = load i32, ptr %11, align 4, !tbaa !9
  %673 = call i32 @close(i32 noundef %672)
  store i32 1, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %707

674:                                              ; preds = %670
  br label %675

675:                                              ; preds = %674, %627
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #11
  %676 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 5
  %677 = load i8, ptr %676, align 8, !tbaa !34, !range !19, !noundef !20
  %678 = trunc i8 %677 to i1
  %679 = zext i1 %678 to i64
  %680 = select i1 %678, i32 0, i32 2
  %681 = or i32 5, %680
  store i32 %681, ptr %54, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #11
  %682 = load ptr, ptr %47, align 8, !tbaa !5
  %683 = load i32, ptr %54, align 4, !tbaa !9
  %684 = call i32 @regcomp(ptr noundef %18, ptr noundef %682, i32 noundef %683)
  store i32 %684, ptr %55, align 4, !tbaa !9
  %685 = load i32, ptr %55, align 4, !tbaa !9
  %686 = icmp ne i32 %685, 0
  br i1 %686, label %687, label %698

687:                                              ; preds = %675
  call void @llvm.lifetime.start.p0(i64 256, ptr %56) #11
  %688 = load i32, ptr %55, align 4, !tbaa !9
  %689 = getelementptr inbounds [256 x i8], ptr %56, i64 0, i64 0
  %690 = call i64 @regerror(i32 noundef %688, ptr noundef %18, ptr noundef %689, i64 noundef 256)
  %691 = load ptr, ptr @stderr, align 8, !tbaa !5
  %692 = load ptr, ptr %6, align 8, !tbaa !5
  %693 = getelementptr inbounds [256 x i8], ptr %56, i64 0, i64 0
  %694 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %691, ptr noundef @.str.112, ptr noundef %692, ptr noundef %693) #11
  %695 = load i32, ptr %11, align 4, !tbaa !9
  %696 = call i32 @close(i32 noundef %695)
  %697 = load ptr, ptr %19, align 8, !tbaa !5
  call void @free(ptr noundef %697) #11
  store i32 2, ptr %4, align 4
  store i32 1, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 256, ptr %56) #11
  br label %706

698:                                              ; preds = %675
  call void @llvm.lifetime.start.p0(i64 72, ptr %57) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %57, ptr align 8 %8, i64 72, i1 false), !tbaa.struct !11
  %699 = getelementptr inbounds %struct.search_params, ptr %57, i32 0, i32 11
  store ptr %18, ptr %699, align 8, !tbaa !43
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %8, ptr align 8 %57, i64 72, i1 false), !tbaa.struct !11
  %700 = load ptr, ptr %9, align 8, !tbaa !5
  %701 = icmp ne ptr %700, null
  br i1 %701, label %702, label %705

702:                                              ; preds = %698
  %703 = load ptr, ptr %9, align 8, !tbaa !5
  call void @ac_trie_free(ptr noundef %703)
  store ptr null, ptr %9, align 8, !tbaa !5
  %704 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 12
  store ptr null, ptr %704, align 8, !tbaa !28
  br label %705

705:                                              ; preds = %702, %698
  call void @llvm.lifetime.end.p0(i64 72, ptr %57) #11
  store i32 0, ptr %24, align 4
  br label %706

706:                                              ; preds = %705, %687
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #11
  br label %707

707:                                              ; preds = %706, %671, %662, %625
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #11
  %708 = load i32, ptr %24, align 4
  switch i32 %708, label %1483 [
    i32 0, label %709
  ]

709:                                              ; preds = %707
  br label %710

710:                                              ; preds = %709, %526
  store i32 2, ptr %58, align 4, !tbaa !9
  store ptr inttoptr (i64 -1 to ptr), ptr %14, align 8, !tbaa !5
  %711 = load i32, ptr %58, align 4, !tbaa !9
  %712 = or i32 %711, 32768
  store i32 %712, ptr %59, align 4, !tbaa !9
  %713 = load i64, ptr %13, align 8, !tbaa !12
  %714 = load i32, ptr %59, align 4, !tbaa !9
  %715 = load i32, ptr %11, align 4, !tbaa !9
  %716 = call ptr @mmap(ptr noundef null, i64 noundef %713, i32 noundef 1, i32 noundef %714, i32 noundef %715, i64 noundef 0) #11
  store ptr %716, ptr %14, align 8, !tbaa !5
  %717 = load ptr, ptr %14, align 8, !tbaa !5
  %718 = icmp eq ptr %717, inttoptr (i64 -1 to ptr)
  br i1 %718, label %719, label %728

719:                                              ; preds = %710
  %720 = call ptr @__errno_location() #15
  %721 = load i32, ptr %720, align 4, !tbaa !9
  %722 = icmp eq i32 %721, 95
  br i1 %722, label %723, label %728

723:                                              ; preds = %719
  %724 = load i64, ptr %13, align 8, !tbaa !12
  %725 = load i32, ptr %58, align 4, !tbaa !9
  %726 = load i32, ptr %11, align 4, !tbaa !9
  %727 = call ptr @mmap(ptr noundef null, i64 noundef %724, i32 noundef 1, i32 noundef %725, i32 noundef %726, i64 noundef 0) #11
  store ptr %727, ptr %14, align 8, !tbaa !5
  br label %743

728:                                              ; preds = %719, %710
  %729 = load ptr, ptr %14, align 8, !tbaa !5
  %730 = icmp eq ptr %729, inttoptr (i64 -1 to ptr)
  br i1 %730, label %731, label %742

731:                                              ; preds = %728
  %732 = load ptr, ptr @stderr, align 8, !tbaa !5
  %733 = load ptr, ptr %6, align 8, !tbaa !5
  %734 = call ptr @__errno_location() #15
  %735 = load i32, ptr %734, align 4, !tbaa !9
  %736 = call ptr @strerror(i32 noundef %735) #11
  %737 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %732, ptr noundef @.str.113, ptr noundef %733, ptr noundef %736) #11
  %738 = load i64, ptr %13, align 8, !tbaa !12
  %739 = load i32, ptr %58, align 4, !tbaa !9
  %740 = load i32, ptr %11, align 4, !tbaa !9
  %741 = call ptr @mmap(ptr noundef null, i64 noundef %738, i32 noundef 1, i32 noundef %739, i32 noundef %740, i64 noundef 0) #11
  store ptr %741, ptr %14, align 8, !tbaa !5
  br label %742

742:                                              ; preds = %731, %728
  br label %743

743:                                              ; preds = %742, %723
  %744 = load ptr, ptr %14, align 8, !tbaa !5
  %745 = icmp eq ptr %744, inttoptr (i64 -1 to ptr)
  br i1 %745, label %746, label %765

746:                                              ; preds = %743
  %747 = load ptr, ptr @stderr, align 8, !tbaa !5
  %748 = load ptr, ptr %6, align 8, !tbaa !5
  %749 = call ptr @__errno_location() #15
  %750 = load i32, ptr %749, align 4, !tbaa !9
  %751 = call ptr @strerror(i32 noundef %750) #11
  %752 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %747, ptr noundef @.str.114, ptr noundef %748, ptr noundef %751) #11
  %753 = load i32, ptr %11, align 4, !tbaa !9
  %754 = call i32 @close(i32 noundef %753)
  %755 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %756 = load i8, ptr %755, align 1, !tbaa !18, !range !19, !noundef !20
  %757 = trunc i8 %756 to i1
  br i1 %757, label %758, label %763

758:                                              ; preds = %746
  %759 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 11
  %760 = load ptr, ptr %759, align 8, !tbaa !43
  %761 = icmp eq ptr %760, %18
  br i1 %761, label %762, label %763

762:                                              ; preds = %758
  call void @regfree(ptr noundef %18)
  br label %763

763:                                              ; preds = %762, %758, %746
  %764 = load ptr, ptr %19, align 8, !tbaa !5
  call void @free(ptr noundef %764) #11
  store i32 2, ptr %10, align 4, !tbaa !9
  br label %1450

765:                                              ; preds = %743
  %766 = load ptr, ptr %14, align 8, !tbaa !5
  %767 = load i64, ptr %13, align 8, !tbaa !12
  %768 = call i32 @madvise(ptr noundef %766, i64 noundef %767, i32 noundef 3) #11
  %769 = icmp ne i32 %768, 0
  br i1 %769, label %770, label %777

770:                                              ; preds = %765
  %771 = load ptr, ptr @stderr, align 8, !tbaa !5
  %772 = load ptr, ptr %6, align 8, !tbaa !5
  %773 = call ptr @__errno_location() #15
  %774 = load i32, ptr %773, align 4, !tbaa !9
  %775 = call ptr @strerror(i32 noundef %774) #11
  %776 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %771, ptr noundef @.str.115, ptr noundef %772, ptr noundef %775) #11
  br label %777

777:                                              ; preds = %770, %765
  %778 = load i32, ptr %11, align 4, !tbaa !9
  %779 = call i32 @close(i32 noundef %778)
  store i32 -1, ptr %11, align 4, !tbaa !9
  %780 = load i32, ptr %7, align 4, !tbaa !9
  %781 = icmp eq i32 %780, 0
  br i1 %781, label %782, label %792

782:                                              ; preds = %777
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #11
  %783 = call i64 @sysconf(i32 noundef 84) #11
  store i64 %783, ptr %60, align 8, !tbaa !12
  %784 = load i64, ptr %60, align 8, !tbaa !12
  %785 = icmp sgt i64 %784, 0
  br i1 %785, label %786, label %789

786:                                              ; preds = %782
  %787 = load i64, ptr %60, align 8, !tbaa !12
  %788 = trunc i64 %787 to i32
  br label %790

789:                                              ; preds = %782
  br label %790

790:                                              ; preds = %789, %786
  %791 = phi i32 [ %788, %786 ], [ 1, %789 ]
  store i32 %791, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #11
  br label %794

792:                                              ; preds = %777
  %793 = load i32, ptr %7, align 4, !tbaa !9
  store i32 %793, ptr %20, align 4, !tbaa !9
  br label %794

794:                                              ; preds = %792, %790
  %795 = load i64, ptr %13, align 8, !tbaa !12
  %796 = icmp ugt i64 %795, 0
  br i1 %796, label %797, label %803

797:                                              ; preds = %794
  %798 = load i64, ptr %13, align 8, !tbaa !12
  %799 = add i64 %798, 4194304
  %800 = sub i64 %799, 1
  %801 = udiv i64 %800, 4194304
  %802 = trunc i64 %801 to i32
  br label %804

803:                                              ; preds = %794
  br label %804

804:                                              ; preds = %803, %797
  %805 = phi i32 [ %802, %797 ], [ 1, %803 ]
  store i32 %805, ptr %61, align 4, !tbaa !9
  %806 = load i32, ptr %20, align 4, !tbaa !9
  %807 = load i32, ptr %61, align 4, !tbaa !9
  %808 = icmp sgt i32 %806, %807
  br i1 %808, label %809, label %814

809:                                              ; preds = %804
  %810 = load i32, ptr %61, align 4, !tbaa !9
  %811 = icmp sgt i32 %810, 0
  br i1 %811, label %812, label %814

812:                                              ; preds = %809
  %813 = load i32, ptr %61, align 4, !tbaa !9
  store i32 %813, ptr %20, align 4, !tbaa !9
  br label %814

814:                                              ; preds = %812, %809, %804
  %815 = load i32, ptr %20, align 4, !tbaa !9
  %816 = icmp sle i32 %815, 0
  br i1 %816, label %817, label %818

817:                                              ; preds = %814
  store i32 1, ptr %20, align 4, !tbaa !9
  br label %818

818:                                              ; preds = %817, %814
  %819 = load i32, ptr %20, align 4, !tbaa !9
  %820 = sext i32 %819 to i64
  %821 = mul i64 %820, 8
  %822 = call noalias ptr @malloc(i64 noundef %821) #13
  store ptr %822, ptr %16, align 8, !tbaa !5
  %823 = load i32, ptr %20, align 4, !tbaa !9
  %824 = sext i32 %823 to i64
  %825 = mul i64 %824, 56
  %826 = call noalias ptr @malloc(i64 noundef %825) #13
  store ptr %826, ptr %17, align 8, !tbaa !5
  %827 = load ptr, ptr %16, align 8, !tbaa !5
  %828 = icmp ne ptr %827, null
  br i1 %828, label %829, label %834

829:                                              ; preds = %818
  %830 = load ptr, ptr %16, align 8, !tbaa !5
  %831 = load i32, ptr %20, align 4, !tbaa !9
  %832 = sext i32 %831 to i64
  %833 = mul i64 %832, 8
  call void @llvm.memset.p0.i64(ptr align 8 %830, i8 0, i64 %833, i1 false)
  br label %834

834:                                              ; preds = %829, %818
  %835 = load ptr, ptr %16, align 8, !tbaa !5
  %836 = icmp ne ptr %835, null
  br i1 %836, label %837, label %840

837:                                              ; preds = %834
  %838 = load ptr, ptr %17, align 8, !tbaa !5
  %839 = icmp ne ptr %838, null
  br i1 %839, label %841, label %840

840:                                              ; preds = %837, %834
  call void @perror(ptr noundef @.str.116)
  store i32 2, ptr %10, align 4, !tbaa !9
  br label %1450

841:                                              ; preds = %837
  %842 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 9
  %843 = load i8, ptr %842, align 4, !tbaa !44, !range !19, !noundef !20
  %844 = trunc i8 %843 to i1
  br i1 %844, label %845, label %867

845:                                              ; preds = %841
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #11
  %846 = load i64, ptr %13, align 8, !tbaa !12
  %847 = udiv i64 %846, 1000
  %848 = icmp ugt i64 %847, 1000
  br i1 %848, label %849, label %852

849:                                              ; preds = %845
  %850 = load i64, ptr %13, align 8, !tbaa !12
  %851 = udiv i64 %850, 1000
  br label %853

852:                                              ; preds = %845
  br label %853

853:                                              ; preds = %852, %849
  %854 = phi i64 [ %851, %849 ], [ 1000, %852 ]
  store i64 %854, ptr %62, align 8, !tbaa !12
  %855 = load i64, ptr %62, align 8, !tbaa !12
  %856 = call ptr @match_result_init(i64 noundef %855)
  store ptr %856, ptr %15, align 8, !tbaa !5
  %857 = load ptr, ptr %15, align 8, !tbaa !5
  %858 = icmp ne ptr %857, null
  br i1 %858, label %863, label %859

859:                                              ; preds = %853
  %860 = load ptr, ptr @stderr, align 8, !tbaa !5
  %861 = load ptr, ptr %6, align 8, !tbaa !5
  %862 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %860, ptr noundef @.str.117, ptr noundef %861) #11
  store i32 2, ptr %10, align 4, !tbaa !9
  store i32 13, ptr %24, align 4
  br label %864

863:                                              ; preds = %853
  store i32 0, ptr %24, align 4
  br label %864

864:                                              ; preds = %863, %859
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #11
  %865 = load i32, ptr %24, align 4
  switch i32 %865, label %1483 [
    i32 0, label %866
    i32 13, label %1450
  ]

866:                                              ; preds = %864
  br label %867

867:                                              ; preds = %866, %841
  %868 = load i64, ptr %13, align 8, !tbaa !12
  %869 = load i32, ptr %20, align 4, !tbaa !9
  %870 = sext i32 %869 to i64
  %871 = add i64 %868, %870
  %872 = sub i64 %871, 1
  %873 = load i32, ptr %20, align 4, !tbaa !9
  %874 = sext i32 %873 to i64
  %875 = udiv i64 %872, %874
  store i64 %875, ptr %63, align 8, !tbaa !12
  %876 = load i64, ptr %63, align 8, !tbaa !12
  %877 = icmp eq i64 %876, 0
  br i1 %877, label %878, label %883

878:                                              ; preds = %867
  %879 = load i64, ptr %13, align 8, !tbaa !12
  %880 = icmp ugt i64 %879, 0
  br i1 %880, label %881, label %883

881:                                              ; preds = %878
  %882 = load i64, ptr %13, align 8, !tbaa !12
  store i64 %882, ptr %63, align 8, !tbaa !12
  br label %883

883:                                              ; preds = %881, %878, %867
  %884 = load i64, ptr %63, align 8, !tbaa !12
  %885 = icmp ult i64 %884, 4194304
  br i1 %885, label %886, label %901

886:                                              ; preds = %883
  %887 = load i64, ptr %13, align 8, !tbaa !12
  %888 = icmp ugt i64 %887, 4194304
  br i1 %888, label %889, label %901

889:                                              ; preds = %886
  store i64 4194304, ptr %63, align 8, !tbaa !12
  %890 = load i64, ptr %13, align 8, !tbaa !12
  %891 = load i64, ptr %63, align 8, !tbaa !12
  %892 = add i64 %890, %891
  %893 = sub i64 %892, 1
  %894 = load i64, ptr %63, align 8, !tbaa !12
  %895 = udiv i64 %893, %894
  %896 = trunc i64 %895 to i32
  store i32 %896, ptr %20, align 4, !tbaa !9
  %897 = load i32, ptr %20, align 4, !tbaa !9
  %898 = icmp sle i32 %897, 0
  br i1 %898, label %899, label %900

899:                                              ; preds = %889
  store i32 1, ptr %20, align 4, !tbaa !9
  br label %900

900:                                              ; preds = %899, %889
  br label %901

901:                                              ; preds = %900, %886, %883
  store i64 0, ptr %64, align 8, !tbaa !12
  store i32 0, ptr %65, align 4, !tbaa !9
  store i64 0, ptr %66, align 8, !tbaa !12
  %902 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %903 = load i8, ptr %902, align 1, !tbaa !18, !range !19, !noundef !20
  %904 = trunc i8 %903 to i1
  br i1 %904, label %931, label %905

905:                                              ; preds = %901
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #11
  store i64 0, ptr %67, align 8, !tbaa !12
  br label %906

906:                                              ; preds = %927, %905
  %907 = load i64, ptr %67, align 8, !tbaa !12
  %908 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 4
  %909 = load i64, ptr %908, align 8, !tbaa !21
  %910 = icmp ult i64 %907, %909
  br i1 %910, label %912, label %911

911:                                              ; preds = %906
  store i32 20, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #11
  br label %930

912:                                              ; preds = %906
  %913 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %914 = load ptr, ptr %913, align 8, !tbaa !22
  %915 = load i64, ptr %67, align 8, !tbaa !12
  %916 = getelementptr inbounds i64, ptr %914, i64 %915
  %917 = load i64, ptr %916, align 8, !tbaa !12
  %918 = load i64, ptr %66, align 8, !tbaa !12
  %919 = icmp ugt i64 %917, %918
  br i1 %919, label %920, label %926

920:                                              ; preds = %912
  %921 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 3
  %922 = load ptr, ptr %921, align 8, !tbaa !22
  %923 = load i64, ptr %67, align 8, !tbaa !12
  %924 = getelementptr inbounds i64, ptr %922, i64 %923
  %925 = load i64, ptr %924, align 8, !tbaa !12
  store i64 %925, ptr %66, align 8, !tbaa !12
  br label %926

926:                                              ; preds = %920, %912
  br label %927

927:                                              ; preds = %926
  %928 = load i64, ptr %67, align 8, !tbaa !12
  %929 = add i64 %928, 1
  store i64 %929, ptr %67, align 8, !tbaa !12
  br label %906, !llvm.loop !45

930:                                              ; preds = %911
  br label %931

931:                                              ; preds = %930, %901
  %932 = load i32, ptr %7, align 4, !tbaa !9
  %933 = icmp sgt i32 %932, 0
  br i1 %933, label %934, label %937

934:                                              ; preds = %931
  %935 = load i32, ptr %7, align 4, !tbaa !9
  %936 = sext i32 %935 to i64
  br label %939

937:                                              ; preds = %931
  %938 = call i64 @sysconf(i32 noundef 84) #11
  br label %939

939:                                              ; preds = %937, %934
  %940 = phi i64 [ %936, %934 ], [ %938, %937 ]
  %941 = trunc i64 %940 to i32
  store i32 %941, ptr %68, align 4, !tbaa !9
  %942 = load i32, ptr %68, align 4, !tbaa !9
  %943 = icmp sle i32 %942, 0
  br i1 %943, label %944, label %945

944:                                              ; preds = %939
  store i32 1, ptr %68, align 4, !tbaa !9
  br label %945

945:                                              ; preds = %944, %939
  store i32 1, ptr %69, align 4, !tbaa !9
  %946 = load i64, ptr %13, align 8, !tbaa !12
  %947 = icmp ugt i64 %946, 0
  br i1 %947, label %948, label %963

948:                                              ; preds = %945
  call void @llvm.lifetime.start.p0(i64 8, ptr %70) #11
  store i64 4194304, ptr %70, align 8, !tbaa !12
  %949 = load i64, ptr %13, align 8, !tbaa !12
  %950 = load i64, ptr %70, align 8, !tbaa !12
  %951 = udiv i64 %949, %950
  %952 = trunc i64 %951 to i32
  store i32 %952, ptr %69, align 4, !tbaa !9
  %953 = load i32, ptr %69, align 4, !tbaa !9
  %954 = load i32, ptr %68, align 4, !tbaa !9
  %955 = icmp sgt i32 %953, %954
  br i1 %955, label %956, label %958

956:                                              ; preds = %948
  %957 = load i32, ptr %68, align 4, !tbaa !9
  store i32 %957, ptr %69, align 4, !tbaa !9
  br label %958

958:                                              ; preds = %956, %948
  %959 = load i32, ptr %69, align 4, !tbaa !9
  %960 = icmp slt i32 %959, 1
  br i1 %960, label %961, label %962

961:                                              ; preds = %958
  store i32 1, ptr %69, align 4, !tbaa !9
  br label %962

962:                                              ; preds = %961, %958
  call void @llvm.lifetime.end.p0(i64 8, ptr %70) #11
  br label %963

963:                                              ; preds = %962, %945
  %964 = load i32, ptr %69, align 4, !tbaa !9
  call void @init_global_thread_pool(i32 noundef %964)
  call void @llvm.lifetime.start.p0(i64 4, ptr %71) #11
  store i32 0, ptr %71, align 4, !tbaa !9
  br label %965

965:                                              ; preds = %1143, %963
  %966 = load i32, ptr %71, align 4, !tbaa !9
  %967 = load i32, ptr %20, align 4, !tbaa !9
  %968 = icmp slt i32 %966, %967
  br i1 %968, label %970, label %969

969:                                              ; preds = %965
  store i32 23, ptr %24, align 4
  br label %1146

970:                                              ; preds = %965
  %971 = load i64, ptr %64, align 8, !tbaa !12
  %972 = load i64, ptr %13, align 8, !tbaa !12
  %973 = icmp uge i64 %971, %972
  br i1 %973, label %974, label %976

974:                                              ; preds = %970
  %975 = load i32, ptr %71, align 4, !tbaa !9
  store i32 %975, ptr %20, align 4, !tbaa !9
  store i32 23, ptr %24, align 4
  br label %1146

976:                                              ; preds = %970
  %977 = load i32, ptr %71, align 4, !tbaa !9
  %978 = load ptr, ptr %17, align 8, !tbaa !5
  %979 = load i32, ptr %71, align 4, !tbaa !9
  %980 = sext i32 %979 to i64
  %981 = getelementptr inbounds %struct.thread_data_t, ptr %978, i64 %980
  %982 = getelementptr inbounds %struct.thread_data_t, ptr %981, i32 0, i32 0
  store i32 %977, ptr %982, align 8, !tbaa !46
  %983 = load ptr, ptr %17, align 8, !tbaa !5
  %984 = load i32, ptr %71, align 4, !tbaa !9
  %985 = sext i32 %984 to i64
  %986 = getelementptr inbounds %struct.thread_data_t, ptr %983, i64 %985
  %987 = getelementptr inbounds %struct.thread_data_t, ptr %986, i32 0, i32 1
  store ptr %8, ptr %987, align 8, !tbaa !48
  %988 = load ptr, ptr %14, align 8, !tbaa !5
  %989 = load i64, ptr %64, align 8, !tbaa !12
  %990 = getelementptr inbounds i8, ptr %988, i64 %989
  %991 = load ptr, ptr %17, align 8, !tbaa !5
  %992 = load i32, ptr %71, align 4, !tbaa !9
  %993 = sext i32 %992 to i64
  %994 = getelementptr inbounds %struct.thread_data_t, ptr %991, i64 %993
  %995 = getelementptr inbounds %struct.thread_data_t, ptr %994, i32 0, i32 2
  store ptr %990, ptr %995, align 8, !tbaa !49
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #11
  %996 = load i64, ptr %64, align 8, !tbaa !12
  %997 = load i64, ptr %63, align 8, !tbaa !12
  %998 = add i64 %996, %997
  %999 = load i64, ptr %13, align 8, !tbaa !12
  %1000 = icmp ugt i64 %998, %999
  br i1 %1000, label %1001, label %1005

1001:                                             ; preds = %976
  %1002 = load i64, ptr %13, align 8, !tbaa !12
  %1003 = load i64, ptr %64, align 8, !tbaa !12
  %1004 = sub i64 %1002, %1003
  br label %1007

1005:                                             ; preds = %976
  %1006 = load i64, ptr %63, align 8, !tbaa !12
  br label %1007

1007:                                             ; preds = %1005, %1001
  %1008 = phi i64 [ %1004, %1001 ], [ %1006, %1005 ]
  store i64 %1008, ptr %72, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #11
  %1009 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %1010 = load i8, ptr %1009, align 1, !tbaa !18, !range !19, !noundef !20
  %1011 = trunc i8 %1010 to i1
  br i1 %1011, label %1023, label %1012

1012:                                             ; preds = %1007
  %1013 = load i64, ptr %66, align 8, !tbaa !12
  %1014 = icmp ugt i64 %1013, 0
  br i1 %1014, label %1015, label %1023

1015:                                             ; preds = %1012
  %1016 = load i32, ptr %71, align 4, !tbaa !9
  %1017 = load i32, ptr %20, align 4, !tbaa !9
  %1018 = sub nsw i32 %1017, 1
  %1019 = icmp slt i32 %1016, %1018
  br i1 %1019, label %1020, label %1023

1020:                                             ; preds = %1015
  %1021 = load i64, ptr %66, align 8, !tbaa !12
  %1022 = sub i64 %1021, 1
  br label %1024

1023:                                             ; preds = %1015, %1012, %1007
  br label %1024

1024:                                             ; preds = %1023, %1020
  %1025 = phi i64 [ %1022, %1020 ], [ 0, %1023 ]
  store i64 %1025, ptr %73, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #11
  %1026 = load i64, ptr %64, align 8, !tbaa !12
  %1027 = load i64, ptr %72, align 8, !tbaa !12
  %1028 = add i64 %1026, %1027
  %1029 = load i64, ptr %73, align 8, !tbaa !12
  %1030 = add i64 %1028, %1029
  %1031 = load i64, ptr %13, align 8, !tbaa !12
  %1032 = icmp ugt i64 %1030, %1031
  br i1 %1032, label %1033, label %1037

1033:                                             ; preds = %1024
  %1034 = load i64, ptr %13, align 8, !tbaa !12
  %1035 = load i64, ptr %64, align 8, !tbaa !12
  %1036 = sub i64 %1034, %1035
  br label %1041

1037:                                             ; preds = %1024
  %1038 = load i64, ptr %72, align 8, !tbaa !12
  %1039 = load i64, ptr %73, align 8, !tbaa !12
  %1040 = add i64 %1038, %1039
  br label %1041

1041:                                             ; preds = %1037, %1033
  %1042 = phi i64 [ %1036, %1033 ], [ %1040, %1037 ]
  store i64 %1042, ptr %74, align 8, !tbaa !12
  %1043 = load i64, ptr %74, align 8, !tbaa !12
  %1044 = icmp eq i64 %1043, 0
  br i1 %1044, label %1045, label %1053

1045:                                             ; preds = %1041
  %1046 = load i64, ptr %64, align 8, !tbaa !12
  %1047 = load i64, ptr %13, align 8, !tbaa !12
  %1048 = icmp ult i64 %1046, %1047
  br i1 %1048, label %1049, label %1053

1049:                                             ; preds = %1045
  %1050 = load i64, ptr %13, align 8, !tbaa !12
  %1051 = load i64, ptr %64, align 8, !tbaa !12
  %1052 = sub i64 %1050, %1051
  store i64 %1052, ptr %74, align 8, !tbaa !12
  br label %1053

1053:                                             ; preds = %1049, %1045, %1041
  %1054 = load i64, ptr %74, align 8, !tbaa !12
  %1055 = load ptr, ptr %17, align 8, !tbaa !5
  %1056 = load i32, ptr %71, align 4, !tbaa !9
  %1057 = sext i32 %1056 to i64
  %1058 = getelementptr inbounds %struct.thread_data_t, ptr %1055, i64 %1057
  %1059 = getelementptr inbounds %struct.thread_data_t, ptr %1058, i32 0, i32 3
  store i64 %1054, ptr %1059, align 8, !tbaa !50
  %1060 = load ptr, ptr %17, align 8, !tbaa !5
  %1061 = load i32, ptr %71, align 4, !tbaa !9
  %1062 = sext i32 %1061 to i64
  %1063 = getelementptr inbounds %struct.thread_data_t, ptr %1060, i64 %1062
  %1064 = getelementptr inbounds %struct.thread_data_t, ptr %1063, i32 0, i32 4
  store ptr null, ptr %1064, align 8, !tbaa !51
  %1065 = load ptr, ptr %17, align 8, !tbaa !5
  %1066 = load i32, ptr %71, align 4, !tbaa !9
  %1067 = sext i32 %1066 to i64
  %1068 = getelementptr inbounds %struct.thread_data_t, ptr %1065, i64 %1067
  %1069 = getelementptr inbounds %struct.thread_data_t, ptr %1068, i32 0, i32 5
  store i64 0, ptr %1069, align 8, !tbaa !52
  %1070 = load ptr, ptr %17, align 8, !tbaa !5
  %1071 = load i32, ptr %71, align 4, !tbaa !9
  %1072 = sext i32 %1071 to i64
  %1073 = getelementptr inbounds %struct.thread_data_t, ptr %1070, i64 %1072
  %1074 = getelementptr inbounds %struct.thread_data_t, ptr %1073, i32 0, i32 6
  store i8 0, ptr %1074, align 8, !tbaa !53
  %1075 = load i64, ptr %74, align 8, !tbaa !12
  %1076 = icmp ugt i64 %1075, 0
  br i1 %1076, label %1077, label %1131

1077:                                             ; preds = %1053
  %1078 = load ptr, ptr @global_thread_pool, align 8, !tbaa !5
  %1079 = icmp ne ptr %1078, null
  br i1 %1079, label %1080, label %1097

1080:                                             ; preds = %1077
  %1081 = load ptr, ptr @global_thread_pool, align 8, !tbaa !5
  %1082 = load ptr, ptr %17, align 8, !tbaa !5
  %1083 = load i32, ptr %71, align 4, !tbaa !9
  %1084 = sext i32 %1083 to i64
  %1085 = getelementptr inbounds %struct.thread_data_t, ptr %1082, i64 %1084
  %1086 = call zeroext i1 @thread_pool_submit(ptr noundef %1081, ptr noundef @search_chunk_thread, ptr noundef %1085)
  br i1 %1086, label %1096, label %1087

1087:                                             ; preds = %1080
  %1088 = load ptr, ptr @stderr, align 8, !tbaa !5
  %1089 = load i32, ptr %71, align 4, !tbaa !9
  %1090 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1088, ptr noundef @.str.118, i32 noundef %1089) #11
  %1091 = load ptr, ptr %17, align 8, !tbaa !5
  %1092 = load i32, ptr %71, align 4, !tbaa !9
  %1093 = sext i32 %1092 to i64
  %1094 = getelementptr inbounds %struct.thread_data_t, ptr %1091, i64 %1093
  %1095 = getelementptr inbounds %struct.thread_data_t, ptr %1094, i32 0, i32 6
  store i8 1, ptr %1095, align 8, !tbaa !53
  br label %1096

1096:                                             ; preds = %1087, %1080
  br label %1128

1097:                                             ; preds = %1077
  call void @llvm.lifetime.start.p0(i64 4, ptr %75) #11
  %1098 = load ptr, ptr %16, align 8, !tbaa !5
  %1099 = load i32, ptr %71, align 4, !tbaa !9
  %1100 = sext i32 %1099 to i64
  %1101 = getelementptr inbounds i64, ptr %1098, i64 %1100
  %1102 = load ptr, ptr %17, align 8, !tbaa !5
  %1103 = load i32, ptr %71, align 4, !tbaa !9
  %1104 = sext i32 %1103 to i64
  %1105 = getelementptr inbounds %struct.thread_data_t, ptr %1102, i64 %1104
  %1106 = call i32 @pthread_create(ptr noundef %1101, ptr noundef null, ptr noundef @search_chunk_thread, ptr noundef %1105) #11
  store i32 %1106, ptr %75, align 4, !tbaa !9
  %1107 = load i32, ptr %75, align 4, !tbaa !9
  %1108 = icmp ne i32 %1107, 0
  br i1 %1108, label %1109, label %1124

1109:                                             ; preds = %1097
  %1110 = load ptr, ptr @stderr, align 8, !tbaa !5
  %1111 = load i32, ptr %71, align 4, !tbaa !9
  %1112 = load i32, ptr %75, align 4, !tbaa !9
  %1113 = call ptr @strerror(i32 noundef %1112) #11
  %1114 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1110, ptr noundef @.str.119, i32 noundef %1111, ptr noundef %1113) #11
  %1115 = load ptr, ptr %16, align 8, !tbaa !5
  %1116 = load i32, ptr %71, align 4, !tbaa !9
  %1117 = sext i32 %1116 to i64
  %1118 = getelementptr inbounds i64, ptr %1115, i64 %1117
  store i64 0, ptr %1118, align 8, !tbaa !12
  %1119 = load ptr, ptr %17, align 8, !tbaa !5
  %1120 = load i32, ptr %71, align 4, !tbaa !9
  %1121 = sext i32 %1120 to i64
  %1122 = getelementptr inbounds %struct.thread_data_t, ptr %1119, i64 %1121
  %1123 = getelementptr inbounds %struct.thread_data_t, ptr %1122, i32 0, i32 6
  store i8 1, ptr %1123, align 8, !tbaa !53
  store i32 25, ptr %24, align 4
  br label %1125

1124:                                             ; preds = %1097
  store i32 0, ptr %24, align 4
  br label %1125

1125:                                             ; preds = %1124, %1109
  call void @llvm.lifetime.end.p0(i64 4, ptr %75) #11
  %1126 = load i32, ptr %24, align 4
  switch i32 %1126, label %1140 [
    i32 0, label %1127
  ]

1127:                                             ; preds = %1125
  br label %1128

1128:                                             ; preds = %1127, %1096
  %1129 = load i32, ptr %65, align 4, !tbaa !9
  %1130 = add nsw i32 %1129, 1
  store i32 %1130, ptr %65, align 4, !tbaa !9
  br label %1136

1131:                                             ; preds = %1053
  %1132 = load ptr, ptr %16, align 8, !tbaa !5
  %1133 = load i32, ptr %71, align 4, !tbaa !9
  %1134 = sext i32 %1133 to i64
  %1135 = getelementptr inbounds i64, ptr %1132, i64 %1134
  store i64 0, ptr %1135, align 8, !tbaa !12
  br label %1136

1136:                                             ; preds = %1131, %1128
  %1137 = load i64, ptr %72, align 8, !tbaa !12
  %1138 = load i64, ptr %64, align 8, !tbaa !12
  %1139 = add i64 %1138, %1137
  store i64 %1139, ptr %64, align 8, !tbaa !12
  store i32 0, ptr %24, align 4
  br label %1140

1140:                                             ; preds = %1136, %1125
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #11
  %1141 = load i32, ptr %24, align 4
  switch i32 %1141, label %1486 [
    i32 0, label %1142
    i32 25, label %1143
  ]

1142:                                             ; preds = %1140
  br label %1143

1143:                                             ; preds = %1142, %1140
  %1144 = load i32, ptr %71, align 4, !tbaa !9
  %1145 = add nsw i32 %1144, 1
  store i32 %1145, ptr %71, align 4, !tbaa !9
  br label %965, !llvm.loop !54

1146:                                             ; preds = %974, %969
  call void @llvm.lifetime.end.p0(i64 4, ptr %71) #11
  br label %1147

1147:                                             ; preds = %1146
  %1148 = load i32, ptr %65, align 4, !tbaa !9
  store i32 %1148, ptr %20, align 4, !tbaa !9
  %1149 = load ptr, ptr @global_thread_pool, align 8, !tbaa !5
  %1150 = icmp ne ptr %1149, null
  br i1 %1150, label %1151, label %1153

1151:                                             ; preds = %1147
  %1152 = load ptr, ptr @global_thread_pool, align 8, !tbaa !5
  call void @thread_pool_wait_all(ptr noundef %1152)
  br label %1153

1153:                                             ; preds = %1151, %1147
  store i8 0, ptr %76, align 1, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %77) #11
  store i32 0, ptr %77, align 4, !tbaa !9
  br label %1154

1154:                                             ; preds = %1380, %1153
  %1155 = load i32, ptr %77, align 4, !tbaa !9
  %1156 = load i32, ptr %20, align 4, !tbaa !9
  %1157 = icmp slt i32 %1155, %1156
  br i1 %1157, label %1159, label %1158

1158:                                             ; preds = %1154
  store i32 26, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %77) #11
  br label %1383

1159:                                             ; preds = %1154
  %1160 = load ptr, ptr @global_thread_pool, align 8, !tbaa !5
  %1161 = icmp ne ptr %1160, null
  br i1 %1161, label %1185, label %1162

1162:                                             ; preds = %1159
  %1163 = load ptr, ptr %16, align 8, !tbaa !5
  %1164 = load i32, ptr %77, align 4, !tbaa !9
  %1165 = sext i32 %1164 to i64
  %1166 = getelementptr inbounds i64, ptr %1163, i64 %1165
  %1167 = load i64, ptr %1166, align 8, !tbaa !12
  %1168 = icmp ne i64 %1167, 0
  br i1 %1168, label %1169, label %1185

1169:                                             ; preds = %1162
  call void @llvm.lifetime.start.p0(i64 4, ptr %78) #11
  %1170 = load ptr, ptr %16, align 8, !tbaa !5
  %1171 = load i32, ptr %77, align 4, !tbaa !9
  %1172 = sext i32 %1171 to i64
  %1173 = getelementptr inbounds i64, ptr %1170, i64 %1172
  %1174 = load i64, ptr %1173, align 8, !tbaa !12
  %1175 = call i32 @pthread_join(i64 noundef %1174, ptr noundef null)
  store i32 %1175, ptr %78, align 4, !tbaa !9
  %1176 = load i32, ptr %78, align 4, !tbaa !9
  %1177 = icmp ne i32 %1176, 0
  br i1 %1177, label %1178, label %1184

1178:                                             ; preds = %1169
  %1179 = load ptr, ptr @stderr, align 8, !tbaa !5
  %1180 = load i32, ptr %77, align 4, !tbaa !9
  %1181 = load i32, ptr %78, align 4, !tbaa !9
  %1182 = call ptr @strerror(i32 noundef %1181) #11
  %1183 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1179, ptr noundef @.str.120, i32 noundef %1180, ptr noundef %1182) #11
  store i32 2, ptr %10, align 4, !tbaa !9
  br label %1184

1184:                                             ; preds = %1178, %1169
  call void @llvm.lifetime.end.p0(i64 4, ptr %78) #11
  br label %1185

1185:                                             ; preds = %1184, %1162, %1159
  %1186 = load ptr, ptr %17, align 8, !tbaa !5
  %1187 = load i32, ptr %77, align 4, !tbaa !9
  %1188 = sext i32 %1187 to i64
  %1189 = getelementptr inbounds %struct.thread_data_t, ptr %1186, i64 %1188
  %1190 = getelementptr inbounds %struct.thread_data_t, ptr %1189, i32 0, i32 6
  %1191 = load i8, ptr %1190, align 8, !tbaa !53, !range !19, !noundef !20
  %1192 = trunc i8 %1191 to i1
  br i1 %1192, label %1193, label %1194

1193:                                             ; preds = %1185
  store i32 2, ptr %10, align 4, !tbaa !9
  br label %1194

1194:                                             ; preds = %1193, %1185
  %1195 = load i32, ptr %10, align 4, !tbaa !9
  %1196 = icmp ne i32 %1195, 2
  br i1 %1196, label %1197, label %1379

1197:                                             ; preds = %1194
  %1198 = load i8, ptr %76, align 1, !tbaa !14, !range !19, !noundef !20
  %1199 = trunc i8 %1198 to i1
  br i1 %1199, label %1379, label %1200

1200:                                             ; preds = %1197
  call void @llvm.lifetime.start.p0(i64 8, ptr %79) #11
  %1201 = load ptr, ptr %17, align 8, !tbaa !5
  %1202 = load i32, ptr %77, align 4, !tbaa !9
  %1203 = sext i32 %1202 to i64
  %1204 = getelementptr inbounds %struct.thread_data_t, ptr %1201, i64 %1203
  %1205 = getelementptr inbounds %struct.thread_data_t, ptr %1204, i32 0, i32 5
  %1206 = load i64, ptr %1205, align 8, !tbaa !52
  store i64 %1206, ptr %79, align 8, !tbaa !12
  %1207 = load i64, ptr %22, align 8, !tbaa !12
  %1208 = icmp ne i64 %1207, -1
  br i1 %1208, label %1209, label %1226

1209:                                             ; preds = %1200
  call void @llvm.lifetime.start.p0(i64 8, ptr %80) #11
  %1210 = load i64, ptr %21, align 8, !tbaa !12
  %1211 = load i64, ptr %22, align 8, !tbaa !12
  %1212 = icmp uge i64 %1210, %1211
  br i1 %1212, label %1213, label %1214

1213:                                             ; preds = %1209
  br label %1218

1214:                                             ; preds = %1209
  %1215 = load i64, ptr %22, align 8, !tbaa !12
  %1216 = load i64, ptr %21, align 8, !tbaa !12
  %1217 = sub i64 %1215, %1216
  br label %1218

1218:                                             ; preds = %1214, %1213
  %1219 = phi i64 [ 0, %1213 ], [ %1217, %1214 ]
  store i64 %1219, ptr %80, align 8, !tbaa !12
  %1220 = load i64, ptr %79, align 8, !tbaa !12
  %1221 = load i64, ptr %80, align 8, !tbaa !12
  %1222 = icmp ugt i64 %1220, %1221
  br i1 %1222, label %1223, label %1225

1223:                                             ; preds = %1218
  %1224 = load i64, ptr %80, align 8, !tbaa !12
  store i64 %1224, ptr %79, align 8, !tbaa !12
  br label %1225

1225:                                             ; preds = %1223, %1218
  call void @llvm.lifetime.end.p0(i64 8, ptr %80) #11
  br label %1226

1226:                                             ; preds = %1225, %1200
  %1227 = load i64, ptr %79, align 8, !tbaa !12
  %1228 = load i64, ptr %21, align 8, !tbaa !12
  %1229 = add i64 %1228, %1227
  store i64 %1229, ptr %21, align 8, !tbaa !12
  %1230 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 9
  %1231 = load i8, ptr %1230, align 4, !tbaa !44, !range !19, !noundef !20
  %1232 = trunc i8 %1231 to i1
  br i1 %1232, label %1233, label %1353

1233:                                             ; preds = %1226
  %1234 = load ptr, ptr %15, align 8, !tbaa !5
  %1235 = icmp ne ptr %1234, null
  br i1 %1235, label %1236, label %1353

1236:                                             ; preds = %1233
  %1237 = load ptr, ptr %17, align 8, !tbaa !5
  %1238 = load i32, ptr %77, align 4, !tbaa !9
  %1239 = sext i32 %1238 to i64
  %1240 = getelementptr inbounds %struct.thread_data_t, ptr %1237, i64 %1239
  %1241 = getelementptr inbounds %struct.thread_data_t, ptr %1240, i32 0, i32 4
  %1242 = load ptr, ptr %1241, align 8, !tbaa !51
  %1243 = icmp ne ptr %1242, null
  br i1 %1243, label %1244, label %1353

1244:                                             ; preds = %1236
  %1245 = load i64, ptr %22, align 8, !tbaa !12
  %1246 = icmp eq i64 %1245, -1
  br i1 %1246, label %1253, label %1247

1247:                                             ; preds = %1244
  %1248 = load ptr, ptr %15, align 8, !tbaa !5
  %1249 = getelementptr inbounds %struct.match_result_t, ptr %1248, i32 0, i32 1
  %1250 = load i64, ptr %1249, align 8, !tbaa !55
  %1251 = load i64, ptr %22, align 8, !tbaa !12
  %1252 = icmp ult i64 %1250, %1251
  br i1 %1252, label %1253, label %1341

1253:                                             ; preds = %1247, %1244
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #11
  %1254 = load i64, ptr %22, align 8, !tbaa !12
  %1255 = icmp eq i64 %1254, -1
  br i1 %1255, label %1256, label %1257

1256:                                             ; preds = %1253
  br label %1263

1257:                                             ; preds = %1253
  %1258 = load i64, ptr %22, align 8, !tbaa !12
  %1259 = load ptr, ptr %15, align 8, !tbaa !5
  %1260 = getelementptr inbounds %struct.match_result_t, ptr %1259, i32 0, i32 1
  %1261 = load i64, ptr %1260, align 8, !tbaa !55
  %1262 = sub i64 %1258, %1261
  br label %1263

1263:                                             ; preds = %1257, %1256
  %1264 = phi i64 [ -1, %1256 ], [ %1262, %1257 ]
  store i64 %1264, ptr %81, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #11
  store i64 0, ptr %82, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #11
  store i64 0, ptr %83, align 8, !tbaa !12
  br label %1265

1265:                                             ; preds = %1336, %1263
  %1266 = load i64, ptr %83, align 8, !tbaa !12
  %1267 = load ptr, ptr %17, align 8, !tbaa !5
  %1268 = load i32, ptr %77, align 4, !tbaa !9
  %1269 = sext i32 %1268 to i64
  %1270 = getelementptr inbounds %struct.thread_data_t, ptr %1267, i64 %1269
  %1271 = getelementptr inbounds %struct.thread_data_t, ptr %1270, i32 0, i32 4
  %1272 = load ptr, ptr %1271, align 8, !tbaa !51
  %1273 = getelementptr inbounds %struct.match_result_t, ptr %1272, i32 0, i32 1
  %1274 = load i64, ptr %1273, align 8, !tbaa !55
  %1275 = icmp ult i64 %1266, %1274
  br i1 %1275, label %1276, label %1280

1276:                                             ; preds = %1265
  %1277 = load i64, ptr %82, align 8, !tbaa !12
  %1278 = load i64, ptr %81, align 8, !tbaa !12
  %1279 = icmp ult i64 %1277, %1278
  br label %1280

1280:                                             ; preds = %1276, %1265
  %1281 = phi i1 [ false, %1265 ], [ %1279, %1276 ]
  br i1 %1281, label %1283, label %1282

1282:                                             ; preds = %1280
  store i32 29, ptr %24, align 4
  br label %1339

1283:                                             ; preds = %1280
  call void @llvm.lifetime.start.p0(i64 8, ptr %84) #11
  %1284 = load ptr, ptr %17, align 8, !tbaa !5
  %1285 = load i32, ptr %77, align 4, !tbaa !9
  %1286 = sext i32 %1285 to i64
  %1287 = getelementptr inbounds %struct.thread_data_t, ptr %1284, i64 %1286
  %1288 = getelementptr inbounds %struct.thread_data_t, ptr %1287, i32 0, i32 2
  %1289 = load ptr, ptr %1288, align 8, !tbaa !49
  %1290 = load ptr, ptr %14, align 8, !tbaa !5
  %1291 = ptrtoint ptr %1289 to i64
  %1292 = ptrtoint ptr %1290 to i64
  %1293 = sub i64 %1291, %1292
  store i64 %1293, ptr %84, align 8, !tbaa !12
  %1294 = load ptr, ptr %15, align 8, !tbaa !5
  %1295 = load ptr, ptr %17, align 8, !tbaa !5
  %1296 = load i32, ptr %77, align 4, !tbaa !9
  %1297 = sext i32 %1296 to i64
  %1298 = getelementptr inbounds %struct.thread_data_t, ptr %1295, i64 %1297
  %1299 = getelementptr inbounds %struct.thread_data_t, ptr %1298, i32 0, i32 4
  %1300 = load ptr, ptr %1299, align 8, !tbaa !51
  %1301 = getelementptr inbounds %struct.match_result_t, ptr %1300, i32 0, i32 0
  %1302 = load ptr, ptr %1301, align 8, !tbaa !57
  %1303 = load i64, ptr %83, align 8, !tbaa !12
  %1304 = getelementptr inbounds %struct.match_position_t, ptr %1302, i64 %1303
  %1305 = getelementptr inbounds %struct.match_position_t, ptr %1304, i32 0, i32 0
  %1306 = load i64, ptr %1305, align 8, !tbaa !58
  %1307 = load i64, ptr %84, align 8, !tbaa !12
  %1308 = add i64 %1306, %1307
  %1309 = load ptr, ptr %17, align 8, !tbaa !5
  %1310 = load i32, ptr %77, align 4, !tbaa !9
  %1311 = sext i32 %1310 to i64
  %1312 = getelementptr inbounds %struct.thread_data_t, ptr %1309, i64 %1311
  %1313 = getelementptr inbounds %struct.thread_data_t, ptr %1312, i32 0, i32 4
  %1314 = load ptr, ptr %1313, align 8, !tbaa !51
  %1315 = getelementptr inbounds %struct.match_result_t, ptr %1314, i32 0, i32 0
  %1316 = load ptr, ptr %1315, align 8, !tbaa !57
  %1317 = load i64, ptr %83, align 8, !tbaa !12
  %1318 = getelementptr inbounds %struct.match_position_t, ptr %1316, i64 %1317
  %1319 = getelementptr inbounds %struct.match_position_t, ptr %1318, i32 0, i32 1
  %1320 = load i64, ptr %1319, align 8, !tbaa !60
  %1321 = load i64, ptr %84, align 8, !tbaa !12
  %1322 = add i64 %1320, %1321
  %1323 = call zeroext i1 @match_result_add(ptr noundef %1294, i64 noundef %1308, i64 noundef %1322)
  br i1 %1323, label %1324, label %1327

1324:                                             ; preds = %1283
  %1325 = load i64, ptr %82, align 8, !tbaa !12
  %1326 = add i64 %1325, 1
  store i64 %1326, ptr %82, align 8, !tbaa !12
  br label %1332

1327:                                             ; preds = %1283
  %1328 = load ptr, ptr @stderr, align 8, !tbaa !5
  %1329 = load ptr, ptr %6, align 8, !tbaa !5
  %1330 = load i32, ptr %77, align 4, !tbaa !9
  %1331 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %1328, ptr noundef @.str.121, ptr noundef %1329, i32 noundef %1330) #11
  store i8 1, ptr %76, align 1, !tbaa !14
  store i32 29, ptr %24, align 4
  br label %1333

1332:                                             ; preds = %1324
  store i32 0, ptr %24, align 4
  br label %1333

1333:                                             ; preds = %1332, %1327
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #11
  %1334 = load i32, ptr %24, align 4
  switch i32 %1334, label %1339 [
    i32 0, label %1335
  ]

1335:                                             ; preds = %1333
  br label %1336

1336:                                             ; preds = %1335
  %1337 = load i64, ptr %83, align 8, !tbaa !12
  %1338 = add i64 %1337, 1
  store i64 %1338, ptr %83, align 8, !tbaa !12
  br label %1265, !llvm.loop !61

1339:                                             ; preds = %1333, %1282
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #11
  br label %1340

1340:                                             ; preds = %1339
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #11
  br label %1341

1341:                                             ; preds = %1340, %1247
  %1342 = load ptr, ptr %17, align 8, !tbaa !5
  %1343 = load i32, ptr %77, align 4, !tbaa !9
  %1344 = sext i32 %1343 to i64
  %1345 = getelementptr inbounds %struct.thread_data_t, ptr %1342, i64 %1344
  %1346 = getelementptr inbounds %struct.thread_data_t, ptr %1345, i32 0, i32 4
  %1347 = load ptr, ptr %1346, align 8, !tbaa !51
  call void @match_result_free(ptr noundef %1347)
  %1348 = load ptr, ptr %17, align 8, !tbaa !5
  %1349 = load i32, ptr %77, align 4, !tbaa !9
  %1350 = sext i32 %1349 to i64
  %1351 = getelementptr inbounds %struct.thread_data_t, ptr %1348, i64 %1350
  %1352 = getelementptr inbounds %struct.thread_data_t, ptr %1351, i32 0, i32 4
  store ptr null, ptr %1352, align 8, !tbaa !51
  br label %1374

1353:                                             ; preds = %1236, %1233, %1226
  %1354 = load ptr, ptr %17, align 8, !tbaa !5
  %1355 = load i32, ptr %77, align 4, !tbaa !9
  %1356 = sext i32 %1355 to i64
  %1357 = getelementptr inbounds %struct.thread_data_t, ptr %1354, i64 %1356
  %1358 = getelementptr inbounds %struct.thread_data_t, ptr %1357, i32 0, i32 4
  %1359 = load ptr, ptr %1358, align 8, !tbaa !51
  %1360 = icmp ne ptr %1359, null
  br i1 %1360, label %1361, label %1373

1361:                                             ; preds = %1353
  %1362 = load ptr, ptr %17, align 8, !tbaa !5
  %1363 = load i32, ptr %77, align 4, !tbaa !9
  %1364 = sext i32 %1363 to i64
  %1365 = getelementptr inbounds %struct.thread_data_t, ptr %1362, i64 %1364
  %1366 = getelementptr inbounds %struct.thread_data_t, ptr %1365, i32 0, i32 4
  %1367 = load ptr, ptr %1366, align 8, !tbaa !51
  call void @match_result_free(ptr noundef %1367)
  %1368 = load ptr, ptr %17, align 8, !tbaa !5
  %1369 = load i32, ptr %77, align 4, !tbaa !9
  %1370 = sext i32 %1369 to i64
  %1371 = getelementptr inbounds %struct.thread_data_t, ptr %1368, i64 %1370
  %1372 = getelementptr inbounds %struct.thread_data_t, ptr %1371, i32 0, i32 4
  store ptr null, ptr %1372, align 8, !tbaa !51
  br label %1373

1373:                                             ; preds = %1361, %1353
  br label %1374

1374:                                             ; preds = %1373, %1341
  %1375 = load i8, ptr %76, align 1, !tbaa !14, !range !19, !noundef !20
  %1376 = trunc i8 %1375 to i1
  br i1 %1376, label %1377, label %1378

1377:                                             ; preds = %1374
  store i32 2, ptr %10, align 4, !tbaa !9
  br label %1378

1378:                                             ; preds = %1377, %1374
  call void @llvm.lifetime.end.p0(i64 8, ptr %79) #11
  br label %1379

1379:                                             ; preds = %1378, %1197, %1194
  br label %1380

1380:                                             ; preds = %1379
  %1381 = load i32, ptr %77, align 4, !tbaa !9
  %1382 = add nsw i32 %1381, 1
  store i32 %1382, ptr %77, align 4, !tbaa !9
  br label %1154, !llvm.loop !62

1383:                                             ; preds = %1158
  %1384 = load i32, ptr %10, align 4, !tbaa !9
  %1385 = icmp ne i32 %1384, 2
  br i1 %1385, label %1386, label %1449

1386:                                             ; preds = %1383
  %1387 = load i64, ptr %21, align 8, !tbaa !12
  %1388 = icmp ugt i64 %1387, 0
  %1389 = zext i1 %1388 to i64
  %1390 = select i1 %1388, i32 0, i32 1
  store i32 %1390, ptr %10, align 4, !tbaa !9
  %1391 = load i32, ptr %10, align 4, !tbaa !9
  %1392 = icmp eq i32 %1391, 0
  br i1 %1392, label %1393, label %1395

1393:                                             ; preds = %1386
  store i8 1, ptr %85, align 1, !tbaa !14
  %1394 = load i8, ptr %85, align 1
  store atomic i8 %1394, ptr @global_match_found_flag seq_cst, align 1
  br label %1395

1395:                                             ; preds = %1393, %1386
  %1396 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 7
  %1397 = load i8, ptr %1396, align 2, !tbaa !38, !range !19, !noundef !20
  %1398 = trunc i8 %1397 to i1
  br i1 %1398, label %1403, label %1399

1399:                                             ; preds = %1395
  %1400 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 8
  %1401 = load i8, ptr %1400, align 1, !tbaa !39, !range !19, !noundef !20
  %1402 = trunc i8 %1401 to i1
  br i1 %1402, label %1403, label %1407

1403:                                             ; preds = %1399, %1395
  %1404 = load ptr, ptr %6, align 8, !tbaa !5
  %1405 = load i64, ptr %21, align 8, !tbaa !12
  %1406 = call i32 (ptr, ...) @printf(ptr noundef @.str.122, ptr noundef %1404, i64 noundef %1405)
  br label %1448

1407:                                             ; preds = %1399
  %1408 = load i32, ptr %10, align 4, !tbaa !9
  %1409 = icmp eq i32 %1408, 0
  br i1 %1409, label %1410, label %1425

1410:                                             ; preds = %1407
  %1411 = load ptr, ptr %15, align 8, !tbaa !5
  %1412 = icmp ne ptr %1411, null
  br i1 %1412, label %1413, label %1425

1413:                                             ; preds = %1410
  %1414 = load ptr, ptr %15, align 8, !tbaa !5
  %1415 = getelementptr inbounds %struct.match_result_t, ptr %1414, i32 0, i32 0
  %1416 = load ptr, ptr %1415, align 8, !tbaa !57
  %1417 = load ptr, ptr %15, align 8, !tbaa !5
  %1418 = getelementptr inbounds %struct.match_result_t, ptr %1417, i32 0, i32 1
  %1419 = load i64, ptr %1418, align 8, !tbaa !55
  call void @qsort(ptr noundef %1416, i64 noundef %1419, i64 noundef 16, ptr noundef @compare_match_positions)
  %1420 = load ptr, ptr %6, align 8, !tbaa !5
  %1421 = load ptr, ptr %14, align 8, !tbaa !5
  %1422 = load i64, ptr %13, align 8, !tbaa !12
  %1423 = load ptr, ptr %15, align 8, !tbaa !5
  %1424 = call i64 @print_matching_items(ptr noundef %1420, ptr noundef %1421, i64 noundef %1422, ptr noundef %1423, ptr noundef %8)
  br label %1447

1425:                                             ; preds = %1410, %1407
  %1426 = load i32, ptr %10, align 4, !tbaa !9
  %1427 = icmp eq i32 %1426, 0
  br i1 %1427, label %1428, label %1446

1428:                                             ; preds = %1425
  %1429 = load ptr, ptr %15, align 8, !tbaa !5
  %1430 = icmp ne ptr %1429, null
  br i1 %1430, label %1431, label %1436

1431:                                             ; preds = %1428
  %1432 = load ptr, ptr %15, align 8, !tbaa !5
  %1433 = getelementptr inbounds %struct.match_result_t, ptr %1432, i32 0, i32 1
  %1434 = load i64, ptr %1433, align 8, !tbaa !55
  %1435 = icmp eq i64 %1434, 0
  br i1 %1435, label %1436, label %1446

1436:                                             ; preds = %1431, %1428
  %1437 = load i8, ptr @only_matching, align 1, !tbaa !14, !range !19, !noundef !20
  %1438 = trunc i8 %1437 to i1
  br i1 %1438, label %1439, label %1442

1439:                                             ; preds = %1436
  %1440 = load ptr, ptr %6, align 8, !tbaa !5
  %1441 = call i32 (ptr, ...) @printf(ptr noundef @.str.123, ptr noundef %1440)
  br label %1445

1442:                                             ; preds = %1436
  %1443 = load ptr, ptr %6, align 8, !tbaa !5
  %1444 = call i32 (ptr, ...) @printf(ptr noundef @.str.108, ptr noundef %1443)
  br label %1445

1445:                                             ; preds = %1442, %1439
  br label %1446

1446:                                             ; preds = %1445, %1431, %1425
  br label %1447

1447:                                             ; preds = %1446, %1413
  br label %1448

1448:                                             ; preds = %1447, %1403
  br label %1449

1449:                                             ; preds = %1448, %1383
  br label %1450

1450:                                             ; preds = %1449, %864, %840, %763, %519
  %1451 = load ptr, ptr %14, align 8, !tbaa !5
  %1452 = icmp ne ptr %1451, inttoptr (i64 -1 to ptr)
  br i1 %1452, label %1453, label %1457

1453:                                             ; preds = %1450
  %1454 = load ptr, ptr %14, align 8, !tbaa !5
  %1455 = load i64, ptr %13, align 8, !tbaa !12
  %1456 = call i32 @munmap(ptr noundef %1454, i64 noundef %1455) #11
  br label %1457

1457:                                             ; preds = %1453, %1450
  %1458 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 6
  %1459 = load i8, ptr %1458, align 1, !tbaa !18, !range !19, !noundef !20
  %1460 = trunc i8 %1459 to i1
  br i1 %1460, label %1461, label %1466

1461:                                             ; preds = %1457
  %1462 = getelementptr inbounds %struct.search_params, ptr %8, i32 0, i32 11
  %1463 = load ptr, ptr %1462, align 8, !tbaa !43
  %1464 = icmp eq ptr %1463, %18
  br i1 %1464, label %1465, label %1466

1465:                                             ; preds = %1461
  call void @regfree(ptr noundef %18)
  br label %1466

1466:                                             ; preds = %1465, %1461, %1457
  %1467 = load ptr, ptr %19, align 8, !tbaa !5
  call void @free(ptr noundef %1467) #11
  %1468 = load ptr, ptr %15, align 8, !tbaa !5
  call void @match_result_free(ptr noundef %1468)
  %1469 = load ptr, ptr %16, align 8, !tbaa !5
  call void @free(ptr noundef %1469) #11
  %1470 = load ptr, ptr %17, align 8, !tbaa !5
  call void @free(ptr noundef %1470) #11
  %1471 = load i32, ptr %11, align 4, !tbaa !9
  %1472 = icmp ne i32 %1471, -1
  br i1 %1472, label %1473, label %1476

1473:                                             ; preds = %1466
  %1474 = load i32, ptr %11, align 4, !tbaa !9
  %1475 = call i32 @close(i32 noundef %1474)
  br label %1476

1476:                                             ; preds = %1473, %1466
  %1477 = load ptr, ptr %9, align 8, !tbaa !5
  %1478 = icmp ne ptr %1477, null
  br i1 %1478, label %1479, label %1481

1479:                                             ; preds = %1476
  %1480 = load ptr, ptr %9, align 8, !tbaa !5
  call void @ac_trie_free(ptr noundef %1480)
  br label %1481

1481:                                             ; preds = %1479, %1476
  %1482 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1482, ptr %4, align 4
  store i32 1, ptr %24, align 4
  br label %1483

1483:                                             ; preds = %1481, %864, %707
  call void @llvm.lifetime.end.p0(i64 1, ptr %46) #11
  br label %1484

1484:                                             ; preds = %1483, %500, %471, %267, %256, %250, %135
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr %18) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #11
  call void @llvm.lifetime.end.p0(i64 144, ptr %12) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr %8) #11
  %1485 = load i32, ptr %4, align 4
  ret i32 %1485

1486:                                             ; preds = %1140
  unreachable
}

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

declare i64 @fread(ptr noundef, i64 noundef, i64 noundef, ptr noundef) #3

; Function Attrs: nounwind
declare i32 @ferror(ptr noundef) #4

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

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

declare i32 @open(ptr noundef, i32 noundef, ...) #3

; Function Attrs: nounwind
declare i32 @fstat(i32 noundef, ptr noundef) #4

declare i32 @close(i32 noundef) #3

declare zeroext i1 @ac_trie_root_has_outputs(ptr noundef) #3

; Function Attrs: nounwind
declare ptr @mmap(ptr noundef, i64 noundef, i32 noundef, i32 noundef, i32 noundef, i64 noundef) #4

; Function Attrs: nounwind
declare i32 @madvise(ptr noundef, i64 noundef, i32 noundef) #4

; Function Attrs: nounwind
declare i64 @sysconf(i32 noundef) #4

; Function Attrs: nounwind uwtable
declare hidden void @init_global_thread_pool(i32 noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local zeroext i1 @thread_pool_submit(ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind
declare i32 @pthread_create(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local void @thread_pool_wait_all(ptr noundef) #1

declare i32 @pthread_join(i64 noundef, ptr noundef) #3

declare void @qsort(ptr noundef, i64 noundef, i64 noundef, ptr noundef) #3

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

; Function Attrs: nounwind
declare i32 @munmap(ptr noundef, i64 noundef) #4

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{i64 0, i64 8, !5, i64 8, i64 8, !12, i64 16, i64 8, !5, i64 24, i64 8, !5, i64 32, i64 8, !12, i64 40, i64 1, !14, i64 41, i64 1, !14, i64 42, i64 1, !14, i64 43, i64 1, !14, i64 44, i64 1, !14, i64 45, i64 1, !14, i64 48, i64 8, !5, i64 56, i64 8, !5, i64 64, i64 8, !12}
!12 = !{!13, !13, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"_Bool", !7, i64 0}
!16 = !{!17, !13, i64 64}
!17 = !{!"search_params", !6, i64 0, !13, i64 8, !6, i64 16, !6, i64 24, !13, i64 32, !15, i64 40, !15, i64 41, !15, i64 42, !15, i64 43, !15, i64 44, !15, i64 45, !6, i64 48, !6, i64 56, !13, i64 64}
!18 = !{!17, !15, i64 41}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{!17, !13, i64 32}
!22 = !{!17, !6, i64 24}
!23 = !{!17, !6, i64 16}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = distinct !{!26, !25}
!27 = !{!7, !7, i64 0}
!28 = !{!17, !6, i64 56}
!29 = !{!30, !13, i64 48}
!30 = !{!"stat", !13, i64 0, !13, i64 8, !13, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !13, i64 40, !13, i64 48, !13, i64 56, !13, i64 64, !31, i64 72, !31, i64 88, !31, i64 104, !7, i64 120}
!31 = !{!"timespec", !13, i64 0, !13, i64 8}
!32 = distinct !{!32, !25}
!33 = distinct !{!33, !25}
!34 = !{!17, !15, i64 40}
!35 = !{!36, !10, i64 0}
!36 = !{!"", !10, i64 0, !10, i64 4}
!37 = !{!36, !10, i64 4}
!38 = !{!17, !15, i64 42}
!39 = !{!17, !15, i64 43}
!40 = !{!17, !15, i64 45}
!41 = distinct !{!41, !25}
!42 = distinct !{!42, !25}
!43 = !{!17, !6, i64 48}
!44 = !{!17, !15, i64 44}
!45 = distinct !{!45, !25}
!46 = !{!47, !10, i64 0}
!47 = !{!"", !10, i64 0, !6, i64 8, !6, i64 16, !13, i64 24, !6, i64 32, !13, i64 40, !15, i64 48}
!48 = !{!47, !6, i64 8}
!49 = !{!47, !6, i64 16}
!50 = !{!47, !13, i64 24}
!51 = !{!47, !6, i64 32}
!52 = !{!47, !13, i64 40}
!53 = !{!47, !15, i64 48}
!54 = distinct !{!54, !25}
!55 = !{!56, !13, i64 8}
!56 = !{!"match_result_t", !6, i64 0, !13, i64 8, !13, i64 16}
!57 = !{!56, !6, i64 0}
!58 = !{!59, !13, i64 0}
!59 = !{!"", !13, i64 0, !13, i64 8}
!60 = !{!59, !13, i64 8}
!61 = distinct !{!61, !25}
!62 = distinct !{!62, !25}


; 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.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }
%struct.stat = type { i64, i64, i64, i32, i32, i32, i32, i64, i64, i64, i64, %struct.timespec, %struct.timespec, %struct.timespec, [3 x i64] }
%struct.timespec = type { i64, i64 }
%struct.re_pattern_buffer = type { ptr, i64, i64, i64, ptr, ptr, i64, i8 }
%struct.regmatch_t = type { i32, i32 }
%struct.thread_data_t = type { i32, ptr, ptr, i64, ptr, i64, i8 }
%struct.match_position_t = type { i64, i64 }

@stderr = external local_unnamed_addr global ptr, align 8
@only_matching = external hidden local_unnamed_addr global i8, align 1
@.str.69 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.91 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.92 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.93 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.94 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [84 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [49 x i8], align 1
@stdin = external local_unnamed_addr global ptr, align 8
@.str.101 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.104 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.106 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.107 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.108 = external hidden unnamed_addr constant [5 x i8], align 1
@global_match_found_flag = external hidden local_unnamed_addr global i8, align 1
@.str.109 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.110 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.111 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.112 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.113 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.114 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.115 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.116 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.117 = external hidden unnamed_addr constant [59 x i8], align 1
@global_thread_pool = external hidden local_unnamed_addr global ptr, align 8
@.str.118 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.119 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.120 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.121 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.122 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.123 = external hidden unnamed_addr constant [7 x i8], align 1

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

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

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

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #2

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare dso_local zeroext i1 @match_result_add(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #5

; Function Attrs: mustprogress nounwind willreturn allockind("realloc") allocsize(1) memory(argmem: readwrite, inaccessiblemem: readwrite)
declare noalias noundef ptr @realloc(ptr allocptr nocapture noundef, i64 noundef) local_unnamed_addr #6

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

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

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

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

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

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

declare i32 @regexec(ptr noundef, ptr noundef, i64 noundef, ptr noundef, i32 noundef) local_unnamed_addr #10

declare i64 @regerror(i32 noundef, ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #10

; Function Attrs: nounwind uwtable
declare dso_local ptr @search_chunk_thread(ptr noundef) #1

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

declare ptr @ac_trie_build(ptr noundef) local_unnamed_addr #10

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

declare i32 @regcomp(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #10

declare void @regfree(ptr noundef) local_unnamed_addr #10

declare void @ac_trie_free(ptr noundef) local_unnamed_addr #10

; Function Attrs: nounwind uwtable
define dso_local i32 @search_file(ptr nocapture noundef readonly %0, ptr noundef %1, i32 noundef %2) local_unnamed_addr #1 {
  %4 = alloca %struct.search_params, align 8
  %5 = alloca %struct.stat, align 8
  %6 = alloca %struct.re_pattern_buffer, align 8
  %7 = alloca %struct.re_pattern_buffer, align 8
  %8 = alloca %struct.regmatch_t, align 4
  %9 = alloca [256 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %4) #17
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(72) %4, ptr noundef nonnull align 8 dereferenceable(72) %0, i64 72, i1 false), !tbaa.struct !5
  call void @llvm.lifetime.start.p0(i64 144, ptr nonnull %5) #17
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %6) #17
  %10 = getelementptr inbounds i8, ptr %4, i64 64
  %11 = load i64, ptr %10, align 8, !tbaa !14
  %12 = getelementptr inbounds i8, ptr %4, i64 41
  %13 = load i8, ptr %12, align 1, !range !16, !noundef !17
  %14 = trunc nuw i8 %13 to i1
  br i1 %14, label %.critedge, label %.preheader692

.preheader692:                                    ; preds = %3
  %15 = getelementptr inbounds i8, ptr %4, i64 32
  %16 = load i64, ptr %15, align 8, !tbaa !18
  %.fr745 = freeze i64 %16
  %.not559697.not = icmp eq i64 %.fr745, 0
  br i1 %.not559697.not, label %.critedge, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader692
  %17 = getelementptr inbounds i8, ptr %4, i64 24
  %18 = load ptr, ptr %17, align 8, !tbaa !19
  %.not746 = icmp eq i64 %.fr745, 1
  br i1 %.not746, label %.lr.ph.split, label %.lr.ph.split.us

.lr.ph.split.us:                                  ; preds = %.lr.ph, %24
  %.0479698.us = phi i64 [ %25, %24 ], [ 0, %.lr.ph ]
  %19 = getelementptr inbounds i64, ptr %18, i64 %.0479698.us
  %20 = load i64, ptr %19, align 8, !tbaa !10
  %21 = icmp eq i64 %20, 0
  br i1 %21, label %.split700.us, label %22

22:                                               ; preds = %.lr.ph.split.us
  %23 = icmp ugt i64 %20, 1024
  br i1 %23, label %.split.us, label %24

24:                                               ; preds = %22
  %25 = add nuw i64 %.0479698.us, 1
  %exitcond.not = icmp eq i64 %25, %.fr745
  br i1 %exitcond.not, label %.critedge, label %.lr.ph.split.us, !llvm.loop !20

.lr.ph.split:                                     ; preds = %.lr.ph
  %.pre = load i64, ptr %18, align 8, !tbaa !10
  %26 = icmp ugt i64 %.pre, 1024
  br i1 %26, label %.split.us, label %.critedge

.split700.us:                                     ; preds = %.lr.ph.split.us
  %27 = load ptr, ptr @stderr, align 8, !tbaa !6
  %28 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %27, ptr noundef nonnull @.str.97, ptr noundef %1) #18
  br label %.thread628

.split.us:                                        ; preds = %22, %.lr.ph.split
  %.us-phi = phi i64 [ 0, %.lr.ph.split ], [ %.0479698.us, %22 ]
  %29 = load ptr, ptr @stderr, align 8, !tbaa !6
  %30 = getelementptr inbounds i8, ptr %4, i64 16
  %31 = load ptr, ptr %30, align 8, !tbaa !22
  %32 = getelementptr inbounds ptr, ptr %31, i64 %.us-phi
  %33 = load ptr, ptr %32, align 8, !tbaa !6
  %34 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %29, ptr noundef nonnull @.str.98, ptr noundef %1, ptr noundef %33, i32 noundef 1024) #18
  br label %.thread628

.critedge:                                        ; preds = %24, %.lr.ph.split, %.preheader692, %3
  %35 = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %1, ptr noundef nonnull dereferenceable(1) @.str.99) #19
  %36 = icmp eq i32 %35, 0
  br i1 %36, label %37, label %86

37:                                               ; preds = %.critedge
  %38 = tail call noalias dereferenceable_or_null(4194304) ptr @malloc(i64 noundef 4194304) #20
  %.not590 = icmp eq ptr %38, null
  br i1 %.not590, label %41, label %.preheader

.preheader:                                       ; preds = %37
  %39 = load ptr, ptr @stdin, align 8, !tbaa !6
  %40 = tail call i64 @fread(ptr noundef nonnull %38, i64 noundef 1, i64 noundef 65536, ptr noundef %39)
  %.not591736 = icmp eq i64 %40, 0
  br i1 %.not591736, label %._crit_edge741, label %.lr.ph740

41:                                               ; preds = %37
  %42 = load ptr, ptr @stderr, align 8, !tbaa !6
  %43 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %42, ptr noundef nonnull @.str.100) #18
  br label %.thread628

.lr.ph740:                                        ; preds = %.preheader, %53
  %44 = phi i64 [ %56, %53 ], [ %40, %.preheader ]
  %.0490739 = phi i64 [ %.1491, %53 ], [ 4194304, %.preheader ]
  %.0492738 = phi i64 [ %45, %53 ], [ 0, %.preheader ]
  %.0493737 = phi ptr [ %.2495, %53 ], [ %38, %.preheader ]
  %45 = add i64 %44, %.0492738
  %46 = add i64 %45, 65536
  %47 = icmp ugt i64 %46, %.0490739
  br i1 %47, label %48, label %53

48:                                               ; preds = %.lr.ph740
  %49 = shl i64 %.0490739, 1
  %50 = tail call ptr @realloc(ptr noundef %.0493737, i64 noundef %49) #21
  %.not598.not = icmp eq ptr %50, null
  br i1 %.not598.not, label %.thread, label %53

.thread:                                          ; preds = %48
  %51 = load ptr, ptr @stderr, align 8, !tbaa !6
  %52 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %51, ptr noundef nonnull @.str.101) #18
  tail call void @free(ptr noundef %.0493737) #17
  br label %.thread628

53:                                               ; preds = %48, %.lr.ph740
  %.2495 = phi ptr [ %.0493737, %.lr.ph740 ], [ %50, %48 ]
  %.1491 = phi i64 [ %.0490739, %.lr.ph740 ], [ %49, %48 ]
  %54 = getelementptr inbounds i8, ptr %.2495, i64 %45
  %55 = load ptr, ptr @stdin, align 8, !tbaa !6
  %56 = tail call i64 @fread(ptr noundef %54, i64 noundef 1, i64 noundef 65536, ptr noundef %55)
  %.not591 = icmp eq i64 %56, 0
  br i1 %.not591, label %._crit_edge741, label %.lr.ph740, !llvm.loop !23

._crit_edge741:                                   ; preds = %53, %.preheader
  %.0493.lcssa = phi ptr [ %38, %.preheader ], [ %.2495, %53 ]
  %.0492.lcssa = phi i64 [ 0, %.preheader ], [ %45, %53 ]
  %57 = load ptr, ptr @stdin, align 8, !tbaa !6
  %58 = tail call i32 @ferror(ptr noundef %57) #17
  %.not592 = icmp eq i32 %58, 0
  br i1 %.not592, label %65, label %59

59:                                               ; preds = %._crit_edge741
  %60 = load ptr, ptr @stderr, align 8, !tbaa !6
  %61 = tail call ptr @__errno_location() #22
  %62 = load i32, ptr %61, align 4, !tbaa !24
  %63 = tail call ptr @strerror(i32 noundef %62) #17
  %64 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %60, ptr noundef nonnull @.str.102, ptr noundef %63) #18
  tail call void @free(ptr noundef %.0493.lcssa) #17
  br label %.thread628

65:                                               ; preds = %._crit_edge741
  %66 = add i64 %.0492.lcssa, 1
  %67 = tail call ptr @realloc(ptr noundef %.0493.lcssa, i64 noundef %66) #21
  %.not593 = icmp eq ptr %67, null
  br i1 %.not593, label %68, label %71

68:                                               ; preds = %65
  %69 = load ptr, ptr @stderr, align 8, !tbaa !6
  %70 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %69, ptr noundef nonnull @.str.103) #18
  tail call void @free(ptr noundef %.0493.lcssa) #17
  br label %.thread628

71:                                               ; preds = %65
  %72 = getelementptr inbounds i8, ptr %67, i64 %.0492.lcssa
  store i8 0, ptr %72, align 1, !tbaa !26
  %73 = getelementptr inbounds i8, ptr %4, i64 32
  %74 = load i64, ptr %73, align 8, !tbaa !18
  %75 = icmp ult i64 %74, 2
  %.not595 = or i1 %75, %14
  br i1 %.not595, label %83, label %76

76:                                               ; preds = %71
  %77 = call ptr @ac_trie_build(ptr noundef nonnull %4) #17
  %.not596 = icmp eq ptr %77, null
  br i1 %.not596, label %78, label %81

78:                                               ; preds = %76
  %79 = load ptr, ptr @stderr, align 8, !tbaa !6
  %80 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %79, ptr noundef nonnull @.str.104) #18
  call void @free(ptr noundef nonnull %67) #17
  br label %.thread628

81:                                               ; preds = %76
  %82 = getelementptr inbounds i8, ptr %4, i64 56
  store ptr %77, ptr %82, align 8, !tbaa !27
  br label %83

83:                                               ; preds = %81, %71
  %.0418 = phi ptr [ %77, %81 ], [ null, %71 ]
  %84 = call i32 @search_string(ptr noundef nonnull %4, ptr noundef nonnull %67)
  call void @free(ptr noundef nonnull %67) #17
  %.not597 = icmp eq ptr %.0418, null
  br i1 %.not597, label %.thread628, label %85

85:                                               ; preds = %83
  call void @ac_trie_free(ptr noundef nonnull %.0418) #17
  br label %.thread628

86:                                               ; preds = %.critedge
  %87 = tail call i32 (ptr, i32, ...) @open(ptr noundef %1, i32 noundef 524288) #17
  %88 = icmp eq i32 %87, -1
  br i1 %88, label %89, label %95

89:                                               ; preds = %86
  %90 = load ptr, ptr @stderr, align 8, !tbaa !6
  %91 = tail call ptr @__errno_location() #22
  %92 = load i32, ptr %91, align 4, !tbaa !24
  %93 = tail call ptr @strerror(i32 noundef %92) #17
  %94 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %90, ptr noundef nonnull @.str.105, ptr noundef %1, ptr noundef %93) #18
  br label %.thread628

95:                                               ; preds = %86
  %96 = call i32 @fstat(i32 noundef %87, ptr noundef nonnull %5) #17
  %97 = icmp eq i32 %96, -1
  br i1 %97, label %98, label %105

98:                                               ; preds = %95
  %99 = load ptr, ptr @stderr, align 8, !tbaa !6
  %100 = tail call ptr @__errno_location() #22
  %101 = load i32, ptr %100, align 4, !tbaa !24
  %102 = tail call ptr @strerror(i32 noundef %101) #17
  %103 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %99, ptr noundef nonnull @.str.105, ptr noundef %1, ptr noundef %102) #18
  %104 = tail call i32 @close(i32 noundef %87) #17
  br label %.thread628

105:                                              ; preds = %95
  %106 = getelementptr inbounds i8, ptr %5, i64 48
  %107 = load i64, ptr %106, align 8, !tbaa !28
  %108 = icmp eq i64 %107, 0
  br i1 %108, label %109, label %207

109:                                              ; preds = %105
  %110 = tail call i32 @close(i32 noundef %87) #17
  %111 = getelementptr inbounds i8, ptr %4, i64 32
  %112 = load i64, ptr %111, align 8
  %113 = icmp ult i64 %112, 2
  %114 = load i8, ptr %12, align 1, !range !16
  %115 = trunc nuw i8 %114 to i1
  %.not587 = select i1 %113, i1 true, i1 %115
  br i1 %.not587, label %120, label %116

116:                                              ; preds = %109
  %117 = call ptr @ac_trie_build(ptr noundef nonnull %4) #17
  %118 = call zeroext i1 @ac_trie_root_has_outputs(ptr noundef %117) #17
  %.not589 = icmp eq ptr %117, null
  br i1 %.not589, label %184, label %119

119:                                              ; preds = %116
  call void @ac_trie_free(ptr noundef nonnull %117) #17
  br i1 %118, label %185, label %.critedge600

120:                                              ; preds = %109
  br i1 %115, label %121, label %177

121:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %7) #17
  %122 = icmp ugt i64 %112, 1
  br i1 %122, label %.preheader687, label %156

.preheader687:                                    ; preds = %121
  %123 = getelementptr inbounds i8, ptr %4, i64 24
  %124 = load ptr, ptr %123, align 8, !tbaa !19
  %min.iters.check859 = icmp ult i64 %112, 4
  br i1 %min.iters.check859, label %scalar.ph858.preheader, label %vector.ph860

scalar.ph858.preheader:                           ; preds = %middle.block857, %.preheader687
  %.0513730.ph = phi i64 [ 0, %.preheader687 ], [ %132, %middle.block857 ]
  %.0514729.ph = phi i64 [ 0, %.preheader687 ], [ %n.vec862, %middle.block857 ]
  br label %scalar.ph858

vector.ph860:                                     ; preds = %.preheader687
  %n.vec862 = and i64 %112, -4
  br label %vector.body864

vector.body864:                                   ; preds = %vector.body864, %vector.ph860
  %index865 = phi i64 [ 0, %vector.ph860 ], [ %index.next870, %vector.body864 ]
  %vec.phi866 = phi <2 x i64> [ zeroinitializer, %vector.ph860 ], [ %129, %vector.body864 ]
  %vec.phi867 = phi <2 x i64> [ zeroinitializer, %vector.ph860 ], [ %130, %vector.body864 ]
  %125 = getelementptr inbounds i64, ptr %124, i64 %index865
  %126 = getelementptr inbounds i8, ptr %125, i64 16
  %wide.load868 = load <2 x i64>, ptr %125, align 8, !tbaa !10
  %wide.load869 = load <2 x i64>, ptr %126, align 8, !tbaa !10
  %127 = add <2 x i64> %vec.phi866, <i64 3, i64 3>
  %128 = add <2 x i64> %vec.phi867, <i64 3, i64 3>
  %129 = add <2 x i64> %127, %wide.load868
  %130 = add <2 x i64> %128, %wide.load869
  %index.next870 = add nuw i64 %index865, 4
  %131 = icmp eq i64 %index.next870, %n.vec862
  br i1 %131, label %middle.block857, label %vector.body864, !llvm.loop !31

middle.block857:                                  ; preds = %vector.body864
  %bin.rdx871 = add <2 x i64> %130, %129
  %132 = tail call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx871)
  %cmp.n872 = icmp eq i64 %112, %n.vec862
  br i1 %cmp.n872, label %.loopexit874, label %scalar.ph858.preheader

.loopexit874:                                     ; preds = %scalar.ph858, %middle.block857
  %.lcssa = phi i64 [ %132, %middle.block857 ], [ %141, %scalar.ph858 ]
  %133 = add i64 %.lcssa, 1
  %134 = tail call noalias ptr @malloc(i64 noundef %133) #20
  %.not588 = icmp eq ptr %134, null
  br i1 %.not588, label %162, label %.lr.ph733

.lr.ph733:                                        ; preds = %.loopexit874
  %135 = getelementptr inbounds i8, ptr %4, i64 16
  %136 = load ptr, ptr %135, align 8, !tbaa !22
  %137 = add i64 %112, -1
  br label %143

scalar.ph858:                                     ; preds = %scalar.ph858.preheader, %scalar.ph858
  %.0513730 = phi i64 [ %141, %scalar.ph858 ], [ %.0513730.ph, %scalar.ph858.preheader ]
  %.0514729 = phi i64 [ %142, %scalar.ph858 ], [ %.0514729.ph, %scalar.ph858.preheader ]
  %138 = getelementptr inbounds i64, ptr %124, i64 %.0514729
  %139 = load i64, ptr %138, align 8, !tbaa !10
  %140 = add i64 %.0513730, 3
  %141 = add i64 %140, %139
  %142 = add nuw i64 %.0514729, 1
  %exitcond766.not = icmp eq i64 %142, %112
  br i1 %exitcond766.not, label %.loopexit874, label %scalar.ph858, !llvm.loop !34

._crit_edge734:                                   ; preds = %154
  store i8 0, ptr %.1517, align 1, !tbaa !26
  br label %162

143:                                              ; preds = %.lr.ph733, %154
  %.0515732 = phi i64 [ 0, %.lr.ph733 ], [ %155, %154 ]
  %.0516731 = phi ptr [ %134, %.lr.ph733 ], [ %.1517, %154 ]
  %144 = getelementptr inbounds ptr, ptr %136, i64 %.0515732
  %145 = load ptr, ptr %144, align 8, !tbaa !6
  %146 = tail call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %.0516731, ptr noundef nonnull dereferenceable(1) @.str.91, ptr noundef %145) #17
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds i8, ptr %.0516731, i64 %147
  %149 = icmp ult i64 %.0515732, %137
  br i1 %149, label %150, label %154

150:                                              ; preds = %143
  %151 = tail call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %148, ptr noundef nonnull dereferenceable(1) @.str.92) #17
  %152 = sext i32 %151 to i64
  %153 = getelementptr inbounds i8, ptr %148, i64 %152
  br label %154

154:                                              ; preds = %143, %150
  %.1517 = phi ptr [ %153, %150 ], [ %148, %143 ]
  %155 = add nuw i64 %.0515732, 1
  %exitcond767.not = icmp eq i64 %155, %112
  br i1 %exitcond767.not, label %._crit_edge734, label %143, !llvm.loop !35

156:                                              ; preds = %121
  %157 = icmp eq i64 %112, 1
  br i1 %157, label %158, label %176

158:                                              ; preds = %156
  %159 = getelementptr inbounds i8, ptr %4, i64 16
  %160 = load ptr, ptr %159, align 8, !tbaa !22
  %161 = load ptr, ptr %160, align 8, !tbaa !6
  br label %162

162:                                              ; preds = %.loopexit874, %._crit_edge734, %158
  %.0512 = phi ptr [ null, %158 ], [ %134, %._crit_edge734 ], [ null, %.loopexit874 ]
  %.1502 = phi ptr [ %161, %158 ], [ %134, %._crit_edge734 ], [ null, %.loopexit874 ]
  %163 = getelementptr inbounds i8, ptr %4, i64 40
  %164 = load i8, ptr %163, align 8, !tbaa !36, !range !16, !noundef !17
  %165 = trunc nuw i8 %164 to i1
  %166 = select i1 %165, i32 5, i32 7
  %167 = call i32 @regcomp(ptr noundef nonnull %7, ptr noundef %.1502, i32 noundef %166) #17
  %168 = icmp eq i32 %167, 0
  br i1 %168, label %.thread618, label %.thread618.thread

.thread618.thread:                                ; preds = %162
  call void @free(ptr noundef %.0512) #17
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %7) #17
  br label %.critedge600

.thread618:                                       ; preds = %162
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #17
  %169 = call i32 @regexec(ptr noundef nonnull %7, ptr noundef nonnull @.str.69, i64 noundef 1, ptr noundef nonnull %8, i32 noundef 0) #17
  %170 = icmp eq i32 %169, 0
  %171 = load i32, ptr %8, align 4
  %172 = icmp eq i32 %171, 0
  %or.cond = select i1 %170, i1 %172, i1 false
  %173 = getelementptr inbounds i8, ptr %8, i64 4
  %174 = load i32, ptr %173, align 4
  %175 = icmp eq i32 %174, 0
  %or.cond12 = select i1 %or.cond, i1 %175, i1 false
  call void @regfree(ptr noundef nonnull %7) #17
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #17
  call void @free(ptr noundef %.0512) #17
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %7) #17
  br i1 %or.cond12, label %185, label %.critedge600

176:                                              ; preds = %156
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %7) #17
  br label %.thread628

177:                                              ; preds = %120
  %178 = icmp eq i64 %112, 1
  br i1 %178, label %179, label %.critedge600

179:                                              ; preds = %177
  %180 = getelementptr inbounds i8, ptr %4, i64 24
  %181 = load ptr, ptr %180, align 8, !tbaa !19
  %182 = load i64, ptr %181, align 8, !tbaa !10
  %183 = icmp eq i64 %182, 0
  br i1 %183, label %185, label %.critedge600

184:                                              ; preds = %116
  br i1 %118, label %185, label %.critedge600

185:                                              ; preds = %.thread618, %179, %119, %184
  %186 = getelementptr inbounds i8, ptr %4, i64 42
  %187 = load i8, ptr %186, align 2, !tbaa !37, !range !16, !noundef !17
  %188 = trunc nuw i8 %187 to i1
  br i1 %188, label %196, label %189

189:                                              ; preds = %185
  %190 = getelementptr inbounds i8, ptr %4, i64 43
  %191 = load i8, ptr %190, align 1, !tbaa !38, !range !16, !noundef !17
  %192 = trunc nuw i8 %191 to i1
  br i1 %192, label %196, label %193

193:                                              ; preds = %189
  %194 = load i8, ptr @only_matching, align 1, !tbaa !12, !range !16, !noundef !17
  %195 = trunc nuw i8 %194 to i1
  %.str.107..str.108 = select i1 %195, ptr @.str.107, ptr @.str.108
  br label %196

196:                                              ; preds = %193, %185, %189
  %.str.107.sink = phi ptr [ @.str.106, %189 ], [ @.str.106, %185 ], [ %.str.107..str.108, %193 ]
  %197 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.107.sink, ptr noundef %1)
  store atomic i8 1, ptr @global_match_found_flag seq_cst, align 1
  br label %.thread628

.critedge600:                                     ; preds = %.thread618.thread, %.thread618, %179, %119, %177, %184
  %198 = getelementptr inbounds i8, ptr %4, i64 42
  %199 = load i8, ptr %198, align 2, !tbaa !37, !range !16, !noundef !17
  %200 = trunc nuw i8 %199 to i1
  br i1 %200, label %205, label %201

201:                                              ; preds = %.critedge600
  %202 = getelementptr inbounds i8, ptr %4, i64 43
  %203 = load i8, ptr %202, align 1, !tbaa !38, !range !16, !noundef !17
  %204 = trunc nuw i8 %203 to i1
  br i1 %204, label %205, label %.thread628

205:                                              ; preds = %201, %.critedge600
  %206 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.109, ptr noundef %1)
  br label %.thread628

207:                                              ; preds = %105
  %208 = load i8, ptr %12, align 1, !range !16, !noundef !17
  %209 = trunc nuw i8 %208 to i1
  %210 = getelementptr inbounds i8, ptr %4, i64 32
  %211 = load i64, ptr %210, align 8
  %212 = icmp ne i64 %211, 1
  %or.cond15.not = select i1 %209, i1 true, i1 %212
  br i1 %or.cond15.not, label %229, label %213

213:                                              ; preds = %207
  %214 = getelementptr inbounds i8, ptr %4, i64 24
  %215 = load ptr, ptr %214, align 8, !tbaa !19
  %216 = load i64, ptr %215, align 8, !tbaa !10
  %217 = icmp ugt i64 %216, %107
  br i1 %217, label %218, label %.thread622

218:                                              ; preds = %213
  %219 = tail call i32 @close(i32 noundef %87) #17
  %220 = getelementptr inbounds i8, ptr %4, i64 42
  %221 = load i8, ptr %220, align 2, !tbaa !37, !range !16, !noundef !17
  %222 = trunc nuw i8 %221 to i1
  br i1 %222, label %227, label %223

223:                                              ; preds = %218
  %224 = getelementptr inbounds i8, ptr %4, i64 43
  %225 = load i8, ptr %224, align 1, !tbaa !38, !range !16, !noundef !17
  %226 = trunc nuw i8 %225 to i1
  br i1 %226, label %227, label %.thread628

227:                                              ; preds = %223, %218
  %228 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.109, ptr noundef %1)
  br label %.thread628

229:                                              ; preds = %207
  %230 = icmp ult i64 %211, 2
  %.not561 = or i1 %230, %209
  br i1 %.not561, label %.thread622, label %231

231:                                              ; preds = %229
  %232 = call ptr @ac_trie_build(ptr noundef nonnull %4) #17
  %.not = icmp eq ptr %232, null
  br i1 %.not, label %233, label %236

233:                                              ; preds = %231
  %234 = load ptr, ptr @stderr, align 8, !tbaa !6
  %235 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %234, ptr noundef nonnull @.str.110, ptr noundef %1) #18
  br label %.thread647

236:                                              ; preds = %231
  %237 = getelementptr inbounds i8, ptr %4, i64 56
  store ptr %232, ptr %237, align 8, !tbaa !27
  %.pre768 = load i8, ptr %12, align 1, !tbaa !39, !range !16
  br label %.thread622

.thread622:                                       ; preds = %213, %236, %229
  %238 = phi i8 [ %.pre768, %236 ], [ %208, %229 ], [ %208, %213 ]
  %.1419 = phi ptr [ %232, %236 ], [ null, %229 ], [ null, %213 ]
  %239 = trunc nuw i8 %238 to i1
  br i1 %239, label %240, label %322

240:                                              ; preds = %.thread622
  %241 = load i64, ptr %210, align 8, !tbaa !18
  %242 = icmp ugt i64 %241, 1
  br i1 %242, label %.preheader691, label %289

.preheader691:                                    ; preds = %240
  %243 = getelementptr inbounds i8, ptr %4, i64 24
  %244 = load ptr, ptr %243, align 8, !tbaa !19
  %245 = getelementptr inbounds i8, ptr %4, i64 45
  %246 = load i8, ptr %245, align 1, !tbaa !40, !range !16, !noundef !17
  %247 = trunc nuw i8 %246 to i1
  %248 = select i1 %247, i64 6, i64 2
  %min.iters.check = icmp ult i64 %241, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.preheader691
  %.0507702.ph = phi i64 [ 0, %.preheader691 ], [ %n.vec, %middle.block ]
  %.0508701.ph = phi i64 [ 0, %.preheader691 ], [ %258, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.preheader691
  %n.vec = and i64 %241, -4
  %broadcast.splatinsert = insertelement <2 x i64> poison, i64 %248, i64 0
  %broadcast.splat = shufflevector <2 x i64> %broadcast.splatinsert, <2 x i64> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %255, %vector.body ]
  %vec.phi839 = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %256, %vector.body ]
  %249 = getelementptr inbounds i64, ptr %244, i64 %index
  %250 = getelementptr inbounds i8, ptr %249, i64 16
  %wide.load = load <2 x i64>, ptr %249, align 8, !tbaa !10
  %wide.load840 = load <2 x i64>, ptr %250, align 8, !tbaa !10
  %251 = add <2 x i64> %vec.phi, <i64 1, i64 1>
  %252 = add <2 x i64> %vec.phi839, <i64 1, i64 1>
  %253 = add <2 x i64> %251, %wide.load
  %254 = add <2 x i64> %252, %wide.load840
  %255 = add <2 x i64> %253, %broadcast.splat
  %256 = add <2 x i64> %254, %broadcast.splat
  %index.next = add nuw i64 %index, 4
  %257 = icmp eq i64 %index.next, %n.vec
  br i1 %257, label %middle.block, label %vector.body, !llvm.loop !41

middle.block:                                     ; preds = %vector.body
  %bin.rdx = add <2 x i64> %256, %255
  %258 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx)
  %cmp.n = icmp eq i64 %241, %n.vec
  br i1 %cmp.n, label %.loopexit875, label %scalar.ph.preheader

.loopexit875:                                     ; preds = %scalar.ph, %middle.block
  %.lcssa836 = phi i64 [ %258, %middle.block ], [ %266, %scalar.ph ]
  %259 = add i64 %.lcssa836, 1
  %260 = call noalias ptr @malloc(i64 noundef %259) #20
  %.not563.not = icmp eq ptr %260, null
  br i1 %.not563.not, label %.thread624, label %.lr.ph705

.lr.ph705:                                        ; preds = %.loopexit875
  %261 = getelementptr inbounds i8, ptr %4, i64 16
  br label %271

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0507702 = phi i64 [ %267, %scalar.ph ], [ %.0507702.ph, %scalar.ph.preheader ]
  %.0508701 = phi i64 [ %266, %scalar.ph ], [ %.0508701.ph, %scalar.ph.preheader ]
  %262 = getelementptr inbounds i64, ptr %244, i64 %.0507702
  %263 = load i64, ptr %262, align 8, !tbaa !10
  %264 = add i64 %.0508701, 1
  %265 = add i64 %264, %263
  %266 = add i64 %265, %248
  %267 = add nuw i64 %.0507702, 1
  %exitcond760.not = icmp eq i64 %267, %241
  br i1 %exitcond760.not, label %.loopexit875, label %scalar.ph, !llvm.loop !42

.thread624:                                       ; preds = %.loopexit875
  %268 = load ptr, ptr @stderr, align 8, !tbaa !6
  %269 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %268, ptr noundef nonnull @.str.111, ptr noundef %1) #18
  %270 = call i32 @close(i32 noundef %87) #17
  br label %.thread628

271:                                              ; preds = %.lr.ph705, %285
  %.0503704 = phi i64 [ 0, %.lr.ph705 ], [ %287, %285 ]
  %.0504703 = phi ptr [ %260, %.lr.ph705 ], [ %.2506, %285 ]
  %272 = load i8, ptr %245, align 1, !tbaa !40, !range !16, !noundef !17
  %273 = trunc nuw i8 %272 to i1
  %274 = load ptr, ptr %261, align 8, !tbaa !22
  %275 = getelementptr inbounds ptr, ptr %274, i64 %.0503704
  %276 = load ptr, ptr %275, align 8, !tbaa !6
  %.str.90..str.91 = select i1 %273, ptr @.str.90, ptr @.str.91
  %277 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %.0504703, ptr noundef nonnull dereferenceable(1) %.str.90..str.91, ptr noundef %276) #17
  %.pn = sext i32 %277 to i64
  %.1505 = getelementptr inbounds i8, ptr %.0504703, i64 %.pn
  %278 = load i64, ptr %210, align 8, !tbaa !18
  %279 = add i64 %278, -1
  %280 = icmp ult i64 %.0503704, %279
  br i1 %280, label %281, label %285

281:                                              ; preds = %271
  %282 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %.1505, ptr noundef nonnull dereferenceable(1) @.str.92) #17
  %283 = sext i32 %282 to i64
  %284 = getelementptr inbounds i8, ptr %.1505, i64 %283
  %.pre769 = load i64, ptr %210, align 8, !tbaa !18
  br label %285

285:                                              ; preds = %271, %281
  %286 = phi i64 [ %.pre769, %281 ], [ %278, %271 ]
  %.2506 = phi ptr [ %284, %281 ], [ %.1505, %271 ]
  %287 = add nuw i64 %.0503704, 1
  %288 = icmp ult i64 %287, %286
  br i1 %288, label %271, label %._crit_edge, !llvm.loop !43

._crit_edge:                                      ; preds = %285
  store i8 0, ptr %.2506, align 1, !tbaa !26
  br label %309

289:                                              ; preds = %240
  %290 = icmp eq i64 %241, 1
  br i1 %290, label %291, label %307

291:                                              ; preds = %289
  %292 = getelementptr inbounds i8, ptr %4, i64 45
  %293 = load i8, ptr %292, align 1, !tbaa !40, !range !16, !noundef !17
  %294 = trunc nuw i8 %293 to i1
  %295 = getelementptr inbounds i8, ptr %4, i64 16
  %296 = load ptr, ptr %295, align 8, !tbaa !22
  %297 = load ptr, ptr %296, align 8, !tbaa !6
  br i1 %294, label %298, label %309

298:                                              ; preds = %291
  %299 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %297) #19
  %300 = add i64 %299, 7
  %301 = call noalias ptr @malloc(i64 noundef %300) #20
  %.not562.not = icmp eq ptr %301, null
  br i1 %.not562.not, label %.thread626, label %305

.thread626:                                       ; preds = %298
  %302 = load ptr, ptr @stderr, align 8, !tbaa !6
  %303 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %302, ptr noundef nonnull @.str.93) #18
  %304 = call i32 @close(i32 noundef %87) #17
  br label %.thread628

305:                                              ; preds = %298
  %306 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %301, ptr noundef nonnull dereferenceable(1) @.str.94, ptr noundef %297) #17
  br label %309

307:                                              ; preds = %289
  %308 = call i32 @close(i32 noundef %87) #17
  br label %.thread628

309:                                              ; preds = %291, %._crit_edge, %305
  %.2511 = phi ptr [ %260, %._crit_edge ], [ %301, %305 ], [ %297, %291 ]
  %.1470 = phi ptr [ %260, %._crit_edge ], [ %301, %305 ], [ null, %291 ]
  %310 = getelementptr inbounds i8, ptr %4, i64 40
  %311 = load i8, ptr %310, align 8, !tbaa !36, !range !16, !noundef !17
  %312 = trunc nuw i8 %311 to i1
  %313 = select i1 %312, i32 5, i32 7
  %314 = call i32 @regcomp(ptr noundef nonnull %6, ptr noundef %.2511, i32 noundef %313) #17
  %.not564 = icmp eq i32 %314, 0
  br i1 %.not564, label %320, label %315

315:                                              ; preds = %309
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %9) #17
  %316 = call i64 @regerror(i32 noundef %314, ptr noundef nonnull %6, ptr noundef nonnull %9, i64 noundef 256) #17
  %317 = load ptr, ptr @stderr, align 8, !tbaa !6
  %318 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %317, ptr noundef nonnull @.str.112, ptr noundef %1, ptr noundef nonnull %9) #18
  %319 = call i32 @close(i32 noundef %87) #17
  call void @free(ptr noundef %.1470) #17
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %9) #17
  br label %.thread628

320:                                              ; preds = %309
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %4, i64 48
  store ptr %6, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !6
  %.not565 = icmp eq ptr %.1419, null
  br i1 %.not565, label %322, label %321

321:                                              ; preds = %320
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %4, i64 56
  call void @ac_trie_free(ptr noundef nonnull %.1419) #17
  store ptr null, ptr %.sroa.5.0..sroa_idx, align 8, !tbaa !27
  br label %322

322:                                              ; preds = %321, %320, %.thread622
  %.3472 = phi ptr [ null, %.thread622 ], [ %.1470, %320 ], [ %.1470, %321 ]
  %.5423 = phi ptr [ %.1419, %.thread622 ], [ null, %320 ], [ null, %321 ]
  %323 = call ptr @mmap(ptr noundef null, i64 noundef %107, i32 noundef 1, i32 noundef 32770, i32 noundef %87, i64 noundef 0) #17
  %324 = icmp eq ptr %323, inttoptr (i64 -1 to ptr)
  br i1 %324, label %325, label %.critedge602.thread

325:                                              ; preds = %322
  %326 = tail call ptr @__errno_location() #22
  %327 = load i32, ptr %326, align 4, !tbaa !24
  %328 = icmp eq i32 %327, 95
  br i1 %328, label %.critedge602, label %329

329:                                              ; preds = %325
  %330 = load ptr, ptr @stderr, align 8, !tbaa !6
  %331 = call ptr @strerror(i32 noundef %327) #17
  %332 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %330, ptr noundef nonnull @.str.113, ptr noundef %1, ptr noundef %331) #18
  br label %.critedge602

.critedge602:                                     ; preds = %325, %329
  %333 = call ptr @mmap(ptr noundef null, i64 noundef %107, i32 noundef 1, i32 noundef 2, i32 noundef %87, i64 noundef 0) #17
  %334 = icmp eq ptr %333, inttoptr (i64 -1 to ptr)
  br i1 %334, label %335, label %.critedge602.thread

335:                                              ; preds = %.critedge602
  %336 = load ptr, ptr @stderr, align 8, !tbaa !6
  %337 = load i32, ptr %326, align 4, !tbaa !24
  %338 = call ptr @strerror(i32 noundef %337) #17
  %339 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %336, ptr noundef nonnull @.str.114, ptr noundef %1, ptr noundef %338) #18
  %340 = call i32 @close(i32 noundef %87) #17
  %341 = load i8, ptr %12, align 1, !tbaa !39, !range !16, !noundef !17
  %342 = trunc nuw i8 %341 to i1
  %343 = getelementptr inbounds i8, ptr %4, i64 48
  %344 = load ptr, ptr %343, align 8
  %345 = icmp eq ptr %344, %6
  %or.cond18 = select i1 %342, i1 %345, i1 false
  br i1 %or.cond18, label %346, label %347

346:                                              ; preds = %335
  call void @regfree(ptr noundef nonnull %6) #17
  br label %347

347:                                              ; preds = %346, %335
  call void @free(ptr noundef %.3472) #17
  br label %.thread647

.critedge602.thread:                              ; preds = %322, %.critedge602
  %.0448635 = phi ptr [ %333, %.critedge602 ], [ %323, %322 ]
  %348 = call i32 @madvise(ptr noundef %.0448635, i64 noundef %107, i32 noundef 3) #17
  %.not566 = icmp eq i32 %348, 0
  br i1 %.not566, label %355, label %349

349:                                              ; preds = %.critedge602.thread
  %350 = load ptr, ptr @stderr, align 8, !tbaa !6
  %351 = tail call ptr @__errno_location() #22
  %352 = load i32, ptr %351, align 4, !tbaa !24
  %353 = call ptr @strerror(i32 noundef %352) #17
  %354 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %350, ptr noundef nonnull @.str.115, ptr noundef %1, ptr noundef %353) #18
  br label %355

355:                                              ; preds = %349, %.critedge602.thread
  %356 = call i32 @close(i32 noundef %87) #17
  %357 = icmp eq i32 %2, 0
  br i1 %357, label %358, label %363

358:                                              ; preds = %355
  %359 = call i64 @sysconf(i32 noundef 84) #17
  %360 = icmp sgt i64 %359, 0
  %361 = trunc i64 %359 to i32
  %362 = select i1 %360, i32 %361, i32 1
  br label %363

363:                                              ; preds = %355, %358
  %.0474 = phi i32 [ %362, %358 ], [ %2, %355 ]
  %364 = add i64 %107, 4194303
  %365 = lshr i64 %364, 22
  %366 = trunc i64 %365 to i32
  %367 = icmp sgt i32 %366, 0
  %368 = call i32 @llvm.smin.i32(i32 %.0474, i32 %366)
  %spec.select603 = select i1 %367, i32 %368, i32 %.0474
  %spec.store.select = call i32 @llvm.smax.i32(i32 %spec.select603, i32 1)
  %369 = zext nneg i32 %spec.store.select to i64
  %370 = shl nuw nsw i64 %369, 3
  %calloc = call ptr @calloc(i64 1, i64 %370)
  %371 = mul nuw nsw i64 %369, 56
  %372 = call noalias ptr @malloc(i64 noundef %371) #20
  %.not748 = icmp eq ptr %calloc, null
  %.not749 = icmp eq ptr %372, null
  %or.cond822 = or i1 %.not748, %.not749
  br i1 %or.cond822, label %.thread636, label %373

.thread636:                                       ; preds = %363
  call void @perror(ptr noundef nonnull @.str.116) #23
  br label %.thread665

373:                                              ; preds = %363
  %374 = getelementptr inbounds i8, ptr %4, i64 44
  %375 = load i8, ptr %374, align 4, !tbaa !44, !range !16, !noundef !17
  %376 = trunc nuw i8 %375 to i1
  br i1 %376, label %377, label %.thread638

377:                                              ; preds = %373
  %378 = icmp ugt i64 %107, 1000999
  %379 = udiv i64 %107, 1000
  %380 = select i1 %378, i64 %379, i64 1000
  %381 = call ptr @match_result_init(i64 noundef %380)
  %.not567 = icmp eq ptr %381, null
  br i1 %.not567, label %382, label %.thread638

382:                                              ; preds = %377
  %383 = load ptr, ptr @stderr, align 8, !tbaa !6
  %384 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %383, ptr noundef nonnull @.str.117, ptr noundef %1) #18
  br label %.thread665

.thread638:                                       ; preds = %377, %373
  %.0451 = phi ptr [ null, %373 ], [ %381, %377 ]
  %385 = add i64 %107, -1
  %386 = add i64 %385, %369
  %387 = udiv i64 %386, %369
  %388 = icmp ult i64 %386, %369
  %spec.select604 = select i1 %388, i64 %107, i64 %387
  %389 = icmp ult i64 %spec.select604, 4194304
  %390 = icmp ugt i64 %107, 4194304
  %or.cond26 = and i1 %390, %389
  %minmaxop = select i1 %or.cond26, i32 %366, i32 %spec.select603
  %.2476 = call i32 @llvm.smax.i32(i32 %minmaxop, i32 1)
  %.1468 = select i1 %or.cond26, i64 4194304, i64 %spec.select604
  %391 = load i8, ptr %12, align 1, !tbaa !39, !range !16, !noundef !17
  %392 = trunc nuw i8 %391 to i1
  br i1 %392, label %.loopexit689, label %.preheader688

.preheader688:                                    ; preds = %.thread638
  %393 = load i64, ptr %210, align 8, !tbaa !18
  %.not750 = icmp eq i64 %393, 0
  br i1 %.not750, label %.loopexit689, label %.lr.ph708

.lr.ph708:                                        ; preds = %.preheader688
  %394 = getelementptr inbounds i8, ptr %4, i64 24
  %395 = load ptr, ptr %394, align 8, !tbaa !19
  %min.iters.check843 = icmp ult i64 %393, 4
  br i1 %min.iters.check843, label %scalar.ph842.preheader, label %vector.ph844

vector.ph844:                                     ; preds = %.lr.ph708
  %n.vec846 = and i64 %393, -4
  br label %vector.body848

vector.body848:                                   ; preds = %vector.body848, %vector.ph844
  %index849 = phi i64 [ 0, %vector.ph844 ], [ %index.next854, %vector.body848 ]
  %vec.phi850 = phi <2 x i64> [ zeroinitializer, %vector.ph844 ], [ %398, %vector.body848 ]
  %vec.phi851 = phi <2 x i64> [ zeroinitializer, %vector.ph844 ], [ %399, %vector.body848 ]
  %396 = getelementptr inbounds i64, ptr %395, i64 %index849
  %397 = getelementptr inbounds i8, ptr %396, i64 16
  %wide.load852 = load <2 x i64>, ptr %396, align 8, !tbaa !10
  %wide.load853 = load <2 x i64>, ptr %397, align 8, !tbaa !10
  %398 = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %wide.load852, <2 x i64> %vec.phi850)
  %399 = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %wide.load853, <2 x i64> %vec.phi851)
  %index.next854 = add nuw i64 %index849, 4
  %400 = icmp eq i64 %index.next854, %n.vec846
  br i1 %400, label %middle.block841, label %vector.body848, !llvm.loop !45

middle.block841:                                  ; preds = %vector.body848
  %rdx.minmax = call <2 x i64> @llvm.umax.v2i64(<2 x i64> %398, <2 x i64> %399)
  %401 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> %rdx.minmax)
  %cmp.n855 = icmp eq i64 %393, %n.vec846
  br i1 %cmp.n855, label %.loopexit689, label %scalar.ph842.preheader

scalar.ph842.preheader:                           ; preds = %middle.block841, %.lr.ph708
  %.0458707.ph = phi i64 [ 0, %.lr.ph708 ], [ %n.vec846, %middle.block841 ]
  %.0459706.ph = phi i64 [ 0, %.lr.ph708 ], [ %401, %middle.block841 ]
  br label %scalar.ph842

scalar.ph842:                                     ; preds = %scalar.ph842.preheader, %scalar.ph842
  %.0458707 = phi i64 [ %404, %scalar.ph842 ], [ %.0458707.ph, %scalar.ph842.preheader ]
  %.0459706 = phi i64 [ %spec.select605, %scalar.ph842 ], [ %.0459706.ph, %scalar.ph842.preheader ]
  %402 = getelementptr inbounds i64, ptr %395, i64 %.0458707
  %403 = load i64, ptr %402, align 8, !tbaa !10
  %spec.select605 = call i64 @llvm.umax.i64(i64 %403, i64 %.0459706)
  %404 = add nuw i64 %.0458707, 1
  %exitcond761.not = icmp eq i64 %404, %393
  br i1 %exitcond761.not, label %.loopexit689, label %scalar.ph842, !llvm.loop !46

.loopexit689:                                     ; preds = %scalar.ph842, %middle.block841, %.preheader688, %.thread638
  %.2461 = phi i64 [ 0, %.thread638 ], [ 0, %.preheader688 ], [ %401, %middle.block841 ], [ %spec.select605, %scalar.ph842 ]
  %405 = icmp sgt i32 %2, 0
  br i1 %405, label %409, label %406

406:                                              ; preds = %.loopexit689
  %407 = call i64 @sysconf(i32 noundef 84) #17
  %408 = trunc i64 %407 to i32
  br label %409

409:                                              ; preds = %.loopexit689, %406
  %410 = phi i32 [ %408, %406 ], [ %2, %.loopexit689 ]
  %spec.store.select28 = call i32 @llvm.smax.i32(i32 %410, i32 1)
  %411 = lshr i64 %107, 22
  %412 = trunc i64 %411 to i32
  %.0456 = call i32 @llvm.smin.i32(i32 %spec.store.select28, i32 %412)
  %spec.store.select29 = call i32 @llvm.smax.i32(i32 %.0456, i32 1)
  call void @init_global_thread_pool(i32 noundef %spec.store.select29)
  %413 = icmp ne i64 %.2461, 0
  %414 = add nsw i32 %.2476, -1
  %415 = add i64 %.2461, -1
  %416 = zext nneg i32 %414 to i64
  %417 = sext i32 %minmaxop to i64
  br label %418

418:                                              ; preds = %409, %458
  %indvars.iv = phi i64 [ 0, %409 ], [ %indvars.iv.next, %458 ]
  %.0462711 = phi i32 [ 0, %409 ], [ %.2464, %458 ]
  %.0465710 = phi i64 [ 0, %409 ], [ %.1466, %458 ]
  %419 = getelementptr inbounds %struct.thread_data_t, ptr %372, i64 %indvars.iv
  %420 = trunc nuw nsw i64 %indvars.iv to i32
  store i32 %420, ptr %419, align 8, !tbaa !47
  %421 = getelementptr inbounds i8, ptr %419, i64 8
  store ptr %4, ptr %421, align 8, !tbaa !49
  %422 = getelementptr inbounds i8, ptr %.0448635, i64 %.0465710
  %423 = getelementptr inbounds i8, ptr %419, i64 16
  store ptr %422, ptr %423, align 8, !tbaa !50
  %424 = add i64 %.0465710, %.1468
  %425 = icmp ugt i64 %424, %107
  %426 = sub i64 %107, %.0465710
  %427 = select i1 %425, i64 %426, i64 %.1468
  %428 = load i8, ptr %12, align 1, !tbaa !39, !range !16, !noundef !17
  %429 = trunc nuw i8 %428 to i1
  %not.685 = xor i1 %429, true
  %or.cond32.not = select i1 %not.685, i1 %413, i1 false
  %430 = icmp ult i64 %indvars.iv, %416
  %or.cond607 = select i1 %or.cond32.not, i1 %430, i1 false
  %431 = select i1 %or.cond607, i64 %415, i64 0
  %432 = add i64 %427, %.0465710
  %433 = add i64 %431, %432
  %434 = icmp ugt i64 %433, %107
  %435 = add i64 %431, %427
  %436 = select i1 %434, i64 %426, i64 %435
  %437 = icmp eq i64 %436, 0
  %.0450 = select i1 %437, i64 %426, i64 %436
  %438 = getelementptr inbounds i8, ptr %419, i64 24
  store i64 %.0450, ptr %438, align 8, !tbaa !51
  %439 = getelementptr inbounds i8, ptr %419, i64 32
  %440 = getelementptr inbounds i8, ptr %419, i64 48
  %.not570 = icmp eq i64 %.0450, 0
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(17) %439, i8 0, i64 17, i1 false)
  br i1 %.not570, label %456, label %441

441:                                              ; preds = %418
  %442 = load ptr, ptr @global_thread_pool, align 8, !tbaa !6
  %.not571 = icmp eq ptr %442, null
  br i1 %.not571, label %448, label %443

443:                                              ; preds = %441
  %444 = call zeroext i1 @thread_pool_submit(ptr noundef nonnull %442, ptr noundef nonnull @search_chunk_thread, ptr noundef nonnull %419)
  br i1 %444, label %.critedge610, label %445

445:                                              ; preds = %443
  %446 = load ptr, ptr @stderr, align 8, !tbaa !6
  %447 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %446, ptr noundef nonnull @.str.118, i32 noundef %420) #18
  store i8 1, ptr %440, align 8, !tbaa !52
  br label %.critedge610

448:                                              ; preds = %441
  %449 = getelementptr inbounds i64, ptr %calloc, i64 %indvars.iv
  %450 = call i32 @pthread_create(ptr noundef nonnull %449, ptr noundef null, ptr noundef nonnull @search_chunk_thread, ptr noundef nonnull %419) #17
  %.not572 = icmp eq i32 %450, 0
  br i1 %.not572, label %.critedge610, label %451

451:                                              ; preds = %448
  %452 = load ptr, ptr @stderr, align 8, !tbaa !6
  %453 = call ptr @strerror(i32 noundef %450) #17
  %454 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %452, ptr noundef nonnull @.str.119, i32 noundef %420, ptr noundef %453) #18
  store i64 0, ptr %449, align 8, !tbaa !10
  store i8 1, ptr %440, align 8, !tbaa !52
  br label %458

.critedge610:                                     ; preds = %448, %443, %445
  %455 = add nsw i32 %.0462711, 1
  br label %458

456:                                              ; preds = %418
  %457 = getelementptr inbounds i64, ptr %calloc, i64 %indvars.iv
  store i64 0, ptr %457, align 8, !tbaa !10
  br label %458

458:                                              ; preds = %451, %.critedge610, %456
  %.1466 = phi i64 [ %.0465710, %451 ], [ %432, %456 ], [ %432, %.critedge610 ]
  %.2464 = phi i32 [ %.0462711, %451 ], [ %.0462711, %456 ], [ %455, %.critedge610 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %459 = icmp slt i64 %indvars.iv.next, %417
  %.not568 = icmp ult i64 %.1466, %107
  %or.cond616 = select i1 %459, i1 %.not568, i1 false
  br i1 %or.cond616, label %418, label %460, !llvm.loop !53

460:                                              ; preds = %458
  %461 = load ptr, ptr @global_thread_pool, align 8, !tbaa !6
  %.not573 = icmp eq ptr %461, null
  br i1 %.not573, label %463, label %462

462:                                              ; preds = %460
  call void @thread_pool_wait_all(ptr noundef nonnull %461)
  br label %463

463:                                              ; preds = %462, %460
  %464 = icmp sgt i32 %.2464, 0
  br i1 %464, label %.lr.ph725, label %._crit_edge726.thread785.thread

.lr.ph725:                                        ; preds = %463
  %.not579 = icmp eq i64 %11, -1
  %465 = icmp ne ptr %.0451, null
  %466 = getelementptr inbounds i8, ptr %.0451, i64 8
  %467 = ptrtoint ptr %.0448635 to i64
  %wide.trip.count = zext nneg i32 %.2464 to i64
  br label %.outer

._crit_edge726:                                   ; preds = %.thread794
  %468 = icmp eq i32 %.7435, 2
  br i1 %468, label %582, label %._crit_edge726.thread785

.outer.peel.newph:                                ; preds = %.thread777.peel, %.thread777
  %indvars.iv763 = phi i64 [ %indvars.iv.next764781, %.thread777 ], [ %indvars.iv.next764781.peel, %.thread777.peel ]
  %469 = load ptr, ptr @global_thread_pool, align 8, !tbaa !6
  %.not575 = icmp eq ptr %469, null
  br i1 %.not575, label %470, label %479

470:                                              ; preds = %.outer.peel.newph
  %471 = getelementptr inbounds i64, ptr %calloc, i64 %indvars.iv763
  %472 = load i64, ptr %471, align 8, !tbaa !10
  %.not576 = icmp eq i64 %472, 0
  br i1 %.not576, label %479, label %473

473:                                              ; preds = %470
  %474 = call i32 @pthread_join(i64 noundef %472, ptr noundef null) #17
  %.not577 = icmp eq i32 %474, 0
  br i1 %.not577, label %479, label %.thread788

.thread788:                                       ; preds = %473, %542
  %indvars.iv763.lcssa = phi i64 [ %indvars.iv763.ph, %542 ], [ %indvars.iv763, %473 ]
  %.lcssa882 = phi i32 [ %543, %542 ], [ %474, %473 ]
  %475 = load ptr, ptr @stderr, align 8, !tbaa !6
  %476 = call ptr @strerror(i32 noundef %.lcssa882) #17
  %477 = trunc nuw nsw i64 %indvars.iv763.lcssa to i32
  %478 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %475, ptr noundef nonnull @.str.120, i32 noundef %477, ptr noundef %476) #18
  br label %.thread794

479:                                              ; preds = %473, %470, %.outer.peel.newph
  %480 = getelementptr inbounds %struct.thread_data_t, ptr %372, i64 %indvars.iv763
  %481 = getelementptr inbounds i8, ptr %480, i64 48
  %482 = load i8, ptr %481, align 8, !tbaa !52, !range !16, !noundef !17
  %483 = trunc nuw i8 %482 to i1
  br i1 %483, label %.thread794, label %484

484:                                              ; preds = %479
  br i1 %537, label %.thread777, label %.loopexit900

.loopexit900:                                     ; preds = %484, %549
  %.lcssa888 = phi ptr [ %545, %549 ], [ %480, %484 ]
  %indvars.iv763.lcssa884 = phi i64 [ %indvars.iv763.ph, %549 ], [ %indvars.iv763, %484 ]
  %485 = getelementptr inbounds i8, ptr %.lcssa888, i64 40
  %486 = load i64, ptr %485, align 8, !tbaa !54
  br i1 %.not579, label %489, label %487

487:                                              ; preds = %.loopexit900
  %488 = call i64 @llvm.usub.sat.i64(i64 %11, i64 %.0477717.ph)
  %spec.select612 = call i64 @llvm.umin.i64(i64 %486, i64 %488)
  br label %489

489:                                              ; preds = %487, %.loopexit900
  %.1439 = phi i64 [ %spec.select612, %487 ], [ %486, %.loopexit900 ]
  %490 = add i64 %.1439, %.0477717.ph
  %491 = load i8, ptr %374, align 4, !tbaa !44, !range !16, !noundef !17
  %492 = trunc nuw i8 %491 to i1
  %or.cond34 = and i1 %465, %492
  %493 = getelementptr inbounds i8, ptr %.lcssa888, i64 32
  %494 = load ptr, ptr %493, align 8, !tbaa !55
  %.not581 = icmp eq ptr %494, null
  br i1 %or.cond34, label %495, label %533

495:                                              ; preds = %489
  br i1 %.not581, label %.thread794, label %496

496:                                              ; preds = %495
  br i1 %.not579, label %.critedge614, label %497

497:                                              ; preds = %496
  %498 = load i64, ptr %466, align 8, !tbaa !56
  %499 = icmp ult i64 %498, %11
  br i1 %499, label %500, label %.loopexit

500:                                              ; preds = %497
  %501 = sub i64 %11, %498
  br label %.critedge614

.critedge614:                                     ; preds = %496, %500
  %502 = phi i64 [ %501, %500 ], [ -1, %496 ]
  %503 = getelementptr inbounds i8, ptr %494, i64 8
  %504 = load i64, ptr %503, align 8, !tbaa !56
  %505 = icmp ne i64 %504, 0
  %506 = icmp ne i64 %502, 0
  %507 = select i1 %505, i1 %506, i1 false
  br i1 %507, label %.lr.ph716, label %.loopexit

.lr.ph716:                                        ; preds = %.critedge614
  %508 = getelementptr inbounds i8, ptr %.lcssa888, i64 16
  br label %509

509:                                              ; preds = %.lr.ph716, %525
  %510 = phi ptr [ %494, %.lr.ph716 ], [ %527, %525 ]
  %.0425715 = phi i64 [ 0, %.lr.ph716 ], [ %526, %525 ]
  %511 = load ptr, ptr %508, align 8, !tbaa !50
  %512 = ptrtoint ptr %511 to i64
  %513 = sub i64 %512, %467
  %514 = load ptr, ptr %510, align 8, !tbaa !58
  %515 = getelementptr inbounds %struct.match_position_t, ptr %514, i64 %.0425715
  %516 = load i64, ptr %515, align 8, !tbaa !59
  %517 = add i64 %516, %513
  %518 = getelementptr inbounds i8, ptr %515, i64 8
  %519 = load i64, ptr %518, align 8, !tbaa !61
  %520 = add i64 %519, %513
  %521 = call zeroext i1 @match_result_add(ptr noundef nonnull %.0451, i64 noundef %517, i64 noundef %520)
  br i1 %521, label %525, label %.thread799

.thread799:                                       ; preds = %509
  %522 = load ptr, ptr @stderr, align 8, !tbaa !6
  %523 = trunc nuw nsw i64 %indvars.iv763.lcssa884 to i32
  %524 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %522, ptr noundef nonnull @.str.121, ptr noundef %1, i32 noundef %523) #18
  %.pre770 = load ptr, ptr %493, align 8, !tbaa !55
  call void @match_result_free(ptr noundef %.pre770)
  store ptr null, ptr %493, align 8, !tbaa !55
  br label %.thread794

525:                                              ; preds = %509
  %526 = add nuw i64 %.0425715, 1
  %527 = load ptr, ptr %493, align 8, !tbaa !55
  %528 = getelementptr inbounds i8, ptr %527, i64 8
  %529 = load i64, ptr %528, align 8, !tbaa !56
  %530 = icmp ult i64 %526, %529
  %531 = icmp ult i64 %526, %502
  %532 = select i1 %530, i1 %531, i1 false
  br i1 %532, label %509, label %.loopexit, !llvm.loop !62

533:                                              ; preds = %489
  br i1 %.not581, label %.thread794, label %534

534:                                              ; preds = %533
  %535 = getelementptr inbounds i8, ptr %.lcssa888, i64 32
  call void @match_result_free(ptr noundef nonnull %494)
  store ptr null, ptr %535, align 8, !tbaa !55
  br label %.thread794

.loopexit:                                        ; preds = %525, %497, %.critedge614
  %536 = phi ptr [ %494, %497 ], [ %494, %.critedge614 ], [ %527, %525 ]
  call void @match_result_free(ptr noundef nonnull %536)
  store ptr null, ptr %493, align 8, !tbaa !55
  %.pre773 = trunc i8 %.0441718.ph to i1
  %spec.select = select i1 %.pre773, i32 2, i32 1
  br label %.thread794

.thread794:                                       ; preds = %544, %479, %.loopexit, %495, %534, %533, %.thread799, %.thread788
  %indvars.iv763886 = phi i64 [ %indvars.iv763.lcssa, %.thread788 ], [ %indvars.iv763.lcssa884, %.thread799 ], [ %indvars.iv763.lcssa884, %533 ], [ %indvars.iv763.lcssa884, %534 ], [ %indvars.iv763.lcssa884, %495 ], [ %indvars.iv763.lcssa884, %.loopexit ], [ %indvars.iv763.ph, %544 ], [ %indvars.iv763, %479 ]
  %.1478 = phi i64 [ %.0477717.ph, %.thread788 ], [ %490, %.thread799 ], [ %490, %533 ], [ %490, %534 ], [ %490, %495 ], [ %490, %.loopexit ], [ %.0477717.ph, %479 ], [ %.0477717.ph, %544 ]
  %.6447 = phi i8 [ %.0441718.ph, %.thread788 ], [ 1, %.thread799 ], [ %.0441718.ph, %533 ], [ %.0441718.ph, %534 ], [ %.0441718.ph, %495 ], [ %.0441718.ph, %.loopexit ], [ %.0441718.ph, %479 ], [ %.0441718.ph, %544 ]
  %.7435 = phi i32 [ 2, %.thread788 ], [ 2, %.thread799 ], [ 1, %533 ], [ 1, %534 ], [ 1, %495 ], [ %spec.select, %.loopexit ], [ 2, %479 ], [ 2, %544 ]
  %indvars.iv.next764 = add nuw nsw i64 %indvars.iv763886, 1
  %exitcond765.not = icmp eq i64 %indvars.iv.next764, %wide.trip.count
  br i1 %exitcond765.not, label %._crit_edge726, label %.outer, !llvm.loop !63

.outer:                                           ; preds = %.thread794, %.lr.ph725
  %indvars.iv763.ph = phi i64 [ %indvars.iv.next764, %.thread794 ], [ 0, %.lr.ph725 ]
  %.2430723.ph = phi i32 [ %.7435, %.thread794 ], [ 1, %.lr.ph725 ]
  %.0441718.ph = phi i8 [ %.6447, %.thread794 ], [ 0, %.lr.ph725 ]
  %.0477717.ph = phi i64 [ %.1478, %.thread794 ], [ 0, %.lr.ph725 ]
  %537 = trunc nuw i8 %.0441718.ph to i1
  %538 = load ptr, ptr @global_thread_pool, align 8, !tbaa !6
  %.not575.peel = icmp eq ptr %538, null
  br i1 %.not575.peel, label %539, label %544

539:                                              ; preds = %.outer
  %540 = getelementptr inbounds i64, ptr %calloc, i64 %indvars.iv763.ph
  %541 = load i64, ptr %540, align 8, !tbaa !10
  %.not576.peel = icmp eq i64 %541, 0
  br i1 %.not576.peel, label %544, label %542

542:                                              ; preds = %539
  %543 = call i32 @pthread_join(i64 noundef %541, ptr noundef null) #17
  %.not577.peel = icmp eq i32 %543, 0
  br i1 %.not577.peel, label %544, label %.thread788

544:                                              ; preds = %542, %539, %.outer
  %545 = getelementptr inbounds %struct.thread_data_t, ptr %372, i64 %indvars.iv763.ph
  %546 = getelementptr inbounds i8, ptr %545, i64 48
  %547 = load i8, ptr %546, align 8, !tbaa !52, !range !16, !noundef !17
  %548 = trunc nuw i8 %547 to i1
  %.not578684.peel = icmp eq i32 %.2430723.ph, 2
  %.not578.peel = or i1 %.not578684.peel, %548
  br i1 %.not578.peel, label %.thread794, label %549

549:                                              ; preds = %544
  br i1 %537, label %.thread777.peel, label %.loopexit900

.thread777.peel:                                  ; preds = %549
  %indvars.iv.next764781.peel = add nuw nsw i64 %indvars.iv763.ph, 1
  %exitcond765.not782.peel = icmp eq i64 %indvars.iv.next764781.peel, %wide.trip.count
  br i1 %exitcond765.not782.peel, label %._crit_edge726.thread785, label %.outer.peel.newph

.thread777:                                       ; preds = %484
  %indvars.iv.next764781 = add nuw nsw i64 %indvars.iv763, 1
  %exitcond765.not782 = icmp eq i64 %indvars.iv.next764781, %wide.trip.count
  br i1 %exitcond765.not782, label %._crit_edge726.thread785, label %.outer.peel.newph, !llvm.loop !64

._crit_edge726.thread785:                         ; preds = %.thread777, %.thread777.peel, %._crit_edge726
  %.0477.lcssa776 = phi i64 [ %.1478, %._crit_edge726 ], [ %.0477717.ph, %.thread777.peel ], [ %.0477717.ph, %.thread777 ]
  %.not823 = icmp eq i64 %.0477.lcssa776, 0
  br i1 %.not823, label %._crit_edge726.thread785.thread, label %550

550:                                              ; preds = %._crit_edge726.thread785
  store atomic i8 1, ptr @global_match_found_flag seq_cst, align 1
  br label %._crit_edge726.thread785.thread

._crit_edge726.thread785.thread:                  ; preds = %463, %550, %._crit_edge726.thread785
  %.shrunk = phi i1 [ %.not823, %550 ], [ %.not823, %._crit_edge726.thread785 ], [ true, %463 ]
  %551 = phi i1 [ true, %550 ], [ false, %._crit_edge726.thread785 ], [ false, %463 ]
  %.0477.lcssa776806 = phi i64 [ %.0477.lcssa776, %550 ], [ 0, %._crit_edge726.thread785 ], [ 0, %463 ]
  %552 = zext i1 %.shrunk to i32
  %553 = getelementptr inbounds i8, ptr %4, i64 42
  %554 = load i8, ptr %553, align 2, !tbaa !37, !range !16, !noundef !17
  %555 = trunc nuw i8 %554 to i1
  br i1 %555, label %560, label %556

556:                                              ; preds = %._crit_edge726.thread785.thread
  %557 = getelementptr inbounds i8, ptr %4, i64 43
  %558 = load i8, ptr %557, align 1, !tbaa !38, !range !16, !noundef !17
  %559 = trunc nuw i8 %558 to i1
  br i1 %559, label %560, label %562

560:                                              ; preds = %556, %._crit_edge726.thread785.thread
  %561 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.122, ptr noundef %1, i64 noundef %.0477.lcssa776806)
  br label %582

562:                                              ; preds = %556
  %563 = icmp ne ptr %.0451, null
  %or.cond36 = and i1 %563, %551
  br i1 %or.cond36, label %564, label %569

564:                                              ; preds = %562
  %565 = load ptr, ptr %.0451, align 8, !tbaa !58
  %566 = getelementptr inbounds i8, ptr %.0451, i64 8
  %567 = load i64, ptr %566, align 8, !tbaa !56
  call void @qsort(ptr noundef %565, i64 noundef %567, i64 noundef 16, ptr noundef nonnull @compare_match_positions) #17
  %568 = call i64 @print_matching_items(ptr noundef %1, ptr noundef %.0448635, i64 noundef %107, ptr noundef nonnull %.0451, ptr noundef nonnull %4)
  br label %582

569:                                              ; preds = %562
  br i1 %551, label %570, label %582

570:                                              ; preds = %569
  br i1 %563, label %571, label %575

571:                                              ; preds = %570
  %572 = getelementptr inbounds i8, ptr %.0451, i64 8
  %573 = load i64, ptr %572, align 8, !tbaa !56
  %574 = icmp eq i64 %573, 0
  br i1 %574, label %575, label %582

575:                                              ; preds = %571, %570
  %576 = load i8, ptr @only_matching, align 1, !tbaa !12, !range !16, !noundef !17
  %577 = trunc nuw i8 %576 to i1
  br i1 %577, label %578, label %580

578:                                              ; preds = %575
  %579 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.123, ptr noundef %1)
  br label %582

580:                                              ; preds = %575
  %581 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.108, ptr noundef %1)
  br label %582

582:                                              ; preds = %._crit_edge726, %564, %578, %580, %571, %569, %560
  %.8436 = phi i32 [ %552, %560 ], [ %552, %564 ], [ %552, %578 ], [ %552, %580 ], [ %552, %571 ], [ %552, %569 ], [ 2, %._crit_edge726 ]
  %.not583 = icmp eq ptr %.0448635, inttoptr (i64 -1 to ptr)
  br i1 %.not583, label %.thread647, label %.thread665

.thread665:                                       ; preds = %.thread636, %382, %582
  %.8436681 = phi i32 [ %.8436, %582 ], [ 2, %382 ], [ 2, %.thread636 ]
  %.1452678 = phi ptr [ %.0451, %582 ], [ null, %382 ], [ null, %.thread636 ]
  %583 = call i32 @munmap(ptr noundef %.0448635, i64 noundef %107) #17
  br label %.thread647

.thread647:                                       ; preds = %233, %347, %.thread665, %582
  %.6424663 = phi ptr [ %.5423, %.thread665 ], [ %.5423, %582 ], [ null, %233 ], [ %.5423, %347 ]
  %.8436662 = phi i32 [ %.8436681, %.thread665 ], [ %.8436, %582 ], [ 2, %233 ], [ 2, %347 ]
  %.0437661 = phi i32 [ -1, %.thread665 ], [ -1, %582 ], [ %87, %233 ], [ %87, %347 ]
  %.1452660 = phi ptr [ %.1452678, %.thread665 ], [ %.0451, %582 ], [ null, %233 ], [ null, %347 ]
  %.0453659 = phi ptr [ %calloc, %.thread665 ], [ %calloc, %582 ], [ null, %233 ], [ null, %347 ]
  %.0455658 = phi ptr [ %372, %.thread665 ], [ %372, %582 ], [ null, %233 ], [ null, %347 ]
  %.4473657 = phi ptr [ %.3472, %.thread665 ], [ %.3472, %582 ], [ null, %233 ], [ %.3472, %347 ]
  %584 = load i8, ptr %12, align 1, !tbaa !39, !range !16, !noundef !17
  %585 = trunc nuw i8 %584 to i1
  %586 = getelementptr inbounds i8, ptr %4, i64 48
  %587 = load ptr, ptr %586, align 8
  %588 = icmp eq ptr %587, %6
  %or.cond39 = select i1 %585, i1 %588, i1 false
  br i1 %or.cond39, label %589, label %590

589:                                              ; preds = %.thread647
  call void @regfree(ptr noundef nonnull %6) #17
  br label %590

590:                                              ; preds = %589, %.thread647
  call void @free(ptr noundef %.4473657) #17
  call void @match_result_free(ptr noundef %.1452660)
  call void @free(ptr noundef %.0453659) #17
  call void @free(ptr noundef %.0455658) #17
  %.not584 = icmp eq i32 %.0437661, -1
  br i1 %.not584, label %593, label %591

591:                                              ; preds = %590
  %592 = call i32 @close(i32 noundef %.0437661) #17
  br label %593

593:                                              ; preds = %591, %590
  %.not585 = icmp eq ptr %.6424663, null
  br i1 %.not585, label %.thread628, label %594

594:                                              ; preds = %593
  call void @ac_trie_free(ptr noundef nonnull %.6424663) #17
  br label %.thread628

.thread628:                                       ; preds = %.thread626, %.thread624, %315, %307, %176, %.thread, %.split700.us, %.split.us, %594, %593, %223, %227, %196, %205, %201, %41, %68, %83, %85, %78, %59, %98, %89
  %.18 = phi i32 [ 2, %89 ], [ 2, %98 ], [ 2, %41 ], [ 2, %59 ], [ 2, %68 ], [ 2, %78 ], [ %84, %85 ], [ %84, %83 ], [ 0, %196 ], [ 1, %176 ], [ 1, %205 ], [ 1, %201 ], [ 1, %227 ], [ 1, %223 ], [ %.8436662, %594 ], [ %.8436662, %593 ], [ 2, %.split.us ], [ 2, %.split700.us ], [ 2, %.thread ], [ 2, %.thread626 ], [ 2, %.thread624 ], [ 2, %315 ], [ 1, %307 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %6) #17
  call void @llvm.lifetime.end.p0(i64 144, ptr nonnull %5) #17
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %4) #17
  ret i32 %.18
}

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

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

; Function Attrs: nofree nounwind memory(read)
declare noundef i32 @ferror(ptr nocapture noundef) local_unnamed_addr #11

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

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

; Function Attrs: nofree
declare noundef i32 @open(ptr nocapture noundef readonly, i32 noundef, ...) local_unnamed_addr #14

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

declare i32 @close(i32 noundef) local_unnamed_addr #10

declare zeroext i1 @ac_trie_root_has_outputs(ptr noundef) local_unnamed_addr #10

; Function Attrs: nounwind
declare ptr @mmap(ptr noundef, i64 noundef, i32 noundef, i32 noundef, i32 noundef, i64 noundef) local_unnamed_addr #12

; Function Attrs: nounwind
declare i32 @madvise(ptr noundef, i64 noundef, i32 noundef) local_unnamed_addr #12

; Function Attrs: nounwind
declare i64 @sysconf(i32 noundef) local_unnamed_addr #12

; Function Attrs: nounwind uwtable
declare hidden void @init_global_thread_pool(i32 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local zeroext i1 @thread_pool_submit(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind
declare i32 @pthread_create(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #12

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

declare i32 @pthread_join(i64 noundef, ptr noundef) local_unnamed_addr #10

; Function Attrs: nofree
declare void @qsort(ptr noundef, i64 noundef, i64 noundef, ptr nocapture noundef) local_unnamed_addr #14

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

; Function Attrs: nounwind
declare i32 @munmap(ptr noundef, i64 noundef) local_unnamed_addr #12

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.usub.sat.i64(i64, i64) #15

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

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

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

; Function Attrs: nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @calloc(i64 noundef, i64 noundef) local_unnamed_addr #16

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>) #15

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x i64> @llvm.umax.v2i64(<2 x i64>, <2 x i64>) #15

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>) #15

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

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


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