; LLVM IR from taichi-dev/taichi :: taichi/common (miniz)

; 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.mz_zip_archive = type { i64, i64, i32, i32, i32, i32, i64, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.mz_zip_internal_state_tag = type { %struct.mz_zip_array, %struct.mz_zip_array, %struct.mz_zip_array, i32, i32, i32, ptr, i64, ptr, i64, i64 }
%struct.mz_zip_array = type { ptr, i64, i64, i32 }

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

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @mz_zip_set_error(ptr noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @mz_zip_reader_locate_file_v2(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, ptr noundef %4) #2 {
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i32, align 4
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca ptr, align 8
  %22 = alloca i32, align 4
  store ptr %0, ptr %7, align 8, !tbaa !5
  store ptr %1, ptr %8, align 8, !tbaa !5
  store ptr %2, ptr %9, align 8, !tbaa !5
  store i32 %3, ptr %10, align 4, !tbaa !9
  store ptr %4, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  %23 = load ptr, ptr %11, align 8, !tbaa !5
  %24 = icmp ne ptr %23, null
  br i1 %24, label %25, label %27

25:                                               ; preds = %5
  %26 = load ptr, ptr %11, align 8, !tbaa !5
  store i32 0, ptr %26, align 4, !tbaa !9
  br label %27

27:                                               ; preds = %25, %5
  %28 = load ptr, ptr %7, align 8, !tbaa !5
  %29 = icmp ne ptr %28, null
  br i1 %29, label %30, label %38

30:                                               ; preds = %27
  %31 = load ptr, ptr %7, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.mz_zip_archive, ptr %31, i32 0, i32 15
  %33 = load ptr, ptr %32, align 8, !tbaa !11
  %34 = icmp ne ptr %33, null
  br i1 %34, label %35, label %38

35:                                               ; preds = %30
  %36 = load ptr, ptr %8, align 8, !tbaa !5
  %37 = icmp ne ptr %36, null
  br i1 %37, label %41, label %38

38:                                               ; preds = %35, %30, %27
  %39 = load ptr, ptr %7, align 8, !tbaa !5
  %40 = call i32 @mz_zip_set_error(ptr noundef %39, i32 noundef 24)
  store i32 %40, ptr %6, align 4
  store i32 1, ptr %15, align 4
  br label %271

41:                                               ; preds = %35
  %42 = load ptr, ptr %7, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.mz_zip_archive, ptr %42, i32 0, i32 15
  %44 = load ptr, ptr %43, align 8, !tbaa !11
  %45 = getelementptr inbounds %struct.mz_zip_internal_state_tag, ptr %44, i32 0, i32 3
  %46 = load i32, ptr %45, align 8, !tbaa !14
  %47 = and i32 %46, 2048
  %48 = icmp eq i32 %47, 0
  br i1 %48, label %49, label %74

49:                                               ; preds = %41
  %50 = load ptr, ptr %7, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.mz_zip_archive, ptr %50, i32 0, i32 3
  %52 = load i32, ptr %51, align 4, !tbaa !17
  %53 = icmp eq i32 %52, 1
  br i1 %53, label %54, label %74

54:                                               ; preds = %49
  %55 = load i32, ptr %10, align 4, !tbaa !9
  %56 = and i32 %55, 768
  %57 = icmp eq i32 %56, 0
  br i1 %57, label %58, label %74

58:                                               ; preds = %54
  %59 = load ptr, ptr %9, align 8, !tbaa !5
  %60 = icmp ne ptr %59, null
  br i1 %60, label %74, label %61

61:                                               ; preds = %58
  %62 = load ptr, ptr %7, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.mz_zip_archive, ptr %62, i32 0, i32 15
  %64 = load ptr, ptr %63, align 8, !tbaa !11
  %65 = getelementptr inbounds %struct.mz_zip_internal_state_tag, ptr %64, i32 0, i32 2
  %66 = getelementptr inbounds %struct.mz_zip_array, ptr %65, i32 0, i32 1
  %67 = load i64, ptr %66, align 8, !tbaa !18
  %68 = icmp ne i64 %67, 0
  br i1 %68, label %69, label %74

69:                                               ; preds = %61
  %70 = load ptr, ptr %7, align 8, !tbaa !5
  %71 = load ptr, ptr %8, align 8, !tbaa !5
  %72 = load ptr, ptr %11, align 8, !tbaa !5
  %73 = call i32 @mz_zip_locate_file_binary_search(ptr noundef %70, ptr noundef %71, ptr noundef %72)
  store i32 %73, ptr %6, align 4
  store i32 1, ptr %15, align 4
  br label %271

74:                                               ; preds = %61, %58, %54, %49, %41
  %75 = load ptr, ptr %8, align 8, !tbaa !5
  %76 = call i64 @strlen(ptr noundef %75) #5
  store i64 %76, ptr %13, align 8, !tbaa !19
  %77 = load i64, ptr %13, align 8, !tbaa !19
  %78 = icmp ugt i64 %77, 65535
  br i1 %78, label %79, label %82

79:                                               ; preds = %74
  %80 = load ptr, ptr %7, align 8, !tbaa !5
  %81 = call i32 @mz_zip_set_error(ptr noundef %80, i32 noundef 24)
  store i32 %81, ptr %6, align 4
  store i32 1, ptr %15, align 4
  br label %271

82:                                               ; preds = %74
  %83 = load ptr, ptr %9, align 8, !tbaa !5
  %84 = icmp ne ptr %83, null
  br i1 %84, label %85, label %88

85:                                               ; preds = %82
  %86 = load ptr, ptr %9, align 8, !tbaa !5
  %87 = call i64 @strlen(ptr noundef %86) #5
  br label %89

88:                                               ; preds = %82
  br label %89

89:                                               ; preds = %88, %85
  %90 = phi i64 [ %87, %85 ], [ 0, %88 ]
  store i64 %90, ptr %14, align 8, !tbaa !19
  %91 = load i64, ptr %14, align 8, !tbaa !19
  %92 = icmp ugt i64 %91, 65535
  br i1 %92, label %93, label %96

93:                                               ; preds = %89
  %94 = load ptr, ptr %7, align 8, !tbaa !5
  %95 = call i32 @mz_zip_set_error(ptr noundef %94, i32 noundef 24)
  store i32 %95, ptr %6, align 4
  store i32 1, ptr %15, align 4
  br label %271

96:                                               ; preds = %89
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %97

97:                                               ; preds = %265, %96
  %98 = load i32, ptr %12, align 4, !tbaa !9
  %99 = load ptr, ptr %7, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.mz_zip_archive, ptr %99, i32 0, i32 2
  %101 = load i32, ptr %100, align 8, !tbaa !20
  %102 = icmp ult i32 %98, %101
  br i1 %102, label %103, label %268

103:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  %104 = load ptr, ptr %7, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.mz_zip_archive, ptr %104, i32 0, i32 15
  %106 = load ptr, ptr %105, align 8, !tbaa !11
  %107 = getelementptr inbounds %struct.mz_zip_internal_state_tag, ptr %106, i32 0, i32 0
  %108 = getelementptr inbounds %struct.mz_zip_array, ptr %107, i32 0, i32 0
  %109 = load ptr, ptr %108, align 8, !tbaa !21
  %110 = load ptr, ptr %7, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.mz_zip_archive, ptr %110, i32 0, i32 15
  %112 = load ptr, ptr %111, align 8, !tbaa !11
  %113 = getelementptr inbounds %struct.mz_zip_internal_state_tag, ptr %112, i32 0, i32 1
  %114 = getelementptr inbounds %struct.mz_zip_array, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !22
  %116 = load i32, ptr %12, align 4, !tbaa !9
  %117 = zext i32 %116 to i64
  %118 = getelementptr inbounds i32, ptr %115, i64 %117
  %119 = load i32, ptr %118, align 4, !tbaa !9
  %120 = zext i32 %119 to i64
  %121 = getelementptr inbounds i8, ptr %109, i64 %120
  store ptr %121, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #4
  %122 = load ptr, ptr %16, align 8, !tbaa !5
  %123 = getelementptr inbounds i8, ptr %122, i64 28
  %124 = getelementptr inbounds i8, ptr %123, i64 0
  %125 = load i8, ptr %124, align 1, !tbaa !23
  %126 = zext i8 %125 to i32
  %127 = load ptr, ptr %16, align 8, !tbaa !5
  %128 = getelementptr inbounds i8, ptr %127, i64 28
  %129 = getelementptr inbounds i8, ptr %128, i64 1
  %130 = load i8, ptr %129, align 1, !tbaa !23
  %131 = zext i8 %130 to i32
  %132 = shl i32 %131, 8
  %133 = or i32 %126, %132
  store i32 %133, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %134 = load ptr, ptr %16, align 8, !tbaa !5
  %135 = getelementptr inbounds i8, ptr %134, i64 46
  store ptr %135, ptr %18, align 8, !tbaa !5
  %136 = load i32, ptr %17, align 4, !tbaa !9
  %137 = zext i32 %136 to i64
  %138 = load i64, ptr %13, align 8, !tbaa !19
  %139 = icmp ult i64 %137, %138
  br i1 %139, label %140, label %141

140:                                              ; preds = %103
  store i32 4, ptr %15, align 4
  br label %262

141:                                              ; preds = %103
  %142 = load i64, ptr %14, align 8, !tbaa !19
  %143 = icmp ne i64 %142, 0
  br i1 %143, label %144, label %192

144:                                              ; preds = %141
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  %145 = load ptr, ptr %16, align 8, !tbaa !5
  %146 = getelementptr inbounds i8, ptr %145, i64 30
  %147 = getelementptr inbounds i8, ptr %146, i64 0
  %148 = load i8, ptr %147, align 1, !tbaa !23
  %149 = zext i8 %148 to i32
  %150 = load ptr, ptr %16, align 8, !tbaa !5
  %151 = getelementptr inbounds i8, ptr %150, i64 30
  %152 = getelementptr inbounds i8, ptr %151, i64 1
  %153 = load i8, ptr %152, align 1, !tbaa !23
  %154 = zext i8 %153 to i32
  %155 = shl i32 %154, 8
  %156 = or i32 %149, %155
  store i32 %156, ptr %19, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  %157 = load ptr, ptr %16, align 8, !tbaa !5
  %158 = getelementptr inbounds i8, ptr %157, i64 32
  %159 = getelementptr inbounds i8, ptr %158, i64 0
  %160 = load i8, ptr %159, align 1, !tbaa !23
  %161 = zext i8 %160 to i32
  %162 = load ptr, ptr %16, align 8, !tbaa !5
  %163 = getelementptr inbounds i8, ptr %162, i64 32
  %164 = getelementptr inbounds i8, ptr %163, i64 1
  %165 = load i8, ptr %164, align 1, !tbaa !23
  %166 = zext i8 %165 to i32
  %167 = shl i32 %166, 8
  %168 = or i32 %161, %167
  store i32 %168, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  %169 = load ptr, ptr %18, align 8, !tbaa !5
  %170 = load i32, ptr %17, align 4, !tbaa !9
  %171 = zext i32 %170 to i64
  %172 = getelementptr inbounds i8, ptr %169, i64 %171
  %173 = load i32, ptr %19, align 4, !tbaa !9
  %174 = zext i32 %173 to i64
  %175 = getelementptr inbounds i8, ptr %172, i64 %174
  store ptr %175, ptr %21, align 8, !tbaa !5
  %176 = load i32, ptr %20, align 4, !tbaa !9
  %177 = zext i32 %176 to i64
  %178 = load i64, ptr %14, align 8, !tbaa !19
  %179 = icmp ne i64 %177, %178
  br i1 %179, label %187, label %180

180:                                              ; preds = %144
  %181 = load ptr, ptr %9, align 8, !tbaa !5
  %182 = load ptr, ptr %21, align 8, !tbaa !5
  %183 = load i32, ptr %20, align 4, !tbaa !9
  %184 = load i32, ptr %10, align 4, !tbaa !9
  %185 = call i32 @mz_zip_string_equal(ptr noundef %181, ptr noundef %182, i32 noundef %183, i32 noundef %184)
  %186 = icmp ne i32 %185, 0
  br i1 %186, label %188, label %187

187:                                              ; preds = %180, %144
  store i32 4, ptr %15, align 4
  br label %189

188:                                              ; preds = %180
  store i32 0, ptr %15, align 4
  br label %189

189:                                              ; preds = %188, %187
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  %190 = load i32, ptr %15, align 4
  switch i32 %190, label %262 [
    i32 0, label %191
  ]

191:                                              ; preds = %189
  br label %192

192:                                              ; preds = %191, %141
  %193 = load i32, ptr %10, align 4, !tbaa !9
  %194 = and i32 %193, 512
  %195 = icmp ne i32 %194, 0
  br i1 %195, label %196, label %242

196:                                              ; preds = %192
  %197 = load i32, ptr %17, align 4, !tbaa !9
  %198 = icmp ne i32 %197, 0
  br i1 %198, label %199, label %242

199:                                              ; preds = %196
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  %200 = load i32, ptr %17, align 4, !tbaa !9
  %201 = sub i32 %200, 1
  store i32 %201, ptr %22, align 4, !tbaa !9
  br label %202

202:                                              ; preds = %228, %199
  %203 = load ptr, ptr %18, align 8, !tbaa !5
  %204 = load i32, ptr %22, align 4, !tbaa !9
  %205 = sext i32 %204 to i64
  %206 = getelementptr inbounds i8, ptr %203, i64 %205
  %207 = load i8, ptr %206, align 1, !tbaa !23
  %208 = sext i8 %207 to i32
  %209 = icmp eq i32 %208, 47
  br i1 %209, label %226, label %210

210:                                              ; preds = %202
  %211 = load ptr, ptr %18, align 8, !tbaa !5
  %212 = load i32, ptr %22, align 4, !tbaa !9
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds i8, ptr %211, i64 %213
  %215 = load i8, ptr %214, align 1, !tbaa !23
  %216 = sext i8 %215 to i32
  %217 = icmp eq i32 %216, 92
  br i1 %217, label %226, label %218

218:                                              ; preds = %210
  %219 = load ptr, ptr %18, align 8, !tbaa !5
  %220 = load i32, ptr %22, align 4, !tbaa !9
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds i8, ptr %219, i64 %221
  %223 = load i8, ptr %222, align 1, !tbaa !23
  %224 = sext i8 %223 to i32
  %225 = icmp eq i32 %224, 58
  br i1 %225, label %226, label %227

226:                                              ; preds = %218, %210, %202
  br label %232

227:                                              ; preds = %218
  br label %228

228:                                              ; preds = %227
  %229 = load i32, ptr %22, align 4, !tbaa !9
  %230 = add nsw i32 %229, -1
  store i32 %230, ptr %22, align 4, !tbaa !9
  %231 = icmp sge i32 %230, 0
  br i1 %231, label %202, label %232, !llvm.loop !24

232:                                              ; preds = %228, %226
  %233 = load i32, ptr %22, align 4, !tbaa !9
  %234 = add nsw i32 %233, 1
  store i32 %234, ptr %22, align 4, !tbaa !9
  %235 = load i32, ptr %22, align 4, !tbaa !9
  %236 = load ptr, ptr %18, align 8, !tbaa !5
  %237 = sext i32 %235 to i64
  %238 = getelementptr inbounds i8, ptr %236, i64 %237
  store ptr %238, ptr %18, align 8, !tbaa !5
  %239 = load i32, ptr %22, align 4, !tbaa !9
  %240 = load i32, ptr %17, align 4, !tbaa !9
  %241 = sub i32 %240, %239
  store i32 %241, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  br label %242

242:                                              ; preds = %232, %196, %192
  %243 = load i32, ptr %17, align 4, !tbaa !9
  %244 = zext i32 %243 to i64
  %245 = load i64, ptr %13, align 8, !tbaa !19
  %246 = icmp eq i64 %244, %245
  br i1 %246, label %247, label %261

247:                                              ; preds = %242
  %248 = load ptr, ptr %8, align 8, !tbaa !5
  %249 = load ptr, ptr %18, align 8, !tbaa !5
  %250 = load i32, ptr %17, align 4, !tbaa !9
  %251 = load i32, ptr %10, align 4, !tbaa !9
  %252 = call i32 @mz_zip_string_equal(ptr noundef %248, ptr noundef %249, i32 noundef %250, i32 noundef %251)
  %253 = icmp ne i32 %252, 0
  br i1 %253, label %254, label %261

254:                                              ; preds = %247
  %255 = load ptr, ptr %11, align 8, !tbaa !5
  %256 = icmp ne ptr %255, null
  br i1 %256, label %257, label %260

257:                                              ; preds = %254
  %258 = load i32, ptr %12, align 4, !tbaa !9
  %259 = load ptr, ptr %11, align 8, !tbaa !5
  store i32 %258, ptr %259, align 4, !tbaa !9
  br label %260

260:                                              ; preds = %257, %254
  store i32 1, ptr %6, align 4
  store i32 1, ptr %15, align 4
  br label %262

261:                                              ; preds = %247, %242
  store i32 0, ptr %15, align 4
  br label %262

262:                                              ; preds = %261, %260, %189, %140
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  %263 = load i32, ptr %15, align 4
  switch i32 %263, label %271 [
    i32 0, label %264
    i32 4, label %265
  ]

264:                                              ; preds = %262
  br label %265

265:                                              ; preds = %264, %262
  %266 = load i32, ptr %12, align 4, !tbaa !9
  %267 = add i32 %266, 1
  store i32 %267, ptr %12, align 4, !tbaa !9
  br label %97, !llvm.loop !26

268:                                              ; preds = %97
  %269 = load ptr, ptr %7, align 8, !tbaa !5
  %270 = call i32 @mz_zip_set_error(ptr noundef %269, i32 noundef 28)
  store i32 %270, ptr %6, align 4
  store i32 1, ptr %15, align 4
  br label %271

271:                                              ; preds = %268, %262, %93, %79, %69, %38
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  %272 = load i32, ptr %6, align 4
  ret i32 %272
}

; Function Attrs: nounwind uwtable
declare hidden i32 @mz_zip_locate_file_binary_search(ptr noundef, ptr noundef, ptr noundef) #2

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @mz_zip_string_equal(ptr noundef, ptr noundef, i32 noundef, i32 noundef) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 104}
!12 = !{!"", !13, i64 0, !13, i64 8, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !13, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !10, i64 96}
!15 = !{!"mz_zip_internal_state_tag", !16, i64 0, !16, i64 32, !16, i64 64, !10, i64 96, !10, i64 100, !10, i64 104, !6, i64 112, !13, i64 120, !6, i64 128, !13, i64 136, !13, i64 144}
!16 = !{!"", !6, i64 0, !13, i64 8, !13, i64 16, !10, i64 24}
!17 = !{!12, !10, i64 20}
!18 = !{!15, !13, i64 72}
!19 = !{!13, !13, i64 0}
!20 = !{!12, !10, i64 16}
!21 = !{!15, !6, i64 0}
!22 = !{!15, !6, i64 32}
!23 = !{!7, !7, i64 0}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = distinct !{!26, !25}


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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @mz_zip_set_error(ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i32 @mz_zip_reader_locate_file_v2(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, ptr noundef %4) local_unnamed_addr #1 {
  %.not = icmp eq ptr %4, null
  br i1 %.not, label %7, label %6

6:                                                ; preds = %5
  store i32 0, ptr %4, align 4, !tbaa !5
  br label %7

7:                                                ; preds = %6, %5
  %.not98 = icmp eq ptr %0, null
  br i1 %.not98, label %13, label %8

8:                                                ; preds = %7
  %9 = getelementptr inbounds i8, ptr %0, i64 104
  %10 = load ptr, ptr %9, align 8, !tbaa !9
  %11 = icmp ne ptr %10, null
  %12 = icmp ne ptr %1, null
  %or.cond = and i1 %12, %11
  br i1 %or.cond, label %15, label %13

13:                                               ; preds = %8, %7
  %14 = tail call i32 @mz_zip_set_error(ptr noundef %0, i32 noundef 24)
  br label %.loopexit

15:                                               ; preds = %8
  %16 = getelementptr inbounds i8, ptr %10, i64 96
  %17 = load i32, ptr %16, align 8, !tbaa !13
  %18 = and i32 %17, 2048
  %19 = icmp eq i32 %18, 0
  br i1 %19, label %20, label %33

20:                                               ; preds = %15
  %21 = getelementptr inbounds i8, ptr %0, i64 20
  %22 = load i32, ptr %21, align 4, !tbaa !16
  %23 = icmp eq i32 %22, 1
  br i1 %23, label %24, label %33

24:                                               ; preds = %20
  %25 = and i32 %3, 768
  %26 = icmp ne i32 %25, 0
  %27 = icmp ne ptr %2, null
  %or.cond3 = or i1 %27, %26
  br i1 %or.cond3, label %33, label %28

28:                                               ; preds = %24
  %29 = getelementptr inbounds i8, ptr %10, i64 72
  %30 = load i64, ptr %29, align 8, !tbaa !17
  %.not99 = icmp eq i64 %30, 0
  br i1 %.not99, label %.thread, label %31

31:                                               ; preds = %28
  %32 = tail call i32 @mz_zip_locate_file_binary_search(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef %4)
  br label %.loopexit

33:                                               ; preds = %24, %20, %15
  %34 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %1) #3
  %35 = icmp ugt i64 %34, 65535
  br i1 %35, label %38, label %40

.thread:                                          ; preds = %28
  %36 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %1) #3
  %37 = icmp ugt i64 %36, 65535
  br i1 %37, label %38, label %.preheader115.thread

38:                                               ; preds = %.thread, %33
  %39 = tail call i32 @mz_zip_set_error(ptr noundef nonnull %0, i32 noundef 24)
  br label %.loopexit

40:                                               ; preds = %33
  %.not100 = icmp eq ptr %2, null
  br i1 %.not100, label %.preheader115.thread, label %.thread106

.thread106:                                       ; preds = %40
  %41 = tail call i64 @strlen(ptr noundef nonnull dereferenceable(1) %2) #3
  %.fr = freeze i64 %41
  %42 = icmp ugt i64 %.fr, 65535
  br i1 %42, label %180, label %.preheader115

.preheader115:                                    ; preds = %.thread106
  %43 = getelementptr inbounds i8, ptr %0, i64 16
  %44 = load i32, ptr %43, align 8, !tbaa !18
  %.not132 = icmp eq i32 %44, 0
  br i1 %.not132, label %._crit_edge, label %.lr.ph

.preheader115.thread:                             ; preds = %.thread, %40
  %.ph = phi i64 [ %36, %.thread ], [ %34, %40 ]
  %45 = getelementptr inbounds i8, ptr %0, i64 16
  %46 = load i32, ptr %45, align 8, !tbaa !18
  %.not132171 = icmp eq i32 %46, 0
  br i1 %.not132171, label %._crit_edge, label %.lr.ph.thread

.lr.ph.thread:                                    ; preds = %.preheader115.thread
  %47 = and i32 %3, 512
  %48 = icmp ne i32 %47, 0
  br label %.lr.ph.split.us.preheader

.lr.ph:                                           ; preds = %.preheader115
  %.not101 = icmp eq i64 %.fr, 0
  %49 = and i32 %3, 512
  %50 = icmp ne i32 %49, 0
  br i1 %.not101, label %.lr.ph.split.us.preheader, label %.lr.ph.split

.lr.ph.split.us.preheader:                        ; preds = %.lr.ph.thread, %.lr.ph
  %51 = phi i1 [ %48, %.lr.ph.thread ], [ %50, %.lr.ph ]
  %52 = phi i64 [ %.ph, %.lr.ph.thread ], [ %34, %.lr.ph ]
  %53 = phi ptr [ %45, %.lr.ph.thread ], [ %43, %.lr.ph ]
  %54 = phi i32 [ %46, %.lr.ph.thread ], [ %44, %.lr.ph ]
  br label %.lr.ph.split.us

.lr.ph.split.us:                                  ; preds = %.lr.ph.split.us.preheader, %.thread111.us
  %55 = phi i32 [ %54, %.lr.ph.split.us.preheader ], [ %91, %.thread111.us ]
  %indvars.iv163 = phi i64 [ 0, %.lr.ph.split.us.preheader ], [ %indvars.iv.next164, %.thread111.us ]
  %56 = load ptr, ptr %9, align 8, !tbaa !9
  %57 = load ptr, ptr %56, align 8, !tbaa !19
  %58 = getelementptr inbounds i8, ptr %56, i64 32
  %59 = load ptr, ptr %58, align 8, !tbaa !20
  %60 = getelementptr inbounds i32, ptr %59, i64 %indvars.iv163
  %61 = load i32, ptr %60, align 4, !tbaa !5
  %62 = zext i32 %61 to i64
  %63 = getelementptr inbounds i8, ptr %57, i64 %62
  %64 = getelementptr inbounds i8, ptr %63, i64 28
  %65 = load i8, ptr %64, align 1, !tbaa !21
  %66 = zext i8 %65 to i32
  %67 = getelementptr inbounds i8, ptr %63, i64 29
  %68 = load i8, ptr %67, align 1, !tbaa !21
  %69 = zext i8 %68 to i32
  %70 = shl nuw nsw i32 %69, 8
  %71 = or disjoint i32 %70, %66
  %72 = getelementptr inbounds i8, ptr %63, i64 46
  %73 = zext nneg i32 %71 to i64
  %74 = icmp ugt i64 %52, %73
  br i1 %74, label %.thread111.us, label %75

75:                                               ; preds = %.lr.ph.split.us
  %76 = icmp ne i32 %71, 0
  %or.cond5.us = and i1 %51, %76
  br i1 %or.cond5.us, label %.preheader.us, label %86

.preheader.us:                                    ; preds = %75, %80
  %indvars.iv159 = phi i64 [ %indvars.iv.next160, %80 ], [ %73, %75 ]
  %indvars.iv.next160 = add nsw i64 %indvars.iv159, -1
  %77 = and i64 %indvars.iv.next160, 4294967295
  %78 = getelementptr inbounds i8, ptr %72, i64 %77
  %79 = load i8, ptr %78, align 1, !tbaa !21
  switch i8 %79, label %80 [
    i8 47, label %.split.loop.exit192
    i8 92, label %.split.loop.exit192
    i8 58, label %.split.loop.exit192
  ]

80:                                               ; preds = %.preheader.us
  %81 = icmp ugt i64 %indvars.iv159, 1
  br i1 %81, label %.preheader.us, label %.split.loop.exit191, !llvm.loop !22

.split.loop.exit192:                              ; preds = %.preheader.us, %.preheader.us, %.preheader.us
  %82 = trunc nuw i64 %indvars.iv159 to i32
  br label %.split.loop.exit191

.split.loop.exit191:                              ; preds = %80, %.split.loop.exit192
  %.1.us = phi i32 [ %82, %.split.loop.exit192 ], [ 0, %80 ]
  %83 = zext nneg i32 %.1.us to i64
  %84 = getelementptr inbounds i8, ptr %72, i64 %83
  %85 = sub nsw i32 %71, %.1.us
  %.pre167 = zext i32 %85 to i64
  br label %86

86:                                               ; preds = %.split.loop.exit191, %75
  %.pre-phi = phi i64 [ %.pre167, %.split.loop.exit191 ], [ %73, %75 ]
  %.084.us = phi i32 [ %85, %.split.loop.exit191 ], [ %71, %75 ]
  %.083.us = phi ptr [ %84, %.split.loop.exit191 ], [ %72, %75 ]
  %87 = icmp eq i64 %52, %.pre-phi
  br i1 %87, label %88, label %.thread111.us

88:                                               ; preds = %86
  %89 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %1, ptr noundef nonnull %.083.us, i32 noundef %.084.us, i32 noundef %3)
  %.not104.us = icmp eq i32 %89, 0
  %brmerge.us = or i1 %.not, %.not104.us
  br i1 %brmerge.us, label %90, label %.thread113

90:                                               ; preds = %88
  br i1 %.not104.us, label %..thread111.us_crit_edge, label %.loopexit

..thread111.us_crit_edge:                         ; preds = %90
  %.pre = load i32, ptr %53, align 8, !tbaa !18
  br label %.thread111.us

.thread111.us:                                    ; preds = %..thread111.us_crit_edge, %86, %.lr.ph.split.us
  %91 = phi i32 [ %.pre, %..thread111.us_crit_edge ], [ %55, %86 ], [ %55, %.lr.ph.split.us ]
  %indvars.iv.next164 = add nuw nsw i64 %indvars.iv163, 1
  %92 = zext i32 %91 to i64
  %93 = icmp ult i64 %indvars.iv.next164, %92
  br i1 %93, label %.lr.ph.split.us, label %._crit_edge, !llvm.loop !24

.lr.ph.split:                                     ; preds = %.lr.ph
  br i1 %50, label %.lr.ph.split.split, label %.lr.ph.split.split.us

.lr.ph.split.split.us:                            ; preds = %.lr.ph.split
  br i1 %.not, label %.lr.ph.split.split.us.split.us, label %.lr.ph.split.split.us.split

.lr.ph.split.split.us.split.us:                   ; preds = %.lr.ph.split.split.us, %.thread111.us129.us
  %indvars.iv149 = phi i64 [ %indvars.iv.next150, %.thread111.us129.us ], [ 0, %.lr.ph.split.split.us ]
  %94 = load ptr, ptr %9, align 8, !tbaa !9
  %95 = load ptr, ptr %94, align 8, !tbaa !19
  %96 = getelementptr inbounds i8, ptr %94, i64 32
  %97 = load ptr, ptr %96, align 8, !tbaa !20
  %98 = getelementptr inbounds i32, ptr %97, i64 %indvars.iv149
  %99 = load i32, ptr %98, align 4, !tbaa !5
  %100 = zext i32 %99 to i64
  %101 = getelementptr inbounds i8, ptr %95, i64 %100
  %102 = getelementptr inbounds i8, ptr %101, i64 28
  %103 = load i8, ptr %102, align 1, !tbaa !21
  %104 = zext i8 %103 to i32
  %105 = getelementptr inbounds i8, ptr %101, i64 29
  %106 = load i8, ptr %105, align 1, !tbaa !21
  %107 = zext i8 %106 to i32
  %108 = shl nuw nsw i32 %107, 8
  %109 = or disjoint i32 %108, %104
  %110 = getelementptr inbounds i8, ptr %101, i64 46
  %111 = zext nneg i32 %109 to i64
  %112 = icmp ugt i64 %34, %111
  br i1 %112, label %.thread111.us129.us, label %113

113:                                              ; preds = %.lr.ph.split.split.us.split.us
  %114 = getelementptr inbounds i8, ptr %101, i64 32
  %115 = load i8, ptr %114, align 1, !tbaa !21
  %116 = zext i8 %115 to i32
  %117 = getelementptr inbounds i8, ptr %101, i64 33
  %118 = load i8, ptr %117, align 1, !tbaa !21
  %119 = zext i8 %118 to i32
  %120 = shl nuw nsw i32 %119, 8
  %121 = or disjoint i32 %120, %116
  %122 = zext nneg i32 %121 to i64
  %.not102.us.us = icmp eq i64 %.fr, %122
  br i1 %.not102.us.us, label %123, label %.thread111.us129.us

123:                                              ; preds = %113
  %124 = getelementptr inbounds i8, ptr %110, i64 %111
  %125 = getelementptr i8, ptr %101, i64 30
  %126 = load i16, ptr %125, align 1
  %127 = zext i16 %126 to i64
  %128 = getelementptr inbounds i8, ptr %124, i64 %127
  %129 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %2, ptr noundef nonnull %128, i32 noundef %121, i32 noundef %3)
  %.not103.not.us.us = icmp eq i32 %129, 0
  br i1 %.not103.not.us.us, label %134, label %130

130:                                              ; preds = %123
  %131 = icmp eq i64 %34, %111
  br i1 %131, label %132, label %.thread111.us129.us

132:                                              ; preds = %130
  %133 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %1, ptr noundef nonnull %110, i32 noundef %109, i32 noundef %3)
  %.not104.us124.us = icmp ne i32 %133, 0
  %.mux.us127.us = zext i1 %.not104.us124.us to i32
  br label %134

134:                                              ; preds = %132, %123
  %.182.us128.us = phi i32 [ 4, %123 ], [ %.mux.us127.us, %132 ]
  switch i32 %.182.us128.us, label %.loopexit [
    i32 0, label %.thread111.us129.us
    i32 4, label %.thread111.us129.us
  ]

.thread111.us129.us:                              ; preds = %134, %134, %130, %113, %.lr.ph.split.split.us.split.us
  %indvars.iv.next150 = add nuw nsw i64 %indvars.iv149, 1
  %135 = load i32, ptr %43, align 8, !tbaa !18
  %136 = zext i32 %135 to i64
  %137 = icmp ult i64 %indvars.iv.next150, %136
  br i1 %137, label %.lr.ph.split.split.us.split.us, label %._crit_edge, !llvm.loop !24

.lr.ph.split.split.us.split:                      ; preds = %.lr.ph.split.split.us, %.thread111.us129
  %indvars.iv = phi i64 [ %indvars.iv.next, %.thread111.us129 ], [ 0, %.lr.ph.split.split.us ]
  %138 = load ptr, ptr %9, align 8, !tbaa !9
  %139 = load ptr, ptr %138, align 8, !tbaa !19
  %140 = getelementptr inbounds i8, ptr %138, i64 32
  %141 = load ptr, ptr %140, align 8, !tbaa !20
  %142 = getelementptr inbounds i32, ptr %141, i64 %indvars.iv
  %143 = load i32, ptr %142, align 4, !tbaa !5
  %144 = zext i32 %143 to i64
  %145 = getelementptr inbounds i8, ptr %139, i64 %144
  %146 = getelementptr inbounds i8, ptr %145, i64 28
  %147 = load i8, ptr %146, align 1, !tbaa !21
  %148 = zext i8 %147 to i32
  %149 = getelementptr inbounds i8, ptr %145, i64 29
  %150 = load i8, ptr %149, align 1, !tbaa !21
  %151 = zext i8 %150 to i32
  %152 = shl nuw nsw i32 %151, 8
  %153 = or disjoint i32 %152, %148
  %154 = getelementptr inbounds i8, ptr %145, i64 46
  %155 = zext nneg i32 %153 to i64
  %156 = icmp ugt i64 %34, %155
  br i1 %156, label %.thread111.us129, label %157

157:                                              ; preds = %.lr.ph.split.split.us.split
  %158 = getelementptr inbounds i8, ptr %145, i64 32
  %159 = load i8, ptr %158, align 1, !tbaa !21
  %160 = zext i8 %159 to i32
  %161 = getelementptr inbounds i8, ptr %145, i64 33
  %162 = load i8, ptr %161, align 1, !tbaa !21
  %163 = zext i8 %162 to i32
  %164 = shl nuw nsw i32 %163, 8
  %165 = or disjoint i32 %164, %160
  %166 = zext nneg i32 %165 to i64
  %.not102.us = icmp eq i64 %.fr, %166
  br i1 %.not102.us, label %167, label %.thread111.us129

167:                                              ; preds = %157
  %168 = getelementptr inbounds i8, ptr %154, i64 %155
  %169 = getelementptr i8, ptr %145, i64 30
  %170 = load i16, ptr %169, align 1
  %171 = zext i16 %170 to i64
  %172 = getelementptr inbounds i8, ptr %168, i64 %171
  %173 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %2, ptr noundef nonnull %172, i32 noundef %165, i32 noundef %3)
  %.not103.not.us = icmp ne i32 %173, 0
  %174 = icmp eq i64 %34, %155
  %or.cond194 = and i1 %.not103.not.us, %174
  br i1 %or.cond194, label %175, label %.thread111.us129

175:                                              ; preds = %167
  %176 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %1, ptr noundef nonnull %154, i32 noundef %153, i32 noundef %3)
  %.not104.us124.not = icmp eq i32 %176, 0
  br i1 %.not104.us124.not, label %.thread111.us129, label %.thread113

.thread111.us129:                                 ; preds = %167, %175, %157, %.lr.ph.split.split.us.split
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %177 = load i32, ptr %43, align 8, !tbaa !18
  %178 = zext i32 %177 to i64
  %179 = icmp ult i64 %indvars.iv.next, %178
  br i1 %179, label %.lr.ph.split.split.us.split, label %._crit_edge, !llvm.loop !24

180:                                              ; preds = %.thread106
  %181 = tail call i32 @mz_zip_set_error(ptr noundef nonnull %0, i32 noundef 24)
  br label %.loopexit

.lr.ph.split.split:                               ; preds = %.lr.ph.split, %.thread111
  %indvars.iv155 = phi i64 [ %indvars.iv.next156, %.thread111 ], [ 0, %.lr.ph.split ]
  %182 = load ptr, ptr %9, align 8, !tbaa !9
  %183 = load ptr, ptr %182, align 8, !tbaa !19
  %184 = getelementptr inbounds i8, ptr %182, i64 32
  %185 = load ptr, ptr %184, align 8, !tbaa !20
  %186 = getelementptr inbounds i32, ptr %185, i64 %indvars.iv155
  %187 = load i32, ptr %186, align 4, !tbaa !5
  %188 = zext i32 %187 to i64
  %189 = getelementptr inbounds i8, ptr %183, i64 %188
  %190 = getelementptr inbounds i8, ptr %189, i64 28
  %191 = load i8, ptr %190, align 1, !tbaa !21
  %192 = zext i8 %191 to i32
  %193 = getelementptr inbounds i8, ptr %189, i64 29
  %194 = load i8, ptr %193, align 1, !tbaa !21
  %195 = zext i8 %194 to i32
  %196 = shl nuw nsw i32 %195, 8
  %197 = or disjoint i32 %196, %192
  %198 = getelementptr inbounds i8, ptr %189, i64 46
  %199 = zext nneg i32 %197 to i64
  %200 = icmp ugt i64 %34, %199
  br i1 %200, label %.thread111, label %201

201:                                              ; preds = %.lr.ph.split.split
  %202 = getelementptr inbounds i8, ptr %189, i64 32
  %203 = load i8, ptr %202, align 1, !tbaa !21
  %204 = zext i8 %203 to i32
  %205 = getelementptr inbounds i8, ptr %189, i64 33
  %206 = load i8, ptr %205, align 1, !tbaa !21
  %207 = zext i8 %206 to i32
  %208 = shl nuw nsw i32 %207, 8
  %209 = or disjoint i32 %208, %204
  %210 = zext nneg i32 %209 to i64
  %.not102 = icmp eq i64 %.fr, %210
  br i1 %.not102, label %211, label %.thread111

211:                                              ; preds = %201
  %212 = getelementptr inbounds i8, ptr %198, i64 %199
  %213 = getelementptr i8, ptr %189, i64 30
  %214 = load i16, ptr %213, align 1
  %215 = zext i16 %214 to i64
  %216 = getelementptr inbounds i8, ptr %212, i64 %215
  %217 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %2, ptr noundef nonnull %216, i32 noundef %209, i32 noundef %3)
  %.not103.not = icmp eq i32 %217, 0
  br i1 %.not103.not, label %233, label %218

218:                                              ; preds = %211
  %.not133 = icmp eq i32 %197, 0
  br i1 %.not133, label %228, label %.preheader

.preheader:                                       ; preds = %218, %222
  %indvars.iv152 = phi i64 [ %indvars.iv.next153, %222 ], [ %199, %218 ]
  %indvars.iv.next153 = add nsw i64 %indvars.iv152, -1
  %219 = and i64 %indvars.iv.next153, 4294967295
  %220 = getelementptr inbounds i8, ptr %198, i64 %219
  %221 = load i8, ptr %220, align 1, !tbaa !21
  switch i8 %221, label %222 [
    i8 47, label %.split.loop.exit
    i8 92, label %.split.loop.exit
    i8 58, label %.split.loop.exit
  ]

222:                                              ; preds = %.preheader
  %223 = icmp ugt i64 %indvars.iv152, 1
  br i1 %223, label %.preheader, label %.split.loop.exit189, !llvm.loop !22

.split.loop.exit:                                 ; preds = %.preheader, %.preheader, %.preheader
  %224 = trunc nuw i64 %indvars.iv152 to i32
  br label %.split.loop.exit189

.split.loop.exit189:                              ; preds = %222, %.split.loop.exit
  %.1 = phi i32 [ %224, %.split.loop.exit ], [ 0, %222 ]
  %225 = zext nneg i32 %.1 to i64
  %226 = getelementptr inbounds i8, ptr %198, i64 %225
  %227 = sub nsw i32 %197, %.1
  br label %228

228:                                              ; preds = %.split.loop.exit189, %218
  %.084 = phi i32 [ %227, %.split.loop.exit189 ], [ 0, %218 ]
  %.083 = phi ptr [ %226, %.split.loop.exit189 ], [ %198, %218 ]
  %229 = zext i32 %.084 to i64
  %230 = icmp eq i64 %34, %229
  br i1 %230, label %231, label %.thread111

231:                                              ; preds = %228
  %232 = tail call i32 @mz_zip_string_equal(ptr noundef nonnull %1, ptr noundef nonnull %.083, i32 noundef %.084, i32 noundef %3)
  %.not104 = icmp eq i32 %232, 0
  %brmerge = or i1 %.not, %.not104
  %not..not104 = xor i1 %.not104, true
  %.mux = zext i1 %not..not104 to i32
  br i1 %brmerge, label %233, label %.thread113

.thread113:                                       ; preds = %175, %231, %88
  %.us-phi.in = phi i64 [ %indvars.iv163, %88 ], [ %indvars.iv155, %231 ], [ %indvars.iv, %175 ]
  %.us-phi = trunc i64 %.us-phi.in to i32
  store i32 %.us-phi, ptr %4, align 4, !tbaa !5
  br label %.loopexit

233:                                              ; preds = %231, %211
  %.182 = phi i32 [ 4, %211 ], [ %.mux, %231 ]
  switch i32 %.182, label %.loopexit [
    i32 0, label %.thread111
    i32 4, label %.thread111
  ]

.thread111:                                       ; preds = %201, %228, %.lr.ph.split.split, %233, %233
  %indvars.iv.next156 = add nuw nsw i64 %indvars.iv155, 1
  %234 = load i32, ptr %43, align 8, !tbaa !18
  %235 = zext i32 %234 to i64
  %236 = icmp ult i64 %indvars.iv.next156, %235
  br i1 %236, label %.lr.ph.split.split, label %._crit_edge, !llvm.loop !24

._crit_edge:                                      ; preds = %.thread111.us129, %.thread111.us129.us, %.thread111, %.thread111.us, %.preheader115.thread, %.preheader115
  %237 = tail call i32 @mz_zip_set_error(ptr noundef nonnull %0, i32 noundef 28)
  br label %.loopexit

.loopexit:                                        ; preds = %134, %233, %90, %.thread113, %._crit_edge, %180, %38, %31, %13
  %.2 = phi i32 [ %39, %38 ], [ %181, %180 ], [ %237, %._crit_edge ], [ %32, %31 ], [ %14, %13 ], [ 1, %.thread113 ], [ 1, %90 ], [ 1, %233 ], [ 1, %134 ]
  ret i32 %.2
}

; Function Attrs: nounwind uwtable
declare hidden i32 @mz_zip_locate_file_binary_search(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @mz_zip_string_equal(ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #0

attributes #0 = { alwaysinline 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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nofree nounwind willreturn 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 #3 = { 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, !12, i64 104}
!10 = !{!"", !11, i64 0, !11, i64 8, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !11, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104}
!11 = !{!"long", !7, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!14, !6, i64 96}
!14 = !{!"mz_zip_internal_state_tag", !15, i64 0, !15, i64 32, !15, i64 64, !6, i64 96, !6, i64 100, !6, i64 104, !12, i64 112, !11, i64 120, !12, i64 128, !11, i64 136, !11, i64 144}
!15 = !{!"", !12, i64 0, !11, i64 8, !11, i64 16, !6, i64 24}
!16 = !{!10, !6, i64 20}
!17 = !{!14, !11, i64 72}
!18 = !{!10, !6, i64 16}
!19 = !{!14, !12, i64 0}
!20 = !{!14, !12, i64 32}
!21 = !{!7, !7, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = distinct !{!24, !23}


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