; LLVM IR from davidesantangelo/krep :: test (test_krep)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }
%struct.match_result_t = type { ptr, i64, i64 }

@tests_passed = external dso_local global i32, align 4
@tests_failed = external dso_local global i32, align 4
@.str.5 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.80 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.140 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.160 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.161 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.162 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.163 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.164 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.165 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.166 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.167 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.168 = external hidden unnamed_addr constant [64 x i8], align 1
@.str.169 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.170 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.171 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.172 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.173 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.174 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.175 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.176 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.177 = external hidden unnamed_addr constant [44 x i8], align 1
@__const.test_edge_cases_advanced.empty_patterns = external hidden unnamed_addr constant [1 x ptr], align 8
@.str.178 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.179 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.180 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.181 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.182 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.183 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.184 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.185 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.186 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.187 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.188 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.189 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.190 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.191 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.192 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.193 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.194 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.195 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.196 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.197 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.198 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.199 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.200 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.201 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.202 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.203 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.204 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.205 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.206 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.207 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.208 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.209 = external hidden unnamed_addr constant [38 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local void @create_literal_params(ptr dead_on_unwind noalias writable sret(%struct.search_params) align 8, ptr noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #0

; Function Attrs: nounwind uwtable
declare dso_local void @create_regex_params(ptr dead_on_unwind noalias writable sret(%struct.search_params) align 8, ptr noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #0

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

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

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

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

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

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

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

declare ptr @match_result_init(i64 noundef) #4

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

declare void @match_result_free(ptr noundef) #4

declare i64 @kmp_search(ptr noundef, ptr noundef, i64 noundef, 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) #6

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

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

; Function Attrs: nounwind uwtable
define dso_local void @test_edge_cases_advanced() #0 {
  %1 = alloca i64, align 8
  %2 = alloca i64, align 8
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i64, align 8
  %6 = alloca %struct.search_params, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca i32, align 4
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i64, align 8
  %14 = alloca %struct.search_params, align 8
  %15 = alloca %struct.search_params, align 8
  %16 = alloca [1 x ptr], align 8
  %17 = alloca [1 x i64], align 8
  %18 = alloca %struct.search_params, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca i64, align 8
  %23 = alloca ptr, align 8
  %24 = alloca i64, align 8
  %25 = alloca %struct.search_params, align 8
  %26 = alloca ptr, align 8
  %27 = alloca i64, align 8
  %28 = alloca ptr, align 8
  %29 = alloca i64, align 8
  %30 = alloca %struct.search_params, align 8
  %31 = alloca [6 x i64], align 16
  %32 = alloca i64, align 8
  %33 = alloca i64, align 8
  %34 = alloca ptr, align 8
  %35 = alloca i64, align 8
  %36 = alloca ptr, align 8
  %37 = alloca %struct.search_params, align 8
  %38 = call i32 (ptr, ...) @printf(ptr noundef @.str.160)
  %39 = call i32 (ptr, ...) @printf(ptr noundef @.str.161)
  call void @llvm.lifetime.start.p0(i64 8, ptr %1) #8
  store i64 209715200, ptr %1, align 8, !tbaa !5
  %40 = call i32 (ptr, ...) @printf(ptr noundef @.str.162, i64 noundef 200)
  call void @llvm.lifetime.start.p0(i64 8, ptr %2) #8
  store i64 1048576, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #8
  %41 = call noalias ptr @malloc(i64 noundef 1048576) #9
  store ptr %41, ptr %3, align 8, !tbaa !9
  %42 = load ptr, ptr %3, align 8, !tbaa !9
  %43 = icmp ne ptr %42, null
  br i1 %43, label %46, label %44

44:                                               ; preds = %0
  %45 = call i32 (ptr, ...) @printf(ptr noundef @.str.163)
  br label %112

46:                                               ; preds = %0
  %47 = load ptr, ptr %3, align 8, !tbaa !9
  call void @llvm.memset.p0.i64(ptr align 1 %47, i8 65, i64 1048576, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #8
  store ptr @.str.164, ptr %4, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #8
  %48 = load ptr, ptr %4, align 8, !tbaa !9
  %49 = call i64 @strlen(ptr noundef %48) #10
  store i64 %49, ptr %5, align 8, !tbaa !5
  %50 = load ptr, ptr %3, align 8, !tbaa !9
  %51 = getelementptr inbounds i8, ptr %50, i64 1000
  %52 = load ptr, ptr %4, align 8, !tbaa !9
  %53 = load i64, ptr %5, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %51, ptr align 1 %52, i64 %53, i1 false)
  %54 = load ptr, ptr %3, align 8, !tbaa !9
  %55 = getelementptr inbounds i8, ptr %54, i64 10000
  %56 = load ptr, ptr %4, align 8, !tbaa !9
  %57 = load i64, ptr %5, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %55, ptr align 1 %56, i64 %57, i1 false)
  %58 = load ptr, ptr %3, align 8, !tbaa !9
  %59 = getelementptr inbounds i8, ptr %58, i64 100000
  %60 = load ptr, ptr %4, align 8, !tbaa !9
  %61 = load i64, ptr %5, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %59, ptr align 1 %60, i64 %61, i1 false)
  call void @llvm.lifetime.start.p0(i64 72, ptr %6) #8
  %62 = load ptr, ptr %4, align 8, !tbaa !9
  call void @create_literal_params(ptr dead_on_unwind writable sret(%struct.search_params) align 8 %6, ptr noundef %62, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %63 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 9
  store i8 1, ptr %63, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #8
  %64 = call ptr @match_result_init(i64 noundef 10)
  store ptr %64, ptr %7, align 8, !tbaa !9
  %65 = call i32 (ptr, ...) @printf(ptr noundef @.str.165)
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #8
  %66 = load ptr, ptr %3, align 8, !tbaa !9
  %67 = load ptr, ptr %7, align 8, !tbaa !9
  %68 = call i64 @boyer_moore_search(ptr noundef %6, ptr noundef %66, i64 noundef 1048576, ptr noundef %67)
  store i64 %68, ptr %8, align 8, !tbaa !5
  br label %69

69:                                               ; preds = %46
  %70 = load i64, ptr %8, align 8, !tbaa !5
  %71 = icmp eq i64 %70, 3
  br i1 %71, label %72, label %76

72:                                               ; preds = %69
  %73 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.166)
  %74 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %75 = add nsw i32 %74, 1
  store i32 %75, ptr @tests_passed, align 4, !tbaa !14
  br label %80

76:                                               ; preds = %69
  %77 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.166)
  %78 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %79 = add nsw i32 %78, 1
  store i32 %79, ptr @tests_failed, align 4, !tbaa !14
  br label %80

80:                                               ; preds = %76, %72
  br label %81

81:                                               ; preds = %80
  br label %82

82:                                               ; preds = %81
  %83 = load ptr, ptr %7, align 8, !tbaa !9
  call void @match_result_free(ptr noundef %83)
  %84 = call i32 (ptr, ...) @printf(ptr noundef @.str.167)
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #8
  store i32 1, ptr %9, align 4, !tbaa !14
  br label %85

85:                                               ; preds = %107, %82
  %86 = load i32, ptr %9, align 4, !tbaa !14
  %87 = icmp sle i32 %86, 8
  br i1 %87, label %89, label %88

88:                                               ; preds = %85
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #8
  br label %110

89:                                               ; preds = %85
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #8
  %90 = load i32, ptr %9, align 4, !tbaa !14
  %91 = sext i32 %90 to i64
  %92 = add i64 209715200, %91
  %93 = sub i64 %92, 1
  %94 = load i32, ptr %9, align 4, !tbaa !14
  %95 = sext i32 %94 to i64
  %96 = udiv i64 %93, %95
  store i64 %96, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #8
  %97 = load i32, ptr %9, align 4, !tbaa !14
  %98 = sub nsw i32 %97, 1
  %99 = sext i32 %98 to i64
  %100 = load i64, ptr %10, align 8, !tbaa !5
  %101 = mul i64 %99, %100
  %102 = sub i64 209715200, %101
  store i64 %102, ptr %11, align 8, !tbaa !5
  %103 = load i32, ptr %9, align 4, !tbaa !14
  %104 = load i64, ptr %10, align 8, !tbaa !5
  %105 = load i64, ptr %11, align 8, !tbaa !5
  %106 = call i32 (ptr, ...) @printf(ptr noundef @.str.168, i32 noundef %103, i64 noundef %104, i64 noundef %105)
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #8
  br label %107

107:                                              ; preds = %89
  %108 = load i32, ptr %9, align 4, !tbaa !14
  %109 = mul nsw i32 %108, 2
  store i32 %109, ptr %9, align 4, !tbaa !14
  br label %85, !llvm.loop !16

110:                                              ; preds = %88
  %111 = load ptr, ptr %3, align 8, !tbaa !9
  call void @free(ptr noundef %111) #8
  call void @cleanup_params(ptr noundef %6)
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %6) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #8
  br label %112

112:                                              ; preds = %110, %44
  %113 = call i32 (ptr, ...) @printf(ptr noundef @.str.169)
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #8
  store ptr @.str.170, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #8
  %114 = load ptr, ptr %12, align 8, !tbaa !9
  %115 = call i64 @strlen(ptr noundef %114) #10
  store i64 %115, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 72, ptr %14) #8
  call void @create_literal_params(ptr dead_on_unwind writable sret(%struct.search_params) align 8 %14, ptr noundef @.str.23, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %116 = call i32 (ptr, ...) @printf(ptr noundef @.str.171)
  br label %117

117:                                              ; preds = %112
  %118 = load ptr, ptr %12, align 8, !tbaa !9
  %119 = load i64, ptr %13, align 8, !tbaa !5
  %120 = call i64 @boyer_moore_search(ptr noundef %14, ptr noundef %118, i64 noundef %119, ptr noundef null)
  %121 = icmp eq i64 %120, 0
  br i1 %121, label %122, label %126

122:                                              ; preds = %117
  %123 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.172)
  %124 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %125 = add nsw i32 %124, 1
  store i32 %125, ptr @tests_passed, align 4, !tbaa !14
  br label %130

126:                                              ; preds = %117
  %127 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.172)
  %128 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %129 = add nsw i32 %128, 1
  store i32 %129, ptr @tests_failed, align 4, !tbaa !14
  br label %130

130:                                              ; preds = %126, %122
  br label %131

131:                                              ; preds = %130
  br label %132

132:                                              ; preds = %131
  %133 = call i32 (ptr, ...) @printf(ptr noundef @.str.173)
  br label %134

134:                                              ; preds = %132
  %135 = load ptr, ptr %12, align 8, !tbaa !9
  %136 = load i64, ptr %13, align 8, !tbaa !5
  %137 = call i64 @kmp_search(ptr noundef %14, ptr noundef %135, i64 noundef %136, ptr noundef null)
  %138 = icmp eq i64 %137, 0
  br i1 %138, label %139, label %143

139:                                              ; preds = %134
  %140 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.174)
  %141 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %142 = add nsw i32 %141, 1
  store i32 %142, ptr @tests_passed, align 4, !tbaa !14
  br label %147

143:                                              ; preds = %134
  %144 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.174)
  %145 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %146 = add nsw i32 %145, 1
  store i32 %146, ptr @tests_failed, align 4, !tbaa !14
  br label %147

147:                                              ; preds = %143, %139
  br label %148

148:                                              ; preds = %147
  br label %149

149:                                              ; preds = %148
  %150 = call i32 (ptr, ...) @printf(ptr noundef @.str.175)
  call void @llvm.lifetime.start.p0(i64 72, ptr %15) #8
  call void @create_regex_params(ptr dead_on_unwind writable sret(%struct.search_params) align 8 %15, ptr noundef @.str.140, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  br label %151

151:                                              ; preds = %149
  %152 = load ptr, ptr %12, align 8, !tbaa !9
  %153 = load i64, ptr %13, align 8, !tbaa !5
  %154 = call i64 @regex_search(ptr noundef %15, ptr noundef %152, i64 noundef %153, ptr noundef null)
  %155 = icmp eq i64 %154, 0
  br i1 %155, label %156, label %160

156:                                              ; preds = %151
  %157 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.176)
  %158 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %159 = add nsw i32 %158, 1
  store i32 %159, ptr @tests_passed, align 4, !tbaa !14
  br label %164

160:                                              ; preds = %151
  %161 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.176)
  %162 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %163 = add nsw i32 %162, 1
  store i32 %163, ptr @tests_failed, align 4, !tbaa !14
  br label %164

164:                                              ; preds = %160, %156
  br label %165

165:                                              ; preds = %164
  br label %166

166:                                              ; preds = %165
  call void @cleanup_params(ptr noundef %15)
  %167 = call i32 (ptr, ...) @printf(ptr noundef @.str.177)
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %16, ptr align 8 @__const.test_edge_cases_advanced.empty_patterns, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  call void @llvm.memset.p0.i64(ptr align 8 %17, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 72, ptr %18) #8
  %168 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 0
  store ptr null, ptr %168, align 8, !tbaa !18
  %169 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 1
  store i64 0, ptr %169, align 8, !tbaa !19
  %170 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 2
  %171 = getelementptr inbounds [1 x ptr], ptr %16, i64 0, i64 0
  store ptr %171, ptr %170, align 8, !tbaa !20
  %172 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 3
  %173 = getelementptr inbounds [1 x i64], ptr %17, i64 0, i64 0
  store ptr %173, ptr %172, align 8, !tbaa !21
  %174 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 4
  store i64 1, ptr %174, align 8, !tbaa !22
  %175 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 5
  store i8 1, ptr %175, align 8, !tbaa !23
  %176 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 6
  store i8 0, ptr %176, align 1, !tbaa !24
  %177 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 7
  store i8 0, ptr %177, align 2, !tbaa !25
  %178 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 8
  store i8 1, ptr %178, align 1, !tbaa !26
  %179 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 9
  store i8 0, ptr %179, align 4, !tbaa !11
  %180 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 10
  store i8 0, ptr %180, align 1, !tbaa !27
  %181 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 11
  store ptr null, ptr %181, align 8, !tbaa !28
  %182 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 12
  store ptr null, ptr %182, align 8, !tbaa !29
  %183 = getelementptr inbounds %struct.search_params, ptr %18, i32 0, i32 13
  store i64 -1, ptr %183, align 8, !tbaa !30
  br label %184

184:                                              ; preds = %166
  %185 = load ptr, ptr %12, align 8, !tbaa !9
  %186 = load i64, ptr %13, align 8, !tbaa !5
  %187 = call i64 @aho_corasick_search(ptr noundef %18, ptr noundef %185, i64 noundef %186, ptr noundef null)
  %188 = icmp eq i64 %187, 0
  br i1 %188, label %189, label %193

189:                                              ; preds = %184
  %190 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.178)
  %191 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %192 = add nsw i32 %191, 1
  store i32 %192, ptr @tests_passed, align 4, !tbaa !14
  br label %197

193:                                              ; preds = %184
  %194 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.178)
  %195 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %196 = add nsw i32 %195, 1
  store i32 %196, ptr @tests_failed, align 4, !tbaa !14
  br label %197

197:                                              ; preds = %193, %189
  br label %198

198:                                              ; preds = %197
  br label %199

199:                                              ; preds = %198
  call void @cleanup_params(ptr noundef %14)
  %200 = call i32 (ptr, ...) @printf(ptr noundef @.str.179)
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  %201 = call ptr @match_result_init(i64 noundef 1152921504606846976)
  store ptr %201, ptr %19, align 8, !tbaa !9
  br label %202

202:                                              ; preds = %199
  %203 = load ptr, ptr %19, align 8, !tbaa !9
  %204 = icmp eq ptr %203, null
  br i1 %204, label %205, label %209

205:                                              ; preds = %202
  %206 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.180)
  %207 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %208 = add nsw i32 %207, 1
  store i32 %208, ptr @tests_passed, align 4, !tbaa !14
  br label %213

209:                                              ; preds = %202
  %210 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.180)
  %211 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %212 = add nsw i32 %211, 1
  store i32 %212, ptr @tests_failed, align 4, !tbaa !14
  br label %213

213:                                              ; preds = %209, %205
  br label %214

214:                                              ; preds = %213
  br label %215

215:                                              ; preds = %214
  %216 = load ptr, ptr %19, align 8, !tbaa !9
  %217 = icmp ne ptr %216, null
  br i1 %217, label %218, label %220

218:                                              ; preds = %215
  %219 = load ptr, ptr %19, align 8, !tbaa !9
  call void @match_result_free(ptr noundef %219)
  br label %220

220:                                              ; preds = %218, %215
  %221 = call i32 (ptr, ...) @printf(ptr noundef @.str.181)
  br label %222

222:                                              ; preds = %220
  %223 = call zeroext i1 @match_result_add(ptr noundef null, i64 noundef 0, i64 noundef 1)
  %224 = zext i1 %223 to i32
  %225 = icmp eq i32 %224, 0
  br i1 %225, label %226, label %230

226:                                              ; preds = %222
  %227 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.182)
  %228 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %229 = add nsw i32 %228, 1
  store i32 %229, ptr @tests_passed, align 4, !tbaa !14
  br label %234

230:                                              ; preds = %222
  %231 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.182)
  %232 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %233 = add nsw i32 %232, 1
  store i32 %233, ptr @tests_failed, align 4, !tbaa !14
  br label %234

234:                                              ; preds = %230, %226
  br label %235

235:                                              ; preds = %234
  br label %236

236:                                              ; preds = %235
  %237 = call i32 (ptr, ...) @printf(ptr noundef @.str.183)
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #8
  %238 = call ptr @match_result_init(i64 noundef 5)
  store ptr %238, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #8
  %239 = call ptr @match_result_init(i64 noundef 5)
  store ptr %239, ptr %21, align 8, !tbaa !9
  %240 = load ptr, ptr %20, align 8, !tbaa !9
  %241 = icmp ne ptr %240, null
  br i1 %241, label %242, label %267

242:                                              ; preds = %236
  %243 = load ptr, ptr %21, align 8, !tbaa !9
  %244 = icmp ne ptr %243, null
  br i1 %244, label %245, label %267

245:                                              ; preds = %242
  %246 = load ptr, ptr %20, align 8, !tbaa !9
  %247 = getelementptr inbounds %struct.match_result_t, ptr %246, i32 0, i32 1
  store i64 3, ptr %247, align 8, !tbaa !31
  %248 = load ptr, ptr %21, align 8, !tbaa !9
  %249 = getelementptr inbounds %struct.match_result_t, ptr %248, i32 0, i32 1
  store i64 -3, ptr %249, align 8, !tbaa !31
  br label %250

250:                                              ; preds = %245
  %251 = load ptr, ptr %21, align 8, !tbaa !9
  %252 = load ptr, ptr %20, align 8, !tbaa !9
  %253 = call zeroext i1 @match_result_merge(ptr noundef %251, ptr noundef %252, i64 noundef 0)
  %254 = zext i1 %253 to i32
  %255 = icmp eq i32 %254, 0
  br i1 %255, label %256, label %260

256:                                              ; preds = %250
  %257 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.184)
  %258 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %259 = add nsw i32 %258, 1
  store i32 %259, ptr @tests_passed, align 4, !tbaa !14
  br label %264

260:                                              ; preds = %250
  %261 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.184)
  %262 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %263 = add nsw i32 %262, 1
  store i32 %263, ptr @tests_failed, align 4, !tbaa !14
  br label %264

264:                                              ; preds = %260, %256
  br label %265

265:                                              ; preds = %264
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266, %242, %236
  %268 = load ptr, ptr %20, align 8, !tbaa !9
  call void @match_result_free(ptr noundef %268)
  %269 = load ptr, ptr %21, align 8, !tbaa !9
  call void @match_result_free(ptr noundef %269)
  %270 = call i32 (ptr, ...) @printf(ptr noundef @.str.185)
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  store i64 1024, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  %271 = call noalias ptr @malloc(i64 noundef 1024) #9
  store ptr %271, ptr %23, align 8, !tbaa !9
  %272 = load ptr, ptr %23, align 8, !tbaa !9
  %273 = icmp ne ptr %272, null
  br i1 %273, label %274, label %320

274:                                              ; preds = %267
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #8
  store i64 0, ptr %24, align 8, !tbaa !5
  br label %275

275:                                              ; preds = %287, %274
  %276 = load i64, ptr %24, align 8, !tbaa !5
  %277 = icmp ult i64 %276, 1024
  br i1 %277, label %279, label %278

278:                                              ; preds = %275
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #8
  br label %290

279:                                              ; preds = %275
  %280 = load i64, ptr %24, align 8, !tbaa !5
  %281 = urem i64 %280, 26
  %282 = add i64 97, %281
  %283 = trunc i64 %282 to i8
  %284 = load ptr, ptr %23, align 8, !tbaa !9
  %285 = load i64, ptr %24, align 8, !tbaa !5
  %286 = getelementptr inbounds i8, ptr %284, i64 %285
  store i8 %283, ptr %286, align 1, !tbaa !33
  br label %287

287:                                              ; preds = %279
  %288 = load i64, ptr %24, align 8, !tbaa !5
  %289 = add i64 %288, 1
  store i64 %289, ptr %24, align 8, !tbaa !5
  br label %275, !llvm.loop !34

290:                                              ; preds = %278
  %291 = load ptr, ptr %23, align 8, !tbaa !9
  %292 = getelementptr inbounds i8, ptr %291, i64 100
  store i8 0, ptr %292, align 1, !tbaa !33
  %293 = load ptr, ptr %23, align 8, !tbaa !9
  %294 = getelementptr inbounds i8, ptr %293, i64 200
  store i8 0, ptr %294, align 1, !tbaa !33
  %295 = load ptr, ptr %23, align 8, !tbaa !9
  %296 = getelementptr inbounds i8, ptr %295, i64 300
  store i8 0, ptr %296, align 1, !tbaa !33
  %297 = call i32 (ptr, ...) @printf(ptr noundef @.str.186)
  call void @llvm.lifetime.start.p0(i64 72, ptr %25) #8
  call void @create_literal_params(ptr dead_on_unwind writable sret(%struct.search_params) align 8 %25, ptr noundef @.str.29, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %298 = load ptr, ptr %23, align 8, !tbaa !9
  %299 = getelementptr inbounds i8, ptr %298, i64 500
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %299, ptr align 1 @.str.29, i64 3, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #8
  %300 = call ptr @match_result_init(i64 noundef 10)
  store ptr %300, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  %301 = load ptr, ptr %23, align 8, !tbaa !9
  %302 = load ptr, ptr %26, align 8, !tbaa !9
  %303 = call i64 @boyer_moore_search(ptr noundef %25, ptr noundef %301, i64 noundef 1024, ptr noundef %302)
  store i64 %303, ptr %27, align 8, !tbaa !5
  br label %304

304:                                              ; preds = %290
  %305 = load i64, ptr %27, align 8, !tbaa !5
  %306 = icmp ugt i64 %305, 0
  br i1 %306, label %307, label %311

307:                                              ; preds = %304
  %308 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.187)
  %309 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %310 = add nsw i32 %309, 1
  store i32 %310, ptr @tests_passed, align 4, !tbaa !14
  br label %315

311:                                              ; preds = %304
  %312 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.187)
  %313 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %314 = add nsw i32 %313, 1
  store i32 %314, ptr @tests_failed, align 4, !tbaa !14
  br label %315

315:                                              ; preds = %311, %307
  br label %316

316:                                              ; preds = %315
  br label %317

317:                                              ; preds = %316
  %318 = load ptr, ptr %26, align 8, !tbaa !9
  call void @match_result_free(ptr noundef %318)
  call void @cleanup_params(ptr noundef %25)
  %319 = load ptr, ptr %23, align 8, !tbaa !9
  call void @free(ptr noundef %319) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %25) #8
  br label %322

320:                                              ; preds = %267
  %321 = call i32 (ptr, ...) @printf(ptr noundef @.str.188)
  br label %322

322:                                              ; preds = %320, %317
  %323 = call i32 (ptr, ...) @printf(ptr noundef @.str.189)
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #8
  store ptr @.str.190, ptr %28, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #8
  %324 = load ptr, ptr %28, align 8, !tbaa !9
  %325 = call i64 @strlen(ptr noundef %324) #10
  store i64 %325, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 72, ptr %30) #8
  call void @create_literal_params(ptr dead_on_unwind writable sret(%struct.search_params) align 8 %30, ptr noundef @.str.80, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %326 = getelementptr inbounds %struct.search_params, ptr %30, i32 0, i32 9
  store i8 1, ptr %326, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 48, ptr %31) #8
  call void @llvm.memset.p0.i64(ptr align 16 %31, i8 0, i64 48, i1 false)
  %327 = getelementptr inbounds [6 x i64], ptr %31, i32 0, i32 1
  store i64 1, ptr %327, align 8
  %328 = getelementptr inbounds [6 x i64], ptr %31, i32 0, i32 2
  store i64 3, ptr %328, align 16
  %329 = getelementptr inbounds [6 x i64], ptr %31, i32 0, i32 3
  store i64 5, ptr %329, align 8
  %330 = getelementptr inbounds [6 x i64], ptr %31, i32 0, i32 4
  store i64 10, ptr %330, align 16
  %331 = getelementptr inbounds [6 x i64], ptr %31, i32 0, i32 5
  store i64 -1, ptr %331, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #8
  store i64 0, ptr %32, align 8, !tbaa !5
  br label %332

332:                                              ; preds = %454, %322
  %333 = load i64, ptr %32, align 8, !tbaa !5
  %334 = icmp ult i64 %333, 6
  br i1 %334, label %336, label %335

335:                                              ; preds = %332
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #8
  br label %457

336:                                              ; preds = %332
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #8
  %337 = load i64, ptr %32, align 8, !tbaa !5
  %338 = getelementptr inbounds [6 x i64], ptr %31, i64 0, i64 %337
  %339 = load i64, ptr %338, align 8, !tbaa !5
  store i64 %339, ptr %33, align 8, !tbaa !5
  %340 = load i64, ptr %33, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.search_params, ptr %30, i32 0, i32 13
  store i64 %340, ptr %341, align 8, !tbaa !30
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  %342 = call ptr @match_result_init(i64 noundef 20)
  store ptr %342, ptr %34, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #8
  %343 = load ptr, ptr %28, align 8, !tbaa !9
  %344 = load i64, ptr %29, align 8, !tbaa !5
  %345 = load ptr, ptr %34, align 8, !tbaa !9
  %346 = call i64 @boyer_moore_search(ptr noundef %30, ptr noundef %343, i64 noundef %344, ptr noundef %345)
  store i64 %346, ptr %35, align 8, !tbaa !5
  %347 = load i64, ptr %33, align 8, !tbaa !5
  %348 = icmp eq i64 %347, -1
  br i1 %348, label %349, label %381

349:                                              ; preds = %336
  %350 = call i32 (ptr, ...) @printf(ptr noundef @.str.191)
  br label %351

351:                                              ; preds = %349
  %352 = load i64, ptr %35, align 8, !tbaa !5
  %353 = icmp eq i64 %352, 10
  br i1 %353, label %354, label %358

354:                                              ; preds = %351
  %355 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.192)
  %356 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %357 = add nsw i32 %356, 1
  store i32 %357, ptr @tests_passed, align 4, !tbaa !14
  br label %362

358:                                              ; preds = %351
  %359 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.192)
  %360 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %361 = add nsw i32 %360, 1
  store i32 %361, ptr @tests_failed, align 4, !tbaa !14
  br label %362

362:                                              ; preds = %358, %354
  br label %363

363:                                              ; preds = %362
  br label %364

364:                                              ; preds = %363
  br label %365

365:                                              ; preds = %364
  %366 = load ptr, ptr %34, align 8, !tbaa !9
  %367 = getelementptr inbounds %struct.match_result_t, ptr %366, i32 0, i32 1
  %368 = load i64, ptr %367, align 8, !tbaa !31
  %369 = icmp eq i64 %368, 10
  br i1 %369, label %370, label %374

370:                                              ; preds = %365
  %371 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.193)
  %372 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %373 = add nsw i32 %372, 1
  store i32 %373, ptr @tests_passed, align 4, !tbaa !14
  br label %378

374:                                              ; preds = %365
  %375 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.193)
  %376 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %377 = add nsw i32 %376, 1
  store i32 %377, ptr @tests_failed, align 4, !tbaa !14
  br label %378

378:                                              ; preds = %374, %370
  br label %379

379:                                              ; preds = %378
  br label %380

380:                                              ; preds = %379
  br label %452

381:                                              ; preds = %336
  %382 = load i64, ptr %33, align 8, !tbaa !5
  %383 = icmp eq i64 %382, 0
  br i1 %383, label %384, label %416

384:                                              ; preds = %381
  %385 = call i32 (ptr, ...) @printf(ptr noundef @.str.194)
  br label %386

386:                                              ; preds = %384
  %387 = load i64, ptr %35, align 8, !tbaa !5
  %388 = icmp eq i64 %387, 0
  br i1 %388, label %389, label %393

389:                                              ; preds = %386
  %390 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.195)
  %391 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %392 = add nsw i32 %391, 1
  store i32 %392, ptr @tests_passed, align 4, !tbaa !14
  br label %397

393:                                              ; preds = %386
  %394 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.195)
  %395 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %396 = add nsw i32 %395, 1
  store i32 %396, ptr @tests_failed, align 4, !tbaa !14
  br label %397

397:                                              ; preds = %393, %389
  br label %398

398:                                              ; preds = %397
  br label %399

399:                                              ; preds = %398
  br label %400

400:                                              ; preds = %399
  %401 = load ptr, ptr %34, align 8, !tbaa !9
  %402 = getelementptr inbounds %struct.match_result_t, ptr %401, i32 0, i32 1
  %403 = load i64, ptr %402, align 8, !tbaa !31
  %404 = icmp eq i64 %403, 0
  br i1 %404, label %405, label %409

405:                                              ; preds = %400
  %406 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.196)
  %407 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %408 = add nsw i32 %407, 1
  store i32 %408, ptr @tests_passed, align 4, !tbaa !14
  br label %413

409:                                              ; preds = %400
  %410 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.196)
  %411 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %412 = add nsw i32 %411, 1
  store i32 %412, ptr @tests_failed, align 4, !tbaa !14
  br label %413

413:                                              ; preds = %409, %405
  br label %414

414:                                              ; preds = %413
  br label %415

415:                                              ; preds = %414
  br label %451

416:                                              ; preds = %381
  %417 = load i64, ptr %33, align 8, !tbaa !5
  %418 = call i32 (ptr, ...) @printf(ptr noundef @.str.197, i64 noundef %417)
  br label %419

419:                                              ; preds = %416
  %420 = load i64, ptr %35, align 8, !tbaa !5
  %421 = load i64, ptr %33, align 8, !tbaa !5
  %422 = icmp eq i64 %420, %421
  br i1 %422, label %423, label %427

423:                                              ; preds = %419
  %424 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.198)
  %425 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %426 = add nsw i32 %425, 1
  store i32 %426, ptr @tests_passed, align 4, !tbaa !14
  br label %431

427:                                              ; preds = %419
  %428 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.198)
  %429 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %430 = add nsw i32 %429, 1
  store i32 %430, ptr @tests_failed, align 4, !tbaa !14
  br label %431

431:                                              ; preds = %427, %423
  br label %432

432:                                              ; preds = %431
  br label %433

433:                                              ; preds = %432
  br label %434

434:                                              ; preds = %433
  %435 = load ptr, ptr %34, align 8, !tbaa !9
  %436 = getelementptr inbounds %struct.match_result_t, ptr %435, i32 0, i32 1
  %437 = load i64, ptr %436, align 8, !tbaa !31
  %438 = load i64, ptr %33, align 8, !tbaa !5
  %439 = icmp eq i64 %437, %438
  br i1 %439, label %440, label %444

440:                                              ; preds = %434
  %441 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.199)
  %442 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %443 = add nsw i32 %442, 1
  store i32 %443, ptr @tests_passed, align 4, !tbaa !14
  br label %448

444:                                              ; preds = %434
  %445 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.199)
  %446 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %447 = add nsw i32 %446, 1
  store i32 %447, ptr @tests_failed, align 4, !tbaa !14
  br label %448

448:                                              ; preds = %444, %440
  br label %449

449:                                              ; preds = %448
  br label %450

450:                                              ; preds = %449
  br label %451

451:                                              ; preds = %450, %415
  br label %452

452:                                              ; preds = %451, %380
  %453 = load ptr, ptr %34, align 8, !tbaa !9
  call void @match_result_free(ptr noundef %453)
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #8
  br label %454

454:                                              ; preds = %452
  %455 = load i64, ptr %32, align 8, !tbaa !5
  %456 = add i64 %455, 1
  store i64 %456, ptr %32, align 8, !tbaa !5
  br label %332, !llvm.loop !35

457:                                              ; preds = %335
  call void @cleanup_params(ptr noundef %30)
  %458 = call i32 (ptr, ...) @printf(ptr noundef @.str.200)
  %459 = call i32 (ptr, ...) @printf(ptr noundef @.str.201)
  %460 = call i32 (ptr, ...) @printf(ptr noundef @.str.202)
  %461 = call i32 (ptr, ...) @printf(ptr noundef @.str.203)
  %462 = call i32 (ptr, ...) @printf(ptr noundef @.str.204)
  %463 = call i32 (ptr, ...) @printf(ptr noundef @.str.205)
  %464 = call i32 (ptr, ...) @printf(ptr noundef @.str.206)
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #8
  store ptr @.str.29, ptr %36, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 72, ptr %37) #8
  call void @create_literal_params(ptr dead_on_unwind writable sret(%struct.search_params) align 8 %37, ptr noundef @.str.17, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %465 = call i32 (ptr, ...) @printf(ptr noundef @.str.207)
  br label %466

466:                                              ; preds = %457
  %467 = load ptr, ptr %36, align 8, !tbaa !9
  %468 = load ptr, ptr %36, align 8, !tbaa !9
  %469 = call i64 @strlen(ptr noundef %468) #10
  %470 = call i64 @boyer_moore_search(ptr noundef %37, ptr noundef %467, i64 noundef %469, ptr noundef null)
  %471 = icmp eq i64 %470, 0
  br i1 %471, label %472, label %476

472:                                              ; preds = %466
  %473 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.208)
  %474 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %475 = add nsw i32 %474, 1
  store i32 %475, ptr @tests_passed, align 4, !tbaa !14
  br label %480

476:                                              ; preds = %466
  %477 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.208)
  %478 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %479 = add nsw i32 %478, 1
  store i32 %479, ptr @tests_failed, align 4, !tbaa !14
  br label %480

480:                                              ; preds = %476, %472
  br label %481

481:                                              ; preds = %480
  br label %482

482:                                              ; preds = %481
  br label %483

483:                                              ; preds = %482
  %484 = load ptr, ptr %36, align 8, !tbaa !9
  %485 = load ptr, ptr %36, align 8, !tbaa !9
  %486 = call i64 @strlen(ptr noundef %485) #10
  %487 = call i64 @kmp_search(ptr noundef %37, ptr noundef %484, i64 noundef %486, ptr noundef null)
  %488 = icmp eq i64 %487, 0
  br i1 %488, label %489, label %493

489:                                              ; preds = %483
  %490 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, ptr noundef @.str.209)
  %491 = load i32, ptr @tests_passed, align 4, !tbaa !14
  %492 = add nsw i32 %491, 1
  store i32 %492, ptr @tests_passed, align 4, !tbaa !14
  br label %497

493:                                              ; preds = %483
  %494 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, ptr noundef @.str.209)
  %495 = load i32, ptr @tests_failed, align 4, !tbaa !14
  %496 = add nsw i32 %495, 1
  store i32 %496, ptr @tests_failed, align 4, !tbaa !14
  br label %497

497:                                              ; preds = %493, %489
  br label %498

498:                                              ; preds = %497
  br label %499

499:                                              ; preds = %498
  call void @cleanup_params(ptr noundef %37)
  call void @llvm.lifetime.end.p0(i64 72, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 48, ptr %31) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %2) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %1) #8
  ret void
}

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

declare zeroext i1 @match_result_add(ptr noundef, i64 noundef, i64 noundef) #4

declare zeroext i1 @match_result_merge(ptr noundef, ptr noundef, i64 noundef) #4

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { "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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #8 = { nounwind }
attributes #9 = { nounwind allocsize(0) }
attributes #10 = { 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 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !13, i64 44}
!12 = !{!"search_params", !10, i64 0, !6, i64 8, !10, i64 16, !10, i64 24, !6, i64 32, !13, i64 40, !13, i64 41, !13, i64 42, !13, i64 43, !13, i64 44, !13, i64 45, !10, i64 48, !10, i64 56, !6, i64 64}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"int", !7, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!12, !10, i64 0}
!19 = !{!12, !6, i64 8}
!20 = !{!12, !10, i64 16}
!21 = !{!12, !10, i64 24}
!22 = !{!12, !6, i64 32}
!23 = !{!12, !13, i64 40}
!24 = !{!12, !13, i64 41}
!25 = !{!12, !13, i64 42}
!26 = !{!12, !13, i64 43}
!27 = !{!12, !13, i64 45}
!28 = !{!12, !10, i64 48}
!29 = !{!12, !10, i64 56}
!30 = !{!12, !6, i64 64}
!31 = !{!32, !6, i64 8}
!32 = !{!"match_result_t", !10, i64 0, !6, i64 8, !6, i64 16}
!33 = !{!7, !7, i64 0}
!34 = distinct !{!34, !17}
!35 = distinct !{!35, !17}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.search_params = type { ptr, i64, ptr, ptr, i64, i8, i8, i8, i8, i8, i8, ptr, ptr, i64 }

@tests_passed = external dso_local local_unnamed_addr global i32, align 4
@tests_failed = external dso_local local_unnamed_addr global i32, align 4
@.str.5 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.80 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.140 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.160 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.161 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.162 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.163 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.164 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.165 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.166 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.167 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.168 = external hidden unnamed_addr constant [64 x i8], align 1
@.str.169 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.170 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.171 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.172 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.173 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.174 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.175 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.176 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.177 = external hidden unnamed_addr constant [44 x i8], align 1
@__const.test_edge_cases_advanced.empty_patterns = external hidden unnamed_addr constant [1 x ptr], align 8
@.str.178 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.179 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.180 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.181 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.182 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.183 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.184 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.185 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.186 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.187 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.188 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.189 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.190 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.191 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.192 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.193 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.194 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.195 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.196 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.197 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.198 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.199 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.200 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.201 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.202 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.203 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.204 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.205 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.206 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.207 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.208 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.209 = external hidden unnamed_addr constant [38 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local void @create_literal_params(ptr dead_on_unwind noalias writable sret(%struct.search_params) align 8, ptr noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @create_regex_params(ptr dead_on_unwind noalias writable sret(%struct.search_params) align 8, ptr noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #0

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #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: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #3

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

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

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

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

declare ptr @match_result_init(i64 noundef) local_unnamed_addr #6

declare i64 @boyer_moore_search(ptr noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #6

declare void @match_result_free(ptr noundef) local_unnamed_addr #6

declare i64 @kmp_search(ptr noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #6

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

declare i64 @regex_search(ptr noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #6

declare i64 @aho_corasick_search(ptr noundef, ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #6

; Function Attrs: nounwind uwtable
define dso_local void @test_edge_cases_advanced() local_unnamed_addr #0 {
  %1 = alloca %struct.search_params, align 8
  %2 = alloca %struct.search_params, align 8
  %3 = alloca %struct.search_params, align 8
  %4 = alloca [1 x ptr], align 8
  %5 = alloca [1 x i64], align 8
  %6 = alloca %struct.search_params, align 8
  %7 = alloca %struct.search_params, align 8
  %8 = alloca %struct.search_params, align 8
  %9 = alloca [6 x i64], align 16
  %10 = alloca %struct.search_params, align 8
  %11 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.160)
  %12 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.161)
  %13 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.162, i64 noundef 200)
  %14 = tail call noalias dereferenceable_or_null(1048576) ptr @malloc(i64 noundef 1048576) #9
  %.not = icmp eq ptr %14, null
  br i1 %.not, label %15, label %17

15:                                               ; preds = %0
  %16 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.163)
  br label %35

17:                                               ; preds = %0
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(1048576) %14, i8 65, i64 1048576, i1 false)
  %18 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) @.str.164) #10
  %19 = getelementptr inbounds i8, ptr %14, i64 1000
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %19, ptr nonnull align 1 @.str.164, i64 %18, i1 false)
  %20 = getelementptr inbounds i8, ptr %14, i64 10000
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %20, ptr nonnull align 1 @.str.164, i64 %18, i1 false)
  %21 = getelementptr inbounds i8, ptr %14, i64 100000
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %21, ptr nonnull align 1 @.str.164, i64 %18, i1 false)
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %1) #11
  call void @create_literal_params(ptr dead_on_unwind nonnull writable sret(%struct.search_params) align 8 %1, ptr noundef nonnull @.str.164, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %22 = getelementptr inbounds i8, ptr %1, i64 44
  store i8 1, ptr %22, align 4, !tbaa !5
  %23 = call ptr @match_result_init(i64 noundef 10) #11
  %24 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.165)
  %25 = call i64 @boyer_moore_search(ptr noundef nonnull %1, ptr noundef nonnull %14, i64 noundef 1048576, ptr noundef %23) #11
  %26 = icmp eq i64 %25, 3
  %.str.5..str.7 = select i1 %26, ptr @.str.5, ptr @.str.7
  %tests_passed.tests_failed = select i1 %26, ptr @tests_passed, ptr @tests_failed
  %27 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.5..str.7, ptr noundef nonnull @.str.166)
  %28 = load i32, ptr %tests_passed.tests_failed, align 4, !tbaa !12
  %29 = add nsw i32 %28, 1
  store i32 %29, ptr %tests_passed.tests_failed, align 4, !tbaa !12
  call void @match_result_free(ptr noundef %23) #11
  %30 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.167)
  %31 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.168, i32 noundef 1, i64 noundef 209715200, i64 noundef 209715200)
  %32 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.168, i32 noundef 2, i64 noundef 104857600, i64 noundef 104857600)
  %33 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.168, i32 noundef 4, i64 noundef 52428800, i64 noundef 52428800)
  %34 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.168, i32 noundef 8, i64 noundef 26214400, i64 noundef 26214400)
  call void @free(ptr noundef nonnull %14) #11
  call void @cleanup_params(ptr noundef nonnull %1)
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %1) #11
  br label %35

35:                                               ; preds = %17, %15
  %36 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.169)
  %37 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) @.str.170) #10
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %2) #11
  call void @create_literal_params(ptr dead_on_unwind nonnull writable sret(%struct.search_params) align 8 %2, ptr noundef nonnull @.str.23, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %38 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.171)
  %39 = call i64 @boyer_moore_search(ptr noundef nonnull %2, ptr noundef nonnull @.str.170, i64 noundef %37, ptr noundef null) #11
  %40 = icmp eq i64 %39, 0
  %.str.5..str.7154 = select i1 %40, ptr @.str.5, ptr @.str.7
  %tests_passed.tests_failed155 = select i1 %40, ptr @tests_passed, ptr @tests_failed
  %41 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.5..str.7154, ptr noundef nonnull @.str.172)
  %42 = load i32, ptr %tests_passed.tests_failed155, align 4, !tbaa !12
  %43 = add nsw i32 %42, 1
  store i32 %43, ptr %tests_passed.tests_failed155, align 4, !tbaa !12
  %44 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.173)
  %45 = call i64 @kmp_search(ptr noundef nonnull %2, ptr noundef nonnull @.str.170, i64 noundef %37, ptr noundef null) #11
  %46 = icmp eq i64 %45, 0
  %.str.7.sink112 = select i1 %46, ptr @.str.5, ptr @.str.7
  %tests_failed.sink111 = select i1 %46, ptr @tests_passed, ptr @tests_failed
  %47 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7.sink112, ptr noundef nonnull @.str.174)
  %48 = load i32, ptr %tests_failed.sink111, align 4, !tbaa !12
  %49 = add nsw i32 %48, 1
  store i32 %49, ptr %tests_failed.sink111, align 4, !tbaa !12
  %50 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.175)
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %3) #11
  call void @create_regex_params(ptr dead_on_unwind nonnull writable sret(%struct.search_params) align 8 %3, ptr noundef nonnull @.str.140, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %51 = call i64 @regex_search(ptr noundef nonnull %3, ptr noundef nonnull @.str.170, i64 noundef %37, ptr noundef null) #11
  %52 = icmp eq i64 %51, 0
  %.str.7.sink116 = select i1 %52, ptr @.str.5, ptr @.str.7
  %tests_failed.sink115 = select i1 %52, ptr @tests_passed, ptr @tests_failed
  %53 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7.sink116, ptr noundef nonnull @.str.176)
  %54 = load i32, ptr %tests_failed.sink115, align 4, !tbaa !12
  %55 = add nsw i32 %54, 1
  store i32 %55, ptr %tests_failed.sink115, align 4, !tbaa !12
  call void @cleanup_params(ptr noundef nonnull %3)
  %56 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.177)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #11
  %57 = load i64, ptr @__const.test_edge_cases_advanced.empty_patterns, align 8
  store i64 %57, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #11
  store i64 0, ptr %5, align 8
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %6) #11
  %58 = getelementptr inbounds i8, ptr %6, i64 16
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %6, i8 0, i64 16, i1 false)
  store ptr %4, ptr %58, align 8, !tbaa !14
  %59 = getelementptr inbounds i8, ptr %6, i64 24
  store ptr %5, ptr %59, align 8, !tbaa !15
  %60 = getelementptr inbounds i8, ptr %6, i64 32
  store i64 1, ptr %60, align 8, !tbaa !16
  %61 = getelementptr inbounds i8, ptr %6, i64 40
  store <4 x i8> <i8 1, i8 0, i8 0, i8 1>, ptr %61, align 8, !tbaa !17
  %62 = getelementptr inbounds i8, ptr %6, i64 44
  store i8 0, ptr %62, align 4, !tbaa !5
  %63 = getelementptr inbounds i8, ptr %6, i64 45
  store i8 0, ptr %63, align 1, !tbaa !18
  %64 = getelementptr inbounds i8, ptr %6, i64 48
  %65 = getelementptr inbounds i8, ptr %6, i64 64
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %64, i8 0, i64 16, i1 false)
  store i64 -1, ptr %65, align 8, !tbaa !19
  %66 = call i64 @aho_corasick_search(ptr noundef nonnull %6, ptr noundef nonnull @.str.170, i64 noundef %37, ptr noundef null) #11
  %67 = icmp eq i64 %66, 0
  %.str.7.sink120 = select i1 %67, ptr @.str.5, ptr @.str.7
  %tests_failed.sink119 = select i1 %67, ptr @tests_passed, ptr @tests_failed
  %68 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7.sink120, ptr noundef nonnull @.str.178)
  %69 = load i32, ptr %tests_failed.sink119, align 4, !tbaa !12
  %70 = add nsw i32 %69, 1
  store i32 %70, ptr %tests_failed.sink119, align 4, !tbaa !12
  call void @cleanup_params(ptr noundef nonnull %2)
  %71 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.179)
  %72 = call ptr @match_result_init(i64 noundef 1152921504606846976) #11
  %73 = icmp eq ptr %72, null
  br i1 %73, label %.thread, label %77

.thread:                                          ; preds = %35
  %74 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, ptr noundef nonnull @.str.180)
  %75 = load i32, ptr @tests_passed, align 4, !tbaa !12
  %76 = add nsw i32 %75, 1
  store i32 %76, ptr @tests_passed, align 4, !tbaa !12
  br label %81

77:                                               ; preds = %35
  %78 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, ptr noundef nonnull @.str.180)
  %79 = load i32, ptr @tests_failed, align 4, !tbaa !12
  %80 = add nsw i32 %79, 1
  store i32 %80, ptr @tests_failed, align 4, !tbaa !12
  call void @match_result_free(ptr noundef nonnull %72) #11
  br label %81

81:                                               ; preds = %.thread, %77
  %82 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.181)
  %83 = call zeroext i1 @match_result_add(ptr noundef null, i64 noundef 0, i64 noundef 1) #11
  %.str.7..str.5 = select i1 %83, ptr @.str.7, ptr @.str.5
  %tests_failed.tests_passed = select i1 %83, ptr @tests_failed, ptr @tests_passed
  %84 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7..str.5, ptr noundef nonnull @.str.182)
  %85 = load i32, ptr %tests_failed.tests_passed, align 4, !tbaa !12
  %86 = add nsw i32 %85, 1
  store i32 %86, ptr %tests_failed.tests_passed, align 4, !tbaa !12
  %87 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.183)
  %88 = call ptr @match_result_init(i64 noundef 5) #11
  %89 = call ptr @match_result_init(i64 noundef 5) #11
  %90 = icmp ne ptr %88, null
  %91 = icmp ne ptr %89, null
  %or.cond = select i1 %90, i1 %91, i1 false
  br i1 %or.cond, label %.sink.split, label %98

.sink.split:                                      ; preds = %81
  %92 = getelementptr inbounds i8, ptr %88, i64 8
  store i64 3, ptr %92, align 8, !tbaa !20
  %93 = getelementptr inbounds i8, ptr %89, i64 8
  store i64 -3, ptr %93, align 8, !tbaa !20
  %94 = call zeroext i1 @match_result_merge(ptr noundef nonnull %89, ptr noundef nonnull %88, i64 noundef 0) #11
  %.str.7..str.5156 = select i1 %94, ptr @.str.7, ptr @.str.5
  %tests_failed.tests_passed157 = select i1 %94, ptr @tests_failed, ptr @tests_passed
  %95 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7..str.5156, ptr noundef nonnull @.str.184)
  %96 = load i32, ptr %tests_failed.tests_passed157, align 4, !tbaa !12
  %97 = add nsw i32 %96, 1
  store i32 %97, ptr %tests_failed.tests_passed157, align 4, !tbaa !12
  br label %98

98:                                               ; preds = %.sink.split, %81
  call void @match_result_free(ptr noundef %88) #11
  call void @match_result_free(ptr noundef %89) #11
  %99 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.185)
  %100 = call noalias dereferenceable_or_null(1024) ptr @malloc(i64 noundef 1024) #9
  %.not95 = icmp eq ptr %100, null
  br i1 %.not95, label %120, label %vector.body

vector.body:                                      ; preds = %98, %vector.body
  %index = phi i64 [ %index.next.1, %vector.body ], [ 0, %98 ]
  %vec.ind = phi <16 x i16> [ %vec.ind.next.1, %vector.body ], [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, %98 ]
  %101 = urem <16 x i16> %vec.ind, <i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26>
  %102 = trunc nuw nsw <16 x i16> %101 to <16 x i8>
  %103 = add nuw nsw <16 x i8> %102, <i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97>
  %104 = getelementptr inbounds i8, ptr %100, i64 %index
  store <16 x i8> %103, ptr %104, align 1, !tbaa !22
  %index.next = or disjoint i64 %index, 16
  %vec.ind.next = add <16 x i16> %vec.ind, <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>
  %105 = urem <16 x i16> %vec.ind.next, <i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26, i16 26>
  %106 = trunc nuw nsw <16 x i16> %105 to <16 x i8>
  %107 = add nuw nsw <16 x i8> %106, <i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97, i8 97>
  %108 = getelementptr inbounds i8, ptr %100, i64 %index.next
  store <16 x i8> %107, ptr %108, align 1, !tbaa !22
  %index.next.1 = add nuw nsw i64 %index, 32
  %vec.ind.next.1 = add <16 x i16> %vec.ind, <i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32, i16 32>
  %109 = icmp eq i64 %index.next.1, 1024
  br i1 %109, label %middle.block, label %vector.body, !llvm.loop !23

middle.block:                                     ; preds = %vector.body
  %110 = getelementptr inbounds i8, ptr %100, i64 100
  store i8 0, ptr %110, align 1, !tbaa !22
  %111 = getelementptr inbounds i8, ptr %100, i64 200
  store i8 0, ptr %111, align 1, !tbaa !22
  %112 = getelementptr inbounds i8, ptr %100, i64 300
  store i8 0, ptr %112, align 1, !tbaa !22
  %113 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.186)
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %7) #11
  call void @create_literal_params(ptr dead_on_unwind nonnull writable sret(%struct.search_params) align 8 %7, ptr noundef nonnull @.str.29, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %114 = getelementptr inbounds i8, ptr %100, i64 500
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(3) %114, ptr noundef nonnull align 1 dereferenceable(3) @.str.29, i64 3, i1 false)
  %115 = call ptr @match_result_init(i64 noundef 10) #11
  %116 = call i64 @boyer_moore_search(ptr noundef nonnull %7, ptr noundef nonnull %100, i64 noundef 1024, ptr noundef %115) #11
  %.not96 = icmp eq i64 %116, 0
  %.str.7..str.5158 = select i1 %.not96, ptr @.str.7, ptr @.str.5
  %tests_failed.tests_passed159 = select i1 %.not96, ptr @tests_failed, ptr @tests_passed
  %117 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7..str.5158, ptr noundef nonnull @.str.187)
  %118 = load i32, ptr %tests_failed.tests_passed159, align 4, !tbaa !12
  %119 = add nsw i32 %118, 1
  store i32 %119, ptr %tests_failed.tests_passed159, align 4, !tbaa !12
  call void @match_result_free(ptr noundef %115) #11
  call void @cleanup_params(ptr noundef nonnull %7)
  call void @free(ptr noundef nonnull %100) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %7) #11
  br label %122

120:                                              ; preds = %98
  %121 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.188)
  br label %122

122:                                              ; preds = %120, %middle.block
  %123 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.189)
  %124 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) @.str.190) #10
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %8) #11
  call void @create_literal_params(ptr dead_on_unwind nonnull writable sret(%struct.search_params) align 8 %8, ptr noundef nonnull @.str.80, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %125 = getelementptr inbounds i8, ptr %8, i64 44
  store i8 1, ptr %125, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %9) #11
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(48) %9, i8 0, i64 16, i1 false)
  %126 = getelementptr inbounds i8, ptr %9, i64 8
  store i64 1, ptr %126, align 8
  %127 = getelementptr inbounds i8, ptr %9, i64 16
  store i64 3, ptr %127, align 16
  %128 = getelementptr inbounds i8, ptr %9, i64 24
  store i64 5, ptr %128, align 8
  %129 = getelementptr inbounds i8, ptr %9, i64 32
  store i64 10, ptr %129, align 16
  %130 = getelementptr inbounds i8, ptr %9, i64 40
  store i64 -1, ptr %130, align 8
  %131 = getelementptr inbounds i8, ptr %8, i64 64
  br label %152

132:                                              ; preds = %194
  call void @cleanup_params(ptr noundef nonnull %8)
  %133 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.200)
  %134 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.201)
  %135 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.202)
  %136 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.203)
  %137 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.204)
  %138 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.205)
  %139 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.206)
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %10) #11
  call void @create_literal_params(ptr dead_on_unwind nonnull writable sret(%struct.search_params) align 8 %10, ptr noundef nonnull @.str.17, i1 noundef zeroext true, i1 noundef zeroext false, i1 noundef zeroext false)
  %140 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.207)
  %141 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) @.str.29) #10
  %142 = call i64 @boyer_moore_search(ptr noundef nonnull %10, ptr noundef nonnull @.str.29, i64 noundef %141, ptr noundef null) #11
  %143 = icmp eq i64 %142, 0
  %.str.5..str.7160 = select i1 %143, ptr @.str.5, ptr @.str.7
  %tests_passed.tests_failed161 = select i1 %143, ptr @tests_passed, ptr @tests_failed
  %144 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.5..str.7160, ptr noundef nonnull @.str.208)
  %145 = load i32, ptr %tests_passed.tests_failed161, align 4, !tbaa !12
  %146 = add nsw i32 %145, 1
  store i32 %146, ptr %tests_passed.tests_failed161, align 4, !tbaa !12
  %147 = call i64 @kmp_search(ptr noundef nonnull %10, ptr noundef nonnull @.str.29, i64 noundef %141, ptr noundef null) #11
  %148 = icmp eq i64 %147, 0
  %.str.7.sink153 = select i1 %148, ptr @.str.5, ptr @.str.7
  %tests_failed.sink152 = select i1 %148, ptr @tests_passed, ptr @tests_failed
  %149 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.7.sink153, ptr noundef nonnull @.str.209)
  %150 = load i32, ptr %tests_failed.sink152, align 4, !tbaa !12
  %151 = add nsw i32 %150, 1
  store i32 %151, ptr %tests_failed.sink152, align 4, !tbaa !12
  call void @cleanup_params(ptr noundef nonnull %10)
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %10) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %9) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %8) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %6) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %3) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %2) #11
  ret void

152:                                              ; preds = %122, %194
  %.087101 = phi i64 [ 0, %122 ], [ %197, %194 ]
  %153 = getelementptr inbounds [6 x i64], ptr %9, i64 0, i64 %.087101
  %154 = load i64, ptr %153, align 8, !tbaa !27
  store i64 %154, ptr %131, align 8, !tbaa !19
  %155 = call ptr @match_result_init(i64 noundef 20) #11
  %156 = call i64 @boyer_moore_search(ptr noundef nonnull %8, ptr noundef nonnull @.str.190, i64 noundef %124, ptr noundef %155) #11
  %157 = getelementptr inbounds i8, ptr %155, i64 8
  switch i64 %154, label %182 [
    i64 -1, label %158
    i64 0, label %170
  ]

158:                                              ; preds = %152
  %159 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.191)
  %160 = icmp eq i64 %156, 10
  %.str.5..str.7162 = select i1 %160, ptr @.str.5, ptr @.str.7
  %tests_passed.tests_failed163 = select i1 %160, ptr @tests_passed, ptr @tests_failed
  %161 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.5..str.7162, ptr noundef nonnull @.str.192)
  %162 = load i32, ptr %tests_passed.tests_failed163, align 4, !tbaa !12
  %163 = add nsw i32 %162, 1
  store i32 %163, ptr %tests_passed.tests_failed163, align 4, !tbaa !12
  %164 = load i64, ptr %157, align 8, !tbaa !20
  %165 = icmp eq i64 %164, 10
  br i1 %165, label %166, label %168

166:                                              ; preds = %158
  %167 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, ptr noundef nonnull @.str.193)
  br label %194

168:                                              ; preds = %158
  %169 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, ptr noundef nonnull @.str.193)
  br label %194

170:                                              ; preds = %152
  %171 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.194)
  %172 = icmp eq i64 %156, 0
  %.str.5..str.7164 = select i1 %172, ptr @.str.5, ptr @.str.7
  %tests_passed.tests_failed165 = select i1 %172, ptr @tests_passed, ptr @tests_failed
  %173 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.5..str.7164, ptr noundef nonnull @.str.195)
  %174 = load i32, ptr %tests_passed.tests_failed165, align 4, !tbaa !12
  %175 = add nsw i32 %174, 1
  store i32 %175, ptr %tests_passed.tests_failed165, align 4, !tbaa !12
  %176 = load i64, ptr %157, align 8, !tbaa !20
  %177 = icmp eq i64 %176, 0
  br i1 %177, label %178, label %180

178:                                              ; preds = %170
  %179 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, ptr noundef nonnull @.str.196)
  br label %194

180:                                              ; preds = %170
  %181 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, ptr noundef nonnull @.str.196)
  br label %194

182:                                              ; preds = %152
  %183 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.197, i64 noundef %154)
  %184 = icmp eq i64 %156, %154
  %.str.5..str.7166 = select i1 %184, ptr @.str.5, ptr @.str.7
  %tests_passed.tests_failed167 = select i1 %184, ptr @tests_passed, ptr @tests_failed
  %185 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) %.str.5..str.7166, ptr noundef nonnull @.str.198)
  %186 = load i32, ptr %tests_passed.tests_failed167, align 4, !tbaa !12
  %187 = add nsw i32 %186, 1
  store i32 %187, ptr %tests_passed.tests_failed167, align 4, !tbaa !12
  %188 = load i64, ptr %157, align 8, !tbaa !20
  %189 = icmp eq i64 %188, %154
  br i1 %189, label %190, label %192

190:                                              ; preds = %182
  %191 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, ptr noundef nonnull @.str.199)
  br label %194

192:                                              ; preds = %182
  %193 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, ptr noundef nonnull @.str.199)
  br label %194

194:                                              ; preds = %180, %178, %192, %190, %166, %168
  %tests_failed.sink145 = phi ptr [ @tests_failed, %180 ], [ @tests_passed, %178 ], [ @tests_failed, %192 ], [ @tests_passed, %190 ], [ @tests_passed, %166 ], [ @tests_failed, %168 ]
  %195 = load i32, ptr %tests_failed.sink145, align 4, !tbaa !12
  %196 = add nsw i32 %195, 1
  store i32 %196, ptr %tests_failed.sink145, align 4, !tbaa !12
  call void @match_result_free(ptr noundef nonnull %155) #11
  %197 = add nuw nsw i64 %.087101, 1
  %exitcond102.not = icmp eq i64 %197, 6
  br i1 %exitcond102.not, label %132, label %152, !llvm.loop !28
}

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

declare zeroext i1 @match_result_add(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #6

declare zeroext i1 @match_result_merge(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #6

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { 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 #4 = { 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 #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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #8 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #9 = { nounwind allocsize(0) }
attributes #10 = { nounwind willreturn memory(read) }
attributes #11 = { 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, !11, i64 44}
!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 = !{!13, !13, i64 0}
!13 = !{!"int", !8, i64 0}
!14 = !{!6, !7, i64 16}
!15 = !{!6, !7, i64 24}
!16 = !{!6, !10, i64 32}
!17 = !{!11, !11, i64 0}
!18 = !{!6, !11, i64 45}
!19 = !{!6, !10, i64 64}
!20 = !{!21, !10, i64 8}
!21 = !{!"match_result_t", !7, i64 0, !10, i64 8, !10, i64 16}
!22 = !{!8, !8, i64 0}
!23 = distinct !{!23, !24, !25, !26}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!"llvm.loop.isvectorized", i32 1}
!26 = !{!"llvm.loop.unroll.runtime.disable"}
!27 = !{!10, !10, i64 0}
!28 = distinct !{!28, !24}


; Effective O3 passes: CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,MemCpyOptPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass