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

; 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.match_position_t = type { i64, i64 }
%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
@.str.160 = external hidden unnamed_addr constant [47 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: nounwind willreturn memory(none)
declare ptr @__ctype_tolower_loc() #1

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

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

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

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

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

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

; Function Attrs: nounwind willreturn memory(none)
declare ptr @__ctype_toupper_loc() #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @is_whole_word_match(ptr noundef, i64 noundef, i64 noundef, i64 noundef) #3

; Function Attrs: nounwind uwtable
define dso_local i64 @memchr_search(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3) #4 {
  %5 = alloca i64, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i64, align 8
  %11 = alloca i8, align 1
  %12 = alloca i8, align 1
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i8, align 1
  %18 = alloca i8, align 1
  %19 = alloca i64, align 8
  %20 = alloca [4096 x %struct.match_position_t], align 16
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca ptr, align 8
  %25 = alloca i32, align 4
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i64, align 8
  %32 = alloca i64, align 8
  %33 = alloca i64, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store i64 %2, ptr %8, align 8, !tbaa !9
  store ptr %3, ptr %9, align 8, !tbaa !5
  %34 = load ptr, ptr %6, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.search_params, ptr %34, i32 0, i32 13
  %36 = load i64, ptr %35, align 8, !tbaa !11
  %37 = icmp eq i64 %36, 0
  br i1 %37, label %38, label %39

38:                                               ; preds = %4
  store i64 0, ptr %5, align 8
  br label %369

39:                                               ; preds = %4
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  store i64 0, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #6
  %40 = load ptr, ptr %6, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.search_params, ptr %40, i32 0, i32 0
  %42 = load ptr, ptr %41, align 8, !tbaa !14
  %43 = getelementptr inbounds i8, ptr %42, i64 0
  %44 = load i8, ptr %43, align 1, !tbaa !15
  store i8 %44, ptr %11, align 1, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 1, ptr %12) #6
  %45 = load ptr, ptr %6, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.search_params, ptr %45, i32 0, i32 5
  %47 = load i8, ptr %46, align 8, !tbaa !16, !range !17, !noundef !18
  %48 = trunc i8 %47 to i1
  br i1 %48, label %49, label %50

49:                                               ; preds = %39
  br label %83

50:                                               ; preds = %39
  %51 = call ptr @__ctype_b_loc() #7
  %52 = load ptr, ptr %51, align 8, !tbaa !5
  %53 = load i8, ptr %11, align 1, !tbaa !15
  %54 = sext i8 %53 to i32
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds i16, ptr %52, i64 %55
  %57 = load i16, ptr %56, align 2, !tbaa !19
  %58 = zext i16 %57 to i32
  %59 = and i32 %58, 512
  %60 = icmp ne i32 %59, 0
  br i1 %60, label %61, label %71

61:                                               ; preds = %50
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #6
  %62 = call ptr @__ctype_toupper_loc() #7
  %63 = load ptr, ptr %62, align 8, !tbaa !5
  %64 = load i8, ptr %11, align 1, !tbaa !15
  %65 = sext i8 %64 to i32
  %66 = sext i32 %65 to i64
  %67 = getelementptr inbounds i32, ptr %63, i64 %66
  %68 = load i32, ptr %67, align 4, !tbaa !21
  store i32 %68, ptr %13, align 4, !tbaa !21
  %69 = load i32, ptr %13, align 4, !tbaa !21
  store i32 %69, ptr %14, align 4, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #6
  %70 = load i32, ptr %14, align 4, !tbaa !21
  br label %81

71:                                               ; preds = %50
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #6
  %72 = call ptr @__ctype_tolower_loc() #7
  %73 = load ptr, ptr %72, align 8, !tbaa !5
  %74 = load i8, ptr %11, align 1, !tbaa !15
  %75 = sext i8 %74 to i32
  %76 = sext i32 %75 to i64
  %77 = getelementptr inbounds i32, ptr %73, i64 %76
  %78 = load i32, ptr %77, align 4, !tbaa !21
  store i32 %78, ptr %15, align 4, !tbaa !21
  %79 = load i32, ptr %15, align 4, !tbaa !21
  store i32 %79, ptr %16, align 4, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #6
  %80 = load i32, ptr %16, align 4, !tbaa !21
  br label %81

81:                                               ; preds = %71, %61
  %82 = phi i32 [ %70, %61 ], [ %80, %71 ]
  br label %83

83:                                               ; preds = %81, %49
  %84 = phi i32 [ 0, %49 ], [ %82, %81 ]
  %85 = trunc i32 %84 to i8
  store i8 %85, ptr %12, align 1, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #6
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.search_params, ptr %86, i32 0, i32 7
  %88 = load i8, ptr %87, align 2, !tbaa !23, !range !17, !noundef !18
  %89 = trunc i8 %88 to i1
  %90 = zext i1 %89 to i8
  store i8 %90, ptr %17, align 1, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #6
  %91 = load ptr, ptr %6, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.search_params, ptr %91, i32 0, i32 9
  %93 = load i8, ptr %92, align 4, !tbaa !25, !range !17, !noundef !18
  %94 = trunc i8 %93 to i1
  %95 = zext i1 %94 to i8
  store i8 %95, ptr %18, align 1, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  %96 = load ptr, ptr %6, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.search_params, ptr %96, i32 0, i32 13
  %98 = load i64, ptr %97, align 8, !tbaa !11
  store i64 %98, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 65536, ptr %20) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  store i64 0, ptr %21, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  store i64 -1, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  store i64 0, ptr %23, align 8, !tbaa !9
  br label %99

99:                                               ; preds = %307, %305, %83
  %100 = load i64, ptr %23, align 8, !tbaa !9
  %101 = load i64, ptr %8, align 8, !tbaa !9
  %102 = icmp ult i64 %100, %101
  br i1 %102, label %103, label %308

103:                                              ; preds = %99
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %104 = load ptr, ptr %7, align 8, !tbaa !5
  %105 = load i64, ptr %23, align 8, !tbaa !9
  %106 = getelementptr inbounds i8, ptr %104, i64 %105
  %107 = load i8, ptr %11, align 1, !tbaa !15
  %108 = sext i8 %107 to i32
  %109 = load i64, ptr %8, align 8, !tbaa !9
  %110 = load i64, ptr %23, align 8, !tbaa !9
  %111 = sub i64 %109, %110
  %112 = call ptr @memchr(ptr noundef %106, i32 noundef %108, i64 noundef %111) #8
  store ptr %112, ptr %24, align 8, !tbaa !5
  %113 = load ptr, ptr %6, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.search_params, ptr %113, i32 0, i32 5
  %115 = load i8, ptr %114, align 8, !tbaa !16, !range !17, !noundef !18
  %116 = trunc i8 %115 to i1
  br i1 %116, label %136, label %117

117:                                              ; preds = %103
  %118 = load ptr, ptr %24, align 8, !tbaa !5
  %119 = icmp ne ptr %118, null
  br i1 %119, label %136, label %120

120:                                              ; preds = %117
  %121 = load i8, ptr %12, align 1, !tbaa !15
  %122 = sext i8 %121 to i32
  %123 = load i8, ptr %11, align 1, !tbaa !15
  %124 = sext i8 %123 to i32
  %125 = icmp ne i32 %122, %124
  br i1 %125, label %126, label %136

126:                                              ; preds = %120
  %127 = load ptr, ptr %7, align 8, !tbaa !5
  %128 = load i64, ptr %23, align 8, !tbaa !9
  %129 = getelementptr inbounds i8, ptr %127, i64 %128
  %130 = load i8, ptr %12, align 1, !tbaa !15
  %131 = sext i8 %130 to i32
  %132 = load i64, ptr %8, align 8, !tbaa !9
  %133 = load i64, ptr %23, align 8, !tbaa !9
  %134 = sub i64 %132, %133
  %135 = call ptr @memchr(ptr noundef %129, i32 noundef %131, i64 noundef %134) #8
  store ptr %135, ptr %24, align 8, !tbaa !5
  br label %136

136:                                              ; preds = %126, %120, %117, %103
  %137 = load ptr, ptr %24, align 8, !tbaa !5
  %138 = icmp ne ptr %137, null
  br i1 %138, label %140, label %139

139:                                              ; preds = %136
  store i32 3, ptr %25, align 4
  br label %305

140:                                              ; preds = %136
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  %141 = load ptr, ptr %24, align 8, !tbaa !5
  %142 = load ptr, ptr %7, align 8, !tbaa !5
  %143 = ptrtoint ptr %141 to i64
  %144 = ptrtoint ptr %142 to i64
  %145 = sub i64 %143, %144
  store i64 %145, ptr %26, align 8, !tbaa !9
  %146 = load ptr, ptr %6, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.search_params, ptr %146, i32 0, i32 10
  %148 = load i8, ptr %147, align 1, !tbaa !26, !range !17, !noundef !18
  %149 = trunc i8 %148 to i1
  br i1 %149, label %150, label %160

150:                                              ; preds = %140
  %151 = load ptr, ptr %7, align 8, !tbaa !5
  %152 = load i64, ptr %8, align 8, !tbaa !9
  %153 = load i64, ptr %26, align 8, !tbaa !9
  %154 = load i64, ptr %26, align 8, !tbaa !9
  %155 = add i64 %154, 1
  %156 = call zeroext i1 @is_whole_word_match(ptr noundef %151, i64 noundef %152, i64 noundef %153, i64 noundef %155)
  br i1 %156, label %160, label %157

157:                                              ; preds = %150
  %158 = load i64, ptr %26, align 8, !tbaa !9
  %159 = add i64 %158, 1
  store i64 %159, ptr %23, align 8, !tbaa !9
  store i32 2, ptr %25, align 4
  br label %304, !llvm.loop !27

160:                                              ; preds = %150, %140
  %161 = load i8, ptr %17, align 1, !tbaa !24, !range !17, !noundef !18
  %162 = trunc i8 %161 to i1
  br i1 %162, label %163, label %204

163:                                              ; preds = %160
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #6
  %164 = load ptr, ptr %7, align 8, !tbaa !5
  %165 = load i64, ptr %8, align 8, !tbaa !9
  %166 = load i64, ptr %26, align 8, !tbaa !9
  %167 = call i64 @find_line_start(ptr noundef %164, i64 noundef %165, i64 noundef %166)
  store i64 %167, ptr %27, align 8, !tbaa !9
  %168 = load i64, ptr %27, align 8, !tbaa !9
  %169 = load i64, ptr %22, align 8, !tbaa !9
  %170 = icmp ne i64 %168, %169
  br i1 %170, label %171, label %197

171:                                              ; preds = %163
  %172 = load i64, ptr %19, align 8, !tbaa !9
  %173 = icmp ne i64 %172, -1
  br i1 %173, label %174, label %179

174:                                              ; preds = %171
  %175 = load i64, ptr %10, align 8, !tbaa !9
  %176 = load i64, ptr %19, align 8, !tbaa !9
  %177 = icmp uge i64 %175, %176
  br i1 %177, label %178, label %179

178:                                              ; preds = %174
  store i32 3, ptr %25, align 4
  br label %201

179:                                              ; preds = %174, %171
  %180 = load i64, ptr %10, align 8, !tbaa !9
  %181 = add i64 %180, 1
  store i64 %181, ptr %10, align 8, !tbaa !9
  %182 = load i64, ptr %27, align 8, !tbaa !9
  store i64 %182, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  %183 = load ptr, ptr %7, align 8, !tbaa !5
  %184 = load i64, ptr %8, align 8, !tbaa !9
  %185 = load i64, ptr %27, align 8, !tbaa !9
  %186 = call i64 @find_line_end(ptr noundef %183, i64 noundef %184, i64 noundef %185)
  store i64 %186, ptr %28, align 8, !tbaa !9
  %187 = load i64, ptr %28, align 8, !tbaa !9
  %188 = load i64, ptr %8, align 8, !tbaa !9
  %189 = icmp ult i64 %187, %188
  br i1 %189, label %190, label %193

190:                                              ; preds = %179
  %191 = load i64, ptr %28, align 8, !tbaa !9
  %192 = add i64 %191, 1
  br label %195

193:                                              ; preds = %179
  %194 = load i64, ptr %8, align 8, !tbaa !9
  br label %195

195:                                              ; preds = %193, %190
  %196 = phi i64 [ %192, %190 ], [ %194, %193 ]
  store i64 %196, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  br label %200

197:                                              ; preds = %163
  %198 = load i64, ptr %26, align 8, !tbaa !9
  %199 = add i64 %198, 1
  store i64 %199, ptr %23, align 8, !tbaa !9
  br label %200

200:                                              ; preds = %197, %195
  store i32 0, ptr %25, align 4
  br label %201

201:                                              ; preds = %200, %178
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #6
  %202 = load i32, ptr %25, align 4
  switch i32 %202, label %304 [
    i32 0, label %203
  ]

203:                                              ; preds = %201
  br label %303

204:                                              ; preds = %160
  %205 = load i64, ptr %19, align 8, !tbaa !9
  %206 = icmp ne i64 %205, -1
  br i1 %206, label %207, label %244

207:                                              ; preds = %204
  %208 = load i64, ptr %10, align 8, !tbaa !9
  %209 = load i64, ptr %19, align 8, !tbaa !9
  %210 = icmp uge i64 %208, %209
  br i1 %210, label %211, label %244

211:                                              ; preds = %207
  %212 = load i8, ptr %18, align 1, !tbaa !24, !range !17, !noundef !18
  %213 = trunc i8 %212 to i1
  br i1 %213, label %214, label %243

214:                                              ; preds = %211
  %215 = load ptr, ptr %9, align 8, !tbaa !5
  %216 = icmp ne ptr %215, null
  br i1 %216, label %217, label %243

217:                                              ; preds = %214
  %218 = load i64, ptr %21, align 8, !tbaa !9
  %219 = icmp ult i64 %218, 4096
  br i1 %219, label %220, label %232

220:                                              ; preds = %217
  %221 = load i64, ptr %26, align 8, !tbaa !9
  %222 = load i64, ptr %21, align 8, !tbaa !9
  %223 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %222
  %224 = getelementptr inbounds %struct.match_position_t, ptr %223, i32 0, i32 0
  store i64 %221, ptr %224, align 16, !tbaa !29
  %225 = load i64, ptr %26, align 8, !tbaa !9
  %226 = add i64 %225, 1
  %227 = load i64, ptr %21, align 8, !tbaa !9
  %228 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %227
  %229 = getelementptr inbounds %struct.match_position_t, ptr %228, i32 0, i32 1
  store i64 %226, ptr %229, align 8, !tbaa !31
  %230 = load i64, ptr %21, align 8, !tbaa !9
  %231 = add i64 %230, 1
  store i64 %231, ptr %21, align 8, !tbaa !9
  br label %242

232:                                              ; preds = %217
  %233 = load ptr, ptr %9, align 8, !tbaa !5
  %234 = load i64, ptr %26, align 8, !tbaa !9
  %235 = load i64, ptr %26, align 8, !tbaa !9
  %236 = add i64 %235, 1
  %237 = call zeroext i1 @match_result_add(ptr noundef %233, i64 noundef %234, i64 noundef %236)
  br i1 %237, label %241, label %238

238:                                              ; preds = %232
  %239 = load ptr, ptr @stderr, align 8, !tbaa !5
  %240 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %239, ptr noundef @.str.160) #6
  br label %241

241:                                              ; preds = %238, %232
  br label %242

242:                                              ; preds = %241, %220
  br label %243

243:                                              ; preds = %242, %214, %211
  store i32 3, ptr %25, align 4
  br label %304

244:                                              ; preds = %207, %204
  %245 = load i64, ptr %10, align 8, !tbaa !9
  %246 = add i64 %245, 1
  store i64 %246, ptr %10, align 8, !tbaa !9
  %247 = load i8, ptr %18, align 1, !tbaa !24, !range !17, !noundef !18
  %248 = trunc i8 %247 to i1
  br i1 %248, label %249, label %300

249:                                              ; preds = %244
  %250 = load ptr, ptr %9, align 8, !tbaa !5
  %251 = icmp ne ptr %250, null
  br i1 %251, label %252, label %300

252:                                              ; preds = %249
  %253 = load i64, ptr %21, align 8, !tbaa !9
  %254 = icmp ult i64 %253, 4096
  br i1 %254, label %255, label %267

255:                                              ; preds = %252
  %256 = load i64, ptr %26, align 8, !tbaa !9
  %257 = load i64, ptr %21, align 8, !tbaa !9
  %258 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %257
  %259 = getelementptr inbounds %struct.match_position_t, ptr %258, i32 0, i32 0
  store i64 %256, ptr %259, align 16, !tbaa !29
  %260 = load i64, ptr %26, align 8, !tbaa !9
  %261 = add i64 %260, 1
  %262 = load i64, ptr %21, align 8, !tbaa !9
  %263 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %262
  %264 = getelementptr inbounds %struct.match_position_t, ptr %263, i32 0, i32 1
  store i64 %261, ptr %264, align 8, !tbaa !31
  %265 = load i64, ptr %21, align 8, !tbaa !9
  %266 = add i64 %265, 1
  store i64 %266, ptr %21, align 8, !tbaa !9
  br label %299

267:                                              ; preds = %252
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  store i64 0, ptr %29, align 8, !tbaa !9
  br label %268

268:                                              ; preds = %284, %267
  %269 = load i64, ptr %29, align 8, !tbaa !9
  %270 = load i64, ptr %21, align 8, !tbaa !9
  %271 = icmp ult i64 %269, %270
  br i1 %271, label %273, label %272

272:                                              ; preds = %268
  store i32 4, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  br label %287

273:                                              ; preds = %268
  %274 = load ptr, ptr %9, align 8, !tbaa !5
  %275 = load i64, ptr %29, align 8, !tbaa !9
  %276 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %275
  %277 = getelementptr inbounds %struct.match_position_t, ptr %276, i32 0, i32 0
  %278 = load i64, ptr %277, align 16, !tbaa !29
  %279 = load i64, ptr %29, align 8, !tbaa !9
  %280 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %279
  %281 = getelementptr inbounds %struct.match_position_t, ptr %280, i32 0, i32 1
  %282 = load i64, ptr %281, align 8, !tbaa !31
  %283 = call zeroext i1 @match_result_add(ptr noundef %274, i64 noundef %278, i64 noundef %282)
  br label %284

284:                                              ; preds = %273
  %285 = load i64, ptr %29, align 8, !tbaa !9
  %286 = add i64 %285, 1
  store i64 %286, ptr %29, align 8, !tbaa !9
  br label %268, !llvm.loop !32

287:                                              ; preds = %272
  store i64 0, ptr %21, align 8, !tbaa !9
  %288 = load i64, ptr %26, align 8, !tbaa !9
  %289 = load i64, ptr %21, align 8, !tbaa !9
  %290 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %289
  %291 = getelementptr inbounds %struct.match_position_t, ptr %290, i32 0, i32 0
  store i64 %288, ptr %291, align 16, !tbaa !29
  %292 = load i64, ptr %26, align 8, !tbaa !9
  %293 = add i64 %292, 1
  %294 = load i64, ptr %21, align 8, !tbaa !9
  %295 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %294
  %296 = getelementptr inbounds %struct.match_position_t, ptr %295, i32 0, i32 1
  store i64 %293, ptr %296, align 8, !tbaa !31
  %297 = load i64, ptr %21, align 8, !tbaa !9
  %298 = add i64 %297, 1
  store i64 %298, ptr %21, align 8, !tbaa !9
  br label %299

299:                                              ; preds = %287, %255
  br label %300

300:                                              ; preds = %299, %249, %244
  %301 = load i64, ptr %26, align 8, !tbaa !9
  %302 = add i64 %301, 1
  store i64 %302, ptr %23, align 8, !tbaa !9
  br label %303

303:                                              ; preds = %300, %203
  store i32 0, ptr %25, align 4
  br label %304

304:                                              ; preds = %303, %243, %201, %157
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  br label %305

305:                                              ; preds = %304, %139
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  %306 = load i32, ptr %25, align 4
  switch i32 %306, label %371 [
    i32 0, label %307
    i32 3, label %308
    i32 2, label %99
  ]

307:                                              ; preds = %305
  br label %99, !llvm.loop !27

308:                                              ; preds = %305, %99
  %309 = load i8, ptr %18, align 1, !tbaa !24, !range !17, !noundef !18
  %310 = trunc i8 %309 to i1
  br i1 %310, label %311, label %367

311:                                              ; preds = %308
  %312 = load ptr, ptr %9, align 8, !tbaa !5
  %313 = icmp ne ptr %312, null
  br i1 %313, label %314, label %367

314:                                              ; preds = %311
  %315 = load i64, ptr %21, align 8, !tbaa !9
  %316 = icmp ugt i64 %315, 0
  br i1 %316, label %317, label %367

317:                                              ; preds = %314
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #6
  %318 = load ptr, ptr %9, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.match_result_t, ptr %318, i32 0, i32 1
  %320 = load i64, ptr %319, align 8, !tbaa !33
  store i64 %320, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #6
  %321 = load i64, ptr %19, align 8, !tbaa !9
  %322 = icmp eq i64 %321, -1
  br i1 %322, label %323, label %325

323:                                              ; preds = %317
  %324 = load i64, ptr %21, align 8, !tbaa !9
  br label %336

325:                                              ; preds = %317
  %326 = load i64, ptr %30, align 8, !tbaa !9
  %327 = load i64, ptr %19, align 8, !tbaa !9
  %328 = icmp uge i64 %326, %327
  br i1 %328, label %329, label %330

329:                                              ; preds = %325
  br label %334

330:                                              ; preds = %325
  %331 = load i64, ptr %19, align 8, !tbaa !9
  %332 = load i64, ptr %30, align 8, !tbaa !9
  %333 = sub i64 %331, %332
  br label %334

334:                                              ; preds = %330, %329
  %335 = phi i64 [ 0, %329 ], [ %333, %330 ]
  br label %336

336:                                              ; preds = %334, %323
  %337 = phi i64 [ %324, %323 ], [ %335, %334 ]
  store i64 %337, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #6
  %338 = load i64, ptr %21, align 8, !tbaa !9
  %339 = load i64, ptr %31, align 8, !tbaa !9
  %340 = icmp ult i64 %338, %339
  br i1 %340, label %341, label %343

341:                                              ; preds = %336
  %342 = load i64, ptr %21, align 8, !tbaa !9
  br label %345

343:                                              ; preds = %336
  %344 = load i64, ptr %31, align 8, !tbaa !9
  br label %345

345:                                              ; preds = %343, %341
  %346 = phi i64 [ %342, %341 ], [ %344, %343 ]
  store i64 %346, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #6
  store i64 0, ptr %33, align 8, !tbaa !9
  br label %347

347:                                              ; preds = %363, %345
  %348 = load i64, ptr %33, align 8, !tbaa !9
  %349 = load i64, ptr %32, align 8, !tbaa !9
  %350 = icmp ult i64 %348, %349
  br i1 %350, label %352, label %351

351:                                              ; preds = %347
  store i32 7, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #6
  br label %366

352:                                              ; preds = %347
  %353 = load ptr, ptr %9, align 8, !tbaa !5
  %354 = load i64, ptr %33, align 8, !tbaa !9
  %355 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %354
  %356 = getelementptr inbounds %struct.match_position_t, ptr %355, i32 0, i32 0
  %357 = load i64, ptr %356, align 16, !tbaa !29
  %358 = load i64, ptr %33, align 8, !tbaa !9
  %359 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %20, i64 0, i64 %358
  %360 = getelementptr inbounds %struct.match_position_t, ptr %359, i32 0, i32 1
  %361 = load i64, ptr %360, align 8, !tbaa !31
  %362 = call zeroext i1 @match_result_add(ptr noundef %353, i64 noundef %357, i64 noundef %361)
  br label %363

363:                                              ; preds = %352
  %364 = load i64, ptr %33, align 8, !tbaa !9
  %365 = add i64 %364, 1
  store i64 %365, ptr %33, align 8, !tbaa !9
  br label %347, !llvm.loop !35

366:                                              ; preds = %351
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #6
  br label %367

367:                                              ; preds = %366, %314, %311, %308
  %368 = load i64, ptr %10, align 8, !tbaa !9
  store i64 %368, ptr %5, align 8
  store i32 1, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 65536, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  br label %369

369:                                              ; preds = %367, %38
  %370 = load i64, ptr %5, align 8
  ret i64 %370

371:                                              ; preds = %305
  unreachable
}

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

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

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

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


; 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.match_position_t = type { i64, i64 }

@stderr = external local_unnamed_addr global ptr, align 8
@.str.160 = external hidden unnamed_addr constant [47 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 nofree nosync nounwind willreturn memory(none)
declare ptr @__ctype_tolower_loc() local_unnamed_addr #1

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

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @is_whole_word_match(ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local i64 @memchr_search(ptr nocapture noundef readonly %0, ptr noundef %1, i64 noundef %2, ptr noundef %3) local_unnamed_addr #4 {
  %5 = alloca [4096 x %struct.match_position_t], align 16
  %6 = getelementptr inbounds i8, ptr %0, i64 64
  %7 = load i64, ptr %6, align 8, !tbaa !5
  %8 = icmp eq i64 %7, 0
  br i1 %8, label %163, label %9

9:                                                ; preds = %4
  %10 = load ptr, ptr %0, align 8, !tbaa !12
  %11 = load i8, ptr %10, align 1, !tbaa !13
  %12 = getelementptr inbounds i8, ptr %0, i64 40
  %13 = load i8, ptr %12, align 8, !tbaa !14, !range !15, !noundef !16
  %14 = trunc nuw i8 %13 to i1
  br i1 %14, label %31, label %15

15:                                               ; preds = %9
  %16 = tail call ptr @__ctype_b_loc() #7
  %17 = load ptr, ptr %16, align 8, !tbaa !17
  %18 = sext i8 %11 to i64
  %19 = getelementptr inbounds i16, ptr %17, i64 %18
  %20 = load i16, ptr %19, align 2, !tbaa !18
  %21 = and i16 %20, 512
  %.not = icmp eq i16 %21, 0
  br i1 %.not, label %24, label %22

22:                                               ; preds = %15
  %23 = tail call ptr @__ctype_toupper_loc() #7
  br label %.sink.split

24:                                               ; preds = %15
  %25 = tail call ptr @__ctype_tolower_loc() #7
  br label %.sink.split

.sink.split:                                      ; preds = %24, %22
  %.sink = phi ptr [ %23, %22 ], [ %25, %24 ]
  %26 = load ptr, ptr %.sink, align 8, !tbaa !17
  %27 = getelementptr inbounds i32, ptr %26, i64 %18
  %28 = load i32, ptr %27, align 4, !tbaa !20
  %29 = shl i32 %28, 24
  %30 = ashr exact i32 %29, 24
  br label %31

31:                                               ; preds = %.sink.split, %9
  %sext = phi i32 [ 0, %9 ], [ %30, %.sink.split ]
  %32 = getelementptr inbounds i8, ptr %0, i64 42
  %33 = load i8, ptr %32, align 2, !tbaa !22, !range !15, !noundef !16
  %34 = getelementptr inbounds i8, ptr %0, i64 44
  %35 = load i8, ptr %34, align 4, !tbaa !23, !range !15, !noundef !16
  %36 = trunc nuw i8 %35 to i1
  call void @llvm.lifetime.start.p0(i64 65536, ptr nonnull %5) #8
  %.not244 = icmp eq i64 %2, 0
  br i1 %.not244, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %31
  %37 = trunc nuw i8 %33 to i1
  %38 = sext i8 %11 to i32
  %.not160 = icmp eq i32 %sext, %38
  %39 = ptrtoint ptr %1 to i64
  %40 = getelementptr inbounds i8, ptr %0, i64 45
  %.not162 = icmp eq i64 %7, -1
  %41 = getelementptr inbounds i8, ptr %5, i64 8
  br i1 %37, label %.lr.ph.split.us, label %.lr.ph.split

.lr.ph.split.us:                                  ; preds = %.lr.ph, %71
  %.0125200.us = phi i64 [ %.5.us, %71 ], [ 0, %.lr.ph ]
  %.0134198.us = phi i64 [ %.5139.us, %71 ], [ -1, %.lr.ph ]
  %.0140197.us = phi i64 [ %.5145.us, %71 ], [ 0, %.lr.ph ]
  %42 = getelementptr inbounds i8, ptr %1, i64 %.0140197.us
  %43 = sub i64 %2, %.0140197.us
  %44 = tail call ptr @memchr(ptr noundef %42, i32 noundef %38, i64 noundef %43) #9
  %45 = load i8, ptr %12, align 8, !tbaa !14, !range !15, !noundef !16
  %46 = trunc nuw i8 %45 to i1
  %47 = icmp ne ptr %44, null
  %or.cond.us = select i1 %46, i1 true, i1 %47
  br i1 %or.cond.us, label %51, label %48

48:                                               ; preds = %.lr.ph.split.us
  br i1 %.not160, label %.loopexit, label %49

49:                                               ; preds = %48
  %50 = tail call ptr @memchr(ptr noundef %42, i32 noundef %sext, i64 noundef %43) #9
  br label %51

51:                                               ; preds = %49, %.lr.ph.split.us
  %.0146.us = phi ptr [ %44, %.lr.ph.split.us ], [ %50, %49 ]
  %.not161.us = icmp eq ptr %.0146.us, null
  br i1 %.not161.us, label %.loopexit, label %52

52:                                               ; preds = %51
  %53 = ptrtoint ptr %.0146.us to i64
  %54 = sub i64 %53, %39
  %55 = load i8, ptr %40, align 1, !tbaa !24, !range !15, !noundef !16
  %56 = trunc nuw i8 %55 to i1
  br i1 %56, label %57, label %60

57:                                               ; preds = %52
  %58 = add i64 %54, 1
  %59 = tail call zeroext i1 @is_whole_word_match(ptr noundef %1, i64 noundef %2, i64 noundef %54, i64 noundef %58)
  br i1 %59, label %60, label %71, !llvm.loop !25

60:                                               ; preds = %57, %52
  %61 = tail call i64 @find_line_start(ptr noundef %1, i64 noundef %2, i64 noundef %54)
  %.not164.us = icmp eq i64 %61, %.0134198.us
  br i1 %.not164.us, label %69, label %62

62:                                               ; preds = %60
  %.not166.us = icmp ult i64 %.0125200.us, %7
  %or.cond168.us = select i1 %.not162, i1 true, i1 %.not166.us
  br i1 %or.cond168.us, label %63, label %.loopexit

63:                                               ; preds = %62
  %64 = add i64 %.0125200.us, 1
  %65 = tail call i64 @find_line_end(ptr noundef %1, i64 noundef %2, i64 noundef %61)
  %66 = icmp ult i64 %65, %2
  %67 = add i64 %65, 1
  %68 = select i1 %66, i64 %67, i64 %2
  br label %71

69:                                               ; preds = %60
  %70 = add i64 %54, 1
  br label %71

71:                                               ; preds = %69, %63, %57
  %.5145.us = phi i64 [ %58, %57 ], [ %70, %69 ], [ %68, %63 ]
  %.5139.us = phi i64 [ %.0134198.us, %57 ], [ %.0134198.us, %69 ], [ %61, %63 ]
  %.5.us = phi i64 [ %.0125200.us, %57 ], [ %.0125200.us, %69 ], [ %64, %63 ]
  %72 = icmp ult i64 %.5145.us, %2
  br i1 %72, label %.lr.ph.split.us, label %.loopexit

.lr.ph.split:                                     ; preds = %.lr.ph
  %73 = icmp ne ptr %3, null
  %or.cond5 = and i1 %73, %36
  br i1 %or.cond5, label %.lr.ph.split.split.us, label %.lr.ph.split.split

.lr.ph.split.split.us:                            ; preds = %.lr.ph.split, %109
  %.0125200.us218 = phi i64 [ %.5.us226, %109 ], [ 0, %.lr.ph.split ]
  %.0126199.us219 = phi i64 [ %.5131.us225, %109 ], [ 0, %.lr.ph.split ]
  %.0140197.us220 = phi i64 [ %.5145.us224, %109 ], [ 0, %.lr.ph.split ]
  %74 = getelementptr inbounds i8, ptr %1, i64 %.0140197.us220
  %75 = sub i64 %2, %.0140197.us220
  %76 = tail call ptr @memchr(ptr noundef %74, i32 noundef %38, i64 noundef %75) #9
  %77 = load i8, ptr %12, align 8, !tbaa !14, !range !15, !noundef !16
  %78 = trunc nuw i8 %77 to i1
  %79 = icmp ne ptr %76, null
  %or.cond.us221 = select i1 %78, i1 true, i1 %79
  br i1 %or.cond.us221, label %83, label %80

80:                                               ; preds = %.lr.ph.split.split.us
  br i1 %.not160, label %.thread185, label %81

81:                                               ; preds = %80
  %82 = tail call ptr @memchr(ptr noundef %74, i32 noundef %sext, i64 noundef %75) #9
  br label %83

83:                                               ; preds = %81, %.lr.ph.split.split.us
  %.0146.us222 = phi ptr [ %76, %.lr.ph.split.split.us ], [ %82, %81 ]
  %.not161.us223 = icmp eq ptr %.0146.us222, null
  br i1 %.not161.us223, label %.thread185, label %84

84:                                               ; preds = %83
  %85 = ptrtoint ptr %.0146.us222 to i64
  %86 = sub i64 %85, %39
  %87 = load i8, ptr %40, align 1, !tbaa !24, !range !15, !noundef !16
  %88 = trunc nuw i8 %87 to i1
  br i1 %88, label %89, label %92

89:                                               ; preds = %84
  %90 = add i64 %86, 1
  %91 = tail call zeroext i1 @is_whole_word_match(ptr noundef %1, i64 noundef %2, i64 noundef %86, i64 noundef %90)
  br i1 %91, label %92, label %109, !llvm.loop !25

92:                                               ; preds = %89, %84
  %.not163.us = icmp ult i64 %.0125200.us218, %7
  %or.cond169.us = select i1 %.not162, i1 true, i1 %.not163.us
  br i1 %or.cond169.us, label %93, label %.split.us

93:                                               ; preds = %92
  %94 = add i64 %.0125200.us218, 1
  %95 = icmp ult i64 %.0126199.us219, 4096
  br i1 %95, label %104, label %.preheader.us

96:                                               ; preds = %.preheader.us
  store i64 %86, ptr %5, align 16, !tbaa !27
  %97 = add i64 %86, 1
  store i64 %97, ptr %41, align 8, !tbaa !29
  br label %109

.preheader.us:                                    ; preds = %93, %.preheader.us
  %.0133196.us = phi i64 [ %103, %.preheader.us ], [ 0, %93 ]
  %98 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %5, i64 0, i64 %.0133196.us
  %99 = load i64, ptr %98, align 16, !tbaa !27
  %100 = getelementptr inbounds i8, ptr %98, i64 8
  %101 = load i64, ptr %100, align 8, !tbaa !29
  %102 = tail call zeroext i1 @match_result_add(ptr noundef nonnull %3, i64 noundef %99, i64 noundef %101)
  %103 = add nuw i64 %.0133196.us, 1
  %exitcond.not = icmp eq i64 %103, %.0126199.us219
  br i1 %exitcond.not, label %96, label %.preheader.us, !llvm.loop !30

104:                                              ; preds = %93
  %105 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %5, i64 0, i64 %.0126199.us219
  store i64 %86, ptr %105, align 16, !tbaa !27
  %106 = add i64 %86, 1
  %107 = getelementptr inbounds i8, ptr %105, i64 8
  store i64 %106, ptr %107, align 8, !tbaa !29
  %108 = add nuw nsw i64 %.0126199.us219, 1
  br label %109

109:                                              ; preds = %96, %104, %89
  %.5145.us224 = phi i64 [ %90, %89 ], [ %106, %104 ], [ %97, %96 ]
  %.5131.us225 = phi i64 [ %.0126199.us219, %89 ], [ %108, %104 ], [ 1, %96 ]
  %.5.us226 = phi i64 [ %.0125200.us218, %89 ], [ %94, %104 ], [ %94, %96 ]
  %110 = icmp ult i64 %.5145.us224, %2
  br i1 %110, label %.lr.ph.split.split.us, label %.thread185

.lr.ph.split.split:                               ; preds = %.lr.ph.split, %145
  %.0125200 = phi i64 [ %.5, %145 ], [ 0, %.lr.ph.split ]
  %.0140197 = phi i64 [ %.5145, %145 ], [ 0, %.lr.ph.split ]
  %111 = getelementptr inbounds i8, ptr %1, i64 %.0140197
  %112 = sub i64 %2, %.0140197
  %113 = tail call ptr @memchr(ptr noundef %111, i32 noundef %38, i64 noundef %112) #9
  %114 = load i8, ptr %12, align 8, !tbaa !14, !range !15, !noundef !16
  %115 = trunc nuw i8 %114 to i1
  %116 = icmp ne ptr %113, null
  %or.cond = select i1 %115, i1 true, i1 %116
  br i1 %or.cond, label %120, label %117

117:                                              ; preds = %.lr.ph.split.split
  br i1 %.not160, label %.loopexit, label %118

118:                                              ; preds = %117
  %119 = tail call ptr @memchr(ptr noundef %111, i32 noundef %sext, i64 noundef %112) #9
  br label %120

120:                                              ; preds = %118, %.lr.ph.split.split
  %.0146 = phi ptr [ %113, %.lr.ph.split.split ], [ %119, %118 ]
  %.not161 = icmp eq ptr %.0146, null
  br i1 %.not161, label %.loopexit, label %121

121:                                              ; preds = %120
  %122 = ptrtoint ptr %.0146 to i64
  %123 = sub i64 %122, %39
  %124 = load i8, ptr %40, align 1, !tbaa !24, !range !15, !noundef !16
  %125 = trunc nuw i8 %124 to i1
  br i1 %125, label %126, label %129

126:                                              ; preds = %121
  %127 = add i64 %123, 1
  %128 = tail call zeroext i1 @is_whole_word_match(ptr noundef %1, i64 noundef %2, i64 noundef %123, i64 noundef %127)
  br i1 %128, label %129, label %145, !llvm.loop !25

129:                                              ; preds = %126, %121
  %.not163 = icmp ult i64 %.0125200, %7
  %or.cond169 = select i1 %.not162, i1 true, i1 %.not163
  br i1 %or.cond169, label %142, label %.split.us.thread

.split.us:                                        ; preds = %92
  br i1 %or.cond5, label %130, label %.thread185

.split.us.thread:                                 ; preds = %129
  br i1 %or.cond5, label %.thread, label %.loopexit

130:                                              ; preds = %.split.us
  %131 = icmp ult i64 %.0126199.us219, 4096
  br i1 %131, label %.thread, label %136

.thread:                                          ; preds = %.split.us.thread, %130
  %.us-phi235259267 = phi i64 [ %.0126199.us219, %130 ], [ 0, %.split.us.thread ]
  %.us-phi236260266 = phi i64 [ %.0125200.us218, %130 ], [ %.0125200, %.split.us.thread ]
  %.us-phi237261265 = phi i64 [ %86, %130 ], [ %123, %.split.us.thread ]
  %132 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %5, i64 0, i64 %.us-phi235259267
  store i64 %.us-phi237261265, ptr %132, align 16, !tbaa !27
  %133 = add i64 %.us-phi237261265, 1
  %134 = getelementptr inbounds i8, ptr %132, i64 8
  store i64 %133, ptr %134, align 8, !tbaa !29
  %135 = add nuw nsw i64 %.us-phi235259267, 1
  br label %.thread185

136:                                              ; preds = %130
  %137 = add i64 %86, 1
  %138 = tail call zeroext i1 @match_result_add(ptr noundef nonnull %3, i64 noundef %86, i64 noundef %137)
  br i1 %138, label %.thread185, label %139

139:                                              ; preds = %136
  %140 = load ptr, ptr @stderr, align 8, !tbaa !17
  %141 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %140, ptr noundef nonnull @.str.160) #10
  br label %.thread185

142:                                              ; preds = %129
  %143 = add i64 %.0125200, 1
  %144 = add i64 %123, 1
  br label %145

145:                                              ; preds = %126, %142
  %.5145 = phi i64 [ %127, %126 ], [ %144, %142 ]
  %.5 = phi i64 [ %.0125200, %126 ], [ %143, %142 ]
  %146 = icmp ult i64 %.5145, %2
  br i1 %146, label %.lr.ph.split.split, label %.loopexit

.thread185:                                       ; preds = %109, %83, %80, %.split.us, %136, %139, %.thread
  %.0125194 = phi i64 [ %.0125200.us218, %.split.us ], [ %.0125200.us218, %139 ], [ %.0125200.us218, %136 ], [ %.us-phi236260266, %.thread ], [ %.5.us226, %109 ], [ %.0125200.us218, %83 ], [ %.0125200.us218, %80 ]
  %.6132 = phi i64 [ %.0126199.us219, %.split.us ], [ %.0126199.us219, %139 ], [ %.0126199.us219, %136 ], [ %135, %.thread ], [ %.5131.us225, %109 ], [ %.0126199.us219, %83 ], [ %.0126199.us219, %80 ]
  %147 = icmp ne ptr %3, null
  %or.cond7 = and i1 %147, %36
  %148 = icmp ne i64 %.6132, 0
  %or.cond9 = select i1 %or.cond7, i1 %148, i1 false
  br i1 %or.cond9, label %149, label %.loopexit

149:                                              ; preds = %.thread185
  %150 = icmp eq i64 %7, -1
  br i1 %150, label %.lr.ph243.preheader, label %151

151:                                              ; preds = %149
  %152 = getelementptr inbounds i8, ptr %3, i64 8
  %153 = load i64, ptr %152, align 8, !tbaa !31
  %154 = tail call i64 @llvm.usub.sat.i64(i64 %7, i64 %153)
  %.not245.not = icmp ugt i64 %7, %153
  br i1 %.not245.not, label %.lr.ph243.preheader, label %.loopexit

.lr.ph243.preheader:                              ; preds = %149, %151
  %155 = phi i64 [ %154, %151 ], [ %.6132, %149 ]
  %156 = tail call i64 @llvm.umin.i64(i64 %.6132, i64 %155)
  br label %.lr.ph243

.lr.ph243:                                        ; preds = %.lr.ph243.preheader, %.lr.ph243
  %.0242 = phi i64 [ %162, %.lr.ph243 ], [ 0, %.lr.ph243.preheader ]
  %157 = getelementptr inbounds [4096 x %struct.match_position_t], ptr %5, i64 0, i64 %.0242
  %158 = load i64, ptr %157, align 16, !tbaa !27
  %159 = getelementptr inbounds i8, ptr %157, i64 8
  %160 = load i64, ptr %159, align 8, !tbaa !29
  %161 = tail call zeroext i1 @match_result_add(ptr noundef nonnull %3, i64 noundef %158, i64 noundef %160)
  %162 = add nuw i64 %.0242, 1
  %exitcond255.not = icmp eq i64 %162, %156
  br i1 %exitcond255.not, label %.loopexit, label %.lr.ph243, !llvm.loop !33

.loopexit:                                        ; preds = %145, %120, %117, %.lr.ph243, %71, %51, %62, %48, %.split.us.thread, %31, %151, %.thread185
  %.0125194272 = phi i64 [ %.0125194, %151 ], [ %.0125194, %.thread185 ], [ %.0125200, %.split.us.thread ], [ 0, %31 ], [ %.0125200.us, %48 ], [ %.0125200.us, %62 ], [ %.0125200.us, %51 ], [ %.5.us, %71 ], [ %.0125194, %.lr.ph243 ], [ %.0125200, %117 ], [ %.0125200, %120 ], [ %.5, %145 ]
  call void @llvm.lifetime.end.p0(i64 65536, ptr nonnull %5) #8
  br label %163

163:                                              ; preds = %4, %.loopexit
  %.0124 = phi i64 [ %.0125194272, %.loopexit ], [ 0, %4 ]
  ret i64 %.0124
}

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

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

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

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

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

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


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