; LLVM IR from mncoppola/rpef :: utilities_src/squashfs2.1/squashfs-2.1-r2 (read_fs)

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

%union.squashfs_inode_header = type { %struct.squashfs_reg_inode_header }
%struct.squashfs_reg_inode_header = type { i32, i32, i32, i32, i32, i32, [0 x i16] }
%struct.squashfs_super_block = type <{ i32, i32, i32, i32, i32, i32, i32, i64, i16, i8, i32, i64, i32, i32, i32 }>
%struct.squashfs_dir_inode_header = type <{ i64, i32, [3 x i8] }>
%struct.squashfs_ldir_inode_header = type <{ i32, [5 x i8], i32, [3 x i8], i16, [0 x %struct.squashfs_dir_index] }>
%struct.squashfs_dir_index = type { [7 x i8], i8, [0 x i8] }

@swap = external dso_local global i32, align 4
@stderr = external global ptr, align 8
@.str.27 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [80 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [50 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

declare void @read_bytes(i32 noundef, i32 noundef, i32 noundef, ptr noundef) #1

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

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

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

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

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

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

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #6

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #6

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @read_filesystem(ptr noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8, ptr noundef %9, ptr noundef %10, ptr noundef %11, ptr noundef %12, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17, ptr noundef %18, ptr noundef %19, ptr noundef %20, ptr noundef %21, ptr noundef %22, ptr noundef %23, ptr noundef %24, ptr noundef %25, ptr noundef %26) #3 {
  %28 = alloca i32, align 4
  %29 = alloca ptr, align 8
  %30 = alloca i32, align 4
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca ptr, align 8
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca ptr, align 8
  %45 = alloca ptr, align 8
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca ptr, align 8
  %55 = alloca ptr, align 8
  %56 = alloca ptr, align 8
  %57 = alloca ptr, align 8
  %58 = alloca i32, align 4
  %59 = alloca i32, align 4
  %60 = alloca i32, align 4
  %61 = alloca i32, align 4
  %62 = alloca i32, align 4
  %63 = alloca i32, align 4
  %64 = alloca %union.squashfs_inode_header, align 1
  %65 = alloca ptr, align 8
  %66 = alloca i64, align 8
  %67 = alloca i32, align 4
  %68 = alloca i32, align 4
  %69 = alloca i32, align 4
  %70 = alloca i32, align 4
  %71 = alloca i64, align 8
  %72 = alloca ptr, align 8
  %73 = alloca ptr, align 8
  %74 = alloca ptr, align 8
  %75 = alloca i64, align 8
  %76 = alloca i32, align 4
  %77 = alloca i32, align 4
  %78 = alloca i32, align 4
  %79 = alloca i32, align 4
  %80 = alloca i64, align 8
  %81 = alloca ptr, align 8
  %82 = alloca ptr, align 8
  %83 = alloca i32, align 4
  store ptr %0, ptr %29, align 8, !tbaa !5
  store i32 %1, ptr %30, align 4, !tbaa !9
  store ptr %2, ptr %31, align 8, !tbaa !5
  store ptr %3, ptr %32, align 8, !tbaa !5
  store ptr %4, ptr %33, align 8, !tbaa !5
  store ptr %5, ptr %34, align 8, !tbaa !5
  store ptr %6, ptr %35, align 8, !tbaa !5
  store ptr %7, ptr %36, align 8, !tbaa !5
  store ptr %8, ptr %37, align 8, !tbaa !5
  store ptr %9, ptr %38, align 8, !tbaa !5
  store ptr %10, ptr %39, align 8, !tbaa !5
  store ptr %11, ptr %40, align 8, !tbaa !5
  store ptr %12, ptr %41, align 8, !tbaa !5
  store ptr %13, ptr %42, align 8, !tbaa !5
  store ptr %14, ptr %43, align 8, !tbaa !5
  store ptr %15, ptr %44, align 8, !tbaa !5
  store ptr %16, ptr %45, align 8, !tbaa !5
  store ptr %17, ptr %46, align 8, !tbaa !5
  store ptr %18, ptr %47, align 8, !tbaa !5
  store ptr %19, ptr %48, align 8, !tbaa !5
  store ptr %20, ptr %49, align 8, !tbaa !5
  store ptr %21, ptr %50, align 8, !tbaa !5
  store ptr %22, ptr %51, align 8, !tbaa !5
  store ptr %23, ptr %52, align 8, !tbaa !5
  store ptr %24, ptr %53, align 8, !tbaa !5
  store ptr %25, ptr %54, align 8, !tbaa !5
  store ptr %26, ptr %55, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #8
  store ptr null, ptr %56, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #8
  %84 = load ptr, ptr %31, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.squashfs_super_block, ptr %84, i32 0, i32 5
  %86 = load i32, ptr %85, align 1, !tbaa !11
  store i32 %86, ptr %58, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #8
  %87 = load ptr, ptr %31, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.squashfs_super_block, ptr %87, i32 0, i32 6
  %89 = load i32, ptr %88, align 1, !tbaa !14
  store i32 %89, ptr %59, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #8
  %90 = load i32, ptr %58, align 4, !tbaa !9
  %91 = load ptr, ptr %31, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.squashfs_super_block, ptr %91, i32 0, i32 11
  %93 = load i64, ptr %92, align 1, !tbaa !15
  %94 = ashr i64 %93, 16
  %95 = trunc i64 %94 to i32
  %96 = add i32 %90, %95
  store i32 %96, ptr %60, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #8
  %97 = load ptr, ptr %31, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.squashfs_super_block, ptr %97, i32 0, i32 11
  %99 = load i64, ptr %98, align 1, !tbaa !15
  %100 = and i64 %99, 65535
  %101 = trunc i64 %100 to i32
  store i32 %101, ptr %61, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #8
  call void @llvm.lifetime.start.p0(i64 24, ptr %64) #8
  %102 = call i32 (ptr, ...) @printf(ptr noundef @.str.27)
  %103 = load i32, ptr %30, align 4, !tbaa !9
  %104 = load ptr, ptr %31, align 8, !tbaa !5
  %105 = load ptr, ptr %55, align 8, !tbaa !5
  %106 = call i32 @read_fragment_table(i32 noundef %103, ptr noundef %104, ptr noundef %105)
  %107 = icmp eq i32 %106, 0
  br i1 %107, label %108, label %109

108:                                              ; preds = %27
  br label %500

109:                                              ; preds = %27
  %110 = load i32, ptr %30, align 4, !tbaa !9
  %111 = load i32, ptr %58, align 4, !tbaa !9
  %112 = load i32, ptr %59, align 4, !tbaa !9
  %113 = load i32, ptr %60, align 4, !tbaa !9
  %114 = load i32, ptr %61, align 4, !tbaa !9
  %115 = load ptr, ptr %31, align 8, !tbaa !5
  %116 = load ptr, ptr %39, align 8, !tbaa !5
  %117 = load ptr, ptr %51, align 8, !tbaa !5
  %118 = load ptr, ptr %53, align 8, !tbaa !5
  %119 = load ptr, ptr %41, align 8, !tbaa !5
  %120 = load ptr, ptr %42, align 8, !tbaa !5
  %121 = load ptr, ptr %43, align 8, !tbaa !5
  %122 = load ptr, ptr %44, align 8, !tbaa !5
  %123 = load ptr, ptr %45, align 8, !tbaa !5
  %124 = load ptr, ptr %46, align 8, !tbaa !5
  %125 = call i32 @scan_inode_table(i32 noundef %110, i32 noundef %111, i32 noundef %112, i32 noundef %113, i32 noundef %114, ptr noundef %115, ptr noundef %64, ptr noundef %56, ptr noundef %62, ptr noundef %116, ptr noundef %117, ptr noundef %118, ptr noundef %119, ptr noundef %120, ptr noundef %121, ptr noundef %122, ptr noundef %123, ptr noundef %124)
  store i32 %125, ptr %63, align 4, !tbaa !9
  %126 = icmp eq i32 %125, 0
  br i1 %126, label %127, label %130

127:                                              ; preds = %109
  %128 = load ptr, ptr @stderr, align 8, !tbaa !5
  %129 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %128, ptr noundef @.str.28) #8
  br label %500

130:                                              ; preds = %109
  %131 = load i32, ptr %62, align 4, !tbaa !9
  %132 = load ptr, ptr %52, align 8, !tbaa !5
  store i32 %131, ptr %132, align 4, !tbaa !9
  %133 = load i32, ptr %63, align 4, !tbaa !9
  %134 = call i32 (ptr, ...) @printf(ptr noundef @.str.29, i32 noundef %133)
  %135 = load i32, ptr %64, align 1
  %136 = and i32 %135, 15
  %137 = icmp eq i32 %136, 1
  br i1 %137, label %142, label %138

138:                                              ; preds = %130
  %139 = load i32, ptr %64, align 1
  %140 = and i32 %139, 15
  %141 = icmp eq i32 %140, 8
  br i1 %141, label %142, label %499

142:                                              ; preds = %138, %130
  %143 = load i32, ptr %64, align 1
  %144 = and i32 %143, 15
  %145 = icmp eq i32 %144, 1
  br i1 %145, label %146, label %160

146:                                              ; preds = %142
  %147 = getelementptr inbounds %struct.squashfs_dir_inode_header, ptr %64, i32 0, i32 2
  %148 = load i24, ptr %147, align 1
  %149 = zext i24 %148 to i32
  %150 = load ptr, ptr %40, align 8, !tbaa !5
  store i32 %149, ptr %150, align 4, !tbaa !9
  %151 = load i64, ptr %64, align 1
  %152 = lshr i64 %151, 51
  %153 = trunc i64 %152 to i32
  %154 = load ptr, ptr %37, align 8, !tbaa !5
  store i32 %153, ptr %154, align 4, !tbaa !9
  %155 = load i64, ptr %64, align 1
  %156 = lshr i64 %155, 32
  %157 = and i64 %156, 524287
  %158 = trunc i64 %157 to i32
  %159 = load ptr, ptr %38, align 8, !tbaa !5
  store i32 %158, ptr %159, align 4, !tbaa !9
  br label %175

160:                                              ; preds = %142
  %161 = getelementptr inbounds %struct.squashfs_ldir_inode_header, ptr %64, i32 0, i32 3
  %162 = load i24, ptr %161, align 1
  %163 = zext i24 %162 to i32
  %164 = load ptr, ptr %40, align 8, !tbaa !5
  store i32 %163, ptr %164, align 4, !tbaa !9
  %165 = getelementptr inbounds %struct.squashfs_ldir_inode_header, ptr %64, i32 0, i32 1
  %166 = load i40, ptr %165, align 1
  %167 = lshr i40 %166, 27
  %168 = trunc i40 %167 to i32
  %169 = load ptr, ptr %37, align 8, !tbaa !5
  store i32 %168, ptr %169, align 4, !tbaa !9
  %170 = getelementptr inbounds %struct.squashfs_ldir_inode_header, ptr %64, i32 0, i32 1
  %171 = load i40, ptr %170, align 1
  %172 = and i40 %171, 134217727
  %173 = trunc i40 %172 to i32
  %174 = load ptr, ptr %38, align 8, !tbaa !5
  store i32 %173, ptr %174, align 4, !tbaa !9
  br label %175

175:                                              ; preds = %160, %146
  %176 = load i32, ptr %30, align 4, !tbaa !9
  %177 = load ptr, ptr %29, align 8, !tbaa !5
  %178 = icmp ne ptr %177, null
  %179 = xor i1 %178, true
  %180 = zext i1 %179 to i32
  %181 = load ptr, ptr %31, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.squashfs_super_block, ptr %181, i32 0, i32 6
  %183 = load i32, ptr %182, align 1, !tbaa !14
  %184 = load ptr, ptr %40, align 8, !tbaa !5
  %185 = load i32, ptr %184, align 4, !tbaa !9
  %186 = add i32 %183, %185
  %187 = load ptr, ptr %37, align 8, !tbaa !5
  %188 = load i32, ptr %187, align 4, !tbaa !9
  %189 = load ptr, ptr %38, align 8, !tbaa !5
  %190 = load i32, ptr %189, align 4, !tbaa !9
  %191 = load ptr, ptr %36, align 8, !tbaa !5
  %192 = load ptr, ptr %31, align 8, !tbaa !5
  %193 = load ptr, ptr %54, align 8, !tbaa !5
  %194 = call ptr @squashfs_readdir(i32 noundef %176, i32 noundef %180, i32 noundef %186, i32 noundef %188, i32 noundef %190, ptr noundef %191, ptr noundef %192, ptr noundef %193)
  store ptr %194, ptr %57, align 8, !tbaa !5
  %195 = icmp eq ptr %194, null
  br i1 %195, label %196, label %199

196:                                              ; preds = %175
  %197 = load ptr, ptr @stderr, align 8, !tbaa !5
  %198 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %197, ptr noundef @.str.30) #8
  br label %500

199:                                              ; preds = %175
  %200 = load i32, ptr %58, align 4, !tbaa !9
  %201 = load i32, ptr %60, align 4, !tbaa !9
  %202 = sub i32 %201, %200
  store i32 %202, ptr %60, align 4, !tbaa !9
  %203 = load i32, ptr %60, align 4, !tbaa !9
  %204 = zext i32 %203 to i64
  %205 = call noalias ptr @malloc(i64 noundef %204) #9
  %206 = load ptr, ptr %32, align 8, !tbaa !5
  store ptr %205, ptr %206, align 8, !tbaa !5
  %207 = icmp eq ptr %205, null
  br i1 %207, label %208, label %211

208:                                              ; preds = %199
  %209 = load ptr, ptr @stderr, align 8, !tbaa !5
  %210 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %209, ptr noundef @.str.31) #8
  br label %500

211:                                              ; preds = %199
  %212 = load i32, ptr %30, align 4, !tbaa !9
  %213 = load i32, ptr %58, align 4, !tbaa !9
  %214 = load i32, ptr %60, align 4, !tbaa !9
  %215 = load ptr, ptr %32, align 8, !tbaa !5
  %216 = load ptr, ptr %215, align 8, !tbaa !5
  call void @read_bytes(i32 noundef %212, i32 noundef %213, i32 noundef %214, ptr noundef %216)
  %217 = load ptr, ptr %31, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.squashfs_super_block, ptr %217, i32 0, i32 6
  %219 = load i32, ptr %218, align 1, !tbaa !14
  %220 = load ptr, ptr %36, align 8, !tbaa !5
  %221 = load i32, ptr %220, align 4, !tbaa !9
  %222 = sub i32 %221, %219
  store i32 %222, ptr %220, align 4, !tbaa !9
  %223 = load ptr, ptr %36, align 8, !tbaa !5
  %224 = load i32, ptr %223, align 4, !tbaa !9
  %225 = zext i32 %224 to i64
  %226 = call noalias ptr @malloc(i64 noundef %225) #9
  %227 = load ptr, ptr %34, align 8, !tbaa !5
  store ptr %226, ptr %227, align 8, !tbaa !5
  %228 = icmp eq ptr %226, null
  br i1 %228, label %229, label %232

229:                                              ; preds = %211
  %230 = load ptr, ptr @stderr, align 8, !tbaa !5
  %231 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %230, ptr noundef @.str.32) #8
  br label %500

232:                                              ; preds = %211
  %233 = load i32, ptr %30, align 4, !tbaa !9
  %234 = load ptr, ptr %31, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.squashfs_super_block, ptr %234, i32 0, i32 6
  %236 = load i32, ptr %235, align 1, !tbaa !14
  %237 = load ptr, ptr %36, align 8, !tbaa !5
  %238 = load i32, ptr %237, align 4, !tbaa !9
  %239 = load ptr, ptr %34, align 8, !tbaa !5
  %240 = load ptr, ptr %239, align 8, !tbaa !5
  call void @read_bytes(i32 noundef %233, i32 noundef %236, i32 noundef %238, ptr noundef %240)
  %241 = load i32, ptr %61, align 4, !tbaa !9
  %242 = load ptr, ptr %39, align 8, !tbaa !5
  %243 = load i32, ptr %242, align 4, !tbaa !9
  %244 = add i32 %241, %243
  %245 = zext i32 %244 to i64
  %246 = call noalias ptr @malloc(i64 noundef %245) #9
  %247 = load ptr, ptr %33, align 8, !tbaa !5
  store ptr %246, ptr %247, align 8, !tbaa !5
  %248 = icmp eq ptr %246, null
  br i1 %248, label %249, label %252

249:                                              ; preds = %232
  %250 = load ptr, ptr @stderr, align 8, !tbaa !5
  %251 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %250, ptr noundef @.str.33) #8
  br label %500

252:                                              ; preds = %232
  %253 = load ptr, ptr %33, align 8, !tbaa !5
  %254 = load ptr, ptr %253, align 8, !tbaa !5
  %255 = load ptr, ptr %56, align 8, !tbaa !5
  %256 = load i32, ptr %62, align 4, !tbaa !9
  %257 = zext i32 %256 to i64
  %258 = getelementptr inbounds i8, ptr %255, i64 %257
  %259 = load i32, ptr %61, align 4, !tbaa !9
  %260 = load ptr, ptr %39, align 8, !tbaa !5
  %261 = load i32, ptr %260, align 4, !tbaa !9
  %262 = add i32 %259, %261
  %263 = zext i32 %262 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %254, ptr align 1 %258, i64 %263, i1 false)
  %264 = load ptr, ptr %37, align 8, !tbaa !5
  %265 = load i32, ptr %264, align 4, !tbaa !9
  %266 = load ptr, ptr %38, align 8, !tbaa !5
  %267 = load i32, ptr %266, align 4, !tbaa !9
  %268 = add i32 %265, %267
  %269 = zext i32 %268 to i64
  %270 = call noalias ptr @malloc(i64 noundef %269) #9
  %271 = load ptr, ptr %35, align 8, !tbaa !5
  store ptr %270, ptr %271, align 8, !tbaa !5
  %272 = icmp eq ptr %270, null
  br i1 %272, label %273, label %276

273:                                              ; preds = %252
  %274 = load ptr, ptr @stderr, align 8, !tbaa !5
  %275 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %274, ptr noundef @.str.34) #8
  br label %500

276:                                              ; preds = %252
  %277 = load ptr, ptr %35, align 8, !tbaa !5
  %278 = load ptr, ptr %277, align 8, !tbaa !5
  %279 = load ptr, ptr %57, align 8, !tbaa !5
  %280 = load ptr, ptr %37, align 8, !tbaa !5
  %281 = load i32, ptr %280, align 4, !tbaa !9
  %282 = load ptr, ptr %38, align 8, !tbaa !5
  %283 = load i32, ptr %282, align 4, !tbaa !9
  %284 = add i32 %281, %283
  %285 = zext i32 %284 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %278, ptr align 1 %279, i64 %285, i1 false)
  %286 = load i32, ptr @swap, align 4, !tbaa !9
  %287 = icmp ne i32 %286, 0
  br i1 %287, label %302, label %288

288:                                              ; preds = %276
  %289 = load i32, ptr %30, align 4, !tbaa !9
  %290 = load ptr, ptr %31, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.squashfs_super_block, ptr %290, i32 0, i32 3
  %292 = load i32, ptr %291, align 1, !tbaa !16
  %293 = load ptr, ptr %31, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.squashfs_super_block, ptr %293, i32 0, i32 8
  %295 = load i16, ptr %294, align 1
  %296 = lshr i16 %295, 8
  %297 = zext i16 %296 to i32
  %298 = zext i32 %297 to i64
  %299 = mul i64 %298, 4
  %300 = trunc i64 %299 to i32
  %301 = load ptr, ptr %47, align 8, !tbaa !5
  call void @read_bytes(i32 noundef %289, i32 noundef %292, i32 noundef %300, ptr noundef %301)
  br label %385

302:                                              ; preds = %276
  %303 = load ptr, ptr %31, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.squashfs_super_block, ptr %303, i32 0, i32 8
  %305 = load i16, ptr %304, align 1
  %306 = lshr i16 %305, 8
  %307 = zext i16 %306 to i32
  %308 = zext i32 %307 to i64
  %309 = call ptr @llvm.stacksave.p0()
  store ptr %309, ptr %65, align 8
  %310 = alloca i32, i64 %308, align 16
  store i64 %308, ptr %66, align 8
  %311 = load i32, ptr %30, align 4, !tbaa !9
  %312 = load ptr, ptr %31, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.squashfs_super_block, ptr %312, i32 0, i32 3
  %314 = load i32, ptr %313, align 1, !tbaa !16
  %315 = load ptr, ptr %31, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.squashfs_super_block, ptr %315, i32 0, i32 8
  %317 = load i16, ptr %316, align 1
  %318 = lshr i16 %317, 8
  %319 = zext i16 %318 to i32
  %320 = zext i32 %319 to i64
  %321 = mul i64 %320, 4
  %322 = trunc i64 %321 to i32
  call void @read_bytes(i32 noundef %311, i32 noundef %314, i32 noundef %322, ptr noundef %310)
  call void @llvm.lifetime.start.p0(i64 4, ptr %67) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %68) #8
  %323 = load ptr, ptr %47, align 8, !tbaa !5
  %324 = load ptr, ptr %31, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.squashfs_super_block, ptr %324, i32 0, i32 8
  %326 = load i16, ptr %325, align 1
  %327 = lshr i16 %326, 8
  %328 = zext i16 %327 to i32
  %329 = zext i32 %328 to i64
  %330 = mul i64 %329, 4
  %331 = mul i64 %330, 8
  %332 = udiv i64 %331, 8
  call void @llvm.memset.p0.i64(ptr align 4 %323, i8 0, i64 %332, i1 false)
  store i32 0, ptr %67, align 4, !tbaa !9
  store i32 0, ptr %68, align 4, !tbaa !9
  br label %333

333:                                              ; preds = %376, %302
  %334 = load i32, ptr %67, align 4, !tbaa !9
  %335 = load ptr, ptr %31, align 8, !tbaa !5
  %336 = getelementptr inbounds %struct.squashfs_super_block, ptr %335, i32 0, i32 8
  %337 = load i16, ptr %336, align 1
  %338 = lshr i16 %337, 8
  %339 = zext i16 %338 to i32
  %340 = icmp slt i32 %334, %339
  br i1 %340, label %341, label %383

341:                                              ; preds = %333
  call void @llvm.lifetime.start.p0(i64 4, ptr %69) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %70) #8
  %342 = load i32, ptr %68, align 4, !tbaa !9
  %343 = srem i32 %342, 8
  store i32 %343, ptr %70, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #8
  store i64 0, ptr %71, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #8
  %344 = load i32, ptr %68, align 4, !tbaa !9
  %345 = sdiv i32 %344, 8
  %346 = sext i32 %345 to i64
  %347 = getelementptr inbounds i8, ptr %310, i64 %346
  store ptr %347, ptr %72, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #8
  %348 = getelementptr inbounds i8, ptr %71, i64 7
  store ptr %348, ptr %73, align 8, !tbaa !5
  store i32 0, ptr %69, align 4, !tbaa !9
  br label %349

349:                                              ; preds = %362, %341
  %350 = load i32, ptr %69, align 4, !tbaa !9
  %351 = sext i32 %350 to i64
  %352 = load i32, ptr %70, align 4, !tbaa !9
  %353 = sext i32 %352 to i64
  %354 = add i64 32, %353
  %355 = icmp ult i64 %351, %354
  br i1 %355, label %356, label %365

356:                                              ; preds = %349
  %357 = load ptr, ptr %72, align 8, !tbaa !5
  %358 = getelementptr inbounds i8, ptr %357, i32 1
  store ptr %358, ptr %72, align 8, !tbaa !5
  %359 = load i8, ptr %357, align 1, !tbaa !18
  %360 = load ptr, ptr %73, align 8, !tbaa !5
  %361 = getelementptr inbounds i8, ptr %360, i32 -1
  store ptr %361, ptr %73, align 8, !tbaa !5
  store i8 %359, ptr %360, align 1, !tbaa !18
  br label %362

362:                                              ; preds = %356
  %363 = load i32, ptr %69, align 4, !tbaa !9
  %364 = add nsw i32 %363, 8
  store i32 %364, ptr %69, align 4, !tbaa !9
  br label %349, !llvm.loop !19

365:                                              ; preds = %349
  %366 = load i64, ptr %71, align 8, !tbaa !17
  %367 = load i32, ptr %70, align 4, !tbaa !9
  %368 = sext i32 %367 to i64
  %369 = sub i64 32, %368
  %370 = lshr i64 %366, %369
  %371 = trunc i64 %370 to i32
  %372 = load ptr, ptr %47, align 8, !tbaa !5
  %373 = load i32, ptr %67, align 4, !tbaa !9
  %374 = sext i32 %373 to i64
  %375 = getelementptr inbounds i32, ptr %372, i64 %374
  store i32 %371, ptr %375, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %70) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %69) #8
  br label %376

376:                                              ; preds = %365
  %377 = load i32, ptr %67, align 4, !tbaa !9
  %378 = add nsw i32 %377, 1
  store i32 %378, ptr %67, align 4, !tbaa !9
  %379 = load i32, ptr %68, align 4, !tbaa !9
  %380 = sext i32 %379 to i64
  %381 = add i64 %380, 32
  %382 = trunc i64 %381 to i32
  store i32 %382, ptr %68, align 4, !tbaa !9
  br label %333, !llvm.loop !21

383:                                              ; preds = %333
  call void @llvm.lifetime.end.p0(i64 4, ptr %68) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %67) #8
  %384 = load ptr, ptr %65, align 8
  call void @llvm.stackrestore.p0(ptr %384)
  br label %385

385:                                              ; preds = %383, %288
  %386 = load i32, ptr @swap, align 4, !tbaa !9
  %387 = icmp ne i32 %386, 0
  br i1 %387, label %401, label %388

388:                                              ; preds = %385
  %389 = load i32, ptr %30, align 4, !tbaa !9
  %390 = load ptr, ptr %31, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.squashfs_super_block, ptr %390, i32 0, i32 4
  %392 = load i32, ptr %391, align 1, !tbaa !22
  %393 = load ptr, ptr %31, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.squashfs_super_block, ptr %393, i32 0, i32 9
  %395 = load i8, ptr %394, align 1
  %396 = zext i8 %395 to i32
  %397 = zext i32 %396 to i64
  %398 = mul i64 %397, 4
  %399 = trunc i64 %398 to i32
  %400 = load ptr, ptr %49, align 8, !tbaa !5
  call void @read_bytes(i32 noundef %389, i32 noundef %392, i32 noundef %399, ptr noundef %400)
  br label %480

401:                                              ; preds = %385
  %402 = load ptr, ptr %31, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.squashfs_super_block, ptr %402, i32 0, i32 9
  %404 = load i8, ptr %403, align 1
  %405 = zext i8 %404 to i32
  %406 = zext i32 %405 to i64
  %407 = call ptr @llvm.stacksave.p0()
  store ptr %407, ptr %74, align 8
  %408 = alloca i32, i64 %406, align 16
  store i64 %406, ptr %75, align 8
  %409 = load i32, ptr %30, align 4, !tbaa !9
  %410 = load ptr, ptr %31, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.squashfs_super_block, ptr %410, i32 0, i32 4
  %412 = load i32, ptr %411, align 1, !tbaa !22
  %413 = load ptr, ptr %31, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.squashfs_super_block, ptr %413, i32 0, i32 9
  %415 = load i8, ptr %414, align 1
  %416 = zext i8 %415 to i32
  %417 = zext i32 %416 to i64
  %418 = mul i64 %417, 4
  %419 = trunc i64 %418 to i32
  call void @read_bytes(i32 noundef %409, i32 noundef %412, i32 noundef %419, ptr noundef %408)
  call void @llvm.lifetime.start.p0(i64 4, ptr %76) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %77) #8
  %420 = load ptr, ptr %49, align 8, !tbaa !5
  %421 = load ptr, ptr %31, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.squashfs_super_block, ptr %421, i32 0, i32 9
  %423 = load i8, ptr %422, align 1
  %424 = zext i8 %423 to i32
  %425 = zext i32 %424 to i64
  %426 = mul i64 %425, 4
  %427 = mul i64 %426, 8
  %428 = udiv i64 %427, 8
  call void @llvm.memset.p0.i64(ptr align 4 %420, i8 0, i64 %428, i1 false)
  store i32 0, ptr %76, align 4, !tbaa !9
  store i32 0, ptr %77, align 4, !tbaa !9
  br label %429

429:                                              ; preds = %471, %401
  %430 = load i32, ptr %76, align 4, !tbaa !9
  %431 = load ptr, ptr %31, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.squashfs_super_block, ptr %431, i32 0, i32 9
  %433 = load i8, ptr %432, align 1
  %434 = zext i8 %433 to i32
  %435 = icmp slt i32 %430, %434
  br i1 %435, label %436, label %478

436:                                              ; preds = %429
  call void @llvm.lifetime.start.p0(i64 4, ptr %78) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %79) #8
  %437 = load i32, ptr %77, align 4, !tbaa !9
  %438 = srem i32 %437, 8
  store i32 %438, ptr %79, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %80) #8
  store i64 0, ptr %80, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #8
  %439 = load i32, ptr %77, align 4, !tbaa !9
  %440 = sdiv i32 %439, 8
  %441 = sext i32 %440 to i64
  %442 = getelementptr inbounds i8, ptr %408, i64 %441
  store ptr %442, ptr %81, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #8
  %443 = getelementptr inbounds i8, ptr %80, i64 7
  store ptr %443, ptr %82, align 8, !tbaa !5
  store i32 0, ptr %78, align 4, !tbaa !9
  br label %444

444:                                              ; preds = %457, %436
  %445 = load i32, ptr %78, align 4, !tbaa !9
  %446 = sext i32 %445 to i64
  %447 = load i32, ptr %79, align 4, !tbaa !9
  %448 = sext i32 %447 to i64
  %449 = add i64 32, %448
  %450 = icmp ult i64 %446, %449
  br i1 %450, label %451, label %460

451:                                              ; preds = %444
  %452 = load ptr, ptr %81, align 8, !tbaa !5
  %453 = getelementptr inbounds i8, ptr %452, i32 1
  store ptr %453, ptr %81, align 8, !tbaa !5
  %454 = load i8, ptr %452, align 1, !tbaa !18
  %455 = load ptr, ptr %82, align 8, !tbaa !5
  %456 = getelementptr inbounds i8, ptr %455, i32 -1
  store ptr %456, ptr %82, align 8, !tbaa !5
  store i8 %454, ptr %455, align 1, !tbaa !18
  br label %457

457:                                              ; preds = %451
  %458 = load i32, ptr %78, align 4, !tbaa !9
  %459 = add nsw i32 %458, 8
  store i32 %459, ptr %78, align 4, !tbaa !9
  br label %444, !llvm.loop !23

460:                                              ; preds = %444
  %461 = load i64, ptr %80, align 8, !tbaa !17
  %462 = load i32, ptr %79, align 4, !tbaa !9
  %463 = sext i32 %462 to i64
  %464 = sub i64 32, %463
  %465 = lshr i64 %461, %464
  %466 = trunc i64 %465 to i32
  %467 = load ptr, ptr %49, align 8, !tbaa !5
  %468 = load i32, ptr %76, align 4, !tbaa !9
  %469 = sext i32 %468 to i64
  %470 = getelementptr inbounds i32, ptr %467, i64 %469
  store i32 %466, ptr %470, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %80) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %79) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %78) #8
  br label %471

471:                                              ; preds = %460
  %472 = load i32, ptr %76, align 4, !tbaa !9
  %473 = add nsw i32 %472, 1
  store i32 %473, ptr %76, align 4, !tbaa !9
  %474 = load i32, ptr %77, align 4, !tbaa !9
  %475 = sext i32 %474 to i64
  %476 = add i64 %475, 32
  %477 = trunc i64 %476 to i32
  store i32 %477, ptr %77, align 4, !tbaa !9
  br label %429, !llvm.loop !24

478:                                              ; preds = %429
  call void @llvm.lifetime.end.p0(i64 4, ptr %77) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #8
  %479 = load ptr, ptr %74, align 8
  call void @llvm.stackrestore.p0(ptr %479)
  br label %480

480:                                              ; preds = %478, %388
  %481 = load ptr, ptr %31, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.squashfs_super_block, ptr %481, i32 0, i32 8
  %483 = load i16, ptr %482, align 1
  %484 = lshr i16 %483, 8
  %485 = zext i16 %484 to i32
  %486 = trunc i32 %485 to i16
  %487 = load ptr, ptr %48, align 8, !tbaa !5
  store i16 %486, ptr %487, align 2, !tbaa !25
  %488 = load ptr, ptr %31, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct.squashfs_super_block, ptr %488, i32 0, i32 9
  %490 = load i8, ptr %489, align 1
  %491 = zext i8 %490 to i32
  %492 = trunc i32 %491 to i16
  %493 = load ptr, ptr %50, align 8, !tbaa !5
  store i16 %492, ptr %493, align 2, !tbaa !25
  %494 = load ptr, ptr %56, align 8, !tbaa !5
  call void @free(ptr noundef %494) #8
  %495 = load ptr, ptr %57, align 8, !tbaa !5
  call void @free(ptr noundef %495) #8
  %496 = load ptr, ptr %31, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.squashfs_super_block, ptr %496, i32 0, i32 5
  %498 = load i32, ptr %497, align 1, !tbaa !11
  store i32 %498, ptr %28, align 4
  store i32 1, ptr %83, align 4
  br label %501

499:                                              ; preds = %138
  br label %500

500:                                              ; preds = %499, %273, %249, %229, %208, %196, %127, %108
  store i32 0, ptr %28, align 4
  store i32 1, ptr %83, align 4
  br label %501

501:                                              ; preds = %500, %480
  call void @llvm.lifetime.end.p0(i64 24, ptr %64) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #8
  %502 = load i32, ptr %28, align 4
  ret i32 %502
}

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

!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, !10, i64 20}
!12 = !{!"squashfs_super_block", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 30, !10, i64 32, !10, i64 34, !10, i64 36, !10, i64 37, !10, i64 38, !10, i64 39, !13, i64 43, !10, i64 51, !10, i64 55, !10, i64 59}
!13 = !{!"long long", !7, i64 0}
!14 = !{!12, !10, i64 24}
!15 = !{!12, !13, i64 43}
!16 = !{!12, !10, i64 12}
!17 = !{!13, !13, i64 0}
!18 = !{!7, !7, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = distinct !{!21, !20}
!22 = !{!12, !10, i64 16}
!23 = distinct !{!23, !20}
!24 = distinct !{!24, !20}
!25 = !{!26, !26, i64 0}
!26 = !{!"short", !7, i64 0}


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

%union.squashfs_inode_header = type { %struct.squashfs_reg_inode_header }
%struct.squashfs_reg_inode_header = type { i32, i32, i32, i32, i32, i32, [0 x i16] }

@swap = external dso_local local_unnamed_addr global i32, align 4
@stderr = external local_unnamed_addr global ptr, align 8
@.str.27 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [76 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [80 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [50 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

declare void @read_bytes(i32 noundef, i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

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

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

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #7

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #7

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

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

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #8

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

; Function Attrs: nounwind uwtable
define dso_local i32 @read_filesystem(ptr noundef readnone %0, i32 noundef %1, ptr noundef %2, ptr nocapture noundef writeonly %3, ptr nocapture noundef writeonly %4, ptr nocapture noundef writeonly %5, ptr nocapture noundef writeonly %6, ptr noundef %7, ptr nocapture noundef %8, ptr nocapture noundef %9, ptr noundef %10, ptr nocapture noundef %11, ptr noundef %12, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17, ptr noundef %18, ptr nocapture noundef writeonly %19, ptr noundef %20, ptr nocapture noundef writeonly %21, ptr noundef %22, ptr nocapture noundef writeonly %23, ptr noundef %24, ptr noundef %25, ptr noundef %26) local_unnamed_addr #3 {
  %28 = alloca ptr, align 8
  %29 = alloca i32, align 4
  %30 = alloca %union.squashfs_inode_header, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %28) #9
  store ptr null, ptr %28, align 8, !tbaa !5
  %31 = getelementptr inbounds i8, ptr %2, i64 20
  %32 = load i32, ptr %31, align 1, !tbaa !9
  %33 = getelementptr inbounds i8, ptr %2, i64 24
  %34 = load i32, ptr %33, align 1, !tbaa !13
  %35 = getelementptr inbounds i8, ptr %2, i64 43
  %36 = load i64, ptr %35, align 1, !tbaa !14
  %37 = lshr i64 %36, 16
  %38 = trunc i64 %37 to i32
  %39 = trunc i64 %36 to i32
  %40 = and i32 %39, 65535
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %29) #9
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %30) #9
  %41 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.27)
  %42 = tail call i32 @read_fragment_table(i32 noundef %1, ptr noundef %2, ptr noundef %26)
  %43 = icmp eq i32 %42, 0
  br i1 %43, label %220, label %44

44:                                               ; preds = %27
  %45 = add i32 %32, %38
  %46 = call i32 @scan_inode_table(i32 noundef %1, i32 noundef %32, i32 noundef %34, i32 noundef %45, i32 noundef %40, ptr noundef nonnull %2, ptr noundef nonnull %30, ptr noundef nonnull %28, ptr noundef nonnull %29, ptr noundef %10, ptr noundef %22, ptr noundef %24, ptr noundef %12, ptr noundef %13, ptr noundef %14, ptr noundef %15, ptr noundef %16, ptr noundef %17)
  %47 = icmp eq i32 %46, 0
  br i1 %47, label %48, label %51

48:                                               ; preds = %44
  %49 = load ptr, ptr @stderr, align 8, !tbaa !5
  %50 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %49, ptr noundef nonnull @.str.28) #10
  br label %220

51:                                               ; preds = %44
  %52 = load i32, ptr %29, align 4, !tbaa !15
  store i32 %52, ptr %23, align 4, !tbaa !15
  %53 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.29, i32 noundef %46)
  %54 = load i32, ptr %30, align 8
  %55 = and i32 %54, 15
  switch i32 %55, label %220 [
    i32 1, label %56
    i32 8, label %66
  ]

56:                                               ; preds = %51
  %57 = getelementptr inbounds i8, ptr %30, i64 12
  %58 = load i24, ptr %57, align 4
  %59 = zext i24 %58 to i32
  store i32 %59, ptr %11, align 4, !tbaa !15
  %60 = load i64, ptr %30, align 8
  %61 = lshr i64 %60, 51
  %62 = trunc nuw nsw i64 %61 to i32
  store i32 %62, ptr %8, align 4, !tbaa !15
  %63 = lshr i64 %60, 32
  %64 = trunc nuw i64 %63 to i32
  %65 = and i32 %64, 524287
  br label %76

66:                                               ; preds = %51
  %67 = getelementptr inbounds i8, ptr %30, i64 13
  %68 = load i24, ptr %67, align 1
  %69 = zext i24 %68 to i32
  store i32 %69, ptr %11, align 4, !tbaa !15
  %70 = getelementptr inbounds i8, ptr %30, i64 4
  %71 = load i40, ptr %70, align 4
  %72 = lshr i40 %71, 27
  %73 = trunc nuw nsw i40 %72 to i32
  store i32 %73, ptr %8, align 4, !tbaa !15
  %74 = trunc i40 %71 to i32
  %75 = and i32 %74, 134217727
  br label %76

76:                                               ; preds = %66, %56
  %storemerge = phi i32 [ %75, %66 ], [ %65, %56 ]
  store i32 %storemerge, ptr %9, align 4, !tbaa !15
  %.not = icmp eq ptr %0, null
  %77 = zext i1 %.not to i32
  %78 = load i32, ptr %33, align 1, !tbaa !13
  %79 = load i32, ptr %11, align 4, !tbaa !15
  %80 = add i32 %79, %78
  %81 = load i32, ptr %8, align 4, !tbaa !15
  %82 = call ptr @squashfs_readdir(i32 noundef %1, i32 noundef %77, i32 noundef %80, i32 noundef %81, i32 noundef %storemerge, ptr noundef %7, ptr noundef nonnull %2, ptr noundef %25)
  %83 = icmp eq ptr %82, null
  br i1 %83, label %84, label %87

84:                                               ; preds = %76
  %85 = load ptr, ptr @stderr, align 8, !tbaa !5
  %86 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %85, ptr noundef nonnull @.str.30) #10
  br label %220

87:                                               ; preds = %76
  %88 = and i64 %37, 4294967295
  %89 = call noalias ptr @malloc(i64 noundef %88) #11
  store ptr %89, ptr %3, align 8, !tbaa !5
  %90 = icmp eq ptr %89, null
  br i1 %90, label %91, label %94

91:                                               ; preds = %87
  %92 = load ptr, ptr @stderr, align 8, !tbaa !5
  %93 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %92, ptr noundef nonnull @.str.31) #10
  br label %220

94:                                               ; preds = %87
  call void @read_bytes(i32 noundef %1, i32 noundef %32, i32 noundef %38, ptr noundef nonnull %89) #9
  %95 = load i32, ptr %33, align 1, !tbaa !13
  %96 = load i32, ptr %7, align 4, !tbaa !15
  %97 = sub i32 %96, %95
  store i32 %97, ptr %7, align 4, !tbaa !15
  %98 = zext i32 %97 to i64
  %99 = call noalias ptr @malloc(i64 noundef %98) #11
  store ptr %99, ptr %5, align 8, !tbaa !5
  %100 = icmp eq ptr %99, null
  br i1 %100, label %101, label %104

101:                                              ; preds = %94
  %102 = load ptr, ptr @stderr, align 8, !tbaa !5
  %103 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %102, ptr noundef nonnull @.str.32) #10
  br label %220

104:                                              ; preds = %94
  %105 = load i32, ptr %33, align 1, !tbaa !13
  call void @read_bytes(i32 noundef %1, i32 noundef %105, i32 noundef %97, ptr noundef nonnull %99) #9
  %106 = load i32, ptr %10, align 4, !tbaa !15
  %107 = add i32 %106, %40
  %108 = zext i32 %107 to i64
  %109 = call noalias ptr @malloc(i64 noundef %108) #11
  store ptr %109, ptr %4, align 8, !tbaa !5
  %110 = icmp eq ptr %109, null
  br i1 %110, label %111, label %114

111:                                              ; preds = %104
  %112 = load ptr, ptr @stderr, align 8, !tbaa !5
  %113 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %112, ptr noundef nonnull @.str.33) #10
  br label %220

114:                                              ; preds = %104
  %115 = load ptr, ptr %28, align 8, !tbaa !5
  %116 = load i32, ptr %29, align 4, !tbaa !15
  %117 = zext i32 %116 to i64
  %118 = getelementptr inbounds i8, ptr %115, i64 %117
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %109, ptr align 1 %118, i64 %108, i1 false)
  %119 = load i32, ptr %8, align 4, !tbaa !15
  %120 = load i32, ptr %9, align 4, !tbaa !15
  %121 = add i32 %120, %119
  %122 = zext i32 %121 to i64
  %123 = call noalias ptr @malloc(i64 noundef %122) #11
  store ptr %123, ptr %6, align 8, !tbaa !5
  %124 = icmp eq ptr %123, null
  br i1 %124, label %125, label %128

125:                                              ; preds = %114
  %126 = load ptr, ptr @stderr, align 8, !tbaa !5
  %127 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %126, ptr noundef nonnull @.str.34) #10
  br label %220

128:                                              ; preds = %114
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %123, ptr nonnull align 1 %82, i64 %122, i1 false)
  %129 = load i32, ptr @swap, align 4, !tbaa !15
  %.not142 = icmp eq i32 %129, 0
  br i1 %.not142, label %130, label %138

130:                                              ; preds = %128
  %131 = getelementptr inbounds i8, ptr %2, i64 12
  %132 = load i32, ptr %131, align 1, !tbaa !16
  %133 = getelementptr inbounds i8, ptr %2, i64 36
  %134 = load i16, ptr %133, align 1
  %135 = lshr i16 %134, 6
  %136 = and i16 %135, 1020
  %137 = zext nneg i16 %136 to i32
  call void @read_bytes(i32 noundef %1, i32 noundef %132, i32 noundef %137, ptr noundef %18) #9
  br label %172

138:                                              ; preds = %128
  %139 = getelementptr inbounds i8, ptr %2, i64 36
  %140 = load i16, ptr %139, align 1
  %141 = lshr i16 %140, 8
  %142 = zext nneg i16 %141 to i64
  %143 = call ptr @llvm.stacksave.p0()
  %144 = alloca i32, i64 %142, align 16
  %145 = getelementptr inbounds i8, ptr %2, i64 12
  %146 = load i32, ptr %145, align 1, !tbaa !16
  %147 = load i16, ptr %139, align 1
  %148 = lshr i16 %147, 6
  %149 = and i16 %148, 1020
  %150 = zext nneg i16 %149 to i32
  call void @read_bytes(i32 noundef %1, i32 noundef %146, i32 noundef %150, ptr noundef nonnull %144) #9
  %151 = load i16, ptr %139, align 1
  %152 = lshr i16 %151, 6
  %153 = and i16 %152, 1020
  %154 = zext nneg i16 %153 to i64
  call void @llvm.memset.p0.i64(ptr align 4 %18, i8 0, i64 %154, i1 false)
  %155 = load i16, ptr %139, align 1
  %.not157 = icmp ult i16 %155, 256
  br i1 %.not157, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %138, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %138 ]
  %.0133147 = phi i32 [ %167, %.lr.ph ], [ 0, %138 ]
  %156 = lshr exact i32 %.0133147, 3
  %157 = zext nneg i32 %156 to i64
  %158 = getelementptr inbounds i8, ptr %144, i64 %157
  %159 = getelementptr inbounds i8, ptr %158, i64 1
  %160 = load i8, ptr %158, align 4, !tbaa !17
  %161 = getelementptr inbounds i8, ptr %158, i64 2
  %162 = load i8, ptr %159, align 1, !tbaa !17
  %163 = getelementptr inbounds i8, ptr %158, i64 3
  %164 = load i8, ptr %161, align 2, !tbaa !17
  %165 = load i8, ptr %163, align 1, !tbaa !17
  %.sroa.7167.0.insert.ext = zext i8 %160 to i32
  %.sroa.7167.0.insert.shift = shl nuw i32 %.sroa.7167.0.insert.ext, 24
  %.sroa.6166.0.insert.ext = zext i8 %162 to i32
  %.sroa.6166.0.insert.shift = shl nuw nsw i32 %.sroa.6166.0.insert.ext, 16
  %.sroa.6166.0.insert.insert = or disjoint i32 %.sroa.7167.0.insert.shift, %.sroa.6166.0.insert.shift
  %.sroa.5165.0.insert.ext = zext i8 %164 to i32
  %.sroa.5165.0.insert.shift = shl nuw nsw i32 %.sroa.5165.0.insert.ext, 8
  %.sroa.5165.0.insert.insert = or disjoint i32 %.sroa.6166.0.insert.insert, %.sroa.5165.0.insert.shift
  %.sroa.4164.0.insert.ext = zext i8 %165 to i32
  %.sroa.4164.0.insert.insert = or disjoint i32 %.sroa.5165.0.insert.insert, %.sroa.4164.0.insert.ext
  %166 = getelementptr inbounds i32, ptr %18, i64 %indvars.iv
  store i32 %.sroa.4164.0.insert.insert, ptr %166, align 4, !tbaa !15
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %167 = add nuw nsw i32 %.0133147, 32
  %168 = load i16, ptr %139, align 1
  %169 = lshr i16 %168, 8
  %170 = zext nneg i16 %169 to i64
  %171 = icmp ult i64 %indvars.iv.next, %170
  br i1 %171, label %.lr.ph, label %._crit_edge, !llvm.loop !18

._crit_edge:                                      ; preds = %.lr.ph, %138
  call void @llvm.stackrestore.p0(ptr %143)
  br label %172

172:                                              ; preds = %._crit_edge, %130
  %173 = load i32, ptr @swap, align 4, !tbaa !15
  %.not143 = icmp eq i32 %173, 0
  br i1 %.not143, label %174, label %181

174:                                              ; preds = %172
  %175 = getelementptr inbounds i8, ptr %2, i64 16
  %176 = load i32, ptr %175, align 1, !tbaa !20
  %177 = getelementptr inbounds i8, ptr %2, i64 38
  %178 = load i8, ptr %177, align 1
  %179 = zext i8 %178 to i32
  %180 = shl nuw nsw i32 %179, 2
  call void @read_bytes(i32 noundef %1, i32 noundef %176, i32 noundef %180, ptr noundef %20) #9
  br label %211

181:                                              ; preds = %172
  %182 = getelementptr inbounds i8, ptr %2, i64 38
  %183 = load i8, ptr %182, align 1
  %184 = zext i8 %183 to i64
  %185 = call ptr @llvm.stacksave.p0()
  %186 = alloca i32, i64 %184, align 16
  %187 = getelementptr inbounds i8, ptr %2, i64 16
  %188 = load i32, ptr %187, align 1, !tbaa !20
  %189 = load i8, ptr %182, align 1
  %190 = zext i8 %189 to i32
  %191 = shl nuw nsw i32 %190, 2
  call void @read_bytes(i32 noundef %1, i32 noundef %188, i32 noundef %191, ptr noundef nonnull %186) #9
  %192 = load i8, ptr %182, align 1
  %193 = zext i8 %192 to i64
  %194 = shl nuw nsw i64 %193, 2
  call void @llvm.memset.p0.i64(ptr align 4 %20, i8 0, i64 %194, i1 false)
  %195 = load i8, ptr %182, align 1
  %.not158 = icmp eq i8 %195, 0
  br i1 %.not158, label %._crit_edge156, label %.lr.ph155

.lr.ph155:                                        ; preds = %181, %.lr.ph155
  %indvars.iv160 = phi i64 [ %indvars.iv.next161, %.lr.ph155 ], [ 0, %181 ]
  %.0128153 = phi i32 [ %207, %.lr.ph155 ], [ 0, %181 ]
  %196 = lshr exact i32 %.0128153, 3
  %197 = zext nneg i32 %196 to i64
  %198 = getelementptr inbounds i8, ptr %186, i64 %197
  %199 = getelementptr inbounds i8, ptr %198, i64 1
  %200 = load i8, ptr %198, align 4, !tbaa !17
  %201 = getelementptr inbounds i8, ptr %198, i64 2
  %202 = load i8, ptr %199, align 1, !tbaa !17
  %203 = getelementptr inbounds i8, ptr %198, i64 3
  %204 = load i8, ptr %201, align 2, !tbaa !17
  %205 = load i8, ptr %203, align 1, !tbaa !17
  %.sroa.7.0.insert.ext = zext i8 %200 to i32
  %.sroa.7.0.insert.shift = shl nuw i32 %.sroa.7.0.insert.ext, 24
  %.sroa.6.0.insert.ext = zext i8 %202 to i32
  %.sroa.6.0.insert.shift = shl nuw nsw i32 %.sroa.6.0.insert.ext, 16
  %.sroa.6.0.insert.insert = or disjoint i32 %.sroa.7.0.insert.shift, %.sroa.6.0.insert.shift
  %.sroa.5.0.insert.ext = zext i8 %204 to i32
  %.sroa.5.0.insert.shift = shl nuw nsw i32 %.sroa.5.0.insert.ext, 8
  %.sroa.5.0.insert.insert = or disjoint i32 %.sroa.6.0.insert.insert, %.sroa.5.0.insert.shift
  %.sroa.4.0.insert.ext = zext i8 %205 to i32
  %.sroa.4.0.insert.insert = or disjoint i32 %.sroa.5.0.insert.insert, %.sroa.4.0.insert.ext
  %206 = getelementptr inbounds i32, ptr %20, i64 %indvars.iv160
  store i32 %.sroa.4.0.insert.insert, ptr %206, align 4, !tbaa !15
  %indvars.iv.next161 = add nuw nsw i64 %indvars.iv160, 1
  %207 = add nuw nsw i32 %.0128153, 32
  %208 = load i8, ptr %182, align 1
  %209 = zext i8 %208 to i64
  %210 = icmp ult i64 %indvars.iv.next161, %209
  br i1 %210, label %.lr.ph155, label %._crit_edge156, !llvm.loop !21

._crit_edge156:                                   ; preds = %.lr.ph155, %181
  call void @llvm.stackrestore.p0(ptr %185)
  br label %211

211:                                              ; preds = %._crit_edge156, %174
  %212 = getelementptr inbounds i8, ptr %2, i64 36
  %213 = load i16, ptr %212, align 1
  %214 = lshr i16 %213, 8
  store i16 %214, ptr %19, align 2, !tbaa !22
  %215 = getelementptr inbounds i8, ptr %2, i64 38
  %216 = load i8, ptr %215, align 1
  %217 = zext i8 %216 to i16
  store i16 %217, ptr %21, align 2, !tbaa !22
  %218 = load ptr, ptr %28, align 8, !tbaa !5
  call void @free(ptr noundef %218) #9
  call void @free(ptr noundef %82) #9
  %219 = load i32, ptr %31, align 1, !tbaa !9
  br label %220

220:                                              ; preds = %51, %48, %84, %91, %101, %111, %125, %27, %211
  %.0126 = phi i32 [ %219, %211 ], [ 0, %51 ], [ 0, %27 ], [ 0, %125 ], [ 0, %111 ], [ 0, %101 ], [ 0, %91 ], [ 0, %84 ], [ 0, %48 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %30) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %29) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %28) #9
  ret i32 %.0126
}

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

!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, !11, i64 20}
!10 = !{!"squashfs_super_block", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 30, !11, i64 32, !11, i64 34, !11, i64 36, !11, i64 37, !11, i64 38, !11, i64 39, !12, i64 43, !11, i64 51, !11, i64 55, !11, i64 59}
!11 = !{!"int", !7, i64 0}
!12 = !{!"long long", !7, i64 0}
!13 = !{!10, !11, i64 24}
!14 = !{!10, !12, i64 43}
!15 = !{!11, !11, i64 0}
!16 = !{!10, !11, i64 12}
!17 = !{!7, !7, i64 0}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!10, !11, i64 16}
!21 = distinct !{!21, !19}
!22 = !{!23, !23, i64 0}
!23 = !{!"short", !7, i64 0}


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