; LLVM IR from bitbank2/AnimatedGIF :: examples/gif_from_spi_flash (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 { %struct.FFOBJID, i8, i8, i32, i32, i32, i32, ptr, [512 x i8] }
%struct.FFOBJID = type { ptr, i16, i8, i8, i32, i32 }
%struct.FATFS = type { i8, i8, i8, i8, i8, i16, i16, i16, i32, i32, i32, i32, i32, i32, i32, i32, i32, [512 x i8] }

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

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

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

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

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

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

declare i32 @disk_write(i8 noundef zeroext, ptr noundef, i32 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) #1 {
  %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 ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %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 4, 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 4, ptr %15) #3
  call void @llvm.lifetime.start.p0(i64 4, 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 = getelementptr inbounds %struct.FIL, ptr %21, i32 0, i32 0
  %23 = call i32 @validate(ptr noundef %22, ptr noundef %11)
  store i32 %23, ptr %10, align 4, !tbaa !9
  %24 = load i32, ptr %10, align 4, !tbaa !9
  %25 = icmp ne i32 %24, 0
  br i1 %25, label %32, label %26

26:                                               ; preds = %4
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.FIL, ptr %27, i32 0, i32 2
  %29 = load i8, ptr %28, align 1, !tbaa !11
  %30 = zext i8 %29 to i32
  store i32 %30, ptr %10, align 4, !tbaa !9
  %31 = icmp ne i32 %30, 0
  br i1 %31, label %32, label %34

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

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

41:                                               ; preds = %34
  store i32 7, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

42:                                               ; preds = %34
  %43 = load ptr, ptr %6, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.FIL, ptr %43, i32 0, i32 3
  %45 = load i32, ptr %44, align 4, !tbaa !16
  %46 = load i32, ptr %8, align 4, !tbaa !9
  %47 = add i32 %45, %46
  %48 = load ptr, ptr %6, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.FIL, ptr %48, i32 0, i32 3
  %50 = load i32, ptr %49, align 4, !tbaa !16
  %51 = icmp ult i32 %47, %50
  br i1 %51, label %52, label %57

52:                                               ; preds = %42
  %53 = load ptr, ptr %6, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.FIL, ptr %53, i32 0, i32 3
  %55 = load i32, ptr %54, align 4, !tbaa !16
  %56 = sub i32 -1, %55
  store i32 %56, ptr %8, align 4, !tbaa !9
  br label %57

57:                                               ; preds = %52, %42
  br label %58

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

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

67:                                               ; preds = %61
  %68 = load ptr, ptr %6, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.FIL, ptr %68, i32 0, i32 3
  %70 = load i32, ptr %69, align 4, !tbaa !16
  %71 = udiv i32 %70, 512
  %72 = load ptr, ptr %11, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.FATFS, ptr %72, i32 0, i32 7
  %74 = load i16, ptr %73, align 2, !tbaa !17
  %75 = zext i16 %74 to i32
  %76 = sub nsw i32 %75, 1
  %77 = and i32 %71, %76
  store i32 %77, ptr %16, align 4, !tbaa !9
  %78 = load i32, ptr %16, align 4, !tbaa !9
  %79 = icmp eq i32 %78, 0
  br i1 %79, label %80, label %135

80:                                               ; preds = %67
  %81 = load ptr, ptr %6, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.FIL, ptr %81, i32 0, i32 3
  %83 = load i32, ptr %82, align 4, !tbaa !16
  %84 = icmp eq i32 %83, 0
  br i1 %84, label %85, label %97

85:                                               ; preds = %80
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.FIL, ptr %86, i32 0, i32 0
  %88 = getelementptr inbounds %struct.FFOBJID, ptr %87, i32 0, i32 4
  %89 = load i32, ptr %88, align 4, !tbaa !19
  store i32 %89, ptr %12, align 4, !tbaa !9
  %90 = load i32, ptr %12, align 4, !tbaa !9
  %91 = icmp eq i32 %90, 0
  br i1 %91, label %92, label %96

92:                                               ; preds = %85
  %93 = load ptr, ptr %6, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.FIL, ptr %93, i32 0, i32 0
  %95 = call i32 @create_chain(ptr noundef %94, i32 noundef 0)
  store i32 %95, ptr %12, align 4, !tbaa !9
  br label %96

96:                                               ; preds = %92, %85
  br label %104

97:                                               ; preds = %80
  %98 = load ptr, ptr %6, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.FIL, ptr %98, i32 0, i32 0
  %100 = load ptr, ptr %6, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.FIL, ptr %100, i32 0, i32 4
  %102 = load i32, ptr %101, align 8, !tbaa !20
  %103 = call i32 @create_chain(ptr noundef %99, i32 noundef %102)
  store i32 %103, ptr %12, align 4, !tbaa !9
  br label %104

104:                                              ; preds = %97, %96
  %105 = load i32, ptr %12, align 4, !tbaa !9
  %106 = icmp eq i32 %105, 0
  br i1 %106, label %107, label %108

107:                                              ; preds = %104
  br label %341

108:                                              ; preds = %104
  %109 = load i32, ptr %12, align 4, !tbaa !9
  %110 = icmp eq i32 %109, 1
  br i1 %110, label %111, label %114

111:                                              ; preds = %108
  %112 = load ptr, ptr %6, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.FIL, ptr %112, i32 0, i32 2
  store i8 2, ptr %113, align 1, !tbaa !11
  store i32 2, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

114:                                              ; preds = %108
  %115 = load i32, ptr %12, align 4, !tbaa !9
  %116 = icmp eq i32 %115, -1
  br i1 %116, label %117, label %120

117:                                              ; preds = %114
  %118 = load ptr, ptr %6, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.FIL, ptr %118, i32 0, i32 2
  store i8 1, ptr %119, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

120:                                              ; preds = %114
  %121 = load i32, ptr %12, align 4, !tbaa !9
  %122 = load ptr, ptr %6, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.FIL, ptr %122, i32 0, i32 4
  store i32 %121, ptr %123, align 8, !tbaa !20
  %124 = load ptr, ptr %6, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.FIL, ptr %124, i32 0, i32 0
  %126 = getelementptr inbounds %struct.FFOBJID, ptr %125, i32 0, i32 4
  %127 = load i32, ptr %126, align 4, !tbaa !19
  %128 = icmp eq i32 %127, 0
  br i1 %128, label %129, label %134

129:                                              ; preds = %120
  %130 = load i32, ptr %12, align 4, !tbaa !9
  %131 = load ptr, ptr %6, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.FIL, ptr %131, i32 0, i32 0
  %133 = getelementptr inbounds %struct.FFOBJID, ptr %132, i32 0, i32 4
  store i32 %130, ptr %133, align 4, !tbaa !19
  br label %134

134:                                              ; preds = %129, %120
  br label %135

135:                                              ; preds = %134, %67
  %136 = load ptr, ptr %6, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.FIL, ptr %136, i32 0, i32 1
  %138 = load i8, ptr %137, align 8, !tbaa !15
  %139 = zext i8 %138 to i32
  %140 = and i32 %139, 128
  %141 = icmp ne i32 %140, 0
  br i1 %141, label %142, label %164

142:                                              ; preds = %135
  %143 = load ptr, ptr %11, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct.FATFS, ptr %143, i32 0, i32 1
  %145 = load i8, ptr %144, align 1, !tbaa !21
  %146 = load ptr, ptr %6, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.FIL, ptr %146, i32 0, i32 8
  %148 = getelementptr inbounds [512 x i8], ptr %147, i64 0, i64 0
  %149 = load ptr, ptr %6, align 8, !tbaa !5
  %150 = getelementptr inbounds %struct.FIL, ptr %149, i32 0, i32 5
  %151 = load i32, ptr %150, align 4, !tbaa !22
  %152 = call i32 @disk_write(i8 noundef zeroext %145, ptr noundef %148, i32 noundef %151, i32 noundef 1)
  %153 = icmp ne i32 %152, 0
  br i1 %153, label %154, label %157

154:                                              ; preds = %142
  %155 = load ptr, ptr %6, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.FIL, ptr %155, i32 0, i32 2
  store i8 1, ptr %156, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

157:                                              ; preds = %142
  %158 = load ptr, ptr %6, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.FIL, ptr %158, i32 0, i32 1
  %160 = load i8, ptr %159, align 8, !tbaa !15
  %161 = zext i8 %160 to i32
  %162 = and i32 %161, 127
  %163 = trunc i32 %162 to i8
  store i8 %163, ptr %159, align 8, !tbaa !15
  br label %164

164:                                              ; preds = %157, %135
  %165 = load ptr, ptr %11, align 8, !tbaa !5
  %166 = load ptr, ptr %6, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.FIL, ptr %166, i32 0, i32 4
  %168 = load i32, ptr %167, align 8, !tbaa !20
  %169 = call i32 @clst2sect(ptr noundef %165, i32 noundef %168)
  store i32 %169, ptr %13, align 4, !tbaa !9
  %170 = load i32, ptr %13, align 4, !tbaa !9
  %171 = icmp eq i32 %170, 0
  br i1 %171, label %172, label %175

172:                                              ; preds = %164
  %173 = load ptr, ptr %6, align 8, !tbaa !5
  %174 = getelementptr inbounds %struct.FIL, ptr %173, i32 0, i32 2
  store i8 2, ptr %174, align 1, !tbaa !11
  store i32 2, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

175:                                              ; preds = %164
  %176 = load i32, ptr %16, align 4, !tbaa !9
  %177 = load i32, ptr %13, align 4, !tbaa !9
  %178 = add i32 %177, %176
  store i32 %178, ptr %13, align 4, !tbaa !9
  %179 = load i32, ptr %8, align 4, !tbaa !9
  %180 = udiv i32 %179, 512
  store i32 %180, ptr %15, align 4, !tbaa !9
  %181 = load i32, ptr %15, align 4, !tbaa !9
  %182 = icmp ugt i32 %181, 0
  br i1 %182, label %183, label %241

183:                                              ; preds = %175
  %184 = load i32, ptr %16, align 4, !tbaa !9
  %185 = load i32, ptr %15, align 4, !tbaa !9
  %186 = add i32 %184, %185
  %187 = load ptr, ptr %11, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.FATFS, ptr %187, i32 0, i32 7
  %189 = load i16, ptr %188, align 2, !tbaa !17
  %190 = zext i16 %189 to i32
  %191 = icmp ugt i32 %186, %190
  br i1 %191, label %192, label %199

192:                                              ; preds = %183
  %193 = load ptr, ptr %11, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.FATFS, ptr %193, i32 0, i32 7
  %195 = load i16, ptr %194, align 2, !tbaa !17
  %196 = zext i16 %195 to i32
  %197 = load i32, ptr %16, align 4, !tbaa !9
  %198 = sub i32 %196, %197
  store i32 %198, ptr %15, align 4, !tbaa !9
  br label %199

199:                                              ; preds = %192, %183
  %200 = load ptr, ptr %11, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.FATFS, ptr %200, i32 0, i32 1
  %202 = load i8, ptr %201, align 1, !tbaa !21
  %203 = load ptr, ptr %17, align 8, !tbaa !5
  %204 = load i32, ptr %13, align 4, !tbaa !9
  %205 = load i32, ptr %15, align 4, !tbaa !9
  %206 = call i32 @disk_write(i8 noundef zeroext %202, ptr noundef %203, i32 noundef %204, i32 noundef %205)
  %207 = icmp ne i32 %206, 0
  br i1 %207, label %208, label %211

208:                                              ; preds = %199
  %209 = load ptr, ptr %6, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.FIL, ptr %209, i32 0, i32 2
  store i8 1, ptr %210, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

211:                                              ; preds = %199
  %212 = load ptr, ptr %6, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.FIL, ptr %212, i32 0, i32 5
  %214 = load i32, ptr %213, align 4, !tbaa !22
  %215 = load i32, ptr %13, align 4, !tbaa !9
  %216 = sub i32 %214, %215
  %217 = load i32, ptr %15, align 4, !tbaa !9
  %218 = icmp ult i32 %216, %217
  br i1 %218, label %219, label %238

219:                                              ; preds = %211
  %220 = load ptr, ptr %6, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.FIL, ptr %220, i32 0, i32 8
  %222 = getelementptr inbounds [512 x i8], ptr %221, i64 0, i64 0
  %223 = load ptr, ptr %17, align 8, !tbaa !5
  %224 = load ptr, ptr %6, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.FIL, ptr %224, i32 0, i32 5
  %226 = load i32, ptr %225, align 4, !tbaa !22
  %227 = load i32, ptr %13, align 4, !tbaa !9
  %228 = sub i32 %226, %227
  %229 = mul i32 %228, 512
  %230 = zext i32 %229 to i64
  %231 = getelementptr inbounds i8, ptr %223, i64 %230
  call void @mem_cpy(ptr noundef %222, ptr noundef %231, i32 noundef 512)
  %232 = load ptr, ptr %6, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.FIL, ptr %232, i32 0, i32 1
  %234 = load i8, ptr %233, align 8, !tbaa !15
  %235 = zext i8 %234 to i32
  %236 = and i32 %235, 127
  %237 = trunc i32 %236 to i8
  store i8 %237, ptr %233, align 8, !tbaa !15
  br label %238

238:                                              ; preds = %219, %211
  %239 = load i32, ptr %15, align 4, !tbaa !9
  %240 = mul i32 512, %239
  store i32 %240, ptr %14, align 4, !tbaa !9
  br label %302

241:                                              ; preds = %175
  %242 = load ptr, ptr %6, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.FIL, ptr %242, i32 0, i32 5
  %244 = load i32, ptr %243, align 4, !tbaa !22
  %245 = load i32, ptr %13, align 4, !tbaa !9
  %246 = icmp ne i32 %244, %245
  br i1 %246, label %247, label %269

247:                                              ; preds = %241
  %248 = load ptr, ptr %6, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.FIL, ptr %248, i32 0, i32 3
  %250 = load i32, ptr %249, align 4, !tbaa !16
  %251 = load ptr, ptr %6, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.FIL, ptr %251, i32 0, i32 0
  %253 = getelementptr inbounds %struct.FFOBJID, ptr %252, i32 0, i32 5
  %254 = load i32, ptr %253, align 8, !tbaa !23
  %255 = icmp ult i32 %250, %254
  br i1 %255, label %256, label %269

256:                                              ; preds = %247
  %257 = load ptr, ptr %11, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.FATFS, ptr %257, i32 0, i32 1
  %259 = load i8, ptr %258, align 1, !tbaa !21
  %260 = load ptr, ptr %6, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.FIL, ptr %260, i32 0, i32 8
  %262 = getelementptr inbounds [512 x i8], ptr %261, i64 0, i64 0
  %263 = load i32, ptr %13, align 4, !tbaa !9
  %264 = call i32 @disk_read(i8 noundef zeroext %259, ptr noundef %262, i32 noundef %263, i32 noundef 1)
  %265 = icmp ne i32 %264, 0
  br i1 %265, label %266, label %269

266:                                              ; preds = %256
  %267 = load ptr, ptr %6, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.FIL, ptr %267, i32 0, i32 2
  store i8 1, ptr %268, align 1, !tbaa !11
  store i32 1, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

269:                                              ; preds = %256, %247, %241
  %270 = load i32, ptr %13, align 4, !tbaa !9
  %271 = load ptr, ptr %6, align 8, !tbaa !5
  %272 = getelementptr inbounds %struct.FIL, ptr %271, i32 0, i32 5
  store i32 %270, ptr %272, align 4, !tbaa !22
  br label %273

273:                                              ; preds = %269, %61
  %274 = load ptr, ptr %6, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.FIL, ptr %274, i32 0, i32 3
  %276 = load i32, ptr %275, align 4, !tbaa !16
  %277 = urem i32 %276, 512
  %278 = sub i32 512, %277
  store i32 %278, ptr %14, align 4, !tbaa !9
  %279 = load i32, ptr %14, align 4, !tbaa !9
  %280 = load i32, ptr %8, align 4, !tbaa !9
  %281 = icmp ugt i32 %279, %280
  br i1 %281, label %282, label %284

282:                                              ; preds = %273
  %283 = load i32, ptr %8, align 4, !tbaa !9
  store i32 %283, ptr %14, align 4, !tbaa !9
  br label %284

284:                                              ; preds = %282, %273
  %285 = load ptr, ptr %6, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.FIL, ptr %285, i32 0, i32 8
  %287 = getelementptr inbounds [512 x i8], ptr %286, i64 0, i64 0
  %288 = load ptr, ptr %6, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.FIL, ptr %288, i32 0, i32 3
  %290 = load i32, ptr %289, align 4, !tbaa !16
  %291 = urem i32 %290, 512
  %292 = zext i32 %291 to i64
  %293 = getelementptr inbounds i8, ptr %287, i64 %292
  %294 = load ptr, ptr %17, align 8, !tbaa !5
  %295 = load i32, ptr %14, align 4, !tbaa !9
  call void @mem_cpy(ptr noundef %293, ptr noundef %294, i32 noundef %295)
  %296 = load ptr, ptr %6, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.FIL, ptr %296, i32 0, i32 1
  %298 = load i8, ptr %297, align 8, !tbaa !15
  %299 = zext i8 %298 to i32
  %300 = or i32 %299, 128
  %301 = trunc i32 %300 to i8
  store i8 %301, ptr %297, align 8, !tbaa !15
  br label %302

302:                                              ; preds = %284, %238
  %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
  %306 = load i32, ptr %14, align 4, !tbaa !9
  %307 = load ptr, ptr %9, align 8, !tbaa !5
  %308 = load i32, ptr %307, align 4, !tbaa !9
  %309 = add i32 %308, %306
  store i32 %309, ptr %307, align 4, !tbaa !9
  %310 = load i32, ptr %14, align 4, !tbaa !9
  %311 = load ptr, ptr %17, align 8, !tbaa !5
  %312 = zext i32 %310 to i64
  %313 = getelementptr inbounds i8, ptr %311, i64 %312
  store ptr %313, ptr %17, align 8, !tbaa !5
  %314 = load i32, ptr %14, align 4, !tbaa !9
  %315 = load ptr, ptr %6, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.FIL, ptr %315, i32 0, i32 3
  %317 = load i32, ptr %316, align 4, !tbaa !16
  %318 = add i32 %317, %314
  store i32 %318, ptr %316, align 4, !tbaa !16
  %319 = load ptr, ptr %6, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.FIL, ptr %319, i32 0, i32 3
  %321 = load i32, ptr %320, align 4, !tbaa !16
  %322 = load ptr, ptr %6, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.FIL, ptr %322, i32 0, i32 0
  %324 = getelementptr inbounds %struct.FFOBJID, ptr %323, i32 0, i32 5
  %325 = load i32, ptr %324, align 8, !tbaa !23
  %326 = icmp ugt i32 %321, %325
  br i1 %326, label %327, label %331

327:                                              ; preds = %302
  %328 = load ptr, ptr %6, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct.FIL, ptr %328, i32 0, i32 3
  %330 = load i32, ptr %329, align 4, !tbaa !16
  br label %336

331:                                              ; preds = %302
  %332 = load ptr, ptr %6, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.FIL, ptr %332, i32 0, i32 0
  %334 = getelementptr inbounds %struct.FFOBJID, ptr %333, i32 0, i32 5
  %335 = load i32, ptr %334, align 8, !tbaa !23
  br label %336

336:                                              ; preds = %331, %327
  %337 = phi i32 [ %330, %327 ], [ %335, %331 ]
  %338 = load ptr, ptr %6, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct.FIL, ptr %338, i32 0, i32 0
  %340 = getelementptr inbounds %struct.FFOBJID, ptr %339, i32 0, i32 5
  store i32 %337, ptr %340, align 8, !tbaa !23
  br label %58, !llvm.loop !24

341:                                              ; preds = %107, %58
  %342 = load ptr, ptr %6, align 8, !tbaa !5
  %343 = getelementptr inbounds %struct.FIL, ptr %342, i32 0, i32 1
  %344 = load i8, ptr %343, align 8, !tbaa !15
  %345 = zext i8 %344 to i32
  %346 = or i32 %345, 64
  %347 = trunc i32 %346 to i8
  store i8 %347, ptr %343, align 8, !tbaa !15
  store i32 0, ptr %5, align 4
  store i32 1, ptr %18, align 4
  br label %348

348:                                              ; preds = %341, %266, %208, %172, %154, %117, %111, %41, %32
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, 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 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, 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
  %349 = load i32, ptr %5, align 4
  ret i32 %349
}

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 25}
!12 = !{!"", !13, i64 0, !7, i64 24, !7, i64 25, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !6, i64 48, !7, i64 56}
!13 = !{!"", !6, i64 0, !14, i64 8, !7, i64 10, !7, i64 11, !10, i64 12, !10, i64 16}
!14 = !{!"short", !7, i64 0}
!15 = !{!12, !7, i64 24}
!16 = !{!12, !10, i64 28}
!17 = !{!18, !14, i64 10}
!18 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !14, i64 6, !14, i64 8, !14, i64 10, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !7, i64 48}
!19 = !{!12, !10, i64 12}
!20 = !{!12, !10, i64 32}
!21 = !{!18, !7, i64 1}
!22 = !{!12, !10, i64 36}
!23 = !{!12, !10, i64 16}
!24 = distinct !{!24, !25}
!25 = !{!"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: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

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

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

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

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

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

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

; 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 #1 {
  %5 = alloca ptr, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #4
  store i32 0, ptr %3, align 4, !tbaa !5
  %6 = call i32 @validate(ptr noundef %0, ptr noundef nonnull %5)
  %.not = icmp eq i32 %6, 0
  br i1 %.not, label %7, label %125

7:                                                ; preds = %4
  %8 = getelementptr inbounds i8, ptr %0, i64 25
  %9 = load i8, ptr %8, align 1, !tbaa !9
  %10 = zext i8 %9 to i32
  %.not110 = icmp eq i8 %9, 0
  br i1 %.not110, label %11, label %125

11:                                               ; preds = %7
  %12 = getelementptr inbounds i8, ptr %0, i64 24
  %13 = load i8, ptr %12, align 8, !tbaa !14
  %14 = and i8 %13, 2
  %.not111 = icmp eq i8 %14, 0
  br i1 %.not111, label %125, label %15

15:                                               ; preds = %11
  %16 = getelementptr inbounds i8, ptr %0, i64 28
  %17 = load i32, ptr %16, align 4, !tbaa !15
  %18 = xor i32 %17, -1
  %spec.select = call i32 @llvm.umin.i32(i32 %18, i32 %2)
  %.not112121 = icmp eq i32 %spec.select, 0
  br i1 %.not112121, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %15
  %19 = getelementptr inbounds i8, ptr %0, i64 32
  %20 = getelementptr inbounds i8, ptr %0, i64 12
  %21 = getelementptr inbounds i8, ptr %0, i64 56
  %22 = getelementptr inbounds i8, ptr %0, i64 36
  %23 = getelementptr inbounds i8, ptr %0, i64 16
  br label %24

24:                                               ; preds = %.lr.ph, %114
  %25 = phi i32 [ %17, %.lr.ph ], [ %121, %114 ]
  %.0123 = phi ptr [ %1, %.lr.ph ], [ %119, %114 ]
  %.197122 = phi i32 [ %spec.select, %.lr.ph ], [ %115, %114 ]
  %26 = and i32 %25, 511
  %27 = icmp eq i32 %26, 0
  br i1 %27, label %28, label %108

28:                                               ; preds = %24
  %29 = lshr exact i32 %25, 9
  %30 = load ptr, ptr %5, align 8, !tbaa !16
  %31 = getelementptr inbounds i8, ptr %30, i64 10
  %32 = load i16, ptr %31, align 2, !tbaa !17
  %33 = zext i16 %32 to i32
  %34 = add nuw nsw i32 %33, 8388607
  %35 = and i32 %34, %29
  %36 = icmp eq i32 %35, 0
  br i1 %36, label %37, label %52

37:                                               ; preds = %28
  %38 = icmp eq i32 %25, 0
  br i1 %38, label %39, label %42

39:                                               ; preds = %37
  %40 = load i32, ptr %20, align 4, !tbaa !19
  %41 = icmp eq i32 %40, 0
  br i1 %41, label %.sink.split, label %45

42:                                               ; preds = %37
  %43 = load i32, ptr %19, align 8, !tbaa !20
  br label %.sink.split

.sink.split:                                      ; preds = %39, %42
  %.sink = phi i32 [ %43, %42 ], [ 0, %39 ]
  %44 = call i32 @create_chain(ptr noundef nonnull %0, i32 noundef %.sink)
  br label %45

45:                                               ; preds = %.sink.split, %39
  %.094 = phi i32 [ %40, %39 ], [ %44, %.sink.split ]
  switch i32 %.094, label %48 [
    i32 0, label %._crit_edge.loopexit
    i32 1, label %46
    i32 -1, label %47
  ]

46:                                               ; preds = %45
  store i8 2, ptr %8, align 1, !tbaa !9
  br label %125

47:                                               ; preds = %45
  store i8 1, ptr %8, align 1, !tbaa !9
  br label %125

48:                                               ; preds = %45
  store i32 %.094, ptr %19, align 8, !tbaa !20
  %49 = load i32, ptr %20, align 4, !tbaa !19
  %50 = icmp eq i32 %49, 0
  br i1 %50, label %51, label %52

51:                                               ; preds = %48
  store i32 %.094, ptr %20, align 4, !tbaa !19
  br label %52

52:                                               ; preds = %48, %51, %28
  %53 = load i8, ptr %12, align 8, !tbaa !14
  %.not113 = icmp sgt i8 %53, -1
  %.pre125 = load ptr, ptr %5, align 8, !tbaa !16
  br i1 %.not113, label %63, label %54

54:                                               ; preds = %52
  %55 = getelementptr inbounds i8, ptr %.pre125, i64 1
  %56 = load i8, ptr %55, align 1, !tbaa !21
  %57 = load i32, ptr %22, align 4, !tbaa !22
  %58 = call i32 @disk_write(i8 noundef zeroext %56, ptr noundef nonnull %21, i32 noundef %57, i32 noundef 1) #4
  %.not114 = icmp eq i32 %58, 0
  br i1 %.not114, label %60, label %59

59:                                               ; preds = %54
  store i8 1, ptr %8, align 1, !tbaa !9
  br label %125

60:                                               ; preds = %54
  %61 = load i8, ptr %12, align 8, !tbaa !14
  %62 = and i8 %61, 127
  store i8 %62, ptr %12, align 8, !tbaa !14
  %.pre = load ptr, ptr %5, align 8, !tbaa !16
  br label %63

63:                                               ; preds = %60, %52
  %64 = phi ptr [ %.pre, %60 ], [ %.pre125, %52 ]
  %65 = load i32, ptr %19, align 8, !tbaa !20
  %66 = call i32 @clst2sect(ptr noundef %64, i32 noundef %65)
  %67 = icmp eq i32 %66, 0
  br i1 %67, label %68, label %69

68:                                               ; preds = %63
  store i8 2, ptr %8, align 1, !tbaa !9
  br label %125

69:                                               ; preds = %63
  %70 = add i32 %66, %35
  %.not115 = icmp ult i32 %.197122, 512
  br i1 %.not115, label %96, label %71

71:                                               ; preds = %69
  %72 = lshr i32 %.197122, 9
  %73 = add nuw nsw i32 %35, %72
  %74 = load ptr, ptr %5, align 8, !tbaa !16
  %75 = getelementptr inbounds i8, ptr %74, i64 10
  %76 = load i16, ptr %75, align 2, !tbaa !17
  %77 = zext i16 %76 to i32
  %78 = icmp ugt i32 %73, %77
  %79 = sub nsw i32 %77, %35
  %spec.select119 = select i1 %78, i32 %79, i32 %72
  %80 = getelementptr inbounds i8, ptr %74, i64 1
  %81 = load i8, ptr %80, align 1, !tbaa !21
  %82 = call i32 @disk_write(i8 noundef zeroext %81, ptr noundef %.0123, i32 noundef %70, i32 noundef %spec.select119) #4
  %.not118 = icmp eq i32 %82, 0
  br i1 %.not118, label %84, label %83

83:                                               ; preds = %71
  store i8 1, ptr %8, align 1, !tbaa !9
  br label %125

84:                                               ; preds = %71
  %85 = load i32, ptr %22, align 4, !tbaa !22
  %86 = sub i32 %85, %70
  %87 = icmp ult i32 %86, %spec.select119
  br i1 %87, label %88, label %94

88:                                               ; preds = %84
  %89 = shl i32 %86, 9
  %90 = zext i32 %89 to i64
  %91 = getelementptr inbounds i8, ptr %.0123, i64 %90
  call void @mem_cpy(ptr noundef nonnull %21, ptr noundef %91, i32 noundef 512)
  %92 = load i8, ptr %12, align 8, !tbaa !14
  %93 = and i8 %92, 127
  store i8 %93, ptr %12, align 8, !tbaa !14
  br label %94

94:                                               ; preds = %88, %84
  %95 = shl i32 %spec.select119, 9
  br label %114

96:                                               ; preds = %69
  %97 = load i32, ptr %22, align 4, !tbaa !22
  %.not116 = icmp eq i32 %97, %70
  %.pre126.pre129 = load i32, ptr %16, align 4, !tbaa !15
  br i1 %.not116, label %107, label %98

98:                                               ; preds = %96
  %99 = load i32, ptr %23, align 8, !tbaa !23
  %100 = icmp ult i32 %.pre126.pre129, %99
  br i1 %100, label %101, label %107

101:                                              ; preds = %98
  %102 = load ptr, ptr %5, align 8, !tbaa !16
  %103 = getelementptr inbounds i8, ptr %102, i64 1
  %104 = load i8, ptr %103, align 1, !tbaa !21
  %105 = call i32 @disk_read(i8 noundef zeroext %104, ptr noundef nonnull %21, i32 noundef %70, i32 noundef 1) #4
  %.not117 = icmp eq i32 %105, 0
  br i1 %.not117, label %._crit_edge128, label %106

._crit_edge128:                                   ; preds = %101
  %.pre126.pre = load i32, ptr %16, align 4, !tbaa !15
  br label %107

106:                                              ; preds = %101
  store i8 1, ptr %8, align 1, !tbaa !9
  br label %125

107:                                              ; preds = %._crit_edge128, %98, %96
  %.pre126 = phi i32 [ %.pre126.pre, %._crit_edge128 ], [ %.pre126.pre129, %98 ], [ %.pre126.pre129, %96 ]
  store i32 %70, ptr %22, align 4, !tbaa !22
  %.pre131 = and i32 %.pre126, 511
  br label %108

108:                                              ; preds = %107, %24
  %.pre-phi = phi i32 [ %.pre131, %107 ], [ %26, %24 ]
  %109 = sub nuw nsw i32 512, %.pre-phi
  %spec.select120 = call i32 @llvm.umin.i32(i32 %109, i32 %.197122)
  %110 = zext nneg i32 %.pre-phi to i64
  %111 = getelementptr inbounds i8, ptr %21, i64 %110
  call void @mem_cpy(ptr noundef nonnull %111, ptr noundef %.0123, i32 noundef %spec.select120)
  %112 = load i8, ptr %12, align 8, !tbaa !14
  %113 = or i8 %112, -128
  store i8 %113, ptr %12, align 8, !tbaa !14
  br label %114

114:                                              ; preds = %108, %94
  %.1 = phi i32 [ %95, %94 ], [ %spec.select120, %108 ]
  %115 = sub i32 %.197122, %.1
  %116 = load i32, ptr %3, align 4, !tbaa !5
  %117 = add i32 %116, %.1
  store i32 %117, ptr %3, align 4, !tbaa !5
  %118 = zext i32 %.1 to i64
  %119 = getelementptr inbounds i8, ptr %.0123, i64 %118
  %120 = load i32, ptr %16, align 4, !tbaa !15
  %121 = add i32 %120, %.1
  store i32 %121, ptr %16, align 4, !tbaa !15
  %122 = load i32, ptr %23, align 8, !tbaa !23
  %. = call i32 @llvm.umax.i32(i32 %121, i32 %122)
  store i32 %., ptr %23, align 8, !tbaa !23
  %.not112 = icmp eq i32 %115, 0
  br i1 %.not112, label %._crit_edge.loopexit, label %24, !llvm.loop !24

._crit_edge.loopexit:                             ; preds = %45, %114
  %.pre127 = load i8, ptr %12, align 8, !tbaa !14
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %15
  %123 = phi i8 [ %.pre127, %._crit_edge.loopexit ], [ %13, %15 ]
  %124 = or i8 %123, 64
  store i8 %124, ptr %12, align 8, !tbaa !14
  br label %125

125:                                              ; preds = %11, %4, %7, %._crit_edge, %106, %83, %68, %59, %47, %46
  %.091 = phi i32 [ 0, %._crit_edge ], [ 2, %46 ], [ 1, %47 ], [ 1, %59 ], [ 2, %68 ], [ 1, %83 ], [ 1, %106 ], [ %6, %4 ], [ %10, %7 ], [ 7, %11 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #4
  ret i32 %.091
}

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

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { 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 25}
!10 = !{!"", !11, i64 0, !7, i64 24, !7, i64 25, !6, i64 28, !6, i64 32, !6, i64 36, !6, i64 40, !12, i64 48, !7, i64 56}
!11 = !{!"", !12, i64 0, !13, i64 8, !7, i64 10, !7, i64 11, !6, i64 12, !6, i64 16}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!"short", !7, i64 0}
!14 = !{!10, !7, i64 24}
!15 = !{!10, !6, i64 28}
!16 = !{!12, !12, i64 0}
!17 = !{!18, !13, i64 10}
!18 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !13, i64 6, !13, i64 8, !13, i64 10, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !6, i64 40, !6, i64 44, !7, i64 48}
!19 = !{!10, !6, i64 12}
!20 = !{!10, !6, i64 32}
!21 = !{!18, !7, i64 1}
!22 = !{!10, !6, i64 36}
!23 = !{!10, !6, i64 16}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}


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