; LLVM IR from joembedded/JesFs :: jesfs_hl (fs_check_disk)

; 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.SFLASH_INFO = type { i32, i32, i32, i32, i32, i16, i16, i16, i16, i16, %union.SF_BUFFER, i8 }
%union.SF_BUFFER = type { [32 x i32] }
%struct.FS_STAT = type { [22 x i8], i32, i32, i32, i32, i8 }
%struct.FS_DESC = type { i32, i32, i32, i32, i32, i32, i16, i8 }

@sflash_info = external global %struct.SFLASH_INFO, align 4
@.str = external hidden unnamed_addr constant [15 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [9 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
declare dso_local signext i16 @fs_start(i8 noundef zeroext) #1

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

; Function Attrs: nounwind uwtable
declare dso_local signext i16 @fs_open(ptr noundef, ptr noundef, i8 noundef zeroext) #1

; Function Attrs: nounwind uwtable
declare dso_local signext i16 @fs_info(ptr noundef, i16 noundef zeroext) #1

; Function Attrs: nounwind uwtable
define dso_local signext i16 @fs_check_disk(ptr noundef %0, ptr noundef %1, i32 noundef %2) #1 {
  %4 = alloca i16, align 2
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca i16, align 2
  %9 = alloca i16, align 2
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i16, align 2
  %13 = alloca %struct.FS_STAT, align 4
  %14 = alloca %struct.FS_DESC, align 4
  %15 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %8) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %9) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %12) #2
  store i16 0, ptr %12, align 2, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 44, ptr %13) #2
  call void @llvm.lifetime.start.p0(i64 28, ptr %14) #2
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = icmp ne ptr %16, null
  br i1 %17, label %18, label %20

18:                                               ; preds = %3
  %19 = load ptr, ptr %5, align 8, !tbaa !5
  call void (ptr, ...) %19(ptr noundef @.str)
  br label %20

20:                                               ; preds = %18, %3
  %21 = call signext i16 @fs_start(i8 noundef zeroext 0)
  store i16 %21, ptr %8, align 2, !tbaa !11
  %22 = load i16, ptr %8, align 2, !tbaa !11
  %23 = icmp ne i16 %22, 0
  br i1 %23, label %24, label %39

24:                                               ; preds = %20
  %25 = load ptr, ptr %5, align 8, !tbaa !5
  %26 = icmp ne ptr %25, null
  br i1 %26, label %27, label %31

27:                                               ; preds = %24
  %28 = load ptr, ptr %5, align 8, !tbaa !5
  %29 = load i16, ptr %8, align 2, !tbaa !11
  %30 = sext i16 %29 to i32
  call void (ptr, ...) %28(ptr noundef @.str.1, i32 noundef %30)
  br label %31

31:                                               ; preds = %27, %24
  %32 = load i16, ptr %8, align 2, !tbaa !11
  %33 = sext i16 %32 to i32
  %34 = icmp eq i32 %33, -147
  br i1 %34, label %35, label %36

35:                                               ; preds = %31
  store i16 -147, ptr %4, align 2
  store i32 1, ptr %15, align 4
  br label %306

36:                                               ; preds = %31
  %37 = load i16, ptr %12, align 2, !tbaa !11
  %38 = add i16 %37, 1
  store i16 %38, ptr %12, align 2, !tbaa !11
  br label %39

39:                                               ; preds = %36, %20
  %40 = load ptr, ptr %5, align 8, !tbaa !5
  %41 = icmp ne ptr %40, null
  br i1 %41, label %42, label %57

42:                                               ; preds = %39
  %43 = load ptr, ptr %5, align 8, !tbaa !5
  %44 = load i16, ptr getelementptr inbounds (%struct.SFLASH_INFO, ptr @sflash_info, i32 0, i32 8), align 2, !tbaa !13
  %45 = zext i16 %44 to i32
  %46 = load i16, ptr getelementptr inbounds (%struct.SFLASH_INFO, ptr @sflash_info, i32 0, i32 7), align 4, !tbaa !15
  %47 = zext i16 %46 to i32
  call void (ptr, ...) %43(ptr noundef @.str.2, i32 noundef %45, i32 noundef %47)
  %48 = load i16, ptr getelementptr inbounds (%struct.SFLASH_INFO, ptr @sflash_info, i32 0, i32 9), align 4, !tbaa !16
  %49 = icmp ne i16 %48, 0
  br i1 %49, label %50, label %56

50:                                               ; preds = %42
  %51 = load ptr, ptr %5, align 8, !tbaa !5
  %52 = load i16, ptr getelementptr inbounds (%struct.SFLASH_INFO, ptr @sflash_info, i32 0, i32 9), align 4, !tbaa !16
  %53 = zext i16 %52 to i32
  call void (ptr, ...) %51(ptr noundef @.str.3, i32 noundef %53)
  %54 = load i16, ptr %12, align 2, !tbaa !11
  %55 = add i16 %54, 1
  store i16 %55, ptr %12, align 2, !tbaa !11
  br label %56

56:                                               ; preds = %50, %42
  br label %57

57:                                               ; preds = %56, %39
  store i16 0, ptr %9, align 2, !tbaa !11
  br label %58

58:                                               ; preds = %288, %57
  %59 = load i16, ptr %9, align 2, !tbaa !11
  %60 = call signext i16 @fs_info(ptr noundef %13, i16 noundef zeroext %59)
  store i16 %60, ptr %8, align 2, !tbaa !11
  %61 = load i16, ptr %9, align 2, !tbaa !11
  %62 = zext i16 %61 to i32
  %63 = load i16, ptr getelementptr inbounds (%struct.SFLASH_INFO, ptr @sflash_info, i32 0, i32 5), align 4, !tbaa !17
  %64 = zext i16 %63 to i32
  %65 = icmp sge i32 %62, %64
  br i1 %65, label %66, label %76

66:                                               ; preds = %58
  %67 = load i16, ptr %8, align 2, !tbaa !11
  %68 = sext i16 %67 to i32
  %69 = icmp eq i32 %68, 128
  br i1 %69, label %70, label %71

70:                                               ; preds = %66
  br label %291

71:                                               ; preds = %66
  %72 = load i16, ptr %8, align 2, !tbaa !11
  %73 = icmp ne i16 %72, 0
  br i1 %73, label %75, label %74

74:                                               ; preds = %71
  br label %288

75:                                               ; preds = %71
  br label %76

76:                                               ; preds = %75, %58
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = icmp ne ptr %77, null
  br i1 %78, label %79, label %102

79:                                               ; preds = %76
  %80 = load i16, ptr %8, align 2, !tbaa !11
  %81 = sext i16 %80 to i32
  %82 = icmp sgt i32 %81, 0
  br i1 %82, label %83, label %101

83:                                               ; preds = %79
  %84 = load i16, ptr %8, align 2, !tbaa !11
  %85 = sext i16 %84 to i32
  %86 = and i32 %85, 2
  %87 = icmp ne i32 %86, 0
  br i1 %87, label %88, label %94

88:                                               ; preds = %83
  %89 = load ptr, ptr %5, align 8, !tbaa !5
  %90 = load i16, ptr %9, align 2, !tbaa !11
  %91 = zext i16 %90 to i32
  %92 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %93 = getelementptr inbounds [22 x i8], ptr %92, i64 0, i64 0
  call void (ptr, ...) %89(ptr noundef @.str.4, i32 noundef %91, ptr noundef %93)
  br label %100

94:                                               ; preds = %83
  %95 = load ptr, ptr %5, align 8, !tbaa !5
  %96 = load i16, ptr %9, align 2, !tbaa !11
  %97 = zext i16 %96 to i32
  %98 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %99 = getelementptr inbounds [22 x i8], ptr %98, i64 0, i64 0
  call void (ptr, ...) %95(ptr noundef @.str.5, i32 noundef %97, ptr noundef %99)
  br label %100

100:                                              ; preds = %94, %88
  br label %101

101:                                              ; preds = %100, %79
  br label %102

102:                                              ; preds = %101, %76
  %103 = load i16, ptr %8, align 2, !tbaa !11
  %104 = sext i16 %103 to i32
  %105 = icmp slt i32 %104, 0
  br i1 %105, label %111, label %106

106:                                              ; preds = %102
  %107 = load i16, ptr %8, align 2, !tbaa !11
  %108 = sext i16 %107 to i32
  %109 = and i32 %108, -8
  %110 = icmp ne i32 %109, 0
  br i1 %110, label %111, label %123

111:                                              ; preds = %106, %102
  %112 = load ptr, ptr %5, align 8, !tbaa !5
  %113 = icmp ne ptr %112, null
  br i1 %113, label %114, label %120

114:                                              ; preds = %111
  %115 = load ptr, ptr %5, align 8, !tbaa !5
  %116 = load i16, ptr %9, align 2, !tbaa !11
  %117 = zext i16 %116 to i32
  %118 = load i16, ptr %8, align 2, !tbaa !11
  %119 = sext i16 %118 to i32
  call void (ptr, ...) %115(ptr noundef @.str.6, i32 noundef %117, i32 noundef %119)
  br label %120

120:                                              ; preds = %114, %111
  %121 = load i16, ptr %12, align 2, !tbaa !11
  %122 = add i16 %121, 1
  store i16 %122, ptr %12, align 2, !tbaa !11
  br label %123

123:                                              ; preds = %120, %106
  %124 = load i16, ptr %8, align 2, !tbaa !11
  %125 = sext i16 %124 to i32
  %126 = and i32 %125, 1
  %127 = icmp ne i32 %126, 0
  br i1 %127, label %128, label %287

128:                                              ; preds = %123
  %129 = load i16, ptr %8, align 2, !tbaa !11
  %130 = sext i16 %129 to i32
  %131 = and i32 %130, 4
  %132 = icmp ne i32 %131, 0
  br i1 %132, label %133, label %185

133:                                              ; preds = %128
  %134 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %135 = getelementptr inbounds [22 x i8], ptr %134, i64 0, i64 0
  %136 = call signext i16 @fs_open(ptr noundef %14, ptr noundef %135, i8 noundef zeroext 9)
  store i16 %136, ptr %8, align 2, !tbaa !11
  %137 = load i16, ptr %8, align 2, !tbaa !11
  %138 = sext i16 %137 to i32
  %139 = icmp slt i32 %138, 0
  br i1 %139, label %140, label %152

140:                                              ; preds = %133
  %141 = load ptr, ptr %5, align 8, !tbaa !5
  %142 = icmp ne ptr %141, null
  br i1 %142, label %143, label %149

143:                                              ; preds = %140
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %146 = getelementptr inbounds [22 x i8], ptr %145, i64 0, i64 0
  %147 = load i16, ptr %8, align 2, !tbaa !11
  %148 = sext i16 %147 to i32
  call void (ptr, ...) %144(ptr noundef @.str.7, ptr noundef %146, i32 noundef %148)
  br label %149

149:                                              ; preds = %143, %140
  %150 = load i16, ptr %12, align 2, !tbaa !11
  %151 = add i16 %150, 1
  store i16 %151, ptr %12, align 2, !tbaa !11
  br label %184

152:                                              ; preds = %133
  %153 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 5
  %154 = load i8, ptr %153, align 4, !tbaa !18
  %155 = zext i8 %154 to i32
  %156 = and i32 %155, 16
  %157 = icmp ne i32 %156, 0
  br i1 %157, label %158, label %168

158:                                              ; preds = %152
  %159 = load ptr, ptr %5, align 8, !tbaa !5
  %160 = icmp ne ptr %159, null
  br i1 %160, label %161, label %165

161:                                              ; preds = %158
  %162 = load ptr, ptr %5, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %164 = getelementptr inbounds [22 x i8], ptr %163, i64 0, i64 0
  call void (ptr, ...) %162(ptr noundef @.str.8, ptr noundef %164)
  br label %165

165:                                              ; preds = %161, %158
  %166 = load i16, ptr %12, align 2, !tbaa !11
  %167 = add i16 %166, 1
  store i16 %167, ptr %12, align 2, !tbaa !11
  br label %168

168:                                              ; preds = %165, %152
  %169 = call i32 @fs_read(ptr noundef %14, ptr noundef null, i32 noundef -1)
  store i32 %169, ptr %10, align 4, !tbaa !9
  %170 = load i32, ptr %10, align 4, !tbaa !9
  %171 = icmp slt i32 %170, 0
  br i1 %171, label %172, label %183

172:                                              ; preds = %168
  %173 = load ptr, ptr %5, align 8, !tbaa !5
  %174 = icmp ne ptr %173, null
  br i1 %174, label %175, label %180

175:                                              ; preds = %172
  %176 = load ptr, ptr %5, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %178 = getelementptr inbounds [22 x i8], ptr %177, i64 0, i64 0
  %179 = load i32, ptr %10, align 4, !tbaa !9
  call void (ptr, ...) %176(ptr noundef @.str.9, ptr noundef %178, i32 noundef %179)
  br label %180

180:                                              ; preds = %175, %172
  %181 = load i16, ptr %12, align 2, !tbaa !11
  %182 = add i16 %181, 1
  store i16 %182, ptr %12, align 2, !tbaa !11
  br label %183

183:                                              ; preds = %180, %168
  br label %184

184:                                              ; preds = %183, %149
  br label %286

185:                                              ; preds = %128
  %186 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 5
  %187 = load i8, ptr %186, align 4, !tbaa !18
  %188 = zext i8 %187 to i32
  %189 = and i32 %188, 16
  %190 = icmp ne i32 %189, 0
  br i1 %190, label %191, label %285

191:                                              ; preds = %185
  %192 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %193 = getelementptr inbounds [22 x i8], ptr %192, i64 0, i64 0
  %194 = call signext i16 @fs_open(ptr noundef %14, ptr noundef %193, i8 noundef zeroext 17)
  store i16 %194, ptr %8, align 2, !tbaa !11
  %195 = load i16, ptr %8, align 2, !tbaa !11
  %196 = sext i16 %195 to i32
  %197 = icmp slt i32 %196, 0
  br i1 %197, label %198, label %210

198:                                              ; preds = %191
  %199 = load ptr, ptr %5, align 8, !tbaa !5
  %200 = icmp ne ptr %199, null
  br i1 %200, label %201, label %207

201:                                              ; preds = %198
  %202 = load ptr, ptr %5, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %204 = getelementptr inbounds [22 x i8], ptr %203, i64 0, i64 0
  %205 = load i16, ptr %8, align 2, !tbaa !11
  %206 = sext i16 %205 to i32
  call void (ptr, ...) %202(ptr noundef @.str.7, ptr noundef %204, i32 noundef %206)
  br label %207

207:                                              ; preds = %201, %198
  %208 = load i16, ptr %12, align 2, !tbaa !11
  %209 = add i16 %208, 1
  store i16 %209, ptr %12, align 2, !tbaa !11
  br label %284

210:                                              ; preds = %191
  %211 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 2
  %212 = load i32, ptr %211, align 4, !tbaa !20
  store i32 %212, ptr %11, align 4, !tbaa !9
  %213 = load i32, ptr %11, align 4, !tbaa !9
  %214 = load i32, ptr getelementptr inbounds (%struct.SFLASH_INFO, ptr @sflash_info, i32 0, i32 1), align 4, !tbaa !21
  %215 = icmp ugt i32 %213, %214
  br i1 %215, label %216, label %227

216:                                              ; preds = %210
  %217 = load ptr, ptr %5, align 8, !tbaa !5
  %218 = icmp ne ptr %217, null
  br i1 %218, label %219, label %224

219:                                              ; preds = %216
  %220 = load ptr, ptr %5, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %222 = getelementptr inbounds [22 x i8], ptr %221, i64 0, i64 0
  %223 = load i32, ptr %11, align 4, !tbaa !9
  call void (ptr, ...) %220(ptr noundef @.str.10, ptr noundef %222, i32 noundef %223)
  br label %224

224:                                              ; preds = %219, %216
  %225 = load i16, ptr %12, align 2, !tbaa !11
  %226 = add i16 %225, 1
  store i16 %226, ptr %12, align 2, !tbaa !11
  br label %283

227:                                              ; preds = %210
  br label %228

228:                                              ; preds = %261, %227
  %229 = load i32, ptr %11, align 4, !tbaa !9
  %230 = icmp ne i32 %229, 0
  br i1 %230, label %231, label %266

231:                                              ; preds = %228
  %232 = load ptr, ptr %6, align 8, !tbaa !5
  %233 = load i32, ptr %7, align 4, !tbaa !9
  %234 = call i32 @fs_read(ptr noundef %14, ptr noundef %232, i32 noundef %233)
  %235 = trunc i32 %234 to i16
  store i16 %235, ptr %8, align 2, !tbaa !11
  %236 = load i16, ptr %8, align 2, !tbaa !11
  %237 = sext i16 %236 to i32
  %238 = icmp slt i32 %237, 0
  br i1 %238, label %249, label %239

239:                                              ; preds = %231
  %240 = load i16, ptr %8, align 2, !tbaa !11
  %241 = sext i16 %240 to i32
  %242 = load i32, ptr %7, align 4, !tbaa !9
  %243 = icmp ugt i32 %241, %242
  br i1 %243, label %249, label %244

244:                                              ; preds = %239
  %245 = load i16, ptr %8, align 2, !tbaa !11
  %246 = sext i16 %245 to i32
  %247 = load i32, ptr %11, align 4, !tbaa !9
  %248 = icmp ugt i32 %246, %247
  br i1 %248, label %249, label %261

249:                                              ; preds = %244, %239, %231
  %250 = load ptr, ptr %5, align 8, !tbaa !5
  %251 = icmp ne ptr %250, null
  br i1 %251, label %252, label %258

252:                                              ; preds = %249
  %253 = load ptr, ptr %5, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %255 = getelementptr inbounds [22 x i8], ptr %254, i64 0, i64 0
  %256 = load i16, ptr %8, align 2, !tbaa !11
  %257 = sext i16 %256 to i32
  call void (ptr, ...) %253(ptr noundef @.str.11, ptr noundef %255, i32 noundef %257)
  br label %258

258:                                              ; preds = %252, %249
  %259 = load i16, ptr %12, align 2, !tbaa !11
  %260 = add i16 %259, 1
  store i16 %260, ptr %12, align 2, !tbaa !11
  br label %266

261:                                              ; preds = %244
  %262 = load i16, ptr %8, align 2, !tbaa !11
  %263 = sext i16 %262 to i32
  %264 = load i32, ptr %11, align 4, !tbaa !9
  %265 = sub i32 %264, %263
  store i32 %265, ptr %11, align 4, !tbaa !9
  br label %228, !llvm.loop !22

266:                                              ; preds = %258, %228
  %267 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 3
  %268 = load i32, ptr %267, align 4, !tbaa !24
  %269 = getelementptr inbounds %struct.FS_DESC, ptr %14, i32 0, i32 4
  %270 = load i32, ptr %269, align 4, !tbaa !25
  %271 = icmp ne i32 %268, %270
  br i1 %271, label %272, label %282

272:                                              ; preds = %266
  %273 = load ptr, ptr %5, align 8, !tbaa !5
  %274 = icmp ne ptr %273, null
  br i1 %274, label %275, label %279

275:                                              ; preds = %272
  %276 = load ptr, ptr %5, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.FS_STAT, ptr %13, i32 0, i32 0
  %278 = getelementptr inbounds [22 x i8], ptr %277, i64 0, i64 0
  call void (ptr, ...) %276(ptr noundef @.str.12, ptr noundef %278)
  br label %279

279:                                              ; preds = %275, %272
  %280 = load i16, ptr %12, align 2, !tbaa !11
  %281 = add i16 %280, 1
  store i16 %281, ptr %12, align 2, !tbaa !11
  br label %282

282:                                              ; preds = %279, %266
  br label %283

283:                                              ; preds = %282, %224
  br label %284

284:                                              ; preds = %283, %207
  br label %285

285:                                              ; preds = %284, %185
  br label %286

286:                                              ; preds = %285, %184
  br label %287

287:                                              ; preds = %286, %123
  br label %288

288:                                              ; preds = %287, %74
  %289 = load i16, ptr %9, align 2, !tbaa !11
  %290 = add i16 %289, 1
  store i16 %290, ptr %9, align 2, !tbaa !11
  br label %58

291:                                              ; preds = %70
  %292 = load ptr, ptr %5, align 8, !tbaa !5
  %293 = icmp ne ptr %292, null
  br i1 %293, label %294, label %304

294:                                              ; preds = %291
  %295 = load i16, ptr %12, align 2, !tbaa !11
  %296 = icmp ne i16 %295, 0
  br i1 %296, label %297, label %301

297:                                              ; preds = %294
  %298 = load ptr, ptr %5, align 8, !tbaa !5
  %299 = load i16, ptr %12, align 2, !tbaa !11
  %300 = sext i16 %299 to i32
  call void (ptr, ...) %298(ptr noundef @.str.13, i32 noundef %300)
  br label %303

301:                                              ; preds = %294
  %302 = load ptr, ptr %5, align 8, !tbaa !5
  call void (ptr, ...) %302(ptr noundef @.str.14)
  br label %303

303:                                              ; preds = %301, %297
  br label %304

304:                                              ; preds = %303, %291
  %305 = load i16, ptr %12, align 2, !tbaa !11
  store i16 %305, ptr %4, align 2
  store i32 1, ptr %15, align 4
  br label %306

306:                                              ; preds = %304, %35
  call void @llvm.lifetime.end.p0(i64 28, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 44, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %8) #2
  %307 = load i16, ptr %4, align 2
  ret i16 %307
}

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 = { 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, !12, i64 0}
!12 = !{!"short", !7, i64 0}
!13 = !{!14, !12, i64 26}
!14 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !12, i64 20, !12, i64 22, !12, i64 24, !12, i64 26, !12, i64 28, !7, i64 32, !7, i64 160}
!15 = !{!14, !12, i64 24}
!16 = !{!14, !12, i64 28}
!17 = !{!14, !12, i64 20}
!18 = !{!19, !7, i64 40}
!19 = !{!"", !7, i64 0, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !7, i64 40}
!20 = !{!19, !10, i64 28}
!21 = !{!14, !10, i64 4}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!19, !10, i64 32}
!25 = !{!26, !10, i64 16}
!26 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !12, i64 24, !7, i64 26}


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

%struct.SFLASH_INFO = type { i32, i32, i32, i32, i32, i16, i16, i16, i16, i16, %union.SF_BUFFER, i8 }
%union.SF_BUFFER = type { [32 x i32] }
%struct.FS_STAT = type { [22 x i8], i32, i32, i32, i32, i8 }
%struct.FS_DESC = type { i32, i32, i32, i32, i32, i32, i16, i8 }

@sflash_info = external local_unnamed_addr global %struct.SFLASH_INFO, align 4
@.str = external hidden unnamed_addr constant [15 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [9 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
declare dso_local signext i16 @fs_start(i8 noundef zeroext) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
declare dso_local signext i16 @fs_open(ptr noundef, ptr noundef, i8 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local signext i16 @fs_info(ptr noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local signext i16 @fs_check_disk(ptr noundef readonly %0, ptr noundef %1, i32 noundef %2) local_unnamed_addr #1 {
  %4 = alloca %struct.FS_STAT, align 4
  %5 = alloca %struct.FS_DESC, align 4
  call void @llvm.lifetime.start.p0(i64 44, ptr nonnull %4) #2
  call void @llvm.lifetime.start.p0(i64 28, ptr nonnull %5) #2
  %6 = icmp ne ptr %0, null
  br i1 %6, label %7, label %.thread

7:                                                ; preds = %3
  tail call void (ptr, ...) %0(ptr noundef nonnull @.str) #2
  %8 = tail call signext i16 @fs_start(i8 noundef zeroext 0)
  %.not = icmp eq i16 %8, 0
  br i1 %.not, label %.thread120, label %.thread117

.thread:                                          ; preds = %3
  %9 = tail call signext i16 @fs_start(i8 noundef zeroext 0)
  switch i16 %9, label %.thread118.fold.split [
    i16 0, label %.thread118
    i16 -147, label %107
  ]

.thread117:                                       ; preds = %7
  %10 = sext i16 %8 to i32
  tail call void (ptr, ...) %0(ptr noundef nonnull @.str.1, i32 noundef %10) #2
  %11 = icmp eq i16 %8, -147
  br i1 %11, label %107, label %.thread120

.thread120:                                       ; preds = %.thread117, %7
  %.0122 = phi i16 [ 0, %7 ], [ 1, %.thread117 ]
  %12 = load i16, ptr getelementptr inbounds (i8, ptr @sflash_info, i64 26), align 2, !tbaa !5
  %13 = zext i16 %12 to i32
  %14 = load i16, ptr getelementptr inbounds (i8, ptr @sflash_info, i64 24), align 4, !tbaa !11
  %15 = zext i16 %14 to i32
  tail call void (ptr, ...) %0(ptr noundef nonnull @.str.2, i32 noundef %13, i32 noundef %15) #2
  %16 = load i16, ptr getelementptr inbounds (i8, ptr @sflash_info, i64 28), align 4, !tbaa !12
  %.not101 = icmp eq i16 %16, 0
  br i1 %.not101, label %.thread118, label %17

17:                                               ; preds = %.thread120
  %18 = zext i16 %16 to i32
  tail call void (ptr, ...) %0(ptr noundef nonnull @.str.3, i32 noundef %18) #2
  %19 = add nuw nsw i16 %.0122, 1
  br label %.thread118

.thread118.fold.split:                            ; preds = %.thread
  br label %.thread118

.thread118:                                       ; preds = %.thread, %.thread118.fold.split, %.thread120, %17
  %.1 = phi i16 [ %19, %17 ], [ %.0122, %.thread120 ], [ %9, %.thread ], [ 1, %.thread118.fold.split ]
  %20 = getelementptr inbounds i8, ptr %4, i64 40
  %21 = getelementptr inbounds i8, ptr %4, i64 28
  %22 = getelementptr inbounds i8, ptr %4, i64 32
  %23 = getelementptr inbounds i8, ptr %5, i64 16
  br label %24

24:                                               ; preds = %100, %.thread118
  %.083 = phi i16 [ 0, %.thread118 ], [ %101, %100 ]
  %.2 = phi i16 [ %.1, %.thread118 ], [ %.6, %100 ]
  %25 = call signext i16 @fs_info(ptr noundef nonnull %4, i16 noundef zeroext %.083)
  %26 = zext i16 %.083 to i32
  %27 = load i16, ptr getelementptr inbounds (i8, ptr @sflash_info, i64 20), align 4, !tbaa !13
  %.not102 = icmp ult i16 %.083, %27
  br i1 %.not102, label %29, label %28

28:                                               ; preds = %24
  switch i16 %25, label %29 [
    i16 128, label %102
    i16 0, label %100
  ]

29:                                               ; preds = %28, %24
  %30 = sext i16 %25 to i32
  %31 = icmp sgt i16 %25, 0
  %or.cond = select i1 %6, i1 %31, i1 false
  br i1 %or.cond, label %.sink.split, label %33

.sink.split:                                      ; preds = %29
  %32 = and i32 %30, 2
  %.not104 = icmp eq i32 %32, 0
  %.str.5..str.4 = select i1 %.not104, ptr @.str.5, ptr @.str.4
  call void (ptr, ...) %0(ptr noundef nonnull %.str.5..str.4, i32 noundef %26, ptr noundef nonnull %4) #2
  br label %33

33:                                               ; preds = %.sink.split, %29
  %.not105 = icmp ult i16 %25, 8
  br i1 %.not105, label %38, label %34

34:                                               ; preds = %33
  br i1 %6, label %35, label %36

35:                                               ; preds = %34
  call void (ptr, ...) %0(ptr noundef nonnull @.str.6, i32 noundef %26, i32 noundef %30) #2
  br label %36

36:                                               ; preds = %35, %34
  %37 = add i16 %.2, 1
  br label %38

38:                                               ; preds = %33, %36
  %.3 = phi i16 [ %37, %36 ], [ %.2, %33 ]
  %39 = and i32 %30, 1
  %.not106 = icmp eq i32 %39, 0
  br i1 %.not106, label %100, label %40

40:                                               ; preds = %38
  %41 = and i32 %30, 4
  %.not107 = icmp eq i32 %41, 0
  br i1 %.not107, label %64, label %42

42:                                               ; preds = %40
  %43 = call signext i16 @fs_open(ptr noundef nonnull %5, ptr noundef nonnull %4, i8 noundef zeroext 9)
  %44 = sext i16 %43 to i32
  %45 = icmp slt i16 %43, 0
  br i1 %45, label %46, label %50

46:                                               ; preds = %42
  br i1 %6, label %47, label %48

47:                                               ; preds = %46
  call void (ptr, ...) %0(ptr noundef nonnull @.str.7, ptr noundef nonnull %4, i32 noundef %44) #2
  br label %48

48:                                               ; preds = %47, %46
  %49 = add i16 %.3, 1
  br label %100

50:                                               ; preds = %42
  %51 = load i8, ptr %20, align 4, !tbaa !14
  %52 = and i8 %51, 16
  %.not111 = icmp eq i8 %52, 0
  br i1 %.not111, label %57, label %53

53:                                               ; preds = %50
  br i1 %6, label %54, label %55

54:                                               ; preds = %53
  call void (ptr, ...) %0(ptr noundef nonnull @.str.8, ptr noundef nonnull %4) #2
  br label %55

55:                                               ; preds = %54, %53
  %56 = add i16 %.3, 1
  br label %57

57:                                               ; preds = %55, %50
  %.4 = phi i16 [ %56, %55 ], [ %.3, %50 ]
  %58 = call i32 @fs_read(ptr noundef nonnull %5, ptr noundef null, i32 noundef -1)
  %59 = icmp slt i32 %58, 0
  br i1 %59, label %60, label %100

60:                                               ; preds = %57
  br i1 %6, label %61, label %62

61:                                               ; preds = %60
  call void (ptr, ...) %0(ptr noundef nonnull @.str.9, ptr noundef nonnull %4, i32 noundef %58) #2
  br label %62

62:                                               ; preds = %61, %60
  %63 = add i16 %.4, 1
  br label %100

64:                                               ; preds = %40
  %65 = load i8, ptr %20, align 4, !tbaa !14
  %66 = and i8 %65, 16
  %.not108 = icmp eq i8 %66, 0
  br i1 %.not108, label %100, label %67

67:                                               ; preds = %64
  %68 = call signext i16 @fs_open(ptr noundef nonnull %5, ptr noundef nonnull %4, i8 noundef zeroext 17)
  %69 = sext i16 %68 to i32
  %70 = icmp slt i16 %68, 0
  br i1 %70, label %71, label %75

71:                                               ; preds = %67
  br i1 %6, label %72, label %73

72:                                               ; preds = %71
  call void (ptr, ...) %0(ptr noundef nonnull @.str.7, ptr noundef nonnull %4, i32 noundef %69) #2
  br label %73

73:                                               ; preds = %72, %71
  %74 = add i16 %.3, 1
  br label %100

75:                                               ; preds = %67
  %76 = load i32, ptr %21, align 4, !tbaa !16
  %77 = load i32, ptr getelementptr inbounds (i8, ptr @sflash_info, i64 4), align 4, !tbaa !17
  %78 = icmp ugt i32 %76, %77
  br i1 %78, label %79, label %.preheader

.preheader:                                       ; preds = %75
  %.not109125 = icmp eq i32 %76, 0
  br i1 %.not109125, label %.loopexit, label %.lr.ph

79:                                               ; preds = %75
  br i1 %6, label %80, label %81

80:                                               ; preds = %79
  call void (ptr, ...) %0(ptr noundef nonnull @.str.10, ptr noundef nonnull %4, i32 noundef %76) #2
  br label %81

81:                                               ; preds = %80, %79
  %82 = add i16 %.3, 1
  br label %100

83:                                               ; preds = %.lr.ph
  %84 = sub i32 %.081126, %86
  %.not109 = icmp eq i32 %84, 0
  br i1 %.not109, label %.loopexit, label %.lr.ph, !llvm.loop !18

.lr.ph:                                           ; preds = %.preheader, %83
  %.081126 = phi i32 [ %84, %83 ], [ %76, %.preheader ]
  %85 = call i32 @fs_read(ptr noundef nonnull %5, ptr noundef %1, i32 noundef %2)
  %sext = shl i32 %85, 16
  %86 = ashr exact i32 %sext, 16
  %87 = icmp slt i32 %86, 0
  %88 = icmp ugt i32 %86, %2
  %or.cond114 = or i1 %87, %88
  %89 = icmp ugt i32 %86, %.081126
  %or.cond115 = or i1 %89, %or.cond114
  br i1 %or.cond115, label %90, label %83

90:                                               ; preds = %.lr.ph
  br i1 %6, label %91, label %92

91:                                               ; preds = %90
  call void (ptr, ...) %0(ptr noundef nonnull @.str.11, ptr noundef nonnull %4, i32 noundef %86) #2
  br label %92

92:                                               ; preds = %91, %90
  %93 = add i16 %.3, 1
  br label %.loopexit

.loopexit:                                        ; preds = %83, %.preheader, %92
  %.5 = phi i16 [ %93, %92 ], [ %.3, %.preheader ], [ %.3, %83 ]
  %94 = load i32, ptr %22, align 4, !tbaa !20
  %95 = load i32, ptr %23, align 4, !tbaa !21
  %.not110 = icmp eq i32 %94, %95
  br i1 %.not110, label %100, label %96

96:                                               ; preds = %.loopexit
  br i1 %6, label %97, label %98

97:                                               ; preds = %96
  call void (ptr, ...) %0(ptr noundef nonnull @.str.12, ptr noundef nonnull %4) #2
  br label %98

98:                                               ; preds = %97, %96
  %99 = add i16 %.5, 1
  br label %100

100:                                              ; preds = %28, %38, %64, %81, %98, %.loopexit, %73, %48, %62, %57
  %.6 = phi i16 [ %49, %48 ], [ %63, %62 ], [ %.4, %57 ], [ %74, %73 ], [ %82, %81 ], [ %99, %98 ], [ %.5, %.loopexit ], [ %.3, %64 ], [ %.3, %38 ], [ %.2, %28 ]
  %101 = add i16 %.083, 1
  br label %24

102:                                              ; preds = %28
  br i1 %6, label %103, label %107

103:                                              ; preds = %102
  %.not112 = icmp eq i16 %.2, 0
  br i1 %.not112, label %106, label %104

104:                                              ; preds = %103
  %105 = sext i16 %.2 to i32
  call void (ptr, ...) %0(ptr noundef nonnull @.str.13, i32 noundef %105) #2
  br label %107

106:                                              ; preds = %103
  call void (ptr, ...) %0(ptr noundef nonnull @.str.14) #2
  br label %107

107:                                              ; preds = %.thread, %102, %106, %104, %.thread117
  %.082 = phi i16 [ -147, %.thread117 ], [ %.2, %104 ], [ 0, %106 ], [ %.2, %102 ], [ %9, %.thread ]
  call void @llvm.lifetime.end.p0(i64 28, ptr nonnull %5) #2
  call void @llvm.lifetime.end.p0(i64 44, ptr nonnull %4) #2
  ret i16 %.082
}

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 = { 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, !10, i64 26}
!6 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !10, i64 20, !10, i64 22, !10, i64 24, !10, i64 26, !10, i64 28, !8, i64 32, !8, i64 160}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"short", !8, i64 0}
!11 = !{!6, !10, i64 24}
!12 = !{!6, !10, i64 28}
!13 = !{!6, !10, i64 20}
!14 = !{!15, !8, i64 40}
!15 = !{!"", !8, i64 0, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !8, i64 40}
!16 = !{!15, !7, i64 28}
!17 = !{!6, !7, i64 4}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!15, !7, i64 32}
!21 = !{!22, !7, i64 16}
!22 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !10, i64 24, !8, i64 26}


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