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

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

@stderr = external global ptr, align 8
@color_output_enabled = external hidden global i8, align 1
@only_matching = external hidden global i8, align 1
@.str.33 = external hidden unnamed_addr constant [4 x i8], align 1
@force_no_simd = external hidden global i8, align 1
@.str.99 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [14 x i8], align 1
@global_match_found_flag = external hidden global i8, align 1
@.str.125 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.130 = external hidden unnamed_addr constant [5 x i8], align 1
@__const.main.long_options = external hidden unnamed_addr constant [8 x %struct.option], align 16
@.str.138 = external hidden unnamed_addr constant [21 x i8], align 1
@optarg = external global ptr, align 8
@.str.139 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.140 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.141 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.142 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.143 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.144 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.145 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.146 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.147 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.148 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.149 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.150 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.151 = external hidden unnamed_addr constant [47 x i8], align 1
@optind = external global i32, align 4
@.str.152 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.153 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.154 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.155 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.156 = external hidden unnamed_addr constant [85 x i8], align 1
@.str.157 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.158 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.159 = external hidden unnamed_addr constant [57 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

declare void @perror(ptr noundef) #1

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

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

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local void @print_usage(ptr noundef) #6

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

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

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

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

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

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

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

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

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

39:                                               ; preds = %258, %2
  %40 = load i32, ptr %4, align 4, !tbaa !5
  %41 = load ptr, ptr %5, align 8, !tbaa !9
  %42 = getelementptr inbounds [8 x %struct.option], ptr %17, i64 0, i64 0
  %43 = call i32 @getopt_long(i32 noundef %40, ptr noundef %41, ptr noundef @.str.138, ptr noundef %42, ptr noundef %18) #8
  store i32 %43, ptr %19, align 4, !tbaa !5
  %44 = icmp ne i32 %43, -1
  br i1 %44, label %45, label %259

45:                                               ; preds = %39
  %46 = load i32, ptr %19, align 4, !tbaa !5
  switch i32 %46, label %254 [
    i32 105, label %47
    i32 99, label %49
    i32 111, label %50
    i32 109, label %51
    i32 69, label %78
    i32 70, label %80
    i32 114, label %82
    i32 116, label %83
    i32 115, label %113
    i32 102, label %115
    i32 118, label %195
    i32 104, label %199
    i32 101, label %203
    i32 67, label %222
    i32 83, label %250
    i32 119, label %251
    i32 63, label %253
  ]

47:                                               ; preds = %45
  %48 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 5
  store i8 0, ptr %48, align 8, !tbaa !11
  br label %258

49:                                               ; preds = %45
  store i8 1, ptr %12, align 1, !tbaa !18
  br label %258

50:                                               ; preds = %45
  store i8 1, ptr @only_matching, align 1, !tbaa !18
  br label %258

51:                                               ; preds = %45
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #8
  store ptr null, ptr %20, align 8, !tbaa !9
  %52 = call ptr @__errno_location() #9
  store i32 0, ptr %52, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #8
  %53 = load ptr, ptr @optarg, align 8, !tbaa !9
  %54 = call i64 @strtol(ptr noundef %53, ptr noundef %20, i32 noundef 10) #8
  store i64 %54, ptr %21, align 8, !tbaa !17
  %55 = call ptr @__errno_location() #9
  %56 = load i32, ptr %55, align 4, !tbaa !5
  %57 = icmp ne i32 %56, 0
  br i1 %57, label %70, label %58

58:                                               ; preds = %51
  %59 = load ptr, ptr @optarg, align 8, !tbaa !9
  %60 = load ptr, ptr %20, align 8, !tbaa !9
  %61 = icmp eq ptr %59, %60
  br i1 %61, label %70, label %62

62:                                               ; preds = %58
  %63 = load ptr, ptr %20, align 8, !tbaa !9
  %64 = load i8, ptr %63, align 1, !tbaa !20
  %65 = sext i8 %64 to i32
  %66 = icmp ne i32 %65, 0
  br i1 %66, label %70, label %67

67:                                               ; preds = %62
  %68 = load i64, ptr %21, align 8, !tbaa !17
  %69 = icmp slt i64 %68, 0
  br i1 %69, label %70, label %74

70:                                               ; preds = %67, %62, %58, %51
  %71 = load ptr, ptr @stderr, align 8, !tbaa !9
  %72 = load ptr, ptr @optarg, align 8, !tbaa !9
  %73 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %71, ptr noundef @.str.139, ptr noundef %72) #8
  br label %77

74:                                               ; preds = %67
  %75 = load i64, ptr %21, align 8, !tbaa !17
  %76 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 13
  store i64 %75, ptr %76, align 8, !tbaa !19
  br label %77

77:                                               ; preds = %74, %70
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  br label %258

78:                                               ; preds = %45
  %79 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 6
  store i8 1, ptr %79, align 1, !tbaa !16
  br label %258

80:                                               ; preds = %45
  %81 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 6
  store i8 0, ptr %81, align 1, !tbaa !16
  br label %258

82:                                               ; preds = %45
  store i8 1, ptr %14, align 1, !tbaa !18
  br label %258

83:                                               ; preds = %45
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  store ptr null, ptr %22, align 8, !tbaa !9
  %84 = call ptr @__errno_location() #9
  store i32 0, ptr %84, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  %85 = load ptr, ptr @optarg, align 8, !tbaa !9
  %86 = call i64 @strtol(ptr noundef %85, ptr noundef %22, i32 noundef 10) #8
  store i64 %86, ptr %23, align 8, !tbaa !17
  %87 = call ptr @__errno_location() #9
  %88 = load i32, ptr %87, align 4, !tbaa !5
  %89 = icmp ne i32 %88, 0
  br i1 %89, label %105, label %90

90:                                               ; preds = %83
  %91 = load ptr, ptr @optarg, align 8, !tbaa !9
  %92 = load ptr, ptr %22, align 8, !tbaa !9
  %93 = icmp eq ptr %91, %92
  br i1 %93, label %105, label %94

94:                                               ; preds = %90
  %95 = load ptr, ptr %22, align 8, !tbaa !9
  %96 = load i8, ptr %95, align 1, !tbaa !20
  %97 = sext i8 %96 to i32
  %98 = icmp ne i32 %97, 0
  br i1 %98, label %105, label %99

99:                                               ; preds = %94
  %100 = load i64, ptr %23, align 8, !tbaa !17
  %101 = icmp sle i64 %100, 0
  br i1 %101, label %105, label %102

102:                                              ; preds = %99
  %103 = load i64, ptr %23, align 8, !tbaa !17
  %104 = icmp sgt i64 %103, 2147483647
  br i1 %104, label %105, label %109

105:                                              ; preds = %102, %99, %94, %90, %83
  %106 = load ptr, ptr @stderr, align 8, !tbaa !9
  %107 = load ptr, ptr @optarg, align 8, !tbaa !9
  %108 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %106, ptr noundef @.str.140, ptr noundef %107) #8
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %112

109:                                              ; preds = %102
  %110 = load i64, ptr %23, align 8, !tbaa !17
  %111 = trunc i64 %110 to i32
  store i32 %111, ptr %15, align 4, !tbaa !5
  br label %112

112:                                              ; preds = %109, %105
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  br label %258

113:                                              ; preds = %45
  store i8 1, ptr %13, align 1, !tbaa !18
  %114 = load ptr, ptr @optarg, align 8, !tbaa !9
  store ptr %114, ptr %11, align 8, !tbaa !9
  br label %258

115:                                              ; preds = %45
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #8
  %116 = load ptr, ptr @optarg, align 8, !tbaa !9
  %117 = call noalias ptr @fopen(ptr noundef %116, ptr noundef @.str.141)
  store ptr %117, ptr %24, align 8, !tbaa !9
  %118 = load ptr, ptr %24, align 8, !tbaa !9
  %119 = icmp ne ptr %118, null
  br i1 %119, label %124, label %120

120:                                              ; preds = %115
  %121 = load ptr, ptr @stderr, align 8, !tbaa !9
  %122 = load ptr, ptr @optarg, align 8, !tbaa !9
  %123 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %121, ptr noundef @.str.142, ptr noundef %122) #8
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %193

124:                                              ; preds = %115
  call void @llvm.lifetime.start.p0(i64 1024, ptr %26) #8
  br label %125

125:                                              ; preds = %181, %179, %124
  %126 = getelementptr inbounds [1024 x i8], ptr %26, i64 0, i64 0
  %127 = load ptr, ptr %24, align 8, !tbaa !9
  %128 = call ptr @fgets(ptr noundef %126, i32 noundef 1024, ptr noundef %127)
  %129 = icmp ne ptr %128, null
  br i1 %129, label %130, label %133

130:                                              ; preds = %125
  %131 = load i64, ptr %9, align 8, !tbaa !17
  %132 = icmp ult i64 %131, 1024
  br label %133

133:                                              ; preds = %130, %125
  %134 = phi i1 [ false, %125 ], [ %132, %130 ]
  br i1 %134, label %135, label %182

135:                                              ; preds = %133
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  %136 = getelementptr inbounds [1024 x i8], ptr %26, i64 0, i64 0
  %137 = call i64 @strlen(ptr noundef %136) #10
  store i64 %137, ptr %27, align 8, !tbaa !17
  %138 = load i64, ptr %27, align 8, !tbaa !17
  %139 = icmp ugt i64 %138, 0
  br i1 %139, label %140, label %151

140:                                              ; preds = %135
  %141 = load i64, ptr %27, align 8, !tbaa !17
  %142 = sub i64 %141, 1
  %143 = getelementptr inbounds [1024 x i8], ptr %26, i64 0, i64 %142
  %144 = load i8, ptr %143, align 1, !tbaa !20
  %145 = sext i8 %144 to i32
  %146 = icmp eq i32 %145, 10
  br i1 %146, label %147, label %151

147:                                              ; preds = %140
  %148 = load i64, ptr %27, align 8, !tbaa !17
  %149 = sub i64 %148, 1
  %150 = getelementptr inbounds [1024 x i8], ptr %26, i64 0, i64 %149
  store i8 0, ptr %150, align 1, !tbaa !20
  br label %151

151:                                              ; preds = %147, %140, %135
  %152 = getelementptr inbounds [1024 x i8], ptr %26, i64 0, i64 0
  %153 = call i64 @strlen(ptr noundef %152) #10
  %154 = icmp eq i64 %153, 0
  br i1 %154, label %155, label %156

155:                                              ; preds = %151
  store i32 5, ptr %25, align 4
  br label %179, !llvm.loop !21

156:                                              ; preds = %151
  %157 = getelementptr inbounds [1024 x i8], ptr %26, i64 0, i64 0
  %158 = call noalias ptr @strdup(ptr noundef %157) #8
  %159 = load i64, ptr %9, align 8, !tbaa !17
  %160 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 %159
  store ptr %158, ptr %160, align 8, !tbaa !9
  %161 = load i64, ptr %9, align 8, !tbaa !17
  %162 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 %161
  %163 = load ptr, ptr %162, align 8, !tbaa !9
  %164 = icmp ne ptr %163, null
  br i1 %164, label %168, label %165

165:                                              ; preds = %156
  call void @perror(ptr noundef @.str.143)
  %166 = load ptr, ptr %24, align 8, !tbaa !9
  %167 = call i32 @fclose(ptr noundef %166)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %179

168:                                              ; preds = %156
  %169 = load i64, ptr %9, align 8, !tbaa !17
  %170 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 %169
  %171 = load ptr, ptr %170, align 8, !tbaa !9
  %172 = call i64 @strlen(ptr noundef %171) #10
  %173 = load i64, ptr %9, align 8, !tbaa !17
  %174 = getelementptr inbounds [1024 x i64], ptr %8, i64 0, i64 %173
  store i64 %172, ptr %174, align 8, !tbaa !17
  %175 = load i64, ptr %9, align 8, !tbaa !17
  %176 = getelementptr inbounds [1024 x i8], ptr %10, i64 0, i64 %175
  store i8 1, ptr %176, align 1, !tbaa !18
  %177 = load i64, ptr %9, align 8, !tbaa !17
  %178 = add i64 %177, 1
  store i64 %178, ptr %9, align 8, !tbaa !17
  store i32 0, ptr %25, align 4
  br label %179

179:                                              ; preds = %168, %165, %155
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  %180 = load i32, ptr %25, align 4
  switch i32 %180, label %192 [
    i32 0, label %181
    i32 5, label %125
  ]

181:                                              ; preds = %179
  br label %125, !llvm.loop !21

182:                                              ; preds = %133
  %183 = load ptr, ptr %24, align 8, !tbaa !9
  %184 = call i32 @fclose(ptr noundef %183)
  %185 = load i64, ptr %9, align 8, !tbaa !17
  %186 = icmp eq i64 %185, 0
  br i1 %186, label %187, label %191

187:                                              ; preds = %182
  %188 = load ptr, ptr @stderr, align 8, !tbaa !9
  %189 = load ptr, ptr @optarg, align 8, !tbaa !9
  %190 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %188, ptr noundef @.str.144, ptr noundef %189) #8
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %192

191:                                              ; preds = %182
  store i32 4, ptr %25, align 4
  br label %192

192:                                              ; preds = %191, %187, %179
  call void @llvm.lifetime.end.p0(i64 1024, ptr %26) #8
  br label %193

193:                                              ; preds = %192, %120
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #8
  %194 = load i32, ptr %25, align 4
  switch i32 %194, label %540 [
    i32 4, label %258
  ]

195:                                              ; preds = %45
  %196 = call i32 (ptr, ...) @printf(ptr noundef @.str.145, ptr noundef @.str.33)
  %197 = call i32 (ptr, ...) @printf(ptr noundef @.str.146)
  %198 = call i32 (ptr, ...) @printf(ptr noundef @.str.147, i64 noundef 0)
  store i32 0, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

199:                                              ; preds = %45
  %200 = load ptr, ptr %5, align 8, !tbaa !9
  %201 = getelementptr inbounds ptr, ptr %200, i64 0
  %202 = load ptr, ptr %201, align 8, !tbaa !9
  call void @print_usage(ptr noundef %202)
  store i32 0, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

203:                                              ; preds = %45
  %204 = load i64, ptr %9, align 8, !tbaa !17
  %205 = icmp ult i64 %204, 1024
  br i1 %205, label %206, label %218

206:                                              ; preds = %203
  %207 = load ptr, ptr @optarg, align 8, !tbaa !9
  %208 = load i64, ptr %9, align 8, !tbaa !17
  %209 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 %208
  store ptr %207, ptr %209, align 8, !tbaa !9
  %210 = load ptr, ptr @optarg, align 8, !tbaa !9
  %211 = call i64 @strlen(ptr noundef %210) #10
  %212 = load i64, ptr %9, align 8, !tbaa !17
  %213 = getelementptr inbounds [1024 x i64], ptr %8, i64 0, i64 %212
  store i64 %211, ptr %213, align 8, !tbaa !17
  %214 = load i64, ptr %9, align 8, !tbaa !17
  %215 = getelementptr inbounds [1024 x i8], ptr %10, i64 0, i64 %214
  store i8 0, ptr %215, align 1, !tbaa !18
  %216 = load i64, ptr %9, align 8, !tbaa !17
  %217 = add i64 %216, 1
  store i64 %217, ptr %9, align 8, !tbaa !17
  br label %221

218:                                              ; preds = %203
  %219 = load ptr, ptr @stderr, align 8, !tbaa !9
  %220 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %219, ptr noundef @.str.148, i32 noundef 1024) #8
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

221:                                              ; preds = %206
  br label %258

222:                                              ; preds = %45
  %223 = load ptr, ptr @optarg, align 8, !tbaa !9
  %224 = icmp eq ptr %223, null
  br i1 %224, label %229, label %225

225:                                              ; preds = %222
  %226 = load ptr, ptr @optarg, align 8, !tbaa !9
  %227 = call i32 @strcmp(ptr noundef %226, ptr noundef @.str.130) #10
  %228 = icmp eq i32 %227, 0
  br i1 %228, label %229, label %230

229:                                              ; preds = %225, %222
  store ptr @.str.130, ptr %16, align 8, !tbaa !9
  br label %249

230:                                              ; preds = %225
  %231 = load ptr, ptr @optarg, align 8, !tbaa !9
  %232 = call i32 @strcmp(ptr noundef %231, ptr noundef @.str.149) #10
  %233 = icmp eq i32 %232, 0
  br i1 %233, label %234, label %235

234:                                              ; preds = %230
  store ptr @.str.149, ptr %16, align 8, !tbaa !9
  br label %248

235:                                              ; preds = %230
  %236 = load ptr, ptr @optarg, align 8, !tbaa !9
  %237 = call i32 @strcmp(ptr noundef %236, ptr noundef @.str.150) #10
  %238 = icmp eq i32 %237, 0
  br i1 %238, label %239, label %240

239:                                              ; preds = %235
  store ptr @.str.150, ptr %16, align 8, !tbaa !9
  br label %247

240:                                              ; preds = %235
  %241 = load ptr, ptr @stderr, align 8, !tbaa !9
  %242 = load ptr, ptr @optarg, align 8, !tbaa !9
  %243 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %241, ptr noundef @.str.151, ptr noundef %242) #8
  %244 = load ptr, ptr %5, align 8, !tbaa !9
  %245 = getelementptr inbounds ptr, ptr %244, i64 0
  %246 = load ptr, ptr %245, align 8, !tbaa !9
  call void @print_usage(ptr noundef %246)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

247:                                              ; preds = %239
  br label %248

248:                                              ; preds = %247, %234
  br label %249

249:                                              ; preds = %248, %229
  br label %258

250:                                              ; preds = %45
  store i8 1, ptr @force_no_simd, align 1, !tbaa !18
  br label %258

251:                                              ; preds = %45
  %252 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 10
  store i8 1, ptr %252, align 1, !tbaa !23
  br label %258

253:                                              ; preds = %45
  br label %254

254:                                              ; preds = %253, %45
  %255 = load ptr, ptr %5, align 8, !tbaa !9
  %256 = getelementptr inbounds ptr, ptr %255, i64 0
  %257 = load ptr, ptr %256, align 8, !tbaa !9
  call void @print_usage(ptr noundef %257)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

258:                                              ; preds = %251, %250, %249, %221, %193, %113, %112, %82, %80, %78, %77, %50, %49, %47
  br label %39, !llvm.loop !24

259:                                              ; preds = %39
  %260 = load ptr, ptr %16, align 8, !tbaa !9
  %261 = call i32 @strcmp(ptr noundef %260, ptr noundef @.str.149) #10
  %262 = icmp eq i32 %261, 0
  br i1 %262, label %263, label %264

263:                                              ; preds = %259
  store i8 1, ptr @color_output_enabled, align 1, !tbaa !18
  br label %274

264:                                              ; preds = %259
  %265 = load ptr, ptr %16, align 8, !tbaa !9
  %266 = call i32 @strcmp(ptr noundef %265, ptr noundef @.str.150) #10
  %267 = icmp eq i32 %266, 0
  br i1 %267, label %268, label %269

268:                                              ; preds = %264
  store i8 0, ptr @color_output_enabled, align 1, !tbaa !18
  br label %273

269:                                              ; preds = %264
  %270 = call i32 @isatty(i32 noundef 1) #8
  %271 = icmp ne i32 %270, 0
  %272 = zext i1 %271 to i8
  store i8 %272, ptr @color_output_enabled, align 1, !tbaa !18
  br label %273

273:                                              ; preds = %269, %268
  br label %274

274:                                              ; preds = %273, %263
  %275 = load i64, ptr %9, align 8, !tbaa !17
  %276 = icmp eq i64 %275, 0
  br i1 %276, label %277, label %300

277:                                              ; preds = %274
  %278 = load i32, ptr @optind, align 4, !tbaa !5
  %279 = load i32, ptr %4, align 4, !tbaa !5
  %280 = icmp sge i32 %278, %279
  br i1 %280, label %281, label %287

281:                                              ; preds = %277
  %282 = load ptr, ptr @stderr, align 8, !tbaa !9
  %283 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %282, ptr noundef @.str.152) #8
  %284 = load ptr, ptr %5, align 8, !tbaa !9
  %285 = getelementptr inbounds ptr, ptr %284, i64 0
  %286 = load ptr, ptr %285, align 8, !tbaa !9
  call void @print_usage(ptr noundef %286)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

287:                                              ; preds = %277
  %288 = load ptr, ptr %5, align 8, !tbaa !9
  %289 = load i32, ptr @optind, align 4, !tbaa !5
  %290 = add nsw i32 %289, 1
  store i32 %290, ptr @optind, align 4, !tbaa !5
  %291 = sext i32 %289 to i64
  %292 = getelementptr inbounds ptr, ptr %288, i64 %291
  %293 = load ptr, ptr %292, align 8, !tbaa !9
  %294 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 0
  store ptr %293, ptr %294, align 16, !tbaa !9
  %295 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 0
  %296 = load ptr, ptr %295, align 16, !tbaa !9
  %297 = call i64 @strlen(ptr noundef %296) #10
  %298 = getelementptr inbounds [1024 x i64], ptr %8, i64 0, i64 0
  store i64 %297, ptr %298, align 16, !tbaa !17
  %299 = getelementptr inbounds [1024 x i8], ptr %10, i64 0, i64 0
  store i8 0, ptr %299, align 16, !tbaa !18
  store i64 1, ptr %9, align 8, !tbaa !17
  br label %300

300:                                              ; preds = %287, %274
  %301 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 0
  %302 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 2
  store ptr %301, ptr %302, align 8, !tbaa !25
  %303 = getelementptr inbounds [1024 x i64], ptr %8, i64 0, i64 0
  %304 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 3
  store ptr %303, ptr %304, align 8, !tbaa !26
  %305 = load i64, ptr %9, align 8, !tbaa !17
  %306 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 4
  store i64 %305, ptr %306, align 8, !tbaa !15
  %307 = load i64, ptr %9, align 8, !tbaa !17
  %308 = icmp eq i64 %307, 1
  br i1 %308, label %309, label %320

309:                                              ; preds = %300
  %310 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 2
  %311 = load ptr, ptr %310, align 8, !tbaa !25
  %312 = getelementptr inbounds ptr, ptr %311, i64 0
  %313 = load ptr, ptr %312, align 8, !tbaa !9
  %314 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 0
  store ptr %313, ptr %314, align 8, !tbaa !27
  %315 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 3
  %316 = load ptr, ptr %315, align 8, !tbaa !26
  %317 = getelementptr inbounds i64, ptr %316, i64 0
  %318 = load i64, ptr %317, align 8, !tbaa !17
  %319 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 1
  store i64 %318, ptr %319, align 8, !tbaa !28
  br label %320

320:                                              ; preds = %309, %300
  %321 = load i32, ptr @optind, align 4, !tbaa !5
  %322 = load i32, ptr %4, align 4, !tbaa !5
  %323 = icmp sge i32 %321, %322
  br i1 %323, label %324, label %369

324:                                              ; preds = %320
  %325 = load i8, ptr %14, align 1, !tbaa !18, !range !29, !noundef !30
  %326 = trunc i8 %325 to i1
  br i1 %326, label %327, label %331

327:                                              ; preds = %324
  %328 = load i8, ptr %13, align 1, !tbaa !18, !range !29, !noundef !30
  %329 = trunc i8 %328 to i1
  br i1 %329, label %331, label %330

330:                                              ; preds = %327
  store ptr @.str.125, ptr %11, align 8, !tbaa !9
  br label %368

331:                                              ; preds = %327, %324
  %332 = load i8, ptr %13, align 1, !tbaa !18, !range !29, !noundef !30
  %333 = trunc i8 %332 to i1
  br i1 %333, label %346, label %334

334:                                              ; preds = %331
  %335 = load i8, ptr %14, align 1, !tbaa !18, !range !29, !noundef !30
  %336 = trunc i8 %335 to i1
  br i1 %336, label %346, label %337

337:                                              ; preds = %334
  %338 = call i32 @isatty(i32 noundef 0) #8
  %339 = icmp ne i32 %338, 0
  br i1 %339, label %340, label %346

340:                                              ; preds = %337
  %341 = load ptr, ptr @stderr, align 8, !tbaa !9
  %342 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %341, ptr noundef @.str.153) #8
  %343 = load ptr, ptr %5, align 8, !tbaa !9
  %344 = getelementptr inbounds ptr, ptr %343, i64 0
  %345 = load ptr, ptr %344, align 8, !tbaa !9
  call void @print_usage(ptr noundef %345)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

346:                                              ; preds = %337, %334, %331
  %347 = load i8, ptr %13, align 1, !tbaa !18, !range !29, !noundef !30
  %348 = trunc i8 %347 to i1
  br i1 %348, label %353, label %349

349:                                              ; preds = %346
  %350 = load i8, ptr %14, align 1, !tbaa !18, !range !29, !noundef !30
  %351 = trunc i8 %350 to i1
  br i1 %351, label %353, label %352

352:                                              ; preds = %349
  store ptr @.str.99, ptr %11, align 8, !tbaa !9
  br label %366

353:                                              ; preds = %349, %346
  %354 = load i8, ptr %13, align 1, !tbaa !18, !range !29, !noundef !30
  %355 = trunc i8 %354 to i1
  br i1 %355, label %356, label %362

356:                                              ; preds = %353
  %357 = load ptr, ptr @stderr, align 8, !tbaa !9
  %358 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %357, ptr noundef @.str.154) #8
  %359 = load ptr, ptr %5, align 8, !tbaa !9
  %360 = getelementptr inbounds ptr, ptr %359, i64 0
  %361 = load ptr, ptr %360, align 8, !tbaa !9
  call void @print_usage(ptr noundef %361)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

362:                                              ; preds = %353
  %363 = load ptr, ptr %5, align 8, !tbaa !9
  %364 = getelementptr inbounds ptr, ptr %363, i64 0
  %365 = load ptr, ptr %364, align 8, !tbaa !9
  call void @print_usage(ptr noundef %365)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

366:                                              ; preds = %352
  br label %367

367:                                              ; preds = %366
  br label %368

368:                                              ; preds = %367, %330
  br label %376

369:                                              ; preds = %320
  %370 = load ptr, ptr %5, align 8, !tbaa !9
  %371 = load i32, ptr @optind, align 4, !tbaa !5
  %372 = add nsw i32 %371, 1
  store i32 %372, ptr @optind, align 4, !tbaa !5
  %373 = sext i32 %371 to i64
  %374 = getelementptr inbounds ptr, ptr %370, i64 %373
  %375 = load ptr, ptr %374, align 8, !tbaa !9
  store ptr %375, ptr %11, align 8, !tbaa !9
  br label %376

376:                                              ; preds = %369, %368
  %377 = load i32, ptr @optind, align 4, !tbaa !5
  %378 = load i32, ptr %4, align 4, !tbaa !5
  %379 = icmp slt i32 %377, %378
  br i1 %379, label %380, label %391

380:                                              ; preds = %376
  %381 = load ptr, ptr @stderr, align 8, !tbaa !9
  %382 = load ptr, ptr %5, align 8, !tbaa !9
  %383 = load i32, ptr @optind, align 4, !tbaa !5
  %384 = sext i32 %383 to i64
  %385 = getelementptr inbounds ptr, ptr %382, i64 %384
  %386 = load ptr, ptr %385, align 8, !tbaa !9
  %387 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %381, ptr noundef @.str.155, ptr noundef %386) #8
  %388 = load ptr, ptr %5, align 8, !tbaa !9
  %389 = getelementptr inbounds ptr, ptr %388, i64 0
  %390 = load ptr, ptr %389, align 8, !tbaa !9
  call void @print_usage(ptr noundef %390)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

391:                                              ; preds = %376
  %392 = load i8, ptr %13, align 1, !tbaa !18, !range !29, !noundef !30
  %393 = trunc i8 %392 to i1
  br i1 %393, label %394, label %403

394:                                              ; preds = %391
  %395 = load i8, ptr %14, align 1, !tbaa !18, !range !29, !noundef !30
  %396 = trunc i8 %395 to i1
  br i1 %396, label %397, label %403

397:                                              ; preds = %394
  %398 = load ptr, ptr @stderr, align 8, !tbaa !9
  %399 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %398, ptr noundef @.str.156) #8
  %400 = load ptr, ptr %5, align 8, !tbaa !9
  %401 = getelementptr inbounds ptr, ptr %400, i64 0
  %402 = load ptr, ptr %401, align 8, !tbaa !9
  call void @print_usage(ptr noundef %402)
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %540

403:                                              ; preds = %394, %391
  %404 = load i8, ptr %12, align 1, !tbaa !18, !range !29, !noundef !30
  %405 = trunc i8 %404 to i1
  br i1 %405, label %406, label %410

406:                                              ; preds = %403
  %407 = load i8, ptr @only_matching, align 1, !tbaa !18, !range !29, !noundef !30
  %408 = trunc i8 %407 to i1
  %409 = xor i1 %408, true
  br label %410

410:                                              ; preds = %406, %403
  %411 = phi i1 [ false, %403 ], [ %409, %406 ]
  %412 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 7
  %413 = zext i1 %411 to i8
  store i8 %413, ptr %412, align 2, !tbaa !31
  %414 = load i8, ptr %12, align 1, !tbaa !18, !range !29, !noundef !30
  %415 = trunc i8 %414 to i1
  br i1 %415, label %416, label %419

416:                                              ; preds = %410
  %417 = load i8, ptr @only_matching, align 1, !tbaa !18, !range !29, !noundef !30
  %418 = trunc i8 %417 to i1
  br label %419

419:                                              ; preds = %416, %410
  %420 = phi i1 [ false, %410 ], [ %418, %416 ]
  %421 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 8
  %422 = zext i1 %420 to i8
  store i8 %422, ptr %421, align 1, !tbaa !32
  %423 = load i8, ptr %12, align 1, !tbaa !18, !range !29, !noundef !30
  %424 = trunc i8 %423 to i1
  br i1 %424, label %425, label %429

425:                                              ; preds = %419
  %426 = load i8, ptr @only_matching, align 1, !tbaa !18, !range !29, !noundef !30
  %427 = trunc i8 %426 to i1
  %428 = xor i1 %427, true
  br label %429

429:                                              ; preds = %425, %419
  %430 = phi i1 [ false, %419 ], [ %428, %425 ]
  %431 = xor i1 %430, true
  %432 = getelementptr inbounds %struct.search_params, ptr %6, i32 0, i32 9
  %433 = zext i1 %431 to i8
  store i8 %433, ptr %432, align 4, !tbaa !33
  %434 = load i32, ptr %15, align 4, !tbaa !5
  call void @init_global_thread_pool(i32 noundef %434)
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #8
  store i32 1, ptr %28, align 4, !tbaa !5
  %435 = load i8, ptr %13, align 1, !tbaa !18, !range !29, !noundef !30
  %436 = trunc i8 %435 to i1
  br i1 %436, label %437, label %440

437:                                              ; preds = %429
  %438 = load ptr, ptr %11, align 8, !tbaa !9
  %439 = call i32 @search_string(ptr noundef %6, ptr noundef %438)
  store i32 %439, ptr %28, align 4, !tbaa !5
  br label %509

440:                                              ; preds = %429
  %441 = load i8, ptr %14, align 1, !tbaa !18, !range !29, !noundef !30
  %442 = trunc i8 %441 to i1
  br i1 %442, label %443, label %484

443:                                              ; preds = %440
  call void @llvm.lifetime.start.p0(i64 144, ptr %29) #8
  %444 = load ptr, ptr %11, align 8, !tbaa !9
  %445 = call i32 @stat(ptr noundef %444, ptr noundef %29) #8
  %446 = icmp eq i32 %445, -1
  br i1 %446, label %447, label %454

447:                                              ; preds = %443
  %448 = load ptr, ptr @stderr, align 8, !tbaa !9
  %449 = load ptr, ptr %11, align 8, !tbaa !9
  %450 = call ptr @__errno_location() #9
  %451 = load i32, ptr %450, align 4, !tbaa !5
  %452 = call ptr @strerror(i32 noundef %451) #8
  %453 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %448, ptr noundef @.str.105, ptr noundef %449, ptr noundef %452) #8
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %481

454:                                              ; preds = %443
  %455 = getelementptr inbounds %struct.stat, ptr %29, i32 0, i32 3
  %456 = load i32, ptr %455, align 8, !tbaa !34
  %457 = and i32 %456, 61440
  %458 = icmp eq i32 %457, 16384
  br i1 %458, label %463, label %459

459:                                              ; preds = %454
  %460 = load ptr, ptr @stderr, align 8, !tbaa !9
  %461 = load ptr, ptr %11, align 8, !tbaa !9
  %462 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %460, ptr noundef @.str.157, ptr noundef %461) #8
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %481

463:                                              ; preds = %454
  store i8 0, ptr %30, align 1, !tbaa !18
  %464 = load i8, ptr %30, align 1
  store atomic i8 %464, ptr @global_match_found_flag seq_cst, align 1
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #8
  %465 = load ptr, ptr %11, align 8, !tbaa !9
  %466 = load i32, ptr %15, align 4, !tbaa !5
  %467 = call i32 @search_directory_recursive(ptr noundef %465, ptr noundef %6, i32 noundef %466)
  store i32 %467, ptr %31, align 4, !tbaa !5
  %468 = load i32, ptr %31, align 4, !tbaa !5
  %469 = icmp sgt i32 %468, 0
  br i1 %469, label %470, label %474

470:                                              ; preds = %463
  %471 = load ptr, ptr @stderr, align 8, !tbaa !9
  %472 = load i32, ptr %31, align 4, !tbaa !5
  %473 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %471, ptr noundef @.str.158, i32 noundef %472) #8
  store i32 2, ptr %28, align 4, !tbaa !5
  br label %480

474:                                              ; preds = %463
  %475 = load atomic i8, ptr @global_match_found_flag seq_cst, align 1
  store i8 %475, ptr %32, align 1
  %476 = load i8, ptr %32, align 1, !tbaa !18, !range !29, !noundef !30
  %477 = trunc i8 %476 to i1
  %478 = zext i1 %477 to i64
  %479 = select i1 %477, i32 0, i32 1
  store i32 %479, ptr %28, align 4, !tbaa !5
  br label %480

480:                                              ; preds = %474, %470
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #8
  store i32 0, ptr %25, align 4
  br label %481

481:                                              ; preds = %480, %459, %447
  call void @llvm.lifetime.end.p0(i64 144, ptr %29) #8
  %482 = load i32, ptr %25, align 4
  switch i32 %482, label %539 [
    i32 0, label %483
  ]

483:                                              ; preds = %481
  br label %508

484:                                              ; preds = %440
  call void @llvm.lifetime.start.p0(i64 144, ptr %33) #8
  %485 = load ptr, ptr %11, align 8, !tbaa !9
  %486 = call i32 @strcmp(ptr noundef %485, ptr noundef @.str.99) #10
  %487 = icmp ne i32 %486, 0
  br i1 %487, label %488, label %501

488:                                              ; preds = %484
  %489 = load ptr, ptr %11, align 8, !tbaa !9
  %490 = call i32 @stat(ptr noundef %489, ptr noundef %33) #8
  %491 = icmp eq i32 %490, 0
  br i1 %491, label %492, label %501

492:                                              ; preds = %488
  %493 = getelementptr inbounds %struct.stat, ptr %33, i32 0, i32 3
  %494 = load i32, ptr %493, align 8, !tbaa !34
  %495 = and i32 %494, 61440
  %496 = icmp eq i32 %495, 16384
  br i1 %496, label %497, label %501

497:                                              ; preds = %492
  %498 = load ptr, ptr @stderr, align 8, !tbaa !9
  %499 = load ptr, ptr %11, align 8, !tbaa !9
  %500 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %498, ptr noundef @.str.159, ptr noundef %499) #8
  store i32 2, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %505

501:                                              ; preds = %492, %488, %484
  %502 = load ptr, ptr %11, align 8, !tbaa !9
  %503 = load i32, ptr %15, align 4, !tbaa !5
  %504 = call i32 @search_file(ptr noundef %6, ptr noundef %502, i32 noundef %503)
  store i32 %504, ptr %28, align 4, !tbaa !5
  store i32 0, ptr %25, align 4
  br label %505

505:                                              ; preds = %501, %497
  call void @llvm.lifetime.end.p0(i64 144, ptr %33) #8
  %506 = load i32, ptr %25, align 4
  switch i32 %506, label %539 [
    i32 0, label %507
  ]

507:                                              ; preds = %505
  br label %508

508:                                              ; preds = %507, %483
  br label %509

509:                                              ; preds = %508, %437
  call void @cleanup_global_thread_pool()
  %510 = load i64, ptr %9, align 8, !tbaa !17
  %511 = icmp ugt i64 %510, 0
  br i1 %511, label %512, label %537

512:                                              ; preds = %509
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  store i64 0, ptr %34, align 8, !tbaa !17
  br label %513

513:                                              ; preds = %533, %512
  %514 = load i64, ptr %34, align 8, !tbaa !17
  %515 = load i64, ptr %9, align 8, !tbaa !17
  %516 = icmp ult i64 %514, %515
  br i1 %516, label %518, label %517

517:                                              ; preds = %513
  store i32 7, ptr %25, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  br label %536

518:                                              ; preds = %513
  %519 = load i64, ptr %34, align 8, !tbaa !17
  %520 = getelementptr inbounds [1024 x i8], ptr %10, i64 0, i64 %519
  %521 = load i8, ptr %520, align 1, !tbaa !18, !range !29, !noundef !30
  %522 = trunc i8 %521 to i1
  br i1 %522, label %523, label %532

523:                                              ; preds = %518
  %524 = load i64, ptr %34, align 8, !tbaa !17
  %525 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 %524
  %526 = load ptr, ptr %525, align 8, !tbaa !9
  %527 = icmp ne ptr %526, null
  br i1 %527, label %528, label %532

528:                                              ; preds = %523
  %529 = load i64, ptr %34, align 8, !tbaa !17
  %530 = getelementptr inbounds [1024 x ptr], ptr %7, i64 0, i64 %529
  %531 = load ptr, ptr %530, align 8, !tbaa !9
  call void @free(ptr noundef %531) #8
  br label %532

532:                                              ; preds = %528, %523, %518
  br label %533

533:                                              ; preds = %532
  %534 = load i64, ptr %34, align 8, !tbaa !17
  %535 = add i64 %534, 1
  store i64 %535, ptr %34, align 8, !tbaa !17
  br label %513, !llvm.loop !37

536:                                              ; preds = %517
  br label %537

537:                                              ; preds = %536, %509
  %538 = load i32, ptr %28, align 4, !tbaa !5
  store i32 %538, ptr %3, align 4
  store i32 1, ptr %25, align 4
  br label %539

539:                                              ; preds = %537, %505, %481
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #8
  br label %540

540:                                              ; preds = %539, %397, %380, %362, %356, %340, %281, %254, %240, %218, %199, %195, %193
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 256, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 1024, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 8192, ptr %8) #8
  call void @llvm.lifetime.end.p0(i64 8192, ptr %7) #8
  call void @llvm.lifetime.end.p0(i64 72, ptr %6) #8
  %541 = load i32, ptr %3, align 4
  ret i32 %541
}

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

; Function Attrs: nounwind
declare i64 @strtol(ptr noundef, ptr noundef, i32 noundef) #2

declare noalias ptr @fopen(ptr noundef, ptr noundef) #1

declare ptr @fgets(ptr noundef, i32 noundef, ptr noundef) #1

; Function Attrs: nounwind
declare noalias ptr @strdup(ptr noundef) #2

declare i32 @fclose(ptr noundef) #1

; Function Attrs: nounwind
declare i32 @isatty(i32 noundef) #2

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

; Function Attrs: nounwind uwtable
declare hidden void @cleanup_global_thread_pool() #6

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { 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 #7 = { nounwind willreturn memory(none) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { nounwind }
attributes #9 = { nounwind willreturn memory(none) }
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 = !{!"int", !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, !14, i64 40}
!12 = !{!"search_params", !10, i64 0, !13, i64 8, !10, i64 16, !10, i64 24, !13, i64 32, !14, i64 40, !14, i64 41, !14, i64 42, !14, i64 43, !14, i64 44, !14, i64 45, !10, i64 48, !10, i64 56, !13, i64 64}
!13 = !{!"long", !7, i64 0}
!14 = !{!"_Bool", !7, i64 0}
!15 = !{!12, !13, i64 32}
!16 = !{!12, !14, i64 41}
!17 = !{!13, !13, i64 0}
!18 = !{!14, !14, i64 0}
!19 = !{!12, !13, i64 64}
!20 = !{!7, !7, i64 0}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = !{!12, !14, i64 45}
!24 = distinct !{!24, !22}
!25 = !{!12, !10, i64 16}
!26 = !{!12, !10, i64 24}
!27 = !{!12, !10, i64 0}
!28 = !{!12, !13, i64 8}
!29 = !{i8 0, i8 2}
!30 = !{}
!31 = !{!12, !14, i64 42}
!32 = !{!12, !14, i64 43}
!33 = !{!12, !14, i64 44}
!34 = !{!35, !6, i64 24}
!35 = !{!"stat", !13, i64 0, !13, i64 8, !13, i64 16, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !13, i64 40, !13, i64 48, !13, i64 56, !13, i64 64, !36, i64 72, !36, i64 88, !36, i64 104, !7, i64 120}
!36 = !{!"timespec", !13, i64 0, !13, i64 8}
!37 = distinct !{!37, !22}


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

@stderr = external local_unnamed_addr global ptr, align 8
@color_output_enabled = external hidden local_unnamed_addr global i8, align 1
@only_matching = external hidden local_unnamed_addr global i8, align 1
@.str.33 = external hidden unnamed_addr constant [4 x i8], align 1
@force_no_simd = external hidden local_unnamed_addr global i8, align 1
@.str.99 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.105 = external hidden unnamed_addr constant [14 x i8], align 1
@global_match_found_flag = external hidden local_unnamed_addr global i8, align 1
@.str.125 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.130 = external hidden unnamed_addr constant [5 x i8], align 1
@__const.main.long_options = external hidden unnamed_addr constant [8 x %struct.option], align 16
@.str.138 = external hidden unnamed_addr constant [21 x i8], align 1
@optarg = external local_unnamed_addr global ptr, align 8
@.str.139 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.140 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.141 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.142 = external hidden unnamed_addr constant [43 x i8], align 1
@.str.143 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.144 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.145 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.146 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.147 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.148 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.149 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.150 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.151 = external hidden unnamed_addr constant [47 x i8], align 1
@optind = external local_unnamed_addr global i32, align 4
@.str.152 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.153 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.154 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.155 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.156 = external hidden unnamed_addr constant [85 x i8], align 1
@.str.157 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.158 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.159 = external hidden unnamed_addr constant [57 x i8], align 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @main(i32 noundef %0, ptr noundef %1) local_unnamed_addr #6 {
  %3 = alloca %struct.search_params, align 8
  %4 = alloca [1024 x ptr], align 16
  %5 = alloca [1024 x i64], align 16
  %6 = alloca [1024 x i8], align 16
  %7 = alloca [8 x %struct.option], align 16
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca [1024 x i8], align 16
  %12 = alloca %struct.stat, align 8
  %13 = alloca %struct.stat, align 8
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %3) #11
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(72) %3, i8 0, i64 64, i1 false)
  %14 = getelementptr inbounds i8, ptr %3, i64 40
  store i8 1, ptr %14, align 8, !tbaa !5
  %15 = getelementptr inbounds i8, ptr %3, i64 32
  %16 = getelementptr inbounds i8, ptr %3, i64 41
  store i8 0, ptr %16, align 1, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8192, ptr nonnull %4) #11
  call void @llvm.lifetime.start.p0(i64 8192, ptr nonnull %5) #11
  call void @llvm.lifetime.start.p0(i64 1024, ptr nonnull %6) #11
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(1024) %6, i8 0, i64 1024, i1 false)
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %7) #11
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %7, ptr noundef nonnull align 16 dereferenceable(256) @__const.main.long_options, i64 256, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %8) #11
  store i32 0, ptr %8, align 4, !tbaa !13
  %17 = getelementptr inbounds i8, ptr %3, i64 64
  store i64 -1, ptr %17, align 8, !tbaa !15
  %18 = getelementptr inbounds i8, ptr %3, i64 45
  br label %19

19:                                               ; preds = %.backedge, %2
  %.0124 = phi ptr [ @.str.130, %2 ], [ %.0124.be, %.backedge ]
  %.0121 = phi i32 [ 0, %2 ], [ %.0121.be, %.backedge ]
  %.0119 = phi i8 [ 0, %2 ], [ %.0119.be, %.backedge ]
  %.0117 = phi i8 [ 0, %2 ], [ %.0117.be, %.backedge ]
  %.0110 = phi i1 [ false, %2 ], [ %.0110.be, %.backedge ]
  %.098 = phi i64 [ 0, %2 ], [ %.098.be, %.backedge ]
  %20 = call i32 @getopt_long(i32 noundef %0, ptr noundef %1, ptr noundef nonnull @.str.138, ptr noundef nonnull %7, ptr noundef nonnull %8) #11
  switch i32 %20, label %140 [
    i32 -1, label %142
    i32 105, label %21
    i32 99, label %.backedge
    i32 111, label %22
    i32 109, label %23
    i32 69, label %40
    i32 70, label %41
    i32 114, label %42
    i32 116, label %43
    i32 115, label %62
    i32 102, label %63
    i32 118, label %104
    i32 104, label %108
    i32 101, label %110
    i32 67, label %122
    i32 83, label %138
    i32 119, label %139
  ]

21:                                               ; preds = %19
  store i8 0, ptr %14, align 8, !tbaa !5
  br label %.backedge

22:                                               ; preds = %19
  store i8 1, ptr @only_matching, align 1, !tbaa !16
  br label %.backedge

23:                                               ; preds = %19
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #11
  store ptr null, ptr %9, align 8, !tbaa !17
  %24 = tail call ptr @__errno_location() #12
  store i32 0, ptr %24, align 4, !tbaa !13
  %25 = load ptr, ptr @optarg, align 8, !tbaa !17
  %26 = call i64 @strtol(ptr noundef %25, ptr noundef nonnull %9, i32 noundef 10) #11
  %27 = load i32, ptr %24, align 4, !tbaa !13
  %.not149 = icmp eq i32 %27, 0
  %.pre288 = load ptr, ptr @optarg, align 8, !tbaa !17
  br i1 %.not149, label %28, label %35

28:                                               ; preds = %23
  %29 = load ptr, ptr %9, align 8, !tbaa !17
  %30 = icmp eq ptr %.pre288, %29
  br i1 %30, label %35, label %31

31:                                               ; preds = %28
  %32 = load i8, ptr %29, align 1, !tbaa !18
  %33 = icmp ne i8 %32, 0
  %34 = icmp slt i64 %26, 0
  %or.cond = select i1 %33, i1 true, i1 %34
  br i1 %or.cond, label %35, label %38

35:                                               ; preds = %31, %28, %23
  %36 = load ptr, ptr @stderr, align 8, !tbaa !17
  %37 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %36, ptr noundef nonnull @.str.139, ptr noundef %.pre288) #13
  br label %39

38:                                               ; preds = %31
  store i64 %26, ptr %17, align 8, !tbaa !15
  br label %39

39:                                               ; preds = %38, %35
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #11
  br label %.backedge

40:                                               ; preds = %19
  store i8 1, ptr %16, align 1, !tbaa !12
  br label %.backedge

41:                                               ; preds = %19
  store i8 0, ptr %16, align 1, !tbaa !12
  br label %.backedge

42:                                               ; preds = %19
  br label %.backedge

43:                                               ; preds = %19
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #11
  store ptr null, ptr %10, align 8, !tbaa !17
  %44 = tail call ptr @__errno_location() #12
  store i32 0, ptr %44, align 4, !tbaa !13
  %45 = load ptr, ptr @optarg, align 8, !tbaa !17
  %46 = call i64 @strtol(ptr noundef %45, ptr noundef nonnull %10, i32 noundef 10) #11
  %47 = load i32, ptr %44, align 4, !tbaa !13
  %.not148 = icmp eq i32 %47, 0
  %.pre = load ptr, ptr @optarg, align 8, !tbaa !17
  br i1 %.not148, label %48, label %56

48:                                               ; preds = %43
  %49 = load ptr, ptr %10, align 8, !tbaa !17
  %50 = icmp eq ptr %.pre, %49
  br i1 %50, label %56, label %51

51:                                               ; preds = %48
  %52 = load i8, ptr %49, align 1, !tbaa !18
  %53 = icmp ne i8 %52, 0
  %54 = add i64 %46, -2147483648
  %55 = icmp ult i64 %54, -2147483647
  %or.cond7 = select i1 %53, i1 true, i1 %55
  br i1 %or.cond7, label %56, label %59

56:                                               ; preds = %51, %48, %43
  %57 = load ptr, ptr @stderr, align 8, !tbaa !17
  %58 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %57, ptr noundef nonnull @.str.140, ptr noundef %.pre) #13
  br label %61

59:                                               ; preds = %51
  %60 = trunc nuw nsw i64 %46 to i32
  br label %61

61:                                               ; preds = %59, %56
  %.1122 = phi i32 [ 0, %56 ], [ %60, %59 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #11
  br label %.backedge

62:                                               ; preds = %19
  br label %.backedge

63:                                               ; preds = %19
  %64 = load ptr, ptr @optarg, align 8, !tbaa !17
  %65 = call noalias ptr @fopen(ptr noundef %64, ptr noundef nonnull @.str.141)
  %.not145 = icmp eq ptr %65, null
  br i1 %.not145, label %.thread154, label %69

.thread154:                                       ; preds = %63
  %66 = load ptr, ptr @stderr, align 8, !tbaa !17
  %67 = load ptr, ptr @optarg, align 8, !tbaa !17
  %68 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %66, ptr noundef nonnull @.str.142, ptr noundef %67) #13
  br label %.loopexit

69:                                               ; preds = %63
  call void @llvm.lifetime.start.p0(i64 1024, ptr nonnull %11) #11
  %70 = call ptr @fgets(ptr noundef nonnull %11, i32 noundef 1024, ptr noundef nonnull %65)
  %71 = icmp ne ptr %70, null
  %72 = icmp ult i64 %.098, 1024
  %73 = select i1 %71, i1 %72, i1 false
  br i1 %73, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %69, %92
  %.199235 = phi i64 [ %.2100, %92 ], [ %.098, %69 ]
  %74 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %11) #14
  %.not146 = icmp eq i64 %74, 0
  br i1 %.not146, label %81, label %75

75:                                               ; preds = %.lr.ph
  %76 = add i64 %74, -1
  %77 = getelementptr inbounds [1024 x i8], ptr %11, i64 0, i64 %76
  %78 = load i8, ptr %77, align 1, !tbaa !18
  %79 = icmp eq i8 %78, 10
  br i1 %79, label %80, label %81

80:                                               ; preds = %75
  store i8 0, ptr %77, align 1, !tbaa !18
  br label %81

81:                                               ; preds = %80, %75, %.lr.ph
  %char0 = load i8, ptr %11, align 16
  %82 = icmp eq i8 %char0, 0
  br i1 %82, label %92, label %83, !llvm.loop !19

83:                                               ; preds = %81
  %84 = call noalias ptr @strdup(ptr noundef nonnull %11) #11
  %85 = getelementptr inbounds [1024 x ptr], ptr %4, i64 0, i64 %.199235
  store ptr %84, ptr %85, align 8, !tbaa !17
  %.not147 = icmp eq ptr %84, null
  br i1 %.not147, label %.thread, label %87

.thread:                                          ; preds = %83
  call void @perror(ptr noundef nonnull @.str.143) #15
  %86 = call i32 @fclose(ptr noundef nonnull %65)
  br label %.thread159

87:                                               ; preds = %83
  %88 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %84) #14
  %89 = getelementptr inbounds [1024 x i64], ptr %5, i64 0, i64 %.199235
  store i64 %88, ptr %89, align 8, !tbaa !21
  %90 = getelementptr inbounds [1024 x i8], ptr %6, i64 0, i64 %.199235
  store i8 1, ptr %90, align 1, !tbaa !16
  %91 = add nuw nsw i64 %.199235, 1
  br label %92

92:                                               ; preds = %81, %87
  %.2100 = phi i64 [ %91, %87 ], [ %.199235, %81 ]
  %93 = call ptr @fgets(ptr noundef nonnull %11, i32 noundef 1024, ptr noundef nonnull %65)
  %94 = icmp ne ptr %93, null
  %95 = icmp ult i64 %.2100, 1024
  %96 = select i1 %94, i1 %95, i1 false
  br i1 %96, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %92, %69
  %.199.lcssa = phi i64 [ %.098, %69 ], [ %.2100, %92 ]
  %97 = call i32 @fclose(ptr noundef nonnull %65)
  %98 = icmp eq i64 %.199.lcssa, 0
  br i1 %98, label %99, label %103

99:                                               ; preds = %._crit_edge
  %100 = load ptr, ptr @stderr, align 8, !tbaa !17
  %101 = load ptr, ptr @optarg, align 8, !tbaa !17
  %102 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %100, ptr noundef nonnull @.str.144, ptr noundef %101) #13
  br label %.thread159

.thread159:                                       ; preds = %99, %.thread
  call void @llvm.lifetime.end.p0(i64 1024, ptr nonnull %11) #11
  br label %.loopexit

103:                                              ; preds = %._crit_edge
  call void @llvm.lifetime.end.p0(i64 1024, ptr nonnull %11) #11
  br label %.backedge

.backedge:                                        ; preds = %103, %131, %128, %122, %125, %19, %139, %138, %112, %62, %61, %42, %41, %40, %39, %22, %21
  %.0124.be = phi ptr [ %.0124, %139 ], [ %.0124, %138 ], [ %.0124, %112 ], [ %.0124, %103 ], [ %.0124, %62 ], [ %.0124, %61 ], [ %.0124, %42 ], [ %.0124, %41 ], [ %.0124, %40 ], [ %.0124, %39 ], [ %.0124, %22 ], [ %.0124, %21 ], [ %.0124, %19 ], [ @.str.130, %125 ], [ @.str.130, %122 ], [ @.str.149, %128 ], [ @.str.150, %131 ]
  %.0121.be = phi i32 [ %.0121, %139 ], [ %.0121, %138 ], [ %.0121, %112 ], [ %.0121, %103 ], [ %.0121, %62 ], [ %.1122, %61 ], [ %.0121, %42 ], [ %.0121, %41 ], [ %.0121, %40 ], [ %.0121, %39 ], [ %.0121, %22 ], [ %.0121, %21 ], [ %.0121, %19 ], [ %.0121, %125 ], [ %.0121, %122 ], [ %.0121, %128 ], [ %.0121, %131 ]
  %.0119.be = phi i8 [ %.0119, %139 ], [ %.0119, %138 ], [ %.0119, %112 ], [ %.0119, %103 ], [ %.0119, %62 ], [ %.0119, %61 ], [ 1, %42 ], [ %.0119, %41 ], [ %.0119, %40 ], [ %.0119, %39 ], [ %.0119, %22 ], [ %.0119, %21 ], [ %.0119, %19 ], [ %.0119, %125 ], [ %.0119, %122 ], [ %.0119, %128 ], [ %.0119, %131 ]
  %.0117.be = phi i8 [ %.0117, %139 ], [ %.0117, %138 ], [ %.0117, %112 ], [ %.0117, %103 ], [ 1, %62 ], [ %.0117, %61 ], [ %.0117, %42 ], [ %.0117, %41 ], [ %.0117, %40 ], [ %.0117, %39 ], [ %.0117, %22 ], [ %.0117, %21 ], [ %.0117, %19 ], [ %.0117, %125 ], [ %.0117, %122 ], [ %.0117, %128 ], [ %.0117, %131 ]
  %.0110.be = phi i1 [ %.0110, %139 ], [ %.0110, %138 ], [ %.0110, %112 ], [ %.0110, %103 ], [ %.0110, %62 ], [ %.0110, %61 ], [ %.0110, %42 ], [ %.0110, %41 ], [ %.0110, %40 ], [ %.0110, %39 ], [ %.0110, %22 ], [ %.0110, %21 ], [ true, %19 ], [ %.0110, %125 ], [ %.0110, %122 ], [ %.0110, %128 ], [ %.0110, %131 ]
  %.098.be = phi i64 [ %.098, %139 ], [ %.098, %138 ], [ %118, %112 ], [ %.199.lcssa, %103 ], [ %.098, %62 ], [ %.098, %61 ], [ %.098, %42 ], [ %.098, %41 ], [ %.098, %40 ], [ %.098, %39 ], [ %.098, %22 ], [ %.098, %21 ], [ %.098, %19 ], [ %.098, %125 ], [ %.098, %122 ], [ %.098, %128 ], [ %.098, %131 ]
  br label %19, !llvm.loop !22

104:                                              ; preds = %19
  %105 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.145, ptr noundef nonnull @.str.33)
  %106 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.146)
  %107 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.147, i64 noundef 0)
  br label %.loopexit

108:                                              ; preds = %19
  %109 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %109)
  br label %.loopexit

110:                                              ; preds = %19
  %111 = icmp ult i64 %.098, 1024
  br i1 %111, label %112, label %119

112:                                              ; preds = %110
  %113 = load ptr, ptr @optarg, align 8, !tbaa !17
  %114 = getelementptr inbounds [1024 x ptr], ptr %4, i64 0, i64 %.098
  store ptr %113, ptr %114, align 8, !tbaa !17
  %115 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %113) #14
  %116 = getelementptr inbounds [1024 x i64], ptr %5, i64 0, i64 %.098
  store i64 %115, ptr %116, align 8, !tbaa !21
  %117 = getelementptr inbounds [1024 x i8], ptr %6, i64 0, i64 %.098
  store i8 0, ptr %117, align 1, !tbaa !16
  %118 = add nuw nsw i64 %.098, 1
  br label %.backedge

119:                                              ; preds = %110
  %120 = load ptr, ptr @stderr, align 8, !tbaa !17
  %121 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %120, ptr noundef nonnull @.str.148, i32 noundef 1024) #13
  br label %.loopexit

122:                                              ; preds = %19
  %123 = load ptr, ptr @optarg, align 8, !tbaa !17
  %124 = icmp eq ptr %123, null
  br i1 %124, label %.backedge, label %125

125:                                              ; preds = %122
  %126 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %123, ptr noundef nonnull dereferenceable(1) @.str.130) #14
  %127 = icmp eq i32 %126, 0
  br i1 %127, label %.backedge, label %128

128:                                              ; preds = %125
  %129 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %123, ptr noundef nonnull dereferenceable(1) @.str.149) #14
  %130 = icmp eq i32 %129, 0
  br i1 %130, label %.backedge, label %131

131:                                              ; preds = %128
  %132 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %123, ptr noundef nonnull dereferenceable(1) @.str.150) #14
  %133 = icmp eq i32 %132, 0
  br i1 %133, label %.backedge, label %134

134:                                              ; preds = %131
  %135 = load ptr, ptr @stderr, align 8, !tbaa !17
  %136 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %135, ptr noundef nonnull @.str.151, ptr noundef nonnull %123) #13
  %137 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %137)
  br label %.loopexit

138:                                              ; preds = %19
  store i8 1, ptr @force_no_simd, align 1, !tbaa !16
  br label %.backedge

139:                                              ; preds = %19
  store i8 1, ptr %18, align 1, !tbaa !23
  br label %.backedge

140:                                              ; preds = %19
  %141 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %141)
  br label %.loopexit

142:                                              ; preds = %19
  %143 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0124, ptr noundef nonnull dereferenceable(1) @.str.149) #14
  %144 = icmp eq i32 %143, 0
  br i1 %144, label %152, label %145

145:                                              ; preds = %142
  %146 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0124, ptr noundef nonnull dereferenceable(1) @.str.150) #14
  %147 = icmp eq i32 %146, 0
  br i1 %147, label %152, label %148

148:                                              ; preds = %145
  %149 = call i32 @isatty(i32 noundef 1) #11
  %150 = icmp ne i32 %149, 0
  %151 = zext i1 %150 to i8
  br label %152

152:                                              ; preds = %145, %142, %148
  %.sink = phi i8 [ %151, %148 ], [ 1, %142 ], [ 0, %145 ]
  store i8 %.sink, ptr @color_output_enabled, align 1, !tbaa !16
  %153 = icmp eq i64 %.098, 0
  br i1 %153, label %154, label %167

154:                                              ; preds = %152
  %155 = load i32, ptr @optind, align 4, !tbaa !13
  %.not140 = icmp slt i32 %155, %0
  br i1 %.not140, label %.thread164, label %156

156:                                              ; preds = %154
  %157 = load ptr, ptr @stderr, align 8, !tbaa !17
  %158 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %157, ptr noundef nonnull @.str.152) #13
  %159 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %159)
  br label %.loopexit

.thread164:                                       ; preds = %154
  %160 = add nsw i32 %155, 1
  store i32 %160, ptr @optind, align 4, !tbaa !13
  %161 = sext i32 %155 to i64
  %162 = getelementptr inbounds ptr, ptr %1, i64 %161
  %163 = load ptr, ptr %162, align 8, !tbaa !17
  store ptr %163, ptr %4, align 16, !tbaa !17
  %164 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %163) #14
  store i64 %164, ptr %5, align 16, !tbaa !21
  store i8 0, ptr %6, align 16, !tbaa !16
  %165 = getelementptr inbounds i8, ptr %3, i64 16
  store ptr %4, ptr %165, align 8, !tbaa !24
  %166 = getelementptr inbounds i8, ptr %3, i64 24
  store ptr %5, ptr %166, align 8, !tbaa !25
  store i64 1, ptr %15, align 8, !tbaa !26
  br label %171

167:                                              ; preds = %152
  %168 = getelementptr inbounds i8, ptr %3, i64 16
  store ptr %4, ptr %168, align 8, !tbaa !24
  %169 = getelementptr inbounds i8, ptr %3, i64 24
  store ptr %5, ptr %169, align 8, !tbaa !25
  store i64 %.098, ptr %15, align 8, !tbaa !26
  %170 = icmp eq i64 %.098, 1
  br i1 %170, label %._crit_edge289, label %175

._crit_edge289:                                   ; preds = %167
  %.pre290 = load ptr, ptr %4, align 16, !tbaa !17
  %.pre291 = load i64, ptr %5, align 16, !tbaa !21
  br label %171

171:                                              ; preds = %._crit_edge289, %.thread164
  %172 = phi i64 [ %.pre291, %._crit_edge289 ], [ %164, %.thread164 ]
  %173 = phi ptr [ %.pre290, %._crit_edge289 ], [ %163, %.thread164 ]
  store ptr %173, ptr %3, align 8, !tbaa !27
  %174 = getelementptr inbounds i8, ptr %3, i64 8
  store i64 %172, ptr %174, align 8, !tbaa !28
  br label %175

175:                                              ; preds = %171, %167
  %.6104166 = phi i64 [ 1, %171 ], [ %.098, %167 ]
  %176 = load i32, ptr @optind, align 4, !tbaa !13
  %.not141 = icmp slt i32 %176, %0
  br i1 %.not141, label %191, label %177

177:                                              ; preds = %175
  %178 = trunc nuw i8 %.0119 to i1
  %179 = trunc nuw i8 %.0117 to i1
  br i1 %178, label %180, label %181

180:                                              ; preds = %177
  br i1 %179, label %.thread168, label %196

181:                                              ; preds = %177
  br i1 %179, label %.thread168, label %182

182:                                              ; preds = %181
  %183 = call i32 @isatty(i32 noundef 0) #11
  %.not142 = icmp eq i32 %183, 0
  br i1 %.not142, label %._crit_edge293, label %184

._crit_edge293:                                   ; preds = %182
  %.pre294 = load i32, ptr @optind, align 4, !tbaa !13
  br label %196

184:                                              ; preds = %182
  %185 = load ptr, ptr @stderr, align 8, !tbaa !17
  %186 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %185, ptr noundef nonnull @.str.153) #13
  %187 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %187)
  br label %.loopexit

.thread168:                                       ; preds = %181, %180
  %188 = load ptr, ptr @stderr, align 8, !tbaa !17
  %189 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %188, ptr noundef nonnull @.str.154) #13
  %190 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %190)
  br label %.loopexit

191:                                              ; preds = %175
  %192 = add nsw i32 %176, 1
  store i32 %192, ptr @optind, align 4, !tbaa !13
  %193 = sext i32 %176 to i64
  %194 = getelementptr inbounds ptr, ptr %1, i64 %193
  %195 = load ptr, ptr %194, align 8, !tbaa !17
  br label %196

196:                                              ; preds = %._crit_edge293, %180, %191
  %197 = phi i32 [ %192, %191 ], [ %176, %180 ], [ %.pre294, %._crit_edge293 ]
  %.0105 = phi ptr [ %195, %191 ], [ @.str.125, %180 ], [ @.str.99, %._crit_edge293 ]
  %198 = icmp slt i32 %197, %0
  br i1 %198, label %199, label %206

199:                                              ; preds = %196
  %200 = load ptr, ptr @stderr, align 8, !tbaa !17
  %201 = sext i32 %197 to i64
  %202 = getelementptr inbounds ptr, ptr %1, i64 %201
  %203 = load ptr, ptr %202, align 8, !tbaa !17
  %204 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %200, ptr noundef nonnull @.str.155, ptr noundef %203) #13
  %205 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %205)
  br label %.loopexit

206:                                              ; preds = %196
  %207 = trunc nuw i8 %.0117 to i1
  br i1 %207, label %208, label %214

208:                                              ; preds = %206
  %209 = trunc nuw i8 %.0119 to i1
  br i1 %209, label %210, label %214

210:                                              ; preds = %208
  %211 = load ptr, ptr @stderr, align 8, !tbaa !17
  %212 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %211, ptr noundef nonnull @.str.156) #13
  %213 = load ptr, ptr %1, align 8, !tbaa !17
  call void @print_usage(ptr noundef %213)
  br label %.loopexit

214:                                              ; preds = %208, %206
  %215 = load i8, ptr @only_matching, align 1, !range !29
  %216 = xor i8 %215, 1
  %217 = select i1 %.0110, i8 %216, i8 0
  %218 = getelementptr inbounds i8, ptr %3, i64 42
  store i8 %217, ptr %218, align 2, !tbaa !30
  %219 = select i1 %.0110, i8 %215, i8 0
  %220 = getelementptr inbounds i8, ptr %3, i64 43
  store i8 %219, ptr %220, align 1, !tbaa !31
  %221 = select i1 %.0110, i8 %215, i8 1
  %222 = getelementptr inbounds i8, ptr %3, i64 44
  store i8 %221, ptr %222, align 4, !tbaa !32
  call void @init_global_thread_pool(i32 noundef %.0121)
  br i1 %207, label %223, label %225

223:                                              ; preds = %214
  %224 = call i32 @search_string(ptr noundef nonnull %3, ptr noundef %.0105)
  br label %270

225:                                              ; preds = %214
  %226 = trunc nuw i8 %.0119 to i1
  br i1 %226, label %227, label %256

227:                                              ; preds = %225
  call void @llvm.lifetime.start.p0(i64 144, ptr nonnull %12) #11
  %228 = call i32 @stat(ptr noundef %.0105, ptr noundef nonnull %12) #11
  %229 = icmp eq i32 %228, -1
  br i1 %229, label %230, label %236

230:                                              ; preds = %227
  %231 = load ptr, ptr @stderr, align 8, !tbaa !17
  %232 = tail call ptr @__errno_location() #12
  %233 = load i32, ptr %232, align 4, !tbaa !13
  %234 = call ptr @strerror(i32 noundef %233) #11
  %235 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %231, ptr noundef nonnull @.str.105, ptr noundef %.0105, ptr noundef %234) #13
  br label %255

236:                                              ; preds = %227
  %237 = getelementptr inbounds i8, ptr %12, i64 24
  %238 = load i32, ptr %237, align 8, !tbaa !33
  %239 = and i32 %238, 61440
  %240 = icmp eq i32 %239, 16384
  br i1 %240, label %244, label %241

241:                                              ; preds = %236
  %242 = load ptr, ptr @stderr, align 8, !tbaa !17
  %243 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %242, ptr noundef nonnull @.str.157, ptr noundef %.0105) #13
  br label %255

244:                                              ; preds = %236
  store atomic i8 0, ptr @global_match_found_flag seq_cst, align 1
  %245 = call i32 @search_directory_recursive(ptr noundef %.0105, ptr noundef nonnull %3, i32 noundef %.0121)
  %246 = icmp sgt i32 %245, 0
  br i1 %246, label %247, label %250

247:                                              ; preds = %244
  %248 = load ptr, ptr @stderr, align 8, !tbaa !17
  %249 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %248, ptr noundef nonnull @.str.158, i32 noundef %245) #13
  br label %.thread175

250:                                              ; preds = %244
  %251 = load atomic i8, ptr @global_match_found_flag seq_cst, align 1
  %252 = and i8 %251, 1
  %253 = xor i8 %252, 1
  %254 = zext nneg i8 %253 to i32
  br label %.thread175

.thread175:                                       ; preds = %250, %247
  %.1107.ph = phi i32 [ %254, %250 ], [ 2, %247 ]
  call void @llvm.lifetime.end.p0(i64 144, ptr nonnull %12) #11
  br label %270

255:                                              ; preds = %241, %230
  call void @llvm.lifetime.end.p0(i64 144, ptr nonnull %12) #11
  br label %.loopexit

256:                                              ; preds = %225
  call void @llvm.lifetime.start.p0(i64 144, ptr nonnull %13) #11
  %257 = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) %.0105, ptr noundef nonnull dereferenceable(1) @.str.99) #14
  %.not143 = icmp eq i32 %257, 0
  br i1 %.not143, label %.thread179, label %258

258:                                              ; preds = %256
  %259 = call i32 @stat(ptr noundef %.0105, ptr noundef nonnull %13) #11
  %260 = icmp eq i32 %259, 0
  br i1 %260, label %261, label %.thread179

261:                                              ; preds = %258
  %262 = getelementptr inbounds i8, ptr %13, i64 24
  %263 = load i32, ptr %262, align 8, !tbaa !33
  %264 = and i32 %263, 61440
  %265 = icmp eq i32 %264, 16384
  br i1 %265, label %267, label %.thread179

.thread179:                                       ; preds = %256, %258, %261
  %266 = call i32 @search_file(ptr noundef nonnull %3, ptr noundef %.0105, i32 noundef %.0121)
  call void @llvm.lifetime.end.p0(i64 144, ptr nonnull %13) #11
  br label %270

267:                                              ; preds = %261
  %268 = load ptr, ptr @stderr, align 8, !tbaa !17
  %269 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %268, ptr noundef nonnull @.str.159, ptr noundef %.0105) #13
  call void @llvm.lifetime.end.p0(i64 144, ptr nonnull %13) #11
  br label %.loopexit

270:                                              ; preds = %.thread179, %.thread175, %223
  %.3109 = phi i32 [ %224, %223 ], [ %.1107.ph, %.thread175 ], [ %266, %.thread179 ]
  call void @cleanup_global_thread_pool()
  br label %271

271:                                              ; preds = %270, %279
  %.0236 = phi i64 [ 0, %270 ], [ %280, %279 ]
  %272 = getelementptr inbounds [1024 x i8], ptr %6, i64 0, i64 %.0236
  %273 = load i8, ptr %272, align 1, !tbaa !16, !range !29, !noundef !36
  %274 = trunc nuw i8 %273 to i1
  br i1 %274, label %275, label %279

275:                                              ; preds = %271
  %276 = getelementptr inbounds [1024 x ptr], ptr %4, i64 0, i64 %.0236
  %277 = load ptr, ptr %276, align 8, !tbaa !17
  %.not144 = icmp eq ptr %277, null
  br i1 %.not144, label %279, label %278

278:                                              ; preds = %275
  call void @free(ptr noundef nonnull %277) #11
  br label %279

279:                                              ; preds = %271, %275, %278
  %280 = add nuw i64 %.0236, 1
  %exitcond.not = icmp eq i64 %280, %.6104166
  br i1 %exitcond.not, label %.loopexit, label %271, !llvm.loop !37

.loopexit:                                        ; preds = %279, %267, %255, %.thread159, %.thread154, %210, %199, %.thread168, %184, %156, %140, %134, %119, %108, %104
  %.9 = phi i32 [ 2, %140 ], [ 2, %134 ], [ 2, %119 ], [ 0, %108 ], [ 0, %104 ], [ 2, %156 ], [ 2, %.thread168 ], [ 2, %199 ], [ 2, %210 ], [ 2, %184 ], [ 2, %255 ], [ 2, %267 ], [ 2, %.thread154 ], [ 2, %.thread159 ], [ %.3109, %279 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %8) #11
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %7) #11
  call void @llvm.lifetime.end.p0(i64 1024, ptr nonnull %6) #11
  call void @llvm.lifetime.end.p0(i64 8192, ptr nonnull %5) #11
  call void @llvm.lifetime.end.p0(i64 8192, ptr nonnull %4) #11
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %3) #11
  ret i32 %.9
}

; Function Attrs: nounwind
declare i32 @getopt_long(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #7

; Function Attrs: mustprogress nofree nounwind willreturn
declare i64 @strtol(ptr noundef readonly, ptr nocapture noundef, i32 noundef) local_unnamed_addr #9

; Function Attrs: nofree nounwind
declare noalias noundef ptr @fopen(ptr nocapture noundef readonly, ptr nocapture noundef readonly) local_unnamed_addr #1

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare noalias ptr @strdup(ptr nocapture noundef readonly) local_unnamed_addr #10

; Function Attrs: nofree nounwind
declare noundef i32 @fclose(ptr nocapture noundef) local_unnamed_addr #1

; Function Attrs: nounwind
declare i32 @isatty(i32 noundef) local_unnamed_addr #7

; Function Attrs: nofree nounwind
declare noundef i32 @stat(ptr nocapture noundef readonly, ptr nocapture noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden void @cleanup_global_thread_pool() local_unnamed_addr #6

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !11, i64 40}
!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 41}
!13 = !{!14, !14, i64 0}
!14 = !{!"int", !8, i64 0}
!15 = !{!6, !10, i64 64}
!16 = !{!11, !11, i64 0}
!17 = !{!7, !7, i64 0}
!18 = !{!8, !8, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!10, !10, i64 0}
!22 = distinct !{!22, !20}
!23 = !{!6, !11, i64 45}
!24 = !{!6, !7, i64 16}
!25 = !{!6, !7, i64 24}
!26 = !{!6, !10, i64 32}
!27 = !{!6, !7, i64 0}
!28 = !{!6, !10, i64 8}
!29 = !{i8 0, i8 2}
!30 = !{!6, !11, i64 42}
!31 = !{!6, !11, i64 43}
!32 = !{!6, !11, i64 44}
!33 = !{!34, !14, i64 24}
!34 = !{!"stat", !10, i64 0, !10, i64 8, !10, i64 16, !14, i64 24, !14, i64 28, !14, i64 32, !14, i64 36, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !35, i64 72, !35, i64 88, !35, i64 104, !8, i64 120}
!35 = !{!"timespec", !10, i64 0, !10, i64 8}
!36 = !{}
!37 = distinct !{!37, !20}


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