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

; Function Attrs: nounwind uwtable
define dso_local i32 @f_write(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 i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i8, align 1
  %17 = 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 4, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  %18 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %18, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #3
  %19 = load ptr, ptr %9, align 8, !tbaa !5
  store i32 0, ptr %19, align 4, !tbaa !9
  %20 = load ptr, ptr %6, align 8, !tbaa !5
  %21 = call i32 @validate(ptr noundef %20)
  store i32 %21, ptr %10, align 4, !tbaa !9
  %22 = load i32, ptr %10, align 4, !tbaa !9
  %23 = icmp ne i32 %22, 0
  br i1 %23, label %24, label %26

24:                                               ; preds = %4
  %25 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %25, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

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

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

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

43:                                               ; preds = %36
  store i32 7, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

44:                                               ; preds = %36
  %45 = load ptr, ptr %6, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.FIL, ptr %45, i32 0, i32 4
  %47 = load i64, ptr %46, align 8, !tbaa !16
  %48 = load i32, ptr %8, align 4, !tbaa !9
  %49 = zext i32 %48 to i64
  %50 = add i64 %47, %49
  %51 = load ptr, ptr %6, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.FIL, ptr %51, i32 0, i32 4
  %53 = load i64, ptr %52, align 8, !tbaa !16
  %54 = icmp ult i64 %50, %53
  br i1 %54, label %55, label %56

55:                                               ; preds = %44
  store i32 0, ptr %8, align 4, !tbaa !9
  br label %56

56:                                               ; preds = %55, %44
  br label %57

57:                                               ; preds = %318, %56
  %58 = load i32, ptr %8, align 4, !tbaa !9
  %59 = icmp ne i32 %58, 0
  br i1 %59, label %60, label %336

60:                                               ; preds = %57
  %61 = load ptr, ptr %6, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.FIL, ptr %61, i32 0, i32 4
  %63 = load i64, ptr %62, align 8, !tbaa !16
  %64 = urem i64 %63, 512
  %65 = icmp eq i64 %64, 0
  br i1 %65, label %66, label %290

66:                                               ; preds = %60
  %67 = load ptr, ptr %6, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.FIL, ptr %67, i32 0, i32 4
  %69 = load i64, ptr %68, align 8, !tbaa !16
  %70 = udiv i64 %69, 512
  %71 = load ptr, ptr %6, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.FIL, ptr %71, i32 0, i32 0
  %73 = load ptr, ptr %72, align 8, !tbaa !17
  %74 = getelementptr inbounds %struct.FATFS, ptr %73, i32 0, i32 2
  %75 = load i8, ptr %74, align 2, !tbaa !18
  %76 = zext i8 %75 to i32
  %77 = sub nsw i32 %76, 1
  %78 = sext i32 %77 to i64
  %79 = and i64 %70, %78
  %80 = trunc i64 %79 to i8
  store i8 %80, ptr %16, align 1, !tbaa !20
  %81 = load i8, ptr %16, align 1, !tbaa !20
  %82 = icmp ne i8 %81, 0
  br i1 %82, label %137, label %83

83:                                               ; preds = %66
  %84 = load ptr, ptr %6, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.FIL, ptr %84, i32 0, i32 4
  %86 = load i64, ptr %85, align 8, !tbaa !16
  %87 = icmp eq i64 %86, 0
  br i1 %87, label %88, label %100

88:                                               ; preds = %83
  %89 = load ptr, ptr %6, align 8, !tbaa !5
  %90 = getelementptr inbounds %struct.FIL, ptr %89, i32 0, i32 6
  %91 = load i64, ptr %90, align 8, !tbaa !21
  store i64 %91, ptr %11, align 8, !tbaa !22
  %92 = load i64, ptr %11, align 8, !tbaa !22
  %93 = icmp eq i64 %92, 0
  br i1 %93, label %94, label %99

94:                                               ; preds = %88
  %95 = load ptr, ptr %6, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.FIL, ptr %95, i32 0, i32 0
  %97 = load ptr, ptr %96, align 8, !tbaa !17
  %98 = call i64 @create_chain(ptr noundef %97, i64 noundef 0)
  store i64 %98, ptr %11, align 8, !tbaa !22
  br label %99

99:                                               ; preds = %94, %88
  br label %108

100:                                              ; preds = %83
  %101 = load ptr, ptr %6, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.FIL, ptr %101, i32 0, i32 0
  %103 = load ptr, ptr %102, align 8, !tbaa !17
  %104 = load ptr, ptr %6, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.FIL, ptr %104, i32 0, i32 7
  %106 = load i64, ptr %105, align 8, !tbaa !23
  %107 = call i64 @create_chain(ptr noundef %103, i64 noundef %106)
  store i64 %107, ptr %11, align 8, !tbaa !22
  br label %108

108:                                              ; preds = %100, %99
  %109 = load i64, ptr %11, align 8, !tbaa !22
  %110 = icmp eq i64 %109, 0
  br i1 %110, label %111, label %112

111:                                              ; preds = %108
  br label %336

112:                                              ; preds = %108
  %113 = load i64, ptr %11, align 8, !tbaa !22
  %114 = icmp eq i64 %113, 1
  br i1 %114, label %115, label %118

115:                                              ; preds = %112
  %116 = load ptr, ptr %6, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.FIL, ptr %116, i32 0, i32 3
  store i8 2, ptr %117, align 1, !tbaa !11
  store i32 2, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

118:                                              ; preds = %112
  %119 = load i64, ptr %11, align 8, !tbaa !22
  %120 = icmp eq i64 %119, 4294967295
  br i1 %120, label %121, label %124

121:                                              ; preds = %118
  %122 = load ptr, ptr %6, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.FIL, ptr %122, i32 0, i32 3
  store i8 1, ptr %123, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

124:                                              ; preds = %118
  %125 = load i64, ptr %11, align 8, !tbaa !22
  %126 = load ptr, ptr %6, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.FIL, ptr %126, i32 0, i32 7
  store i64 %125, ptr %127, align 8, !tbaa !23
  %128 = load ptr, ptr %6, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.FIL, ptr %128, i32 0, i32 6
  %130 = load i64, ptr %129, align 8, !tbaa !21
  %131 = icmp eq i64 %130, 0
  br i1 %131, label %132, label %136

132:                                              ; preds = %124
  %133 = load i64, ptr %11, align 8, !tbaa !22
  %134 = load ptr, ptr %6, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.FIL, ptr %134, i32 0, i32 6
  store i64 %133, ptr %135, align 8, !tbaa !21
  br label %136

136:                                              ; preds = %132, %124
  br label %137

137:                                              ; preds = %136, %66
  %138 = load ptr, ptr %6, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.FIL, ptr %138, i32 0, i32 2
  %140 = load i8, ptr %139, align 2, !tbaa !15
  %141 = zext i8 %140 to i32
  %142 = and i32 %141, 64
  %143 = icmp ne i32 %142, 0
  br i1 %143, label %144, label %168

144:                                              ; preds = %137
  %145 = load ptr, ptr %6, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.FIL, ptr %145, i32 0, i32 0
  %147 = load ptr, ptr %146, align 8, !tbaa !17
  %148 = getelementptr inbounds %struct.FATFS, ptr %147, i32 0, i32 1
  %149 = load i8, ptr %148, align 1, !tbaa !24
  %150 = load ptr, ptr %6, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.FIL, ptr %150, i32 0, i32 11
  %152 = getelementptr inbounds [512 x i8], ptr %151, i64 0, i64 0
  %153 = load ptr, ptr %6, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.FIL, ptr %153, i32 0, i32 8
  %155 = load i64, ptr %154, align 8, !tbaa !25
  %156 = call i32 @disk_write(i8 noundef zeroext %149, ptr noundef %152, i64 noundef %155, i32 noundef 1)
  %157 = icmp ne i32 %156, 0
  br i1 %157, label %158, label %161

158:                                              ; preds = %144
  %159 = load ptr, ptr %6, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.FIL, ptr %159, i32 0, i32 3
  store i8 1, ptr %160, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

161:                                              ; preds = %144
  %162 = load ptr, ptr %6, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.FIL, ptr %162, i32 0, i32 2
  %164 = load i8, ptr %163, align 2, !tbaa !15
  %165 = zext i8 %164 to i32
  %166 = and i32 %165, -65
  %167 = trunc i32 %166 to i8
  store i8 %167, ptr %163, align 2, !tbaa !15
  br label %168

168:                                              ; preds = %161, %137
  %169 = load ptr, ptr %6, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.FIL, ptr %169, i32 0, i32 0
  %171 = load ptr, ptr %170, align 8, !tbaa !17
  %172 = load ptr, ptr %6, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.FIL, ptr %172, i32 0, i32 7
  %174 = load i64, ptr %173, align 8, !tbaa !23
  %175 = call i64 @clust2sect(ptr noundef %171, i64 noundef %174)
  store i64 %175, ptr %12, align 8, !tbaa !22
  %176 = load i64, ptr %12, align 8, !tbaa !22
  %177 = icmp ne i64 %176, 0
  br i1 %177, label %181, label %178

178:                                              ; preds = %168
  %179 = load ptr, ptr %6, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.FIL, ptr %179, i32 0, i32 3
  store i8 2, ptr %180, align 1, !tbaa !11
  store i32 2, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

181:                                              ; preds = %168
  %182 = load i8, ptr %16, align 1, !tbaa !20
  %183 = zext i8 %182 to i64
  %184 = load i64, ptr %12, align 8, !tbaa !22
  %185 = add i64 %184, %183
  store i64 %185, ptr %12, align 8, !tbaa !22
  %186 = load i32, ptr %8, align 4, !tbaa !9
  %187 = udiv i32 %186, 512
  store i32 %187, ptr %14, align 4, !tbaa !9
  %188 = load i32, ptr %14, align 4, !tbaa !9
  %189 = icmp ne i32 %188, 0
  br i1 %189, label %190, label %256

190:                                              ; preds = %181
  %191 = load i8, ptr %16, align 1, !tbaa !20
  %192 = zext i8 %191 to i32
  %193 = load i32, ptr %14, align 4, !tbaa !9
  %194 = add i32 %192, %193
  %195 = load ptr, ptr %6, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.FIL, ptr %195, i32 0, i32 0
  %197 = load ptr, ptr %196, align 8, !tbaa !17
  %198 = getelementptr inbounds %struct.FATFS, ptr %197, i32 0, i32 2
  %199 = load i8, ptr %198, align 2, !tbaa !18
  %200 = zext i8 %199 to i32
  %201 = icmp ugt i32 %194, %200
  br i1 %201, label %202, label %212

202:                                              ; preds = %190
  %203 = load ptr, ptr %6, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.FIL, ptr %203, i32 0, i32 0
  %205 = load ptr, ptr %204, align 8, !tbaa !17
  %206 = getelementptr inbounds %struct.FATFS, ptr %205, i32 0, i32 2
  %207 = load i8, ptr %206, align 2, !tbaa !18
  %208 = zext i8 %207 to i32
  %209 = load i8, ptr %16, align 1, !tbaa !20
  %210 = zext i8 %209 to i32
  %211 = sub nsw i32 %208, %210
  store i32 %211, ptr %14, align 4, !tbaa !9
  br label %212

212:                                              ; preds = %202, %190
  %213 = load ptr, ptr %6, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.FIL, ptr %213, i32 0, i32 0
  %215 = load ptr, ptr %214, align 8, !tbaa !17
  %216 = getelementptr inbounds %struct.FATFS, ptr %215, i32 0, i32 1
  %217 = load i8, ptr %216, align 1, !tbaa !24
  %218 = load ptr, ptr %15, align 8, !tbaa !5
  %219 = load i64, ptr %12, align 8, !tbaa !22
  %220 = load i32, ptr %14, align 4, !tbaa !9
  %221 = call i32 @disk_write(i8 noundef zeroext %217, ptr noundef %218, i64 noundef %219, i32 noundef %220)
  %222 = icmp ne i32 %221, 0
  br i1 %222, label %223, label %226

223:                                              ; preds = %212
  %224 = load ptr, ptr %6, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.FIL, ptr %224, i32 0, i32 3
  store i8 1, ptr %225, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

226:                                              ; preds = %212
  %227 = load ptr, ptr %6, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.FIL, ptr %227, i32 0, i32 8
  %229 = load i64, ptr %228, align 8, !tbaa !25
  %230 = load i64, ptr %12, align 8, !tbaa !22
  %231 = sub i64 %229, %230
  %232 = load i32, ptr %14, align 4, !tbaa !9
  %233 = zext i32 %232 to i64
  %234 = icmp ult i64 %231, %233
  br i1 %234, label %235, label %253

235:                                              ; preds = %226
  %236 = load ptr, ptr %6, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.FIL, ptr %236, i32 0, i32 11
  %238 = getelementptr inbounds [512 x i8], ptr %237, i64 0, i64 0
  %239 = load ptr, ptr %15, align 8, !tbaa !5
  %240 = load ptr, ptr %6, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.FIL, ptr %240, i32 0, i32 8
  %242 = load i64, ptr %241, align 8, !tbaa !25
  %243 = load i64, ptr %12, align 8, !tbaa !22
  %244 = sub i64 %242, %243
  %245 = mul i64 %244, 512
  %246 = getelementptr inbounds i8, ptr %239, i64 %245
  call void @mem_cpy(ptr noundef %238, ptr noundef %246, i32 noundef 512)
  %247 = load ptr, ptr %6, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.FIL, ptr %247, i32 0, i32 2
  %249 = load i8, ptr %248, align 2, !tbaa !15
  %250 = zext i8 %249 to i32
  %251 = and i32 %250, -65
  %252 = trunc i32 %251 to i8
  store i8 %252, ptr %248, align 2, !tbaa !15
  br label %253

253:                                              ; preds = %235, %226
  %254 = load i32, ptr %14, align 4, !tbaa !9
  %255 = mul i32 512, %254
  store i32 %255, ptr %13, align 4, !tbaa !9
  br label %318

256:                                              ; preds = %181
  %257 = load ptr, ptr %6, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.FIL, ptr %257, i32 0, i32 8
  %259 = load i64, ptr %258, align 8, !tbaa !25
  %260 = load i64, ptr %12, align 8, !tbaa !22
  %261 = icmp ne i64 %259, %260
  br i1 %261, label %262, label %286

262:                                              ; preds = %256
  %263 = load ptr, ptr %6, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.FIL, ptr %263, i32 0, i32 4
  %265 = load i64, ptr %264, align 8, !tbaa !16
  %266 = load ptr, ptr %6, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct.FIL, ptr %266, i32 0, i32 5
  %268 = load i64, ptr %267, align 8, !tbaa !26
  %269 = icmp ult i64 %265, %268
  br i1 %269, label %270, label %285

270:                                              ; preds = %262
  %271 = load ptr, ptr %6, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.FIL, ptr %271, i32 0, i32 0
  %273 = load ptr, ptr %272, align 8, !tbaa !17
  %274 = getelementptr inbounds %struct.FATFS, ptr %273, i32 0, i32 1
  %275 = load i8, ptr %274, align 1, !tbaa !24
  %276 = load ptr, ptr %6, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.FIL, ptr %276, i32 0, i32 11
  %278 = getelementptr inbounds [512 x i8], ptr %277, i64 0, i64 0
  %279 = load i64, ptr %12, align 8, !tbaa !22
  %280 = call i32 @disk_read(i8 noundef zeroext %275, ptr noundef %278, i64 noundef %279, i32 noundef 1)
  %281 = icmp ne i32 %280, 0
  br i1 %281, label %282, label %285

282:                                              ; preds = %270
  %283 = load ptr, ptr %6, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.FIL, ptr %283, i32 0, i32 3
  store i8 1, ptr %284, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

285:                                              ; preds = %270, %262
  br label %286

286:                                              ; preds = %285, %256
  %287 = load i64, ptr %12, align 8, !tbaa !22
  %288 = load ptr, ptr %6, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.FIL, ptr %288, i32 0, i32 8
  store i64 %287, ptr %289, align 8, !tbaa !25
  br label %290

290:                                              ; preds = %286, %60
  %291 = load ptr, ptr %6, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.FIL, ptr %291, i32 0, i32 4
  %293 = load i64, ptr %292, align 8, !tbaa !16
  %294 = trunc i64 %293 to i32
  %295 = urem i32 %294, 512
  %296 = sub i32 512, %295
  store i32 %296, ptr %13, align 4, !tbaa !9
  %297 = load i32, ptr %13, align 4, !tbaa !9
  %298 = load i32, ptr %8, align 4, !tbaa !9
  %299 = icmp ugt i32 %297, %298
  br i1 %299, label %300, label %302

300:                                              ; preds = %290
  %301 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %301, ptr %13, align 4, !tbaa !9
  br label %302

302:                                              ; preds = %300, %290
  %303 = load ptr, ptr %6, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.FIL, ptr %303, i32 0, i32 11
  %305 = load ptr, ptr %6, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.FIL, ptr %305, i32 0, i32 4
  %307 = load i64, ptr %306, align 8, !tbaa !16
  %308 = urem i64 %307, 512
  %309 = getelementptr inbounds [512 x i8], ptr %304, i64 0, i64 %308
  %310 = load ptr, ptr %15, align 8, !tbaa !5
  %311 = load i32, ptr %13, align 4, !tbaa !9
  call void @mem_cpy(ptr noundef %309, ptr noundef %310, i32 noundef %311)
  %312 = load ptr, ptr %6, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.FIL, ptr %312, i32 0, i32 2
  %314 = load i8, ptr %313, align 2, !tbaa !15
  %315 = zext i8 %314 to i32
  %316 = or i32 %315, 64
  %317 = trunc i32 %316 to i8
  store i8 %317, ptr %313, align 2, !tbaa !15
  br label %318

318:                                              ; preds = %302, %253
  %319 = load i32, ptr %13, align 4, !tbaa !9
  %320 = load ptr, ptr %15, align 8, !tbaa !5
  %321 = zext i32 %319 to i64
  %322 = getelementptr inbounds i8, ptr %320, i64 %321
  store ptr %322, ptr %15, align 8, !tbaa !5
  %323 = load i32, ptr %13, align 4, !tbaa !9
  %324 = zext i32 %323 to i64
  %325 = load ptr, ptr %6, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.FIL, ptr %325, i32 0, i32 4
  %327 = load i64, ptr %326, align 8, !tbaa !16
  %328 = add i64 %327, %324
  store i64 %328, ptr %326, align 8, !tbaa !16
  %329 = load i32, ptr %13, align 4, !tbaa !9
  %330 = load ptr, ptr %9, align 8, !tbaa !5
  %331 = load i32, ptr %330, align 4, !tbaa !9
  %332 = add i32 %331, %329
  store i32 %332, ptr %330, align 4, !tbaa !9
  %333 = load i32, ptr %13, align 4, !tbaa !9
  %334 = load i32, ptr %8, align 4, !tbaa !9
  %335 = sub i32 %334, %333
  store i32 %335, ptr %8, align 4, !tbaa !9
  br label %57, !llvm.loop !27

336:                                              ; preds = %111, %57
  %337 = load ptr, ptr %6, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct.FIL, ptr %337, i32 0, i32 4
  %339 = load i64, ptr %338, align 8, !tbaa !16
  %340 = load ptr, ptr %6, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.FIL, ptr %340, i32 0, i32 5
  %342 = load i64, ptr %341, align 8, !tbaa !26
  %343 = icmp ugt i64 %339, %342
  br i1 %343, label %344, label %350

344:                                              ; preds = %336
  %345 = load ptr, ptr %6, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.FIL, ptr %345, i32 0, i32 4
  %347 = load i64, ptr %346, align 8, !tbaa !16
  %348 = load ptr, ptr %6, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.FIL, ptr %348, i32 0, i32 5
  store i64 %347, ptr %349, align 8, !tbaa !26
  br label %350

350:                                              ; preds = %344, %336
  %351 = load ptr, ptr %6, align 8, !tbaa !5
  %352 = getelementptr inbounds %struct.FIL, ptr %351, i32 0, i32 2
  %353 = load i8, ptr %352, align 2, !tbaa !15
  %354 = zext i8 %353 to i32
  %355 = or i32 %354, 32
  %356 = trunc i32 %355 to i8
  store i8 %356, ptr %352, align 2, !tbaa !15
  store i32 0, ptr %5, align 4
  store i32 1, ptr %17, align 4
  br label %357

357:                                              ; preds = %350, %282, %223, %178, %158, %121, %115, %43, %31, %24
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, 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
  %358 = load i32, ptr %5, align 4
  ret i32 %358
}

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

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 16}
!17 = !{!12, !6, 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, !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}
!20 = !{!7, !7, i64 0}
!21 = !{!12, !14, i64 32}
!22 = !{!14, !14, i64 0}
!23 = !{!12, !14, i64 40}
!24 = !{!19, !7, i64 1}
!25 = !{!12, !14, i64 48}
!26 = !{!12, !14, i64 24}
!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 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: nounwind uwtable
define dso_local i32 @f_write(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 %135

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

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

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

15:                                               ; preds = %11
  %16 = getelementptr inbounds i8, ptr %0, i64 16
  %17 = load i64, ptr %16, align 8, !tbaa !15
  %18 = zext i32 %2 to i64
  %19 = xor i64 %17, -1
  %20 = icmp ult i64 %19, %18
  %.not114125128 = icmp eq i32 %2, 0
  %.not114125 = or i1 %20, %.not114125128
  br i1 %.not114125, label %._crit_edge, label %.lr.ph

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

26:                                               ; preds = %.lr.ph, %select.unfold
  %27 = phi i64 [ %17, %.lr.ph ], [ %123, %select.unfold ]
  %.097127 = phi ptr [ %1, %.lr.ph ], [ %121, %select.unfold ]
  %.0101126 = phi i32 [ %2, %.lr.ph ], [ %126, %select.unfold ]
  %28 = and i64 %27, 511
  %29 = icmp eq i64 %28, 0
  br i1 %29, label %30, label %112

30:                                               ; preds = %26
  %31 = lshr exact i64 %27, 9
  %32 = load ptr, ptr %0, align 8, !tbaa !16
  %33 = getelementptr inbounds i8, ptr %32, i64 2
  %34 = load i8, ptr %33, align 2, !tbaa !17
  %35 = zext i8 %34 to i64
  %36 = add nuw nsw i64 %35, 255
  %37 = and i64 %36, %31
  %38 = and i64 %37, 255
  %.not115 = icmp eq i64 %38, 0
  br i1 %.not115, label %39, label %54

39:                                               ; preds = %30
  %40 = icmp eq i64 %27, 0
  br i1 %40, label %41, label %44

41:                                               ; preds = %39
  %42 = load i64, ptr %22, align 8, !tbaa !19
  %43 = icmp eq i64 %42, 0
  br i1 %43, label %.sink.split, label %47

44:                                               ; preds = %39
  %45 = load i64, ptr %21, align 8, !tbaa !20
  br label %.sink.split

.sink.split:                                      ; preds = %41, %44
  %.sink = phi i64 [ %45, %44 ], [ 0, %41 ]
  %46 = tail call i64 @create_chain(ptr noundef nonnull %32, i64 noundef %.sink)
  br label %47

47:                                               ; preds = %.sink.split, %41
  %.0100 = phi i64 [ %42, %41 ], [ %46, %.sink.split ]
  switch i64 %.0100, label %50 [
    i64 0, label %.._crit_edge.loopexit_crit_edge
    i64 1, label %48
    i64 4294967295, label %49
  ]

.._crit_edge.loopexit_crit_edge:                  ; preds = %47
  %.pre131.pre = load i64, ptr %16, align 8, !tbaa !15
  br label %._crit_edge

48:                                               ; preds = %47
  store i8 2, ptr %7, align 1, !tbaa !9
  br label %135

49:                                               ; preds = %47
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %135

50:                                               ; preds = %47
  store i64 %.0100, ptr %21, align 8, !tbaa !20
  %51 = load i64, ptr %22, align 8, !tbaa !19
  %52 = icmp eq i64 %51, 0
  br i1 %52, label %53, label %54

53:                                               ; preds = %50
  store i64 %.0100, ptr %22, align 8, !tbaa !19
  br label %54

54:                                               ; preds = %50, %53, %30
  %55 = load i8, ptr %12, align 2, !tbaa !14
  %56 = and i8 %55, 64
  %.not116 = icmp eq i8 %56, 0
  %.pre129 = load ptr, ptr %0, align 8, !tbaa !16
  br i1 %.not116, label %66, label %57

57:                                               ; preds = %54
  %58 = getelementptr inbounds i8, ptr %.pre129, i64 1
  %59 = load i8, ptr %58, align 1, !tbaa !21
  %60 = load i64, ptr %24, align 8, !tbaa !22
  %61 = tail call i32 @disk_write(i8 noundef zeroext %59, ptr noundef nonnull %23, i64 noundef %60, i32 noundef 1) #3
  %.not117 = icmp eq i32 %61, 0
  br i1 %.not117, label %63, label %62

62:                                               ; preds = %57
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %135

63:                                               ; preds = %57
  %64 = load i8, ptr %12, align 2, !tbaa !14
  %65 = and i8 %64, -65
  store i8 %65, ptr %12, align 2, !tbaa !14
  %.pre = load ptr, ptr %0, align 8, !tbaa !16
  br label %66

66:                                               ; preds = %63, %54
  %67 = phi ptr [ %.pre, %63 ], [ %.pre129, %54 ]
  %68 = load i64, ptr %21, align 8, !tbaa !20
  %69 = tail call i64 @clust2sect(ptr noundef %67, i64 noundef %68)
  %.not118 = icmp eq i64 %69, 0
  br i1 %.not118, label %70, label %71

70:                                               ; preds = %66
  store i8 2, ptr %7, align 1, !tbaa !9
  br label %135

71:                                               ; preds = %66
  %72 = add i64 %69, %38
  %.not119 = icmp ult i32 %.0101126, 512
  br i1 %.not119, label %100, label %73

73:                                               ; preds = %71
  %74 = lshr i32 %.0101126, 9
  %75 = trunc nuw nsw i64 %37 to i32
  %76 = and i32 %75, 255
  %77 = add nuw nsw i32 %76, %74
  %78 = load ptr, ptr %0, align 8, !tbaa !16
  %79 = getelementptr inbounds i8, ptr %78, i64 2
  %80 = load i8, ptr %79, align 2, !tbaa !17
  %81 = zext i8 %80 to i32
  %82 = icmp ugt i32 %77, %81
  %83 = sub nsw i32 %81, %76
  %spec.select = select i1 %82, i32 %83, i32 %74
  %84 = getelementptr inbounds i8, ptr %78, i64 1
  %85 = load i8, ptr %84, align 1, !tbaa !21
  %86 = tail call i32 @disk_write(i8 noundef zeroext %85, ptr noundef %.097127, i64 noundef %72, i32 noundef %spec.select) #3
  %.not122 = icmp eq i32 %86, 0
  br i1 %.not122, label %88, label %87

87:                                               ; preds = %73
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %135

88:                                               ; preds = %73
  %89 = load i64, ptr %24, align 8, !tbaa !22
  %90 = sub i64 %89, %72
  %91 = zext i32 %spec.select to i64
  %92 = icmp ult i64 %90, %91
  br i1 %92, label %93, label %98

93:                                               ; preds = %88
  %94 = shl nuw nsw i64 %90, 9
  %95 = getelementptr inbounds i8, ptr %.097127, i64 %94
  tail call void @mem_cpy(ptr noundef nonnull %23, ptr noundef %95, i32 noundef 512)
  %96 = load i8, ptr %12, align 2, !tbaa !14
  %97 = and i8 %96, -65
  store i8 %97, ptr %12, align 2, !tbaa !14
  br label %98

98:                                               ; preds = %93, %88
  %99 = shl i32 %spec.select, 9
  br label %select.unfold

100:                                              ; preds = %71
  %101 = load i64, ptr %24, align 8, !tbaa !22
  %.not120 = icmp eq i64 %101, %72
  %.pre130.pre133 = load i64, ptr %16, align 8, !tbaa !15
  br i1 %.not120, label %111, label %102

102:                                              ; preds = %100
  %103 = load i64, ptr %25, align 8, !tbaa !23
  %104 = icmp ult i64 %.pre130.pre133, %103
  br i1 %104, label %105, label %111

105:                                              ; preds = %102
  %106 = load ptr, ptr %0, align 8, !tbaa !16
  %107 = getelementptr inbounds i8, ptr %106, i64 1
  %108 = load i8, ptr %107, align 1, !tbaa !21
  %109 = tail call i32 @disk_read(i8 noundef zeroext %108, ptr noundef nonnull %23, i64 noundef %72, i32 noundef 1) #3
  %.not121 = icmp eq i32 %109, 0
  br i1 %.not121, label %._crit_edge132, label %110

._crit_edge132:                                   ; preds = %105
  %.pre130.pre = load i64, ptr %16, align 8, !tbaa !15
  br label %111

110:                                              ; preds = %105
  store i8 1, ptr %7, align 1, !tbaa !9
  br label %135

111:                                              ; preds = %._crit_edge132, %102, %100
  %.pre130 = phi i64 [ %.pre130.pre, %._crit_edge132 ], [ %.pre130.pre133, %102 ], [ %.pre130.pre133, %100 ]
  store i64 %72, ptr %24, align 8, !tbaa !22
  %.pre136 = and i64 %.pre130, 511
  br label %112

112:                                              ; preds = %111, %26
  %.pre-phi = phi i64 [ %.pre136, %111 ], [ %28, %26 ]
  %113 = phi i64 [ %.pre130, %111 ], [ %27, %26 ]
  %114 = trunc i64 %113 to i32
  %115 = and i32 %114, 511
  %116 = sub nuw nsw i32 512, %115
  %spec.select123 = tail call i32 @llvm.umin.i32(i32 %116, i32 %.0101126)
  %117 = getelementptr inbounds [512 x i8], ptr %23, i64 0, i64 %.pre-phi
  tail call void @mem_cpy(ptr noundef nonnull %117, ptr noundef %.097127, i32 noundef %spec.select123)
  %118 = load i8, ptr %12, align 2, !tbaa !14
  %119 = or i8 %118, 64
  store i8 %119, ptr %12, align 2, !tbaa !14
  br label %select.unfold

select.unfold:                                    ; preds = %112, %98
  %.1 = phi i32 [ %99, %98 ], [ %spec.select123, %112 ]
  %120 = zext i32 %.1 to i64
  %121 = getelementptr inbounds i8, ptr %.097127, i64 %120
  %122 = load i64, ptr %16, align 8, !tbaa !15
  %123 = add i64 %122, %120
  store i64 %123, ptr %16, align 8, !tbaa !15
  %124 = load i32, ptr %3, align 4, !tbaa !5
  %125 = add i32 %124, %.1
  store i32 %125, ptr %3, align 4, !tbaa !5
  %126 = sub i32 %.0101126, %.1
  %.not114 = icmp eq i32 %126, 0
  br i1 %.not114, label %._crit_edge, label %26, !llvm.loop !24

._crit_edge:                                      ; preds = %select.unfold, %.._crit_edge.loopexit_crit_edge, %15
  %127 = phi i64 [ %17, %15 ], [ %.pre131.pre, %.._crit_edge.loopexit_crit_edge ], [ %123, %select.unfold ]
  %128 = getelementptr inbounds i8, ptr %0, i64 24
  %129 = load i64, ptr %128, align 8, !tbaa !23
  %130 = icmp ugt i64 %127, %129
  br i1 %130, label %131, label %132

131:                                              ; preds = %._crit_edge
  store i64 %127, ptr %128, align 8, !tbaa !23
  br label %132

132:                                              ; preds = %131, %._crit_edge
  %133 = load i8, ptr %12, align 2, !tbaa !14
  %134 = or i8 %133, 32
  store i8 %134, ptr %12, align 2, !tbaa !14
  br label %135

135:                                              ; preds = %11, %4, %132, %110, %87, %70, %62, %49, %48, %9
  %.0 = phi i32 [ %10, %9 ], [ 1, %62 ], [ 1, %87 ], [ 1, %110 ], [ 2, %70 ], [ 0, %132 ], [ 2, %48 ], [ 1, %49 ], [ %5, %4 ], [ 7, %11 ]
  ret i32 %.0
}

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

; 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 16}
!16 = !{!10, !11, i64 0}
!17 = !{!18, !7, i64 2}
!18 = !{!"", !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}
!19 = !{!10, !13, i64 32}
!20 = !{!10, !13, i64 40}
!21 = !{!18, !7, i64 1}
!22 = !{!10, !13, i64 48}
!23 = !{!10, !13, i64 24}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}


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