; LLVM IR from cvra/robot-software :: lib/fatfs (ff)

; 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.FIL = type { ptr, i16, i8, i8, i64, i64, i64, i64, i64, i64, ptr, [512 x i8] }
%struct.FATFS = type { i8, i8, i8, i8, i8, i8, i16, i16, i64, i64, i64, i64, i64, i64, i64, i64, i64, [512 x i8] }

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

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

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

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

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

25:                                               ; preds = %4
  %26 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %26, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

27:                                               ; preds = %4
  %28 = load ptr, ptr %6, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.FIL, ptr %28, i32 0, i32 3
  %30 = load i8, ptr %29, align 1, !tbaa !11
  %31 = icmp ne i8 %30, 0
  br i1 %31, label %32, label %37

32:                                               ; preds = %27
  %33 = load ptr, ptr %6, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.FIL, ptr %33, i32 0, i32 3
  %35 = load i8, ptr %34, align 1, !tbaa !11
  %36 = zext i8 %35 to i32
  store i32 %36, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

37:                                               ; preds = %27
  %38 = load ptr, ptr %6, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.FIL, ptr %38, i32 0, i32 2
  %40 = load i8, ptr %39, align 2, !tbaa !15
  %41 = zext i8 %40 to i32
  %42 = and i32 %41, 1
  %43 = icmp ne i32 %42, 0
  br i1 %43, label %45, label %44

44:                                               ; preds = %37
  store i32 7, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

45:                                               ; preds = %37
  %46 = load ptr, ptr %6, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.FIL, ptr %46, i32 0, i32 5
  %48 = load i64, ptr %47, align 8, !tbaa !16
  %49 = load ptr, ptr %6, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.FIL, ptr %49, i32 0, i32 4
  %51 = load i64, ptr %50, align 8, !tbaa !17
  %52 = sub i64 %48, %51
  store i64 %52, ptr %13, align 8, !tbaa !18
  %53 = load i32, ptr %8, align 4, !tbaa !9
  %54 = zext i32 %53 to i64
  %55 = load i64, ptr %13, align 8, !tbaa !18
  %56 = icmp ugt i64 %54, %55
  br i1 %56, label %57, label %60

57:                                               ; preds = %45
  %58 = load i64, ptr %13, align 8, !tbaa !18
  %59 = trunc i64 %58 to i32
  store i32 %59, ptr %8, align 4, !tbaa !9
  br label %60

60:                                               ; preds = %57, %45
  br label %61

61:                                               ; preds = %288, %60
  %62 = load i32, ptr %8, align 4, !tbaa !9
  %63 = icmp ne i32 %62, 0
  br i1 %63, label %64, label %306

64:                                               ; preds = %61
  %65 = load ptr, ptr %6, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.FIL, ptr %65, i32 0, i32 4
  %67 = load i64, ptr %66, align 8, !tbaa !17
  %68 = urem i64 %67, 512
  %69 = icmp eq i64 %68, 0
  br i1 %69, label %70, label %266

70:                                               ; preds = %64
  %71 = load ptr, ptr %6, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.FIL, ptr %71, i32 0, i32 4
  %73 = load i64, ptr %72, align 8, !tbaa !17
  %74 = udiv i64 %73, 512
  %75 = load ptr, ptr %6, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.FIL, ptr %75, i32 0, i32 0
  %77 = load ptr, ptr %76, align 8, !tbaa !19
  %78 = getelementptr inbounds %struct.FATFS, ptr %77, i32 0, i32 2
  %79 = load i8, ptr %78, align 2, !tbaa !20
  %80 = zext i8 %79 to i32
  %81 = sub nsw i32 %80, 1
  %82 = sext i32 %81 to i64
  %83 = and i64 %74, %82
  %84 = trunc i64 %83 to i8
  store i8 %84, ptr %16, align 1, !tbaa !22
  %85 = load i8, ptr %16, align 1, !tbaa !22
  %86 = icmp ne i8 %85, 0
  br i1 %86, label %120, label %87

87:                                               ; preds = %70
  %88 = load ptr, ptr %6, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.FIL, ptr %88, i32 0, i32 4
  %90 = load i64, ptr %89, align 8, !tbaa !17
  %91 = icmp eq i64 %90, 0
  br i1 %91, label %92, label %96

92:                                               ; preds = %87
  %93 = load ptr, ptr %6, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.FIL, ptr %93, i32 0, i32 6
  %95 = load i64, ptr %94, align 8, !tbaa !23
  store i64 %95, ptr %11, align 8, !tbaa !18
  br label %104

96:                                               ; preds = %87
  %97 = load ptr, ptr %6, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.FIL, ptr %97, i32 0, i32 0
  %99 = load ptr, ptr %98, align 8, !tbaa !19
  %100 = load ptr, ptr %6, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.FIL, ptr %100, i32 0, i32 7
  %102 = load i64, ptr %101, align 8, !tbaa !24
  %103 = call i64 @get_fat(ptr noundef %99, i64 noundef %102)
  store i64 %103, ptr %11, align 8, !tbaa !18
  br label %104

104:                                              ; preds = %96, %92
  %105 = load i64, ptr %11, align 8, !tbaa !18
  %106 = icmp ult i64 %105, 2
  br i1 %106, label %107, label %110

107:                                              ; preds = %104
  %108 = load ptr, ptr %6, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.FIL, ptr %108, i32 0, i32 3
  store i8 2, ptr %109, align 1, !tbaa !11
  store i32 2, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

110:                                              ; preds = %104
  %111 = load i64, ptr %11, align 8, !tbaa !18
  %112 = icmp eq i64 %111, 4294967295
  br i1 %112, label %113, label %116

113:                                              ; preds = %110
  %114 = load ptr, ptr %6, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.FIL, ptr %114, i32 0, i32 3
  store i8 1, ptr %115, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

116:                                              ; preds = %110
  %117 = load i64, ptr %11, align 8, !tbaa !18
  %118 = load ptr, ptr %6, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.FIL, ptr %118, i32 0, i32 7
  store i64 %117, ptr %119, align 8, !tbaa !24
  br label %120

120:                                              ; preds = %116, %70
  %121 = load ptr, ptr %6, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.FIL, ptr %121, i32 0, i32 0
  %123 = load ptr, ptr %122, align 8, !tbaa !19
  %124 = load ptr, ptr %6, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.FIL, ptr %124, i32 0, i32 7
  %126 = load i64, ptr %125, align 8, !tbaa !24
  %127 = call i64 @clust2sect(ptr noundef %123, i64 noundef %126)
  store i64 %127, ptr %12, align 8, !tbaa !18
  %128 = load i64, ptr %12, align 8, !tbaa !18
  %129 = icmp ne i64 %128, 0
  br i1 %129, label %133, label %130

130:                                              ; preds = %120
  %131 = load ptr, ptr %6, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.FIL, ptr %131, i32 0, i32 3
  store i8 2, ptr %132, align 1, !tbaa !11
  store i32 2, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

133:                                              ; preds = %120
  %134 = load i8, ptr %16, align 1, !tbaa !22
  %135 = zext i8 %134 to i64
  %136 = load i64, ptr %12, align 8, !tbaa !18
  %137 = add i64 %136, %135
  store i64 %137, ptr %12, align 8, !tbaa !18
  %138 = load i32, ptr %8, align 4, !tbaa !9
  %139 = udiv i32 %138, 512
  store i32 %139, ptr %15, align 4, !tbaa !9
  %140 = load i32, ptr %15, align 4, !tbaa !9
  %141 = icmp ne i32 %140, 0
  br i1 %141, label %142, label %209

142:                                              ; preds = %133
  %143 = load i8, ptr %16, align 1, !tbaa !22
  %144 = zext i8 %143 to i32
  %145 = load i32, ptr %15, align 4, !tbaa !9
  %146 = add i32 %144, %145
  %147 = load ptr, ptr %6, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.FIL, ptr %147, i32 0, i32 0
  %149 = load ptr, ptr %148, align 8, !tbaa !19
  %150 = getelementptr inbounds %struct.FATFS, ptr %149, i32 0, i32 2
  %151 = load i8, ptr %150, align 2, !tbaa !20
  %152 = zext i8 %151 to i32
  %153 = icmp ugt i32 %146, %152
  br i1 %153, label %154, label %164

154:                                              ; preds = %142
  %155 = load ptr, ptr %6, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.FIL, ptr %155, i32 0, i32 0
  %157 = load ptr, ptr %156, align 8, !tbaa !19
  %158 = getelementptr inbounds %struct.FATFS, ptr %157, i32 0, i32 2
  %159 = load i8, ptr %158, align 2, !tbaa !20
  %160 = zext i8 %159 to i32
  %161 = load i8, ptr %16, align 1, !tbaa !22
  %162 = zext i8 %161 to i32
  %163 = sub nsw i32 %160, %162
  store i32 %163, ptr %15, align 4, !tbaa !9
  br label %164

164:                                              ; preds = %154, %142
  %165 = load ptr, ptr %6, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.FIL, ptr %165, i32 0, i32 0
  %167 = load ptr, ptr %166, align 8, !tbaa !19
  %168 = getelementptr inbounds %struct.FATFS, ptr %167, i32 0, i32 1
  %169 = load i8, ptr %168, align 1, !tbaa !25
  %170 = load ptr, ptr %17, align 8, !tbaa !5
  %171 = load i64, ptr %12, align 8, !tbaa !18
  %172 = load i32, ptr %15, align 4, !tbaa !9
  %173 = call i32 @disk_read(i8 noundef zeroext %169, ptr noundef %170, i64 noundef %171, i32 noundef %172)
  %174 = icmp ne i32 %173, 0
  br i1 %174, label %175, label %178

175:                                              ; preds = %164
  %176 = load ptr, ptr %6, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.FIL, ptr %176, i32 0, i32 3
  store i8 1, ptr %177, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

178:                                              ; preds = %164
  %179 = load ptr, ptr %6, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.FIL, ptr %179, i32 0, i32 2
  %181 = load i8, ptr %180, align 2, !tbaa !15
  %182 = zext i8 %181 to i32
  %183 = and i32 %182, 64
  %184 = icmp ne i32 %183, 0
  br i1 %184, label %185, label %206

185:                                              ; preds = %178
  %186 = load ptr, ptr %6, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.FIL, ptr %186, i32 0, i32 8
  %188 = load i64, ptr %187, align 8, !tbaa !26
  %189 = load i64, ptr %12, align 8, !tbaa !18
  %190 = sub i64 %188, %189
  %191 = load i32, ptr %15, align 4, !tbaa !9
  %192 = zext i32 %191 to i64
  %193 = icmp ult i64 %190, %192
  br i1 %193, label %194, label %206

194:                                              ; preds = %185
  %195 = load ptr, ptr %17, align 8, !tbaa !5
  %196 = load ptr, ptr %6, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.FIL, ptr %196, i32 0, i32 8
  %198 = load i64, ptr %197, align 8, !tbaa !26
  %199 = load i64, ptr %12, align 8, !tbaa !18
  %200 = sub i64 %198, %199
  %201 = mul i64 %200, 512
  %202 = getelementptr inbounds i8, ptr %195, i64 %201
  %203 = load ptr, ptr %6, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.FIL, ptr %203, i32 0, i32 11
  %205 = getelementptr inbounds [512 x i8], ptr %204, i64 0, i64 0
  call void @mem_cpy(ptr noundef %202, ptr noundef %205, i32 noundef 512)
  br label %206

206:                                              ; preds = %194, %185, %178
  %207 = load i32, ptr %15, align 4, !tbaa !9
  %208 = mul i32 512, %207
  store i32 %208, ptr %14, align 4, !tbaa !9
  br label %288

209:                                              ; preds = %133
  %210 = load ptr, ptr %6, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.FIL, ptr %210, i32 0, i32 8
  %212 = load i64, ptr %211, align 8, !tbaa !26
  %213 = load i64, ptr %12, align 8, !tbaa !18
  %214 = icmp ne i64 %212, %213
  br i1 %214, label %215, label %262

215:                                              ; preds = %209
  %216 = load ptr, ptr %6, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.FIL, ptr %216, i32 0, i32 2
  %218 = load i8, ptr %217, align 2, !tbaa !15
  %219 = zext i8 %218 to i32
  %220 = and i32 %219, 64
  %221 = icmp ne i32 %220, 0
  br i1 %221, label %222, label %246

222:                                              ; preds = %215
  %223 = load ptr, ptr %6, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.FIL, ptr %223, i32 0, i32 0
  %225 = load ptr, ptr %224, align 8, !tbaa !19
  %226 = getelementptr inbounds %struct.FATFS, ptr %225, i32 0, i32 1
  %227 = load i8, ptr %226, align 1, !tbaa !25
  %228 = load ptr, ptr %6, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.FIL, ptr %228, i32 0, i32 11
  %230 = getelementptr inbounds [512 x i8], ptr %229, i64 0, i64 0
  %231 = load ptr, ptr %6, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.FIL, ptr %231, i32 0, i32 8
  %233 = load i64, ptr %232, align 8, !tbaa !26
  %234 = call i32 @disk_write(i8 noundef zeroext %227, ptr noundef %230, i64 noundef %233, i32 noundef 1)
  %235 = icmp ne i32 %234, 0
  br i1 %235, label %236, label %239

236:                                              ; preds = %222
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.FIL, ptr %237, i32 0, i32 3
  store i8 1, ptr %238, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

239:                                              ; preds = %222
  %240 = load ptr, ptr %6, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.FIL, ptr %240, i32 0, i32 2
  %242 = load i8, ptr %241, align 2, !tbaa !15
  %243 = zext i8 %242 to i32
  %244 = and i32 %243, -65
  %245 = trunc i32 %244 to i8
  store i8 %245, ptr %241, align 2, !tbaa !15
  br label %246

246:                                              ; preds = %239, %215
  %247 = load ptr, ptr %6, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.FIL, ptr %247, i32 0, i32 0
  %249 = load ptr, ptr %248, align 8, !tbaa !19
  %250 = getelementptr inbounds %struct.FATFS, ptr %249, i32 0, i32 1
  %251 = load i8, ptr %250, align 1, !tbaa !25
  %252 = load ptr, ptr %6, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.FIL, ptr %252, i32 0, i32 11
  %254 = getelementptr inbounds [512 x i8], ptr %253, i64 0, i64 0
  %255 = load i64, ptr %12, align 8, !tbaa !18
  %256 = call i32 @disk_read(i8 noundef zeroext %251, ptr noundef %254, i64 noundef %255, i32 noundef 1)
  %257 = icmp ne i32 %256, 0
  br i1 %257, label %258, label %261

258:                                              ; preds = %246
  %259 = load ptr, ptr %6, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.FIL, ptr %259, i32 0, i32 3
  store i8 1, ptr %260, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

261:                                              ; preds = %246
  br label %262

262:                                              ; preds = %261, %209
  %263 = load i64, ptr %12, align 8, !tbaa !18
  %264 = load ptr, ptr %6, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.FIL, ptr %264, i32 0, i32 8
  store i64 %263, ptr %265, align 8, !tbaa !26
  br label %266

266:                                              ; preds = %262, %64
  %267 = load ptr, ptr %6, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.FIL, ptr %267, i32 0, i32 4
  %269 = load i64, ptr %268, align 8, !tbaa !17
  %270 = trunc i64 %269 to i32
  %271 = urem i32 %270, 512
  %272 = sub i32 512, %271
  store i32 %272, ptr %14, align 4, !tbaa !9
  %273 = load i32, ptr %14, align 4, !tbaa !9
  %274 = load i32, ptr %8, align 4, !tbaa !9
  %275 = icmp ugt i32 %273, %274
  br i1 %275, label %276, label %278

276:                                              ; preds = %266
  %277 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %277, ptr %14, align 4, !tbaa !9
  br label %278

278:                                              ; preds = %276, %266
  %279 = load ptr, ptr %17, align 8, !tbaa !5
  %280 = load ptr, ptr %6, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.FIL, ptr %280, i32 0, i32 11
  %282 = load ptr, ptr %6, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.FIL, ptr %282, i32 0, i32 4
  %284 = load i64, ptr %283, align 8, !tbaa !17
  %285 = urem i64 %284, 512
  %286 = getelementptr inbounds [512 x i8], ptr %281, i64 0, i64 %285
  %287 = load i32, ptr %14, align 4, !tbaa !9
  call void @mem_cpy(ptr noundef %279, ptr noundef %286, i32 noundef %287)
  br label %288

288:                                              ; preds = %278, %206
  %289 = load i32, ptr %14, align 4, !tbaa !9
  %290 = load ptr, ptr %17, align 8, !tbaa !5
  %291 = zext i32 %289 to i64
  %292 = getelementptr inbounds i8, ptr %290, i64 %291
  store ptr %292, ptr %17, align 8, !tbaa !5
  %293 = load i32, ptr %14, align 4, !tbaa !9
  %294 = zext i32 %293 to i64
  %295 = load ptr, ptr %6, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.FIL, ptr %295, i32 0, i32 4
  %297 = load i64, ptr %296, align 8, !tbaa !17
  %298 = add i64 %297, %294
  store i64 %298, ptr %296, align 8, !tbaa !17
  %299 = load i32, ptr %14, align 4, !tbaa !9
  %300 = load ptr, ptr %9, align 8, !tbaa !5
  %301 = load i32, ptr %300, align 4, !tbaa !9
  %302 = add i32 %301, %299
  store i32 %302, ptr %300, align 4, !tbaa !9
  %303 = load i32, ptr %14, align 4, !tbaa !9
  %304 = load i32, ptr %8, align 4, !tbaa !9
  %305 = sub i32 %304, %303
  store i32 %305, ptr %8, align 4, !tbaa !9
  br label %61, !llvm.loop !27

306:                                              ; preds = %61
  store i32 0, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %307

307:                                              ; preds = %306, %258, %236, %175, %130, %113, %107, %44, %32, %25
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  %308 = load i32, ptr %5, align 4
  ret i32 %308
}

; Function Attrs: nounwind uwtable
declare hidden i32 @validate(ptr noundef) #0

declare i32 @disk_read(i8 noundef zeroext, ptr noundef, i64 noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare hidden void @mem_cpy(ptr noundef, ptr noundef, i32 noundef) #0

declare i32 @disk_write(i8 noundef zeroext, ptr noundef, i64 noundef, i32 noundef) #2

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

!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, !7, i64 11}
!12 = !{!"", !6, i64 0, !13, i64 8, !7, i64 10, !7, i64 11, !14, i64 16, !14, i64 24, !14, i64 32, !14, i64 40, !14, i64 48, !14, i64 56, !6, i64 64, !7, i64 72}
!13 = !{!"short", !7, i64 0}
!14 = !{!"long", !7, i64 0}
!15 = !{!12, !7, i64 10}
!16 = !{!12, !14, i64 24}
!17 = !{!12, !14, i64 16}
!18 = !{!14, !14, i64 0}
!19 = !{!12, !6, i64 0}
!20 = !{!21, !7, i64 2}
!21 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5, !13, i64 6, !13, i64 8, !14, i64 16, !14, i64 24, !14, i64 32, !14, i64 40, !14, i64 48, !14, i64 56, !14, i64 64, !14, i64 72, !14, i64 80, !7, i64 88}
!22 = !{!7, !7, i64 0}
!23 = !{!12, !14, i64 32}
!24 = !{!12, !14, i64 40}
!25 = !{!21, !7, i64 1}
!26 = !{!12, !14, i64 48}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}


; 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: nounwind uwtable
declare dso_local i64 @clust2sect(ptr noundef, i64 noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local i32 @f_read(ptr noundef %0, ptr noundef %1, i32 noundef %2, ptr nocapture noundef %3) local_unnamed_addr #0 {
  store i32 0, ptr %3, align 4, !tbaa !5
  %5 = tail call i32 @validate(ptr noundef %0)
  %.not = icmp eq i32 %5, 0
  br i1 %.not, label %6, label %.loopexit

6:                                                ; preds = %4
  %7 = getelementptr inbounds i8, ptr %0, i64 11
  %8 = load i8, ptr %7, align 1, !tbaa !9
  %.not101 = icmp eq i8 %8, 0
  br i1 %.not101, label %11, label %9

9:                                                ; preds = %6
  %10 = zext i8 %8 to i32
  br label %.loopexit

11:                                               ; preds = %6
  %12 = getelementptr inbounds i8, ptr %0, i64 10
  %13 = load i8, ptr %12, align 2, !tbaa !14
  %14 = and i8 %13, 1
  %.not102 = icmp eq i8 %14, 0
  br i1 %.not102, label %.loopexit, label %15

15:                                               ; preds = %11
  %16 = getelementptr inbounds i8, ptr %0, i64 24
  %17 = load i64, ptr %16, align 8, !tbaa !15
  %18 = getelementptr inbounds i8, ptr %0, i64 16
  %19 = load i64, ptr %18, align 8, !tbaa !16
  %20 = sub i64 %17, %19
  %21 = zext i32 %2 to i64
  %22 = icmp ult i64 %20, %21
  %23 = trunc nuw i64 %20 to i32
  %spec.select = select i1 %22, i32 %23, i32 %2
  %.not103115 = icmp eq i32 %spec.select, 0
  br i1 %.not103115, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %15
  %24 = getelementptr inbounds i8, ptr %0, i64 40
  %25 = getelementptr inbounds i8, ptr %0, i64 32
  %26 = getelementptr inbounds i8, ptr %0, i64 48
  %27 = getelementptr inbounds i8, ptr %0, i64 72
  br label %28

28:                                               ; preds = %.lr.ph, %117
  %29 = phi i64 [ %19, %.lr.ph ], [ %121, %117 ]
  %.0117 = phi ptr [ %1, %.lr.ph ], [ %119, %117 ]
  %.189116 = phi i32 [ %spec.select, %.lr.ph ], [ %124, %117 ]
  %30 = and i64 %29, 511
  %31 = icmp eq i64 %30, 0
  br i1 %31, label %32, label %111

32:                                               ; preds = %28
  %33 = lshr exact i64 %29, 9
  %34 = load ptr, ptr %0, align 8, !tbaa !17
  %35 = getelementptr inbounds i8, ptr %34, i64 2
  %36 = load i8, ptr %35, align 2, !tbaa !18
  %37 = zext i8 %36 to i64
  %38 = add nuw nsw i64 %37, 255
  %39 = and i64 %38, %33
  %40 = and i64 %39, 255
  %.not104 = icmp eq i64 %40, 0
  br i1 %.not104, label %41, label %._crit_edge

._crit_edge:                                      ; preds = %32
  %.pre118 = load i64, ptr %24, align 8, !tbaa !20
  br label %55

41:                                               ; preds = %32
  %42 = icmp eq i64 %29, 0
  br i1 %42, label %43, label %45

43:                                               ; preds = %41
  %44 = load i64, ptr %25, align 8, !tbaa !21
  br label %48

45:                                               ; preds = %41
  %46 = load i64, ptr %24, align 8, !tbaa !20
  %47 = tail call i64 @get_fat(ptr noundef nonnull %34, i64 noundef %46)
  br label %48

48:                                               ; preds = %45, %43
  %.090 = phi i64 [ %44, %43 ], [ %47, %45 ]
  %49 = icmp ult i64 %.090, 2
  br i1 %49, label %50, label %51

50:                                               ; preds = %48
  store i8 2, ptr %7, align 1, !tbaa !9
  br label %.loopexit

51:                                               ; preds = %48
  %52 = icmp eq i64 %.090, 4294967295
  br i1 %52, label %53, label %54

53:                                               ; preds = %51
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %.loopexit

54:                                               ; preds = %51
  store i64 %.090, ptr %24, align 8, !tbaa !20
  %.pre = load ptr, ptr %0, align 8, !tbaa !17
  br label %55

55:                                               ; preds = %._crit_edge, %54
  %56 = phi i64 [ %.090, %54 ], [ %.pre118, %._crit_edge ]
  %57 = phi ptr [ %.pre, %54 ], [ %34, %._crit_edge ]
  %58 = tail call i64 @clust2sect(ptr noundef %57, i64 noundef %56)
  %.not105 = icmp eq i64 %58, 0
  br i1 %.not105, label %59, label %60

59:                                               ; preds = %55
  store i8 2, ptr %7, align 1, !tbaa !9
  br label %.loopexit

60:                                               ; preds = %55
  %61 = add i64 %58, %40
  %.not106 = icmp ult i32 %.189116, 512
  br i1 %.not106, label %90, label %62

62:                                               ; preds = %60
  %63 = lshr i32 %.189116, 9
  %64 = trunc nuw nsw i64 %39 to i32
  %65 = and i32 %64, 255
  %66 = add nuw nsw i32 %65, %63
  %67 = load ptr, ptr %0, align 8, !tbaa !17
  %68 = getelementptr inbounds i8, ptr %67, i64 2
  %69 = load i8, ptr %68, align 2, !tbaa !18
  %70 = zext i8 %69 to i32
  %71 = icmp ugt i32 %66, %70
  %72 = sub nsw i32 %70, %65
  %spec.select113 = select i1 %71, i32 %72, i32 %63
  %73 = getelementptr inbounds i8, ptr %67, i64 1
  %74 = load i8, ptr %73, align 1, !tbaa !22
  %75 = tail call i32 @disk_read(i8 noundef zeroext %74, ptr noundef %.0117, i64 noundef %61, i32 noundef %spec.select113) #3
  %.not111 = icmp eq i32 %75, 0
  br i1 %.not111, label %77, label %76

76:                                               ; preds = %62
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %.loopexit

77:                                               ; preds = %62
  %78 = load i8, ptr %12, align 2, !tbaa !14
  %79 = and i8 %78, 64
  %.not112 = icmp eq i8 %79, 0
  br i1 %.not112, label %88, label %80

80:                                               ; preds = %77
  %81 = load i64, ptr %26, align 8, !tbaa !23
  %82 = sub i64 %81, %61
  %83 = zext i32 %spec.select113 to i64
  %84 = icmp ult i64 %82, %83
  br i1 %84, label %85, label %88

85:                                               ; preds = %80
  %86 = shl nuw nsw i64 %82, 9
  %87 = getelementptr inbounds i8, ptr %.0117, i64 %86
  tail call void @mem_cpy(ptr noundef %87, ptr noundef nonnull %27, i32 noundef 512)
  br label %88

88:                                               ; preds = %85, %80, %77
  %89 = shl i32 %spec.select113, 9
  br label %117

90:                                               ; preds = %60
  %91 = load i64, ptr %26, align 8, !tbaa !23
  %.not107 = icmp eq i64 %91, %61
  br i1 %.not107, label %110, label %92

92:                                               ; preds = %90
  %93 = load i8, ptr %12, align 2, !tbaa !14
  %94 = and i8 %93, 64
  %.not108 = icmp eq i8 %94, 0
  br i1 %.not108, label %104, label %95

95:                                               ; preds = %92
  %96 = load ptr, ptr %0, align 8, !tbaa !17
  %97 = getelementptr inbounds i8, ptr %96, i64 1
  %98 = load i8, ptr %97, align 1, !tbaa !22
  %99 = tail call i32 @disk_write(i8 noundef zeroext %98, ptr noundef nonnull %27, i64 noundef %91, i32 noundef 1) #3
  %.not109 = icmp eq i32 %99, 0
  br i1 %.not109, label %101, label %100

100:                                              ; preds = %95
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %.loopexit

101:                                              ; preds = %95
  %102 = load i8, ptr %12, align 2, !tbaa !14
  %103 = and i8 %102, -65
  store i8 %103, ptr %12, align 2, !tbaa !14
  br label %104

104:                                              ; preds = %101, %92
  %105 = load ptr, ptr %0, align 8, !tbaa !17
  %106 = getelementptr inbounds i8, ptr %105, i64 1
  %107 = load i8, ptr %106, align 1, !tbaa !22
  %108 = tail call i32 @disk_read(i8 noundef zeroext %107, ptr noundef nonnull %27, i64 noundef %61, i32 noundef 1) #3
  %.not110 = icmp eq i32 %108, 0
  br i1 %.not110, label %110, label %109

109:                                              ; preds = %104
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %.loopexit

110:                                              ; preds = %104, %90
  store i64 %61, ptr %26, align 8, !tbaa !23
  %.pre119 = load i64, ptr %18, align 8, !tbaa !16
  %.pre120 = and i64 %.pre119, 511
  br label %111

111:                                              ; preds = %110, %28
  %.pre-phi = phi i64 [ %.pre120, %110 ], [ %30, %28 ]
  %112 = phi i64 [ %.pre119, %110 ], [ %29, %28 ]
  %113 = trunc i64 %112 to i32
  %114 = and i32 %113, 511
  %115 = sub nuw nsw i32 512, %114
  %spec.select114 = tail call i32 @llvm.umin.i32(i32 %115, i32 %.189116)
  %116 = getelementptr inbounds [512 x i8], ptr %27, i64 0, i64 %.pre-phi
  tail call void @mem_cpy(ptr noundef %.0117, ptr noundef nonnull %116, i32 noundef %spec.select114)
  br label %117

117:                                              ; preds = %111, %88
  %.1 = phi i32 [ %89, %88 ], [ %spec.select114, %111 ]
  %118 = zext i32 %.1 to i64
  %119 = getelementptr inbounds i8, ptr %.0117, i64 %118
  %120 = load i64, ptr %18, align 8, !tbaa !16
  %121 = add i64 %120, %118
  store i64 %121, ptr %18, align 8, !tbaa !16
  %122 = load i32, ptr %3, align 4, !tbaa !5
  %123 = add i32 %122, %.1
  store i32 %123, ptr %3, align 4, !tbaa !5
  %124 = sub i32 %.189116, %.1
  %.not103 = icmp eq i32 %124, 0
  br i1 %.not103, label %.loopexit, label %28, !llvm.loop !24

.loopexit:                                        ; preds = %117, %15, %11, %4, %109, %100, %76, %59, %53, %50, %9
  %.085 = phi i32 [ %10, %9 ], [ 1, %76 ], [ 1, %100 ], [ 1, %109 ], [ 2, %59 ], [ 2, %50 ], [ 1, %53 ], [ %5, %4 ], [ 7, %11 ], [ 0, %15 ], [ 0, %117 ]
  ret i32 %.085
}

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

declare i32 @disk_read(i8 noundef zeroext, ptr noundef, i64 noundef, i32 noundef) local_unnamed_addr #1

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

declare i32 @disk_write(i8 noundef zeroext, ptr noundef, i64 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.umin.i32(i32, i32) #2

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

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

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


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