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

; 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.re_pattern_buffer = type { ptr, i64, i64, i64, ptr, ptr, i64, i8 }
%struct.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }
%struct.match_result_t = type { ptr, 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.83 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.84 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.85 = external hidden unnamed_addr constant [74 x i8], align 1
@.str.86 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.87 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.88 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [53 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.95 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.96 = external hidden unnamed_addr constant [5 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

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

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

; 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) #4

; 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) #5

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @search_string(ptr noundef %0, ptr noundef %1) #1 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca %struct.re_pattern_buffer, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i8, align 1
  %13 = alloca %struct.search_params, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i32, align 4
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i8, align 1
  %19 = alloca ptr, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca ptr, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca [256 x i8], align 16
  %29 = alloca ptr, align 8
  %30 = alloca i8, align 1
  %31 = alloca i64, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #7
  store i64 0, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  store i64 0, ptr %7, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  store ptr null, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #7
  store i32 1, ptr %9, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 64, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #7
  store ptr null, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %12) #7
  store i8 0, ptr %12, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 72, ptr %13) #7
  %32 = load ptr, ptr %4, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %13, ptr align 8 %32, i64 72, i1 false), !tbaa.struct !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  store ptr null, ptr %14, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %34 = load i64, ptr %33, align 8, !tbaa !16
  %35 = icmp eq i64 %34, 0
  br i1 %35, label %36, label %39

36:                                               ; preds = %2
  %37 = load ptr, ptr @stderr, align 8, !tbaa !5
  %38 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %37, ptr noundef @.str.83) #7
  store i32 2, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %435

39:                                               ; preds = %2
  %40 = load ptr, ptr %5, align 8, !tbaa !5
  %41 = icmp ne ptr %40, null
  br i1 %41, label %45, label %42

42:                                               ; preds = %39
  %43 = load ptr, ptr @stderr, align 8, !tbaa !5
  %44 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %43, ptr noundef @.str.84) #7
  store i32 2, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %435

45:                                               ; preds = %39
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  %47 = call i64 @strlen(ptr noundef %46) #8
  store i64 %47, ptr %6, align 8, !tbaa !9
  %48 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 6
  %49 = load i8, ptr %48, align 1, !tbaa !18, !range !19, !noundef !20
  %50 = trunc i8 %49 to i1
  br i1 %50, label %96, label %51

51:                                               ; preds = %45
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  store i64 0, ptr %16, align 8, !tbaa !9
  br label %52

52:                                               ; preds = %90, %51
  %53 = load i64, ptr %16, align 8, !tbaa !9
  %54 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %55 = load i64, ptr %54, align 8, !tbaa !16
  %56 = icmp ult i64 %53, %55
  br i1 %56, label %58, label %57

57:                                               ; preds = %52
  store i32 2, ptr %15, align 4
  br label %93

58:                                               ; preds = %52
  %59 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 3
  %60 = load ptr, ptr %59, align 8, !tbaa !21
  %61 = load i64, ptr %16, align 8, !tbaa !9
  %62 = getelementptr inbounds i64, ptr %60, i64 %61
  %63 = load i64, ptr %62, align 8, !tbaa !9
  %64 = icmp eq i64 %63, 0
  br i1 %64, label %65, label %73

65:                                               ; preds = %58
  %66 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %67 = load i64, ptr %66, align 8, !tbaa !16
  %68 = icmp ugt i64 %67, 1
  br i1 %68, label %69, label %72

69:                                               ; preds = %65
  %70 = load ptr, ptr @stderr, align 8, !tbaa !5
  %71 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %70, ptr noundef @.str.85) #7
  store i32 2, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %93

72:                                               ; preds = %65
  br label %89

73:                                               ; preds = %58
  %74 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 3
  %75 = load ptr, ptr %74, align 8, !tbaa !21
  %76 = load i64, ptr %16, align 8, !tbaa !9
  %77 = getelementptr inbounds i64, ptr %75, i64 %76
  %78 = load i64, ptr %77, align 8, !tbaa !9
  %79 = icmp ugt i64 %78, 1024
  br i1 %79, label %80, label %88

80:                                               ; preds = %73
  %81 = load ptr, ptr @stderr, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 2
  %83 = load ptr, ptr %82, align 8, !tbaa !22
  %84 = load i64, ptr %16, align 8, !tbaa !9
  %85 = getelementptr inbounds ptr, ptr %83, i64 %84
  %86 = load ptr, ptr %85, align 8, !tbaa !5
  %87 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %81, ptr noundef @.str.86, ptr noundef %86, i32 noundef 1024) #7
  store i32 2, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %93

88:                                               ; preds = %73
  br label %89

89:                                               ; preds = %88, %72
  br label %90

90:                                               ; preds = %89
  %91 = load i64, ptr %16, align 8, !tbaa !9
  %92 = add i64 %91, 1
  store i64 %92, ptr %16, align 8, !tbaa !9
  br label %52, !llvm.loop !23

93:                                               ; preds = %80, %69, %57
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  %94 = load i32, ptr %15, align 4
  switch i32 %94, label %435 [
    i32 2, label %95
  ]

95:                                               ; preds = %93
  br label %96

96:                                               ; preds = %95, %45
  %97 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 9
  %98 = load i8, ptr %97, align 4, !tbaa !25, !range !19, !noundef !20
  %99 = trunc i8 %98 to i1
  br i1 %99, label %100, label %117

100:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  %101 = load i64, ptr %6, align 8, !tbaa !9
  %102 = icmp ugt i64 %101, 10000
  %103 = zext i1 %102 to i64
  %104 = select i1 %102, i32 1000, i32 16
  %105 = sext i32 %104 to i64
  store i64 %105, ptr %17, align 8, !tbaa !9
  %106 = load i64, ptr %17, align 8, !tbaa !9
  %107 = call ptr @match_result_init(i64 noundef %106)
  store ptr %107, ptr %8, align 8, !tbaa !5
  %108 = load ptr, ptr %8, align 8, !tbaa !5
  %109 = icmp ne ptr %108, null
  br i1 %109, label %113, label %110

110:                                              ; preds = %100
  %111 = load ptr, ptr @stderr, align 8, !tbaa !5
  %112 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %111, ptr noundef @.str.87) #7
  store i32 2, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %114

113:                                              ; preds = %100
  store i32 0, ptr %15, align 4
  br label %114

114:                                              ; preds = %113, %110
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  %115 = load i32, ptr %15, align 4
  switch i32 %115, label %435 [
    i32 0, label %116
  ]

116:                                              ; preds = %114
  br label %117

117:                                              ; preds = %116, %96
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #7
  %118 = load ptr, ptr %4, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.search_params, ptr %118, i32 0, i32 4
  %120 = load i64, ptr %119, align 8, !tbaa !16
  %121 = icmp ugt i64 %120, 1
  br i1 %121, label %122, label %128

122:                                              ; preds = %117
  %123 = load ptr, ptr %4, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.search_params, ptr %123, i32 0, i32 6
  %125 = load i8, ptr %124, align 1, !tbaa !18, !range !19, !noundef !20
  %126 = trunc i8 %125 to i1
  %127 = xor i1 %126, true
  br label %128

128:                                              ; preds = %122, %117
  %129 = phi i1 [ false, %117 ], [ %127, %122 ]
  %130 = zext i1 %129 to i8
  store i8 %130, ptr %18, align 1, !tbaa !13
  %131 = load i8, ptr %18, align 1, !tbaa !13, !range !19, !noundef !20
  %132 = trunc i8 %131 to i1
  br i1 %132, label %133, label %143

133:                                              ; preds = %128
  %134 = call ptr @ac_trie_build(ptr noundef %13)
  store ptr %134, ptr %14, align 8, !tbaa !5
  %135 = load ptr, ptr %14, align 8, !tbaa !5
  %136 = icmp ne ptr %135, null
  br i1 %136, label %140, label %137

137:                                              ; preds = %133
  %138 = load ptr, ptr @stderr, align 8, !tbaa !5
  %139 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %138, ptr noundef @.str.88) #7
  store i32 2, ptr %9, align 4, !tbaa !11
  br label %421

140:                                              ; preds = %133
  %141 = load ptr, ptr %14, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 12
  store ptr %141, ptr %142, align 8, !tbaa !26
  br label %143

143:                                              ; preds = %140, %128
  %144 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 6
  %145 = load i8, ptr %144, align 1, !tbaa !18, !range !19, !noundef !20
  %146 = trunc i8 %145 to i1
  br i1 %146, label %147, label %310

147:                                              ; preds = %143
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  store ptr null, ptr %19, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %149 = load i64, ptr %148, align 8, !tbaa !16
  %150 = icmp ugt i64 %149, 1
  br i1 %150, label %151, label %242

151:                                              ; preds = %147
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  store i64 0, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #7
  store i64 0, ptr %21, align 8, !tbaa !9
  br label %152

152:                                              ; preds = %174, %151
  %153 = load i64, ptr %21, align 8, !tbaa !9
  %154 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %155 = load i64, ptr %154, align 8, !tbaa !16
  %156 = icmp ult i64 %153, %155
  br i1 %156, label %158, label %157

157:                                              ; preds = %152
  store i32 6, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #7
  br label %177

158:                                              ; preds = %152
  %159 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 3
  %160 = load ptr, ptr %159, align 8, !tbaa !21
  %161 = load i64, ptr %21, align 8, !tbaa !9
  %162 = getelementptr inbounds i64, ptr %160, i64 %161
  %163 = load i64, ptr %162, align 8, !tbaa !9
  %164 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 10
  %165 = load i8, ptr %164, align 1, !tbaa !27, !range !19, !noundef !20
  %166 = trunc i8 %165 to i1
  %167 = zext i1 %166 to i64
  %168 = select i1 %166, i32 6, i32 2
  %169 = sext i32 %168 to i64
  %170 = add i64 %163, %169
  %171 = add i64 %170, 1
  %172 = load i64, ptr %20, align 8, !tbaa !9
  %173 = add i64 %172, %171
  store i64 %173, ptr %20, align 8, !tbaa !9
  br label %174

174:                                              ; preds = %158
  %175 = load i64, ptr %21, align 8, !tbaa !9
  %176 = add i64 %175, 1
  store i64 %176, ptr %21, align 8, !tbaa !9
  br label %152, !llvm.loop !28

177:                                              ; preds = %157
  %178 = load i64, ptr %20, align 8, !tbaa !9
  %179 = add i64 %178, 1
  %180 = call noalias ptr @malloc(i64 noundef %179) #9
  store ptr %180, ptr %11, align 8, !tbaa !5
  %181 = load ptr, ptr %11, align 8, !tbaa !5
  %182 = icmp ne ptr %181, null
  br i1 %182, label %186, label %183

183:                                              ; preds = %177
  %184 = load ptr, ptr @stderr, align 8, !tbaa !5
  %185 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %184, ptr noundef @.str.89) #7
  store i32 5, ptr %15, align 4
  br label %239

186:                                              ; preds = %177
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  %187 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %187, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #7
  store i64 0, ptr %23, align 8, !tbaa !9
  br label %188

188:                                              ; preds = %233, %186
  %189 = load i64, ptr %23, align 8, !tbaa !9
  %190 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %191 = load i64, ptr %190, align 8, !tbaa !16
  %192 = icmp ult i64 %189, %191
  br i1 %192, label %194, label %193

193:                                              ; preds = %188
  store i32 9, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #7
  br label %236

194:                                              ; preds = %188
  %195 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 10
  %196 = load i8, ptr %195, align 1, !tbaa !27, !range !19, !noundef !20
  %197 = trunc i8 %196 to i1
  br i1 %197, label %198, label %209

198:                                              ; preds = %194
  %199 = load ptr, ptr %22, align 8, !tbaa !5
  %200 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 2
  %201 = load ptr, ptr %200, align 8, !tbaa !22
  %202 = load i64, ptr %23, align 8, !tbaa !9
  %203 = getelementptr inbounds ptr, ptr %201, i64 %202
  %204 = load ptr, ptr %203, align 8, !tbaa !5
  %205 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %199, ptr noundef @.str.90, ptr noundef %204) #7
  %206 = load ptr, ptr %22, align 8, !tbaa !5
  %207 = sext i32 %205 to i64
  %208 = getelementptr inbounds i8, ptr %206, i64 %207
  store ptr %208, ptr %22, align 8, !tbaa !5
  br label %220

209:                                              ; preds = %194
  %210 = load ptr, ptr %22, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 2
  %212 = load ptr, ptr %211, align 8, !tbaa !22
  %213 = load i64, ptr %23, align 8, !tbaa !9
  %214 = getelementptr inbounds ptr, ptr %212, i64 %213
  %215 = load ptr, ptr %214, align 8, !tbaa !5
  %216 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %210, ptr noundef @.str.91, ptr noundef %215) #7
  %217 = load ptr, ptr %22, align 8, !tbaa !5
  %218 = sext i32 %216 to i64
  %219 = getelementptr inbounds i8, ptr %217, i64 %218
  store ptr %219, ptr %22, align 8, !tbaa !5
  br label %220

220:                                              ; preds = %209, %198
  %221 = load i64, ptr %23, align 8, !tbaa !9
  %222 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %223 = load i64, ptr %222, align 8, !tbaa !16
  %224 = sub i64 %223, 1
  %225 = icmp ult i64 %221, %224
  br i1 %225, label %226, label %232

226:                                              ; preds = %220
  %227 = load ptr, ptr %22, align 8, !tbaa !5
  %228 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %227, ptr noundef @.str.92) #7
  %229 = load ptr, ptr %22, align 8, !tbaa !5
  %230 = sext i32 %228 to i64
  %231 = getelementptr inbounds i8, ptr %229, i64 %230
  store ptr %231, ptr %22, align 8, !tbaa !5
  br label %232

232:                                              ; preds = %226, %220
  br label %233

233:                                              ; preds = %232
  %234 = load i64, ptr %23, align 8, !tbaa !9
  %235 = add i64 %234, 1
  store i64 %235, ptr %23, align 8, !tbaa !9
  br label %188, !llvm.loop !29

236:                                              ; preds = %193
  %237 = load ptr, ptr %22, align 8, !tbaa !5
  store i8 0, ptr %237, align 1, !tbaa !30
  %238 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %238, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  store i32 0, ptr %15, align 4
  br label %239

239:                                              ; preds = %236, %183
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  %240 = load i32, ptr %15, align 4
  switch i32 %240, label %307 [
    i32 0, label %241
  ]

241:                                              ; preds = %239
  br label %285

242:                                              ; preds = %147
  %243 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 4
  %244 = load i64, ptr %243, align 8, !tbaa !16
  %245 = icmp eq i64 %244, 1
  br i1 %245, label %246, label %283

246:                                              ; preds = %242
  %247 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 10
  %248 = load i8, ptr %247, align 1, !tbaa !27, !range !19, !noundef !20
  %249 = trunc i8 %248 to i1
  br i1 %249, label %250, label %277

250:                                              ; preds = %246
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  %251 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 2
  %252 = load ptr, ptr %251, align 8, !tbaa !22
  %253 = getelementptr inbounds ptr, ptr %252, i64 0
  %254 = load ptr, ptr %253, align 8, !tbaa !5
  %255 = call i64 @strlen(ptr noundef %254) #8
  store i64 %255, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %256 = load i64, ptr %24, align 8, !tbaa !9
  %257 = add i64 %256, 7
  %258 = call noalias ptr @malloc(i64 noundef %257) #9
  store ptr %258, ptr %25, align 8, !tbaa !5
  %259 = load ptr, ptr %25, align 8, !tbaa !5
  %260 = icmp ne ptr %259, null
  br i1 %260, label %264, label %261

261:                                              ; preds = %250
  %262 = load ptr, ptr @stderr, align 8, !tbaa !5
  %263 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %262, ptr noundef @.str.93) #7
  store i32 2, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %274

264:                                              ; preds = %250
  %265 = load ptr, ptr %25, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 2
  %267 = load ptr, ptr %266, align 8, !tbaa !22
  %268 = getelementptr inbounds ptr, ptr %267, i64 0
  %269 = load ptr, ptr %268, align 8, !tbaa !5
  %270 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %265, ptr noundef @.str.94, ptr noundef %269) #7
  %271 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %271, ptr %19, align 8, !tbaa !5
  %272 = load ptr, ptr %11, align 8, !tbaa !5
  call void @free(ptr noundef %272) #7
  %273 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %273, ptr %11, align 8, !tbaa !5
  store i32 0, ptr %15, align 4
  br label %274

274:                                              ; preds = %264, %261
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  %275 = load i32, ptr %15, align 4
  switch i32 %275, label %307 [
    i32 0, label %276
  ]

276:                                              ; preds = %274
  br label %282

277:                                              ; preds = %246
  %278 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 2
  %279 = load ptr, ptr %278, align 8, !tbaa !22
  %280 = getelementptr inbounds ptr, ptr %279, i64 0
  %281 = load ptr, ptr %280, align 8, !tbaa !5
  store ptr %281, ptr %19, align 8, !tbaa !5
  br label %282

282:                                              ; preds = %277, %276
  br label %284

283:                                              ; preds = %242
  store i32 5, ptr %15, align 4
  br label %307

284:                                              ; preds = %282
  br label %285

285:                                              ; preds = %284, %241
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  %286 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 5
  %287 = load i8, ptr %286, align 8, !tbaa !31, !range !19, !noundef !20
  %288 = trunc i8 %287 to i1
  %289 = zext i1 %288 to i64
  %290 = select i1 %288, i32 0, i32 2
  %291 = or i32 5, %290
  store i32 %291, ptr %26, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  %292 = load ptr, ptr %19, align 8, !tbaa !5
  %293 = load i32, ptr %26, align 4, !tbaa !11
  %294 = call i32 @regcomp(ptr noundef %10, ptr noundef %292, i32 noundef %293)
  store i32 %294, ptr %27, align 4, !tbaa !11
  %295 = load i32, ptr %27, align 4, !tbaa !11
  %296 = icmp ne i32 %295, 0
  br i1 %296, label %297, label %304

297:                                              ; preds = %285
  call void @llvm.lifetime.start.p0(i64 256, ptr %28) #7
  %298 = load i32, ptr %27, align 4, !tbaa !11
  %299 = getelementptr inbounds [256 x i8], ptr %28, i64 0, i64 0
  %300 = call i64 @regerror(i32 noundef %298, ptr noundef %10, ptr noundef %299, i64 noundef 256)
  %301 = load ptr, ptr @stderr, align 8, !tbaa !5
  %302 = getelementptr inbounds [256 x i8], ptr %28, i64 0, i64 0
  %303 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %301, ptr noundef @.str.95, ptr noundef %302) #7
  store i32 5, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 256, ptr %28) #7
  br label %306

304:                                              ; preds = %285
  store i8 1, ptr %12, align 1, !tbaa !13
  %305 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 11
  store ptr %10, ptr %305, align 8, !tbaa !32
  store i32 0, ptr %15, align 4
  br label %306

306:                                              ; preds = %304, %297
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  br label %307

307:                                              ; preds = %306, %283, %274, %239
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  %308 = load i32, ptr %15, align 4
  switch i32 %308, label %434 [
    i32 0, label %309
    i32 5, label %421
  ]

309:                                              ; preds = %307
  br label %310

310:                                              ; preds = %309, %143
  %311 = call ptr @select_search_algorithm(ptr noundef %13)
  store ptr %311, ptr %29, align 8, !tbaa !5
  %312 = load ptr, ptr %29, align 8, !tbaa !5
  %313 = load ptr, ptr %5, align 8, !tbaa !5
  %314 = load i64, ptr %6, align 8, !tbaa !9
  %315 = load ptr, ptr %8, align 8, !tbaa !5
  %316 = call i64 %312(ptr noundef %13, ptr noundef %313, i64 noundef %314, ptr noundef %315)
  store i64 %316, ptr %7, align 8, !tbaa !9
  store i8 0, ptr %30, align 1, !tbaa !13
  %317 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 13
  %318 = load i64, ptr %317, align 8, !tbaa !33
  store i64 %318, ptr %31, align 8, !tbaa !9
  %319 = load i64, ptr %31, align 8, !tbaa !9
  %320 = icmp ne i64 %319, -1
  br i1 %320, label %321, label %327

321:                                              ; preds = %310
  %322 = load i64, ptr %7, align 8, !tbaa !9
  %323 = load i64, ptr %31, align 8, !tbaa !9
  %324 = icmp ugt i64 %322, %323
  br i1 %324, label %325, label %327

325:                                              ; preds = %321
  %326 = load i64, ptr %31, align 8, !tbaa !9
  store i64 %326, ptr %7, align 8, !tbaa !9
  br label %327

327:                                              ; preds = %325, %321, %310
  %328 = load ptr, ptr %8, align 8, !tbaa !5
  %329 = icmp ne ptr %328, null
  br i1 %329, label %330, label %343

330:                                              ; preds = %327
  %331 = load i64, ptr %31, align 8, !tbaa !9
  %332 = icmp ne i64 %331, -1
  br i1 %332, label %333, label %343

333:                                              ; preds = %330
  %334 = load ptr, ptr %8, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.match_result_t, ptr %334, i32 0, i32 1
  %336 = load i64, ptr %335, align 8, !tbaa !34
  %337 = load i64, ptr %31, align 8, !tbaa !9
  %338 = icmp ugt i64 %336, %337
  br i1 %338, label %339, label %343

339:                                              ; preds = %333
  %340 = load i64, ptr %31, align 8, !tbaa !9
  %341 = load ptr, ptr %8, align 8, !tbaa !5
  %342 = getelementptr inbounds %struct.match_result_t, ptr %341, i32 0, i32 1
  store i64 %340, ptr %342, align 8, !tbaa !34
  br label %343

343:                                              ; preds = %339, %333, %330, %327
  %344 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 7
  %345 = load i8, ptr %344, align 2, !tbaa !36, !range !19, !noundef !20
  %346 = trunc i8 %345 to i1
  br i1 %346, label %351, label %347

347:                                              ; preds = %343
  %348 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 8
  %349 = load i8, ptr %348, align 1, !tbaa !37, !range !19, !noundef !20
  %350 = trunc i8 %349 to i1
  br i1 %350, label %351, label %355

351:                                              ; preds = %347, %343
  %352 = load i64, ptr %7, align 8, !tbaa !9
  %353 = icmp ugt i64 %352, 0
  %354 = zext i1 %353 to i8
  store i8 %354, ptr %30, align 1, !tbaa !13
  br label %373

355:                                              ; preds = %347
  %356 = load ptr, ptr %8, align 8, !tbaa !5
  %357 = icmp ne ptr %356, null
  br i1 %357, label %358, label %363

358:                                              ; preds = %355
  %359 = load ptr, ptr %8, align 8, !tbaa !5
  %360 = getelementptr inbounds %struct.match_result_t, ptr %359, i32 0, i32 1
  %361 = load i64, ptr %360, align 8, !tbaa !34
  %362 = icmp ugt i64 %361, 0
  br label %363

363:                                              ; preds = %358, %355
  %364 = phi i1 [ false, %355 ], [ %362, %358 ]
  %365 = zext i1 %364 to i8
  store i8 %365, ptr %30, align 1, !tbaa !13
  %366 = load i8, ptr %30, align 1, !tbaa !13, !range !19, !noundef !20
  %367 = trunc i8 %366 to i1
  br i1 %367, label %368, label %372

368:                                              ; preds = %363
  %369 = load ptr, ptr %8, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.match_result_t, ptr %369, i32 0, i32 1
  %371 = load i64, ptr %370, align 8, !tbaa !34
  store i64 %371, ptr %7, align 8, !tbaa !9
  br label %372

372:                                              ; preds = %368, %363
  br label %373

373:                                              ; preds = %372, %351
  %374 = load i8, ptr %30, align 1, !tbaa !13, !range !19, !noundef !20
  %375 = trunc i8 %374 to i1
  %376 = zext i1 %375 to i64
  %377 = select i1 %375, i32 0, i32 1
  store i32 %377, ptr %9, align 4, !tbaa !11
  %378 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 7
  %379 = load i8, ptr %378, align 2, !tbaa !36, !range !19, !noundef !20
  %380 = trunc i8 %379 to i1
  br i1 %380, label %385, label %381

381:                                              ; preds = %373
  %382 = getelementptr inbounds %struct.search_params, ptr %13, i32 0, i32 8
  %383 = load i8, ptr %382, align 1, !tbaa !37, !range !19, !noundef !20
  %384 = trunc i8 %383 to i1
  br i1 %384, label %385, label %388

385:                                              ; preds = %381, %373
  %386 = load i64, ptr %7, align 8, !tbaa !9
  %387 = call i32 (ptr, ...) @printf(ptr noundef @.str.96, i64 noundef %386)
  br label %420

388:                                              ; preds = %381
  %389 = load i32, ptr %9, align 4, !tbaa !11
  %390 = icmp eq i32 %389, 0
  br i1 %390, label %391, label %399

391:                                              ; preds = %388
  %392 = load ptr, ptr %8, align 8, !tbaa !5
  %393 = icmp ne ptr %392, null
  br i1 %393, label %394, label %399

394:                                              ; preds = %391
  %395 = load ptr, ptr %5, align 8, !tbaa !5
  %396 = load i64, ptr %6, align 8, !tbaa !9
  %397 = load ptr, ptr %8, align 8, !tbaa !5
  %398 = call i64 @print_matching_items(ptr noundef null, ptr noundef %395, i64 noundef %396, ptr noundef %397, ptr noundef %13)
  br label %419

399:                                              ; preds = %391, %388
  %400 = load i32, ptr %9, align 4, !tbaa !11
  %401 = icmp eq i32 %400, 0
  br i1 %401, label %402, label %418

402:                                              ; preds = %399
  %403 = load ptr, ptr %8, align 8, !tbaa !5
  %404 = icmp ne ptr %403, null
  br i1 %404, label %405, label %410

405:                                              ; preds = %402
  %406 = load ptr, ptr %8, align 8, !tbaa !5
  %407 = getelementptr inbounds %struct.match_result_t, ptr %406, i32 0, i32 1
  %408 = load i64, ptr %407, align 8, !tbaa !34
  %409 = icmp eq i64 %408, 0
  br i1 %409, label %410, label %418

410:                                              ; preds = %405, %402
  %411 = load i8, ptr @only_matching, align 1, !tbaa !13, !range !19, !noundef !20
  %412 = trunc i8 %411 to i1
  br i1 %412, label %413, label %415

413:                                              ; preds = %410
  %414 = call i32 @puts(ptr noundef @.str.69)
  br label %417

415:                                              ; preds = %410
  %416 = call i32 @puts(ptr noundef @.str.69)
  br label %417

417:                                              ; preds = %415, %413
  br label %418

418:                                              ; preds = %417, %405, %399
  br label %419

419:                                              ; preds = %418, %394
  br label %420

420:                                              ; preds = %419, %385
  br label %421

421:                                              ; preds = %420, %307, %137
  %422 = load i8, ptr %12, align 1, !tbaa !13, !range !19, !noundef !20
  %423 = trunc i8 %422 to i1
  br i1 %423, label %424, label %425

424:                                              ; preds = %421
  call void @regfree(ptr noundef %10)
  br label %425

425:                                              ; preds = %424, %421
  %426 = load ptr, ptr %11, align 8, !tbaa !5
  call void @free(ptr noundef %426) #7
  %427 = load ptr, ptr %8, align 8, !tbaa !5
  call void @match_result_free(ptr noundef %427)
  %428 = load ptr, ptr %14, align 8, !tbaa !5
  %429 = icmp ne ptr %428, null
  br i1 %429, label %430, label %432

430:                                              ; preds = %425
  %431 = load ptr, ptr %14, align 8, !tbaa !5
  call void @ac_trie_free(ptr noundef %431)
  br label %432

432:                                              ; preds = %430, %425
  %433 = load i32, ptr %9, align 4, !tbaa !11
  store i32 %433, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %434

434:                                              ; preds = %432, %307
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #7
  br label %435

435:                                              ; preds = %434, %114, %93, %42, %36
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 72, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 64, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #7
  %436 = load i32, ptr %3, align 4
  ret i32 %436
}

declare ptr @ac_trie_build(ptr noundef) #6

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

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

declare i32 @puts(ptr noundef) #6

declare void @regfree(ptr noundef) #6

declare void @ac_trie_free(ptr noundef) #6

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 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind 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 #5 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nounwind }
attributes #8 = { nounwind willreturn memory(read) }
attributes #9 = { nounwind allocsize(0) }

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

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


; 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.re_pattern_buffer = type { ptr, i64, i64, i64, ptr, ptr, i64, i8 }
%struct.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }

@stderr = external local_unnamed_addr global ptr, align 8
@.str.69 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.83 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.84 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.85 = external hidden unnamed_addr constant [74 x i8], align 1
@.str.86 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.87 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.88 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [53 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.95 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.96 = external hidden unnamed_addr constant [5 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 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: 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 #5

; 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) #6

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

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

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 3) i32 @search_string(ptr nocapture noundef readonly %0, ptr noundef %1) local_unnamed_addr #1 {
  %3 = alloca %struct.re_pattern_buffer, align 8
  %4 = alloca %struct.search_params, align 8
  %5 = alloca [256 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %3) #9
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %4) #9
  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
  %6 = getelementptr inbounds i8, ptr %4, i64 32
  %7 = load i64, ptr %6, align 8, !tbaa !14
  %.fr = freeze i64 %7
  %8 = icmp eq i64 %.fr, 0
  br i1 %8, label %9, label %12

9:                                                ; preds = %2
  %10 = load ptr, ptr @stderr, align 8, !tbaa !6
  %11 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %10, ptr noundef nonnull @.str.83) #10
  br label %182

12:                                               ; preds = %2
  %.not = icmp eq ptr %1, null
  br i1 %.not, label %13, label %16

13:                                               ; preds = %12
  %14 = load ptr, ptr @stderr, align 8, !tbaa !6
  %15 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %14, ptr noundef nonnull @.str.84) #10
  br label %182

16:                                               ; preds = %12
  %17 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %1) #11
  %18 = getelementptr inbounds i8, ptr %4, i64 41
  %19 = load i8, ptr %18, align 1, !tbaa !16, !range !17, !noundef !18
  %20 = trunc nuw i8 %19 to i1
  br i1 %20, label %.critedge, label %.preheader183

.preheader183:                                    ; preds = %16
  %21 = getelementptr inbounds i8, ptr %4, i64 24
  %22 = load ptr, ptr %21, align 8, !tbaa !19
  %.not179 = icmp eq i64 %.fr, 1
  br i1 %.not179, label %.preheader183.split.us, label %.preheader183.split

.preheader183.split.us:                           ; preds = %.preheader183
  %.pre = load i64, ptr %22, align 8, !tbaa !10
  %23 = icmp ugt i64 %.pre, 1024
  br i1 %23, label %.split.us, label %.critedge

.preheader183.split:                              ; preds = %.preheader183, %38
  %.0117186 = phi i64 [ %39, %38 ], [ 0, %.preheader183 ]
  %24 = getelementptr inbounds i64, ptr %22, i64 %.0117186
  %25 = load i64, ptr %24, align 8, !tbaa !10
  %26 = icmp eq i64 %25, 0
  br i1 %26, label %27, label %30

27:                                               ; preds = %.preheader183.split
  %28 = load ptr, ptr @stderr, align 8, !tbaa !6
  %29 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %28, ptr noundef nonnull @.str.85) #10
  br label %182

30:                                               ; preds = %.preheader183.split
  %31 = icmp ugt i64 %25, 1024
  br i1 %31, label %.split.us, label %38

.split.us:                                        ; preds = %30, %.preheader183.split.us
  %.us-phi = phi i64 [ 0, %.preheader183.split.us ], [ %.0117186, %30 ]
  %32 = load ptr, ptr @stderr, align 8, !tbaa !6
  %33 = getelementptr inbounds i8, ptr %4, i64 16
  %34 = load ptr, ptr %33, align 8, !tbaa !20
  %35 = getelementptr inbounds ptr, ptr %34, i64 %.us-phi
  %36 = load ptr, ptr %35, align 8, !tbaa !6
  %37 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %32, ptr noundef nonnull @.str.86, ptr noundef %36, i32 noundef 1024) #10
  br label %182

38:                                               ; preds = %30
  %39 = add nuw i64 %.0117186, 1
  %exitcond.not = icmp eq i64 %39, %.fr
  br i1 %exitcond.not, label %.critedge, label %.preheader183.split, !llvm.loop !21

.critedge:                                        ; preds = %38, %.preheader183.split.us, %16
  %40 = getelementptr inbounds i8, ptr %4, i64 44
  %41 = load i8, ptr %40, align 4, !tbaa !23, !range !17, !noundef !18
  %42 = trunc nuw i8 %41 to i1
  br i1 %42, label %43, label %.critedge141

43:                                               ; preds = %.critedge
  %44 = icmp ugt i64 %17, 10000
  %45 = select i1 %44, i64 1000, i64 16
  %46 = tail call ptr @match_result_init(i64 noundef %45)
  %.not134.not = icmp eq ptr %46, null
  br i1 %.not134.not, label %47, label %.critedge141

47:                                               ; preds = %43
  %48 = load ptr, ptr @stderr, align 8, !tbaa !6
  %49 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %48, ptr noundef nonnull @.str.87) #10
  br label %182

.critedge141:                                     ; preds = %43, %.critedge
  %.095 = phi ptr [ null, %.critedge ], [ %46, %43 ]
  %50 = getelementptr inbounds i8, ptr %0, i64 32
  %51 = load i64, ptr %50, align 8, !tbaa !14
  %52 = icmp ugt i64 %51, 1
  br i1 %52, label %53, label %.critedge143

53:                                               ; preds = %.critedge141
  %54 = getelementptr inbounds i8, ptr %0, i64 41
  %55 = load i8, ptr %54, align 1, !tbaa !16, !range !17, !noundef !18
  %56 = trunc nuw i8 %55 to i1
  br i1 %56, label %.critedge143, label %57

57:                                               ; preds = %53
  %58 = call ptr @ac_trie_build(ptr noundef nonnull %4) #9
  %.not135 = icmp eq ptr %58, null
  br i1 %.not135, label %59, label %62

59:                                               ; preds = %57
  %60 = load ptr, ptr @stderr, align 8, !tbaa !6
  %61 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %60, ptr noundef nonnull @.str.88) #10
  br label %.thread171

62:                                               ; preds = %57
  %63 = getelementptr inbounds i8, ptr %4, i64 56
  store ptr %58, ptr %63, align 8, !tbaa !24
  %.pre199 = load i8, ptr %18, align 1, !tbaa !16, !range !17
  br label %.critedge143

.critedge143:                                     ; preds = %.critedge141, %62, %53
  %64 = phi i8 [ %.pre199, %62 ], [ %19, %53 ], [ %19, %.critedge141 ]
  %.0115 = phi ptr [ %58, %62 ], [ null, %53 ], [ null, %.critedge141 ]
  %65 = trunc nuw i8 %64 to i1
  br i1 %65, label %66, label %.thread155

66:                                               ; preds = %.critedge143
  %67 = load i64, ptr %6, align 8, !tbaa !14
  %68 = icmp ugt i64 %67, 1
  br i1 %68, label %.preheader182, label %114

.preheader182:                                    ; preds = %66
  %69 = getelementptr inbounds i8, ptr %4, i64 24
  %70 = load ptr, ptr %69, align 8, !tbaa !19
  %71 = getelementptr inbounds i8, ptr %4, i64 45
  %72 = load i8, ptr %71, align 1, !tbaa !25, !range !17, !noundef !18
  %73 = trunc nuw i8 %72 to i1
  %74 = select i1 %73, i64 6, i64 2
  %min.iters.check = icmp ult i64 %67, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.preheader182
  %.0106188.ph = phi i64 [ 0, %.preheader182 ], [ %n.vec, %middle.block ]
  %.0107187.ph = phi i64 [ 0, %.preheader182 ], [ %84, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.preheader182
  %n.vec = and i64 %67, -4
  %broadcast.splatinsert = insertelement <2 x i64> poison, i64 %74, 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 ], [ %81, %vector.body ]
  %vec.phi217 = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %82, %vector.body ]
  %75 = getelementptr inbounds i64, ptr %70, i64 %index
  %76 = getelementptr inbounds i8, ptr %75, i64 16
  %wide.load = load <2 x i64>, ptr %75, align 8, !tbaa !10
  %wide.load218 = load <2 x i64>, ptr %76, align 8, !tbaa !10
  %77 = add <2 x i64> %vec.phi, <i64 1, i64 1>
  %78 = add <2 x i64> %vec.phi217, <i64 1, i64 1>
  %79 = add <2 x i64> %77, %wide.load
  %80 = add <2 x i64> %78, %wide.load218
  %81 = add <2 x i64> %79, %broadcast.splat
  %82 = add <2 x i64> %80, %broadcast.splat
  %index.next = add nuw i64 %index, 4
  %83 = icmp eq i64 %index.next, %n.vec
  br i1 %83, label %middle.block, label %vector.body, !llvm.loop !26

middle.block:                                     ; preds = %vector.body
  %bin.rdx = add <2 x i64> %82, %81
  %84 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx)
  %cmp.n = icmp eq i64 %67, %n.vec
  br i1 %cmp.n, label %.loopexit, label %scalar.ph.preheader

.loopexit:                                        ; preds = %scalar.ph, %middle.block
  %.lcssa = phi i64 [ %84, %middle.block ], [ %92, %scalar.ph ]
  %85 = add i64 %.lcssa, 1
  %86 = call noalias ptr @malloc(i64 noundef %85) #12
  %.not137.not = icmp eq ptr %86, null
  br i1 %.not137.not, label %.thread, label %.lr.ph

.lr.ph:                                           ; preds = %.loopexit
  %87 = getelementptr inbounds i8, ptr %4, i64 16
  br label %96

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0106188 = phi i64 [ %93, %scalar.ph ], [ %.0106188.ph, %scalar.ph.preheader ]
  %.0107187 = phi i64 [ %92, %scalar.ph ], [ %.0107187.ph, %scalar.ph.preheader ]
  %88 = getelementptr inbounds i64, ptr %70, i64 %.0106188
  %89 = load i64, ptr %88, align 8, !tbaa !10
  %90 = add i64 %.0107187, 1
  %91 = add i64 %90, %89
  %92 = add i64 %91, %74
  %93 = add nuw i64 %.0106188, 1
  %exitcond198.not = icmp eq i64 %93, %67
  br i1 %exitcond198.not, label %.loopexit, label %scalar.ph, !llvm.loop !29

.thread:                                          ; preds = %.loopexit
  %94 = load ptr, ptr @stderr, align 8, !tbaa !6
  %95 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %94, ptr noundef nonnull @.str.89) #10
  br label %.thread171

96:                                               ; preds = %.lr.ph, %110
  %.0102190 = phi i64 [ 0, %.lr.ph ], [ %112, %110 ]
  %.0103189 = phi ptr [ %86, %.lr.ph ], [ %.2105, %110 ]
  %97 = load i8, ptr %71, align 1, !tbaa !25, !range !17, !noundef !18
  %98 = trunc nuw i8 %97 to i1
  %99 = load ptr, ptr %87, align 8, !tbaa !20
  %100 = getelementptr inbounds ptr, ptr %99, i64 %.0102190
  %101 = load ptr, ptr %100, align 8, !tbaa !6
  %.str.90..str.91 = select i1 %98, ptr @.str.90, ptr @.str.91
  %102 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %.0103189, ptr noundef nonnull dereferenceable(1) %.str.90..str.91, ptr noundef %101) #9
  %.pn = sext i32 %102 to i64
  %.1104 = getelementptr inbounds i8, ptr %.0103189, i64 %.pn
  %103 = load i64, ptr %6, align 8, !tbaa !14
  %104 = add i64 %103, -1
  %105 = icmp ult i64 %.0102190, %104
  br i1 %105, label %106, label %110

106:                                              ; preds = %96
  %107 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %.1104, ptr noundef nonnull dereferenceable(1) @.str.92) #9
  %108 = sext i32 %107 to i64
  %109 = getelementptr inbounds i8, ptr %.1104, i64 %108
  %.pre200 = load i64, ptr %6, align 8, !tbaa !14
  br label %110

110:                                              ; preds = %96, %106
  %111 = phi i64 [ %.pre200, %106 ], [ %103, %96 ]
  %.2105 = phi ptr [ %109, %106 ], [ %.1104, %96 ]
  %112 = add nuw i64 %.0102190, 1
  %113 = icmp ult i64 %112, %111
  br i1 %113, label %96, label %._crit_edge, !llvm.loop !30

._crit_edge:                                      ; preds = %110
  store i8 0, ptr %.2105, align 1, !tbaa !31
  br label %129

114:                                              ; preds = %66
  %115 = icmp eq i64 %67, 1
  br i1 %115, label %116, label %.thread171

116:                                              ; preds = %114
  %117 = getelementptr inbounds i8, ptr %4, i64 45
  %118 = load i8, ptr %117, align 1, !tbaa !25, !range !17, !noundef !18
  %119 = trunc nuw i8 %118 to i1
  %120 = getelementptr inbounds i8, ptr %4, i64 16
  %121 = load ptr, ptr %120, align 8, !tbaa !20
  %122 = load ptr, ptr %121, align 8, !tbaa !6
  br i1 %119, label %123, label %129

123:                                              ; preds = %116
  %124 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %122) #11
  %125 = add i64 %124, 7
  %126 = call noalias ptr @malloc(i64 noundef %125) #12
  %.not136.not = icmp eq ptr %126, null
  br i1 %.not136.not, label %141, label %127

127:                                              ; preds = %123
  %128 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %126, ptr noundef nonnull dereferenceable(1) @.str.94, ptr noundef %122) #9
  br label %129

129:                                              ; preds = %116, %._crit_edge, %127
  %.2110 = phi ptr [ %86, %._crit_edge ], [ %126, %127 ], [ %122, %116 ]
  %.198 = phi ptr [ %86, %._crit_edge ], [ %126, %127 ], [ null, %116 ]
  %130 = getelementptr inbounds i8, ptr %4, i64 40
  %131 = load i8, ptr %130, align 8, !tbaa !32, !range !17, !noundef !18
  %132 = trunc nuw i8 %131 to i1
  %133 = select i1 %132, i32 5, i32 7
  %134 = call i32 @regcomp(ptr noundef nonnull %3, ptr noundef %.2110, i32 noundef %133) #9
  %.not138 = icmp eq i32 %134, 0
  br i1 %.not138, label %139, label %135

135:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %5) #9
  %136 = call i64 @regerror(i32 noundef %134, ptr noundef nonnull %3, ptr noundef nonnull %5, i64 noundef 256) #9
  %137 = load ptr, ptr @stderr, align 8, !tbaa !6
  %138 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %137, ptr noundef nonnull @.str.95, ptr noundef nonnull %5) #10
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %5) #9
  br label %.thread171

139:                                              ; preds = %129
  %140 = getelementptr inbounds i8, ptr %4, i64 48
  store ptr %3, ptr %140, align 8, !tbaa !33
  br label %.thread155

141:                                              ; preds = %123
  %142 = load ptr, ptr @stderr, align 8, !tbaa !6
  %143 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %142, ptr noundef nonnull @.str.93) #10
  br label %182

.thread155:                                       ; preds = %139, %.critedge143
  %.3100 = phi ptr [ null, %.critedge143 ], [ %.198, %139 ]
  %144 = call ptr @select_search_algorithm(ptr noundef nonnull %4)
  %145 = call i64 %144(ptr noundef nonnull %4, ptr noundef nonnull %1, i64 noundef %17, ptr noundef %.095) #9
  %146 = getelementptr inbounds i8, ptr %4, i64 64
  %147 = load i64, ptr %146, align 8, !tbaa !34
  %148 = icmp ne i64 %147, -1
  %149 = call i64 @llvm.umin.i64(i64 %145, i64 %147)
  %.093 = select i1 %148, i64 %149, i64 %145
  %150 = icmp ne ptr %.095, null
  %or.cond = and i1 %150, %148
  br i1 %or.cond, label %151, label %156

151:                                              ; preds = %.thread155
  %152 = getelementptr inbounds i8, ptr %.095, i64 8
  %153 = load i64, ptr %152, align 8, !tbaa !35
  %154 = icmp ugt i64 %153, %147
  br i1 %154, label %155, label %156

155:                                              ; preds = %151
  store i64 %147, ptr %152, align 8, !tbaa !35
  br label %156

156:                                              ; preds = %155, %151, %.thread155
  %157 = getelementptr inbounds i8, ptr %4, i64 42
  %158 = load i8, ptr %157, align 2, !tbaa !37, !range !17, !noundef !18
  %159 = trunc nuw i8 %158 to i1
  br i1 %159, label %.thread168, label %160

160:                                              ; preds = %156
  %161 = getelementptr inbounds i8, ptr %4, i64 43
  %162 = load i8, ptr %161, align 1, !tbaa !38, !range !17, !noundef !18
  %163 = trunc nuw i8 %162 to i1
  br i1 %163, label %.thread168, label %164

164:                                              ; preds = %160
  br i1 %150, label %165, label %179

165:                                              ; preds = %164
  %166 = getelementptr inbounds i8, ptr %.095, i64 8
  %167 = load i64, ptr %166, align 8, !tbaa !35
  %.not180 = icmp eq i64 %167, 0
  br i1 %.not180, label %179, label %170

.thread168:                                       ; preds = %160, %156
  %.in.sink = icmp eq i64 %.093, 0
  %168 = zext i1 %.in.sink to i32
  %169 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.96, i64 noundef %.093)
  br label %179

170:                                              ; preds = %165
  br i1 %150, label %171, label %173

171:                                              ; preds = %170
  %172 = call i64 @print_matching_items(ptr noundef null, ptr noundef nonnull %1, i64 noundef %17, ptr noundef nonnull %.095, ptr noundef nonnull %4)
  br label %179

173:                                              ; preds = %170
  %174 = getelementptr inbounds i8, ptr %.095, i64 8
  %175 = load i64, ptr %174, align 8, !tbaa !35
  %176 = icmp eq i64 %175, 0
  br i1 %176, label %177, label %179

177:                                              ; preds = %173
  %178 = call i32 @puts(ptr noundef nonnull dereferenceable(1) @.str.69)
  br label %179

179:                                              ; preds = %177, %165, %164, %.thread168, %173, %171
  %.096 = phi i32 [ %168, %.thread168 ], [ 0, %171 ], [ 0, %173 ], [ 1, %164 ], [ 1, %165 ], [ 0, %177 ]
  br i1 %65, label %180, label %.thread171

180:                                              ; preds = %179
  call void @regfree(ptr noundef nonnull %3) #9
  br label %.thread171

.thread171:                                       ; preds = %.thread, %135, %114, %59, %180, %179
  %.096178 = phi i32 [ %.096, %180 ], [ %.096, %179 ], [ 2, %59 ], [ 1, %114 ], [ 1, %135 ], [ 1, %.thread ]
  %.4101177 = phi ptr [ %.3100, %180 ], [ %.3100, %179 ], [ null, %59 ], [ null, %114 ], [ %.198, %135 ], [ null, %.thread ]
  %.1116176 = phi ptr [ %.0115, %180 ], [ %.0115, %179 ], [ null, %59 ], [ %.0115, %114 ], [ %.0115, %135 ], [ %.0115, %.thread ]
  call void @free(ptr noundef %.4101177) #9
  call void @match_result_free(ptr noundef %.095)
  %.not139 = icmp eq ptr %.1116176, null
  br i1 %.not139, label %182, label %181

181:                                              ; preds = %.thread171
  call void @ac_trie_free(ptr noundef nonnull %.1116176) #9
  br label %182

182:                                              ; preds = %141, %27, %.split.us, %47, %181, %.thread171, %13, %9
  %.8 = phi i32 [ 2, %9 ], [ 2, %47 ], [ 2, %13 ], [ 2, %141 ], [ %.096178, %181 ], [ %.096178, %.thread171 ], [ 2, %.split.us ], [ 2, %27 ]
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %4) #9
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %3) #9
  ret i32 %.8
}

declare ptr @ac_trie_build(ptr noundef) local_unnamed_addr #7

; 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 #7

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

declare void @regfree(ptr noundef) local_unnamed_addr #7

declare void @ac_trie_free(ptr noundef) local_unnamed_addr #7

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

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

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 = { mustprogress nofree nounwind willreturn memory(argmem: read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { "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 nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { nounwind }
attributes #10 = { cold nounwind }
attributes #11 = { nounwind willreturn memory(read) }
attributes #12 = { nounwind allocsize(0) }

!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 32}
!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 = !{!15, !13, i64 41}
!17 = !{i8 0, i8 2}
!18 = !{}
!19 = !{!15, !7, i64 24}
!20 = !{!15, !7, i64 16}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = !{!15, !13, i64 44}
!24 = !{!15, !7, i64 56}
!25 = !{!15, !13, i64 45}
!26 = distinct !{!26, !22, !27, !28}
!27 = !{!"llvm.loop.isvectorized", i32 1}
!28 = !{!"llvm.loop.unroll.runtime.disable"}
!29 = distinct !{!29, !22, !28, !27}
!30 = distinct !{!30, !22}
!31 = !{!8, !8, i64 0}
!32 = !{!15, !13, i64 40}
!33 = !{!15, !7, i64 48}
!34 = !{!15, !11, i64 64}
!35 = !{!36, !11, i64 8}
!36 = !{!"match_result_t", !7, i64 0, !11, i64 8, !11, i64 16}
!37 = !{!15, !13, i64 42}
!38 = !{!15, !13, i64 43}


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