; LLVM IR from davidesantangelo/krep :: krep (memchr_short_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.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }

@lower_table = external dso_local global [256 x i8], align 16
@stderr = external global ptr, align 8
@only_matching = external hidden global i8, align 1
@.str.161 = external hidden unnamed_addr constant [46 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
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #1

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i64 @memchr_short_search(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3) #3 {
  %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 i64, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i8, align 1
  %14 = alloca i8, align 1
  %15 = alloca i8, align 1
  %16 = alloca i64, align 8
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i8, align 1
  %22 = alloca i8, align 1
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca i64, align 8
  %26 = alloca i8, align 1
  %27 = alloca i64, align 8
  %28 = alloca i8, align 1
  %29 = alloca i64, align 8
  %30 = 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
  %31 = load ptr, ptr %6, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.search_params, ptr %31, i32 0, i32 13
  %33 = load i64, ptr %32, align 8, !tbaa !11
  %34 = icmp eq i64 %33, 0
  br i1 %34, label %35, label %46

35:                                               ; preds = %4
  %36 = load ptr, ptr %6, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.search_params, ptr %36, i32 0, i32 7
  %38 = load i8, ptr %37, align 2, !tbaa !14, !range !15, !noundef !16
  %39 = trunc i8 %38 to i1
  br i1 %39, label %45, label %40

40:                                               ; preds = %35
  %41 = load ptr, ptr %6, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.search_params, ptr %41, i32 0, i32 9
  %43 = load i8, ptr %42, align 4, !tbaa !17, !range !15, !noundef !16
  %44 = trunc i8 %43 to i1
  br i1 %44, label %45, label %46

45:                                               ; preds = %40, %35
  store i64 0, ptr %5, align 8
  br label %293

46:                                               ; preds = %40, %4
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  store i64 0, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.search_params, ptr %47, i32 0, i32 1
  %49 = load i64, ptr %48, align 8, !tbaa !18
  store i64 %49, ptr %11, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.search_params, ptr %50, i32 0, i32 0
  %52 = load ptr, ptr %51, align 8, !tbaa !19
  store ptr %52, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #5
  %53 = load ptr, ptr %6, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.search_params, ptr %53, i32 0, i32 5
  %55 = load i8, ptr %54, align 8, !tbaa !20, !range !15, !noundef !16
  %56 = trunc i8 %55 to i1
  %57 = zext i1 %56 to i8
  store i8 %57, ptr %13, align 1, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 1, ptr %14) #5
  %58 = load ptr, ptr %6, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.search_params, ptr %58, i32 0, i32 7
  %60 = load i8, ptr %59, align 2, !tbaa !14, !range !15, !noundef !16
  %61 = trunc i8 %60 to i1
  %62 = zext i1 %61 to i8
  store i8 %62, ptr %14, align 1, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 1, ptr %15) #5
  %63 = load ptr, ptr %6, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.search_params, ptr %63, i32 0, i32 9
  %65 = load i8, ptr %64, align 4, !tbaa !17, !range !15, !noundef !16
  %66 = trunc i8 %65 to i1
  %67 = zext i1 %66 to i8
  store i8 %67, ptr %15, align 1, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #5
  %68 = load ptr, ptr %6, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.search_params, ptr %68, i32 0, i32 13
  %70 = load i64, ptr %69, align 8, !tbaa !11
  store i64 %70, ptr %16, align 8, !tbaa !9
  %71 = load i64, ptr %11, align 8, !tbaa !9
  %72 = icmp ult i64 %71, 2
  br i1 %72, label %80, label %73

73:                                               ; preds = %46
  %74 = load i64, ptr %11, align 8, !tbaa !9
  %75 = icmp ugt i64 %74, 3
  br i1 %75, label %80, label %76

76:                                               ; preds = %73
  %77 = load i64, ptr %8, align 8, !tbaa !9
  %78 = load i64, ptr %11, align 8, !tbaa !9
  %79 = icmp ult i64 %77, %78
  br i1 %79, label %80, label %81

80:                                               ; preds = %76, %73, %46
  store i64 0, ptr %5, align 8
  store i32 1, ptr %17, align 4
  br label %292

81:                                               ; preds = %76
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  %82 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %82, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  %83 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %83, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  store i64 -1, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %21) #5
  %84 = load ptr, ptr %12, align 8, !tbaa !5
  %85 = getelementptr inbounds i8, ptr %84, i64 0
  %86 = load i8, ptr %85, align 1, !tbaa !22
  store i8 %86, ptr %21, align 1, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 1, ptr %22) #5
  %87 = load i8, ptr %13, align 1, !tbaa !21, !range !15, !noundef !16
  %88 = trunc i8 %87 to i1
  br i1 %88, label %89, label %90

89:                                               ; preds = %81
  br label %96

90:                                               ; preds = %81
  %91 = load i8, ptr %21, align 1, !tbaa !22
  %92 = zext i8 %91 to i64
  %93 = getelementptr inbounds [256 x i8], ptr @lower_table, i64 0, i64 %92
  %94 = load i8, ptr %93, align 1, !tbaa !22
  %95 = zext i8 %94 to i32
  br label %96

96:                                               ; preds = %90, %89
  %97 = phi i32 [ 0, %89 ], [ %95, %90 ]
  %98 = trunc i32 %97 to i8
  store i8 %98, ptr %22, align 1, !tbaa !22
  br label %99

99:                                               ; preds = %289, %287, %96
  %100 = load i64, ptr %19, align 8, !tbaa !9
  %101 = load i64, ptr %11, align 8, !tbaa !9
  %102 = icmp uge i64 %100, %101
  br i1 %102, label %103, label %290

103:                                              ; preds = %99
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  store ptr null, ptr %23, align 8, !tbaa !5
  %104 = load i8, ptr %13, align 1, !tbaa !21, !range !15, !noundef !16
  %105 = trunc i8 %104 to i1
  br i1 %105, label %106, label %115

106:                                              ; preds = %103
  %107 = load ptr, ptr %18, align 8, !tbaa !5
  %108 = load i8, ptr %21, align 1, !tbaa !22
  %109 = zext i8 %108 to i32
  %110 = load i64, ptr %19, align 8, !tbaa !9
  %111 = load i64, ptr %11, align 8, !tbaa !9
  %112 = sub i64 %110, %111
  %113 = add i64 %112, 1
  %114 = call ptr @memchr(ptr noundef %107, i32 noundef %109, i64 noundef %113) #6
  store ptr %114, ptr %23, align 8, !tbaa !5
  br label %146

115:                                              ; preds = %103
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  %116 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %116, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  store i64 0, ptr %25, align 8, !tbaa !9
  br label %117

117:                                              ; preds = %141, %115
  %118 = load i64, ptr %25, align 8, !tbaa !9
  %119 = load i64, ptr %19, align 8, !tbaa !9
  %120 = load i64, ptr %11, align 8, !tbaa !9
  %121 = sub i64 %119, %120
  %122 = icmp ule i64 %118, %121
  br i1 %122, label %124, label %123

123:                                              ; preds = %117
  store i32 4, ptr %17, align 4
  br label %144

124:                                              ; preds = %117
  %125 = load ptr, ptr %24, align 8, !tbaa !5
  %126 = load i64, ptr %25, align 8, !tbaa !9
  %127 = getelementptr inbounds i8, ptr %125, i64 %126
  %128 = load i8, ptr %127, align 1, !tbaa !22
  %129 = zext i8 %128 to i64
  %130 = getelementptr inbounds [256 x i8], ptr @lower_table, i64 0, i64 %129
  %131 = load i8, ptr %130, align 1, !tbaa !22
  %132 = zext i8 %131 to i32
  %133 = load i8, ptr %22, align 1, !tbaa !22
  %134 = zext i8 %133 to i32
  %135 = icmp eq i32 %132, %134
  br i1 %135, label %136, label %140

136:                                              ; preds = %124
  %137 = load ptr, ptr %24, align 8, !tbaa !5
  %138 = load i64, ptr %25, align 8, !tbaa !9
  %139 = getelementptr inbounds i8, ptr %137, i64 %138
  store ptr %139, ptr %23, align 8, !tbaa !5
  store i32 4, ptr %17, align 4
  br label %144

140:                                              ; preds = %124
  br label %141

141:                                              ; preds = %140
  %142 = load i64, ptr %25, align 8, !tbaa !9
  %143 = add i64 %142, 1
  store i64 %143, ptr %25, align 8, !tbaa !9
  br label %117, !llvm.loop !23

144:                                              ; preds = %136, %123
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  br label %145

145:                                              ; preds = %144
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  br label %146

146:                                              ; preds = %145, %106
  %147 = load ptr, ptr %23, align 8, !tbaa !5
  %148 = icmp eq ptr %147, null
  br i1 %148, label %149, label %150

149:                                              ; preds = %146
  store i32 3, ptr %17, align 4
  br label %287

150:                                              ; preds = %146
  call void @llvm.lifetime.start.p0(i64 1, ptr %26) #5
  store i8 0, ptr %26, align 1, !tbaa !21
  %151 = load i8, ptr %13, align 1, !tbaa !21, !range !15, !noundef !16
  %152 = trunc i8 %151 to i1
  br i1 %152, label %153, label %164

153:                                              ; preds = %150
  %154 = load ptr, ptr %23, align 8, !tbaa !5
  %155 = getelementptr inbounds i8, ptr %154, i64 1
  %156 = load ptr, ptr %12, align 8, !tbaa !5
  %157 = getelementptr inbounds i8, ptr %156, i64 1
  %158 = load i64, ptr %11, align 8, !tbaa !9
  %159 = sub i64 %158, 1
  %160 = call i32 @memcmp(ptr noundef %155, ptr noundef %157, i64 noundef %159) #6
  %161 = icmp eq i32 %160, 0
  br i1 %161, label %162, label %163

162:                                              ; preds = %153
  store i8 1, ptr %26, align 1, !tbaa !21
  br label %163

163:                                              ; preds = %162, %153
  br label %174

164:                                              ; preds = %150
  %165 = load ptr, ptr %23, align 8, !tbaa !5
  %166 = getelementptr inbounds i8, ptr %165, i64 1
  %167 = load ptr, ptr %12, align 8, !tbaa !5
  %168 = getelementptr inbounds i8, ptr %167, i64 1
  %169 = load i64, ptr %11, align 8, !tbaa !9
  %170 = sub i64 %169, 1
  %171 = call zeroext i1 @memory_equals_case_insensitive(ptr noundef %166, ptr noundef %168, i64 noundef %170)
  br i1 %171, label %172, label %173

172:                                              ; preds = %164
  store i8 1, ptr %26, align 1, !tbaa !21
  br label %173

173:                                              ; preds = %172, %164
  br label %174

174:                                              ; preds = %173, %163
  %175 = load i8, ptr %26, align 1, !tbaa !21, !range !15, !noundef !16
  %176 = trunc i8 %175 to i1
  br i1 %176, label %177, label %260

177:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  %178 = load ptr, ptr %23, align 8, !tbaa !5
  %179 = load ptr, ptr %7, align 8, !tbaa !5
  %180 = ptrtoint ptr %178 to i64
  %181 = ptrtoint ptr %179 to i64
  %182 = sub i64 %180, %181
  store i64 %182, ptr %27, align 8, !tbaa !9
  %183 = load ptr, ptr %6, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.search_params, ptr %183, i32 0, i32 10
  %185 = load i8, ptr %184, align 1, !tbaa !25, !range !15, !noundef !16
  %186 = trunc i8 %185 to i1
  br i1 %186, label %187, label %206

187:                                              ; preds = %177
  %188 = load ptr, ptr %7, align 8, !tbaa !5
  %189 = load i64, ptr %8, align 8, !tbaa !9
  %190 = load i64, ptr %27, align 8, !tbaa !9
  %191 = load i64, ptr %27, align 8, !tbaa !9
  %192 = load i64, ptr %11, align 8, !tbaa !9
  %193 = add i64 %191, %192
  %194 = call zeroext i1 @is_whole_word_match(ptr noundef %188, i64 noundef %189, i64 noundef %190, i64 noundef %193)
  br i1 %194, label %206, label %195

195:                                              ; preds = %187
  %196 = load ptr, ptr %23, align 8, !tbaa !5
  %197 = getelementptr inbounds i8, ptr %196, i64 1
  store ptr %197, ptr %18, align 8, !tbaa !5
  %198 = load ptr, ptr %23, align 8, !tbaa !5
  %199 = load ptr, ptr %18, align 8, !tbaa !5
  %200 = ptrtoint ptr %198 to i64
  %201 = ptrtoint ptr %199 to i64
  %202 = sub i64 %200, %201
  %203 = add nsw i64 %202, 1
  %204 = load i64, ptr %19, align 8, !tbaa !9
  %205 = sub i64 %204, %203
  store i64 %205, ptr %19, align 8, !tbaa !9
  store i32 2, ptr %17, align 4
  br label %257, !llvm.loop !26

206:                                              ; preds = %187, %177
  call void @llvm.lifetime.start.p0(i64 1, ptr %28) #5
  store i8 0, ptr %28, align 1, !tbaa !21
  %207 = load i8, ptr %14, align 1, !tbaa !21, !range !15, !noundef !16
  %208 = trunc i8 %207 to i1
  br i1 %208, label %209, label %222

209:                                              ; preds = %206
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  %210 = load ptr, ptr %7, align 8, !tbaa !5
  %211 = load i64, ptr %8, align 8, !tbaa !9
  %212 = load i64, ptr %27, align 8, !tbaa !9
  %213 = call i64 @find_line_start(ptr noundef %210, i64 noundef %211, i64 noundef %212)
  store i64 %213, ptr %29, align 8, !tbaa !9
  %214 = load i64, ptr %29, align 8, !tbaa !9
  %215 = load i64, ptr %20, align 8, !tbaa !9
  %216 = icmp ne i64 %214, %215
  br i1 %216, label %217, label %221

217:                                              ; preds = %209
  %218 = load i64, ptr %10, align 8, !tbaa !9
  %219 = add i64 %218, 1
  store i64 %219, ptr %10, align 8, !tbaa !9
  %220 = load i64, ptr %29, align 8, !tbaa !9
  store i64 %220, ptr %20, align 8, !tbaa !9
  store i8 1, ptr %28, align 1, !tbaa !21
  br label %221

221:                                              ; preds = %217, %209
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  br label %247

222:                                              ; preds = %206
  %223 = load i64, ptr %10, align 8, !tbaa !9
  %224 = add i64 %223, 1
  store i64 %224, ptr %10, align 8, !tbaa !9
  store i8 1, ptr %28, align 1, !tbaa !21
  %225 = load i8, ptr %15, align 1, !tbaa !21, !range !15, !noundef !16
  %226 = trunc i8 %225 to i1
  br i1 %226, label %227, label %246

227:                                              ; preds = %222
  %228 = load ptr, ptr %9, align 8, !tbaa !5
  %229 = icmp ne ptr %228, null
  br i1 %229, label %230, label %246

230:                                              ; preds = %227
  %231 = load i64, ptr %10, align 8, !tbaa !9
  %232 = load i64, ptr %16, align 8, !tbaa !9
  %233 = icmp ule i64 %231, %232
  br i1 %233, label %234, label %245

234:                                              ; preds = %230
  %235 = load ptr, ptr %9, align 8, !tbaa !5
  %236 = load i64, ptr %27, align 8, !tbaa !9
  %237 = load i64, ptr %27, align 8, !tbaa !9
  %238 = load i64, ptr %11, align 8, !tbaa !9
  %239 = add i64 %237, %238
  %240 = call zeroext i1 @match_result_add(ptr noundef %235, i64 noundef %236, i64 noundef %239)
  br i1 %240, label %244, label %241

241:                                              ; preds = %234
  %242 = load ptr, ptr @stderr, align 8, !tbaa !5
  %243 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %242, ptr noundef @.str.161) #5
  br label %244

244:                                              ; preds = %241, %234
  br label %245

245:                                              ; preds = %244, %230
  br label %246

246:                                              ; preds = %245, %227, %222
  br label %247

247:                                              ; preds = %246, %221
  %248 = load i8, ptr %28, align 1, !tbaa !21, !range !15, !noundef !16
  %249 = trunc i8 %248 to i1
  br i1 %249, label %250, label %255

250:                                              ; preds = %247
  %251 = load i64, ptr %10, align 8, !tbaa !9
  %252 = load i64, ptr %16, align 8, !tbaa !9
  %253 = icmp uge i64 %251, %252
  br i1 %253, label %254, label %255

254:                                              ; preds = %250
  store i32 3, ptr %17, align 4
  br label %256

255:                                              ; preds = %250, %247
  store i32 0, ptr %17, align 4
  br label %256

256:                                              ; preds = %255, %254
  call void @llvm.lifetime.end.p0(i64 1, ptr %28) #5
  br label %257

257:                                              ; preds = %256, %195
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  %258 = load i32, ptr %17, align 4
  switch i32 %258, label %286 [
    i32 0, label %259
  ]

259:                                              ; preds = %257
  br label %260

260:                                              ; preds = %259, %174
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  %261 = load ptr, ptr %23, align 8, !tbaa !5
  %262 = load ptr, ptr %18, align 8, !tbaa !5
  %263 = ptrtoint ptr %261 to i64
  %264 = ptrtoint ptr %262 to i64
  %265 = sub i64 %263, %264
  %266 = load i8, ptr @only_matching, align 1, !tbaa !21, !range !15, !noundef !16
  %267 = trunc i8 %266 to i1
  br i1 %267, label %268, label %270

268:                                              ; preds = %260
  %269 = load i64, ptr %11, align 8, !tbaa !9
  br label %271

270:                                              ; preds = %260
  br label %271

271:                                              ; preds = %270, %268
  %272 = phi i64 [ %269, %268 ], [ 1, %270 ]
  %273 = add i64 %265, %272
  store i64 %273, ptr %30, align 8, !tbaa !9
  %274 = load i64, ptr %30, align 8, !tbaa !9
  %275 = load i64, ptr %19, align 8, !tbaa !9
  %276 = icmp ugt i64 %274, %275
  br i1 %276, label %277, label %278

277:                                              ; preds = %271
  store i32 3, ptr %17, align 4
  br label %285

278:                                              ; preds = %271
  %279 = load i64, ptr %30, align 8, !tbaa !9
  %280 = load ptr, ptr %18, align 8, !tbaa !5
  %281 = getelementptr inbounds i8, ptr %280, i64 %279
  store ptr %281, ptr %18, align 8, !tbaa !5
  %282 = load i64, ptr %30, align 8, !tbaa !9
  %283 = load i64, ptr %19, align 8, !tbaa !9
  %284 = sub i64 %283, %282
  store i64 %284, ptr %19, align 8, !tbaa !9
  store i32 0, ptr %17, align 4
  br label %285

285:                                              ; preds = %278, %277
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  br label %286

286:                                              ; preds = %285, %257
  call void @llvm.lifetime.end.p0(i64 1, ptr %26) #5
  br label %287

287:                                              ; preds = %286, %149
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  %288 = load i32, ptr %17, align 4
  switch i32 %288, label %295 [
    i32 0, label %289
    i32 3, label %290
    i32 2, label %99
  ]

289:                                              ; preds = %287
  br label %99, !llvm.loop !26

290:                                              ; preds = %287, %99
  %291 = load i64, ptr %10, align 8, !tbaa !9
  store i64 %291, ptr %5, align 8
  store i32 1, ptr %17, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  br label %292

292:                                              ; preds = %290, %80
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  br label %293

293:                                              ; preds = %292, %45
  %294 = load i64, ptr %5, align 8
  ret i64 %294

295:                                              ; preds = %287
  unreachable
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 #3 = { 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 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 = { nounwind }
attributes #6 = { 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, !13, i64 42}
!15 = !{i8 0, i8 2}
!16 = !{}
!17 = !{!12, !13, i64 44}
!18 = !{!12, !10, i64 8}
!19 = !{!12, !6, i64 0}
!20 = !{!12, !13, i64 40}
!21 = !{!13, !13, i64 0}
!22 = !{!7, !7, i64 0}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!12, !13, i64 45}
!26 = distinct !{!26, !24}


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

@lower_table = external dso_local local_unnamed_addr global [256 x i8], align 16
@stderr = external local_unnamed_addr global ptr, align 8
@only_matching = external hidden local_unnamed_addr global i8, align 1
@.str.161 = external hidden unnamed_addr constant [46 x i8], align 1

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare dso_local zeroext i1 @memory_equals_case_insensitive(ptr noundef, ptr noundef, i64 noundef) 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 #1

; Function Attrs: nounwind uwtable
define dso_local i64 @memchr_short_search(ptr nocapture noundef readonly %0, ptr noundef %1, i64 noundef %2, ptr noundef %3) local_unnamed_addr #2 {
  %5 = getelementptr inbounds i8, ptr %0, i64 64
  %6 = load i64, ptr %5, align 8, !tbaa !5
  %7 = icmp eq i64 %6, 0
  %8 = getelementptr inbounds i8, ptr %0, i64 42
  %9 = load i8, ptr %8, align 2, !tbaa !12, !range !13
  br i1 %7, label %10, label %._crit_edge

._crit_edge:                                      ; preds = %4
  %.phi.trans.insert177 = getelementptr inbounds i8, ptr %0, i64 44
  %.pre178 = load i8, ptr %.phi.trans.insert177, align 4, !tbaa !14, !range !13
  br label %16

10:                                               ; preds = %4
  %11 = trunc nuw i8 %9 to i1
  br i1 %11, label %.thread156, label %12

12:                                               ; preds = %10
  %13 = getelementptr inbounds i8, ptr %0, i64 44
  %14 = load i8, ptr %13, align 4, !tbaa !14, !range !13, !noundef !15
  %15 = trunc nuw i8 %14 to i1
  br i1 %15, label %.thread156, label %16

16:                                               ; preds = %._crit_edge, %12
  %17 = phi i8 [ %.pre178, %._crit_edge ], [ %14, %12 ]
  %18 = getelementptr inbounds i8, ptr %0, i64 8
  %19 = load i64, ptr %18, align 8, !tbaa !16
  %20 = load ptr, ptr %0, align 8, !tbaa !17
  %21 = getelementptr inbounds i8, ptr %0, i64 40
  %22 = load i8, ptr %21, align 8, !tbaa !18, !range !13, !noundef !15
  %23 = trunc nuw i8 %22 to i1
  %24 = trunc nuw i8 %9 to i1
  %25 = trunc nuw i8 %17 to i1
  %26 = and i64 %19, -2
  %or.cond.not = icmp ne i64 %26, 2
  %27 = icmp ugt i64 %19, %2
  %or.cond = or i1 %27, %or.cond.not
  br i1 %or.cond, label %.thread156, label %28

28:                                               ; preds = %16
  %29 = load i8, ptr %20, align 1, !tbaa !19
  br i1 %23, label %34, label %30

30:                                               ; preds = %28
  %31 = zext i8 %29 to i64
  %32 = getelementptr inbounds [256 x i8], ptr @lower_table, i64 0, i64 %31
  %33 = load i8, ptr %32, align 1, !tbaa !19
  br label %34

34:                                               ; preds = %28, %30
  %35 = phi i8 [ %33, %30 ], [ 0, %28 ]
  %36 = getelementptr inbounds i8, ptr %20, i64 1
  %37 = add nsw i64 %19, -1
  %38 = zext i8 %29 to i32
  %39 = ptrtoint ptr %1 to i64
  %40 = getelementptr inbounds i8, ptr %0, i64 45
  %41 = icmp ne ptr %3, null
  %or.cond3 = and i1 %41, %25
  br label %.outer

.outer:                                           ; preds = %.loopexit, %34
  %.0116.ph = phi i64 [ %.4120, %.loopexit ], [ -1, %34 ]
  %.0110.ph = phi i64 [ %.3113, %.loopexit ], [ %2, %34 ]
  %.0102.ph = phi ptr [ %.3105, %.loopexit ], [ %1, %34 ]
  %.091.ph = phi i64 [ %.4, %.loopexit ], [ 0, %34 ]
  %.not = icmp ult i64 %.0110.ph, %19
  %42 = sub i64 %.0110.ph, %19
  %reass.sub = sub i64 %.0110.ph, %19
  %43 = add i64 %reass.sub, 1
  br i1 %.not, label %.thread156, label %.lr.ph

.lr.ph:                                           ; preds = %.outer, %.thread149
  %.0102198 = phi ptr [ %91, %.thread149 ], [ %.0102.ph, %.outer ]
  br i1 %23, label %52, label %.preheader

.preheader:                                       ; preds = %.lr.ph, %50
  %.0101173 = phi i64 [ %51, %50 ], [ 0, %.lr.ph ]
  %44 = getelementptr inbounds i8, ptr %.0102198, i64 %.0101173
  %45 = load i8, ptr %44, align 1, !tbaa !19
  %46 = zext i8 %45 to i64
  %47 = getelementptr inbounds [256 x i8], ptr @lower_table, i64 0, i64 %46
  %48 = load i8, ptr %47, align 1, !tbaa !19
  %49 = icmp eq i8 %48, %35
  br i1 %49, label %57, label %50

50:                                               ; preds = %.preheader
  %51 = add i64 %.0101173, 1
  %.not130 = icmp ugt i64 %51, %42
  br i1 %.not130, label %.thread156, label %.preheader, !llvm.loop !20

52:                                               ; preds = %.lr.ph
  %53 = tail call ptr @memchr(ptr noundef %.0102198, i32 noundef %38, i64 noundef %43) #5
  %54 = icmp eq ptr %53, null
  br i1 %54, label %.thread156, label %.thread143

.thread143:                                       ; preds = %52
  %55 = getelementptr inbounds i8, ptr %53, i64 1
  %bcmp = tail call i32 @bcmp(ptr nonnull %55, ptr nonnull %36, i64 %37)
  %56 = icmp eq i32 %bcmp, 0
  br i1 %56, label %61, label %.loopexit

57:                                               ; preds = %.preheader
  %58 = getelementptr inbounds i8, ptr %.0102198, i64 %.0101173
  %59 = getelementptr inbounds i8, ptr %58, i64 1
  %60 = tail call zeroext i1 @memory_equals_case_insensitive(ptr noundef nonnull %59, ptr noundef nonnull %36, i64 noundef %37)
  br i1 %60, label %61, label %.loopexit

61:                                               ; preds = %.thread143, %57
  %.1109142145148 = phi ptr [ %53, %.thread143 ], [ %58, %57 ]
  %62 = ptrtoint ptr %.1109142145148 to i64
  %63 = sub i64 %62, %39
  %64 = load i8, ptr %40, align 1, !tbaa !22, !range !13, !noundef !15
  %65 = trunc nuw i8 %64 to i1
  br i1 %65, label %66, label %69

66:                                               ; preds = %61
  %67 = add i64 %63, %19
  %68 = tail call zeroext i1 @is_whole_word_match(ptr noundef %1, i64 noundef %2, i64 noundef %63, i64 noundef %67)
  br i1 %68, label %69, label %.thread149

69:                                               ; preds = %66, %61
  br i1 %24, label %70, label %73

70:                                               ; preds = %69
  %71 = tail call i64 @find_line_start(ptr noundef %1, i64 noundef %2, i64 noundef %63)
  %.not132 = icmp ne i64 %71, %.0116.ph
  %72 = zext i1 %.not132 to i64
  %spec.select136 = add i64 %.091.ph, %72
  br label %81

73:                                               ; preds = %69
  %74 = add i64 %.091.ph, 1
  %.not131 = icmp ule i64 %74, %6
  %or.cond137.not = select i1 %or.cond3, i1 %.not131, i1 false
  br i1 %or.cond137.not, label %75, label %81

75:                                               ; preds = %73
  %76 = add i64 %63, %19
  %77 = tail call zeroext i1 @match_result_add(ptr noundef nonnull %3, i64 noundef %63, i64 noundef %76)
  br i1 %77, label %81, label %78

78:                                               ; preds = %75
  %79 = load ptr, ptr @stderr, align 8, !tbaa !23
  %80 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %79, ptr noundef nonnull @.str.161) #6
  br label %81

81:                                               ; preds = %73, %75, %78, %70
  %.2118 = phi i64 [ %71, %70 ], [ %.0116.ph, %75 ], [ %.0116.ph, %78 ], [ %.0116.ph, %73 ]
  %.194 = phi i1 [ %.not132, %70 ], [ true, %75 ], [ true, %78 ], [ true, %73 ]
  %.2 = phi i64 [ %spec.select136, %70 ], [ %74, %75 ], [ %74, %78 ], [ %74, %73 ]
  %.not133 = icmp uge i64 %.2, %6
  %or.cond138.not = select i1 %.194, i1 %.not133, i1 false
  br i1 %or.cond138.not, label %.thread156, label %.loopexit

.loopexit:                                        ; preds = %.thread143, %57, %81
  %.1109142145147 = phi ptr [ %.1109142145148, %81 ], [ %53, %.thread143 ], [ %58, %57 ]
  %.4120 = phi i64 [ %.2118, %81 ], [ %.0116.ph, %57 ], [ %.0116.ph, %.thread143 ]
  %.4 = phi i64 [ %.2, %81 ], [ %.091.ph, %57 ], [ %.091.ph, %.thread143 ]
  %82 = ptrtoint ptr %.1109142145147 to i64
  %83 = ptrtoint ptr %.0102198 to i64
  %84 = sub i64 %82, %83
  %85 = load i8, ptr @only_matching, align 1, !tbaa !24, !range !13, !noundef !15
  %86 = trunc nuw i8 %85 to i1
  %87 = select i1 %86, i64 %19, i64 1
  %88 = add i64 %87, %84
  %89 = icmp ugt i64 %88, %.0110.ph
  %90 = select i1 %89, i64 0, i64 %88
  %.3113 = sub i64 %.0110.ph, %90
  %.3105 = getelementptr inbounds i8, ptr %.0102198, i64 %90
  br i1 %89, label %.thread156, label %.outer

.thread149:                                       ; preds = %66
  %91 = getelementptr inbounds i8, ptr %.1109142145148, i64 1
  br i1 %.not, label %.thread156, label %.lr.ph

.thread156:                                       ; preds = %81, %.loopexit, %.outer, %.thread149, %52, %50, %16, %10, %12
  %.1 = phi i64 [ 0, %12 ], [ 0, %10 ], [ 0, %16 ], [ %.091.ph, %50 ], [ %.091.ph, %52 ], [ %.091.ph, %.thread149 ], [ %.2, %81 ], [ %.4, %.loopexit ], [ %.091.ph, %.outer ]
  ret i64 %.1
}

; Function Attrs: nofree nounwind willreturn memory(argmem: read)
declare i32 @bcmp(ptr nocapture, ptr nocapture, i64) local_unnamed_addr #4

attributes #0 = { 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 #1 = { 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 #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress 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 #4 = { nofree nounwind willreturn memory(argmem: read) }
attributes #5 = { nounwind willreturn memory(read) }
attributes #6 = { 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, !11, i64 42}
!13 = !{i8 0, i8 2}
!14 = !{!6, !11, i64 44}
!15 = !{}
!16 = !{!6, !10, i64 8}
!17 = !{!6, !7, i64 0}
!18 = !{!6, !11, i64 40}
!19 = !{!8, !8, i64 0}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = !{!6, !11, i64 45}
!23 = !{!7, !7, i64 0}
!24 = !{!11, !11, i64 0}


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