; LLVM IR from carlk3/no-OS-FatFS-SD-SDIO-SPI-RPi-Pico :: src/ff15/source (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, i64, i32, i64, i64, ptr, ptr, [512 x i8] }
%struct.FFOBJID = type { ptr, i16, i8, i8, i32, i64, i32, i32, i32, i32, i32, i32 }
%struct.FATFS = type { i8, i8, i8, i8, i8, i8, i16, i16, i16, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, [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 @get_fat(ptr noundef, i32 noundef) #1

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

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

23:                                               ; preds = %3
  %24 = load ptr, ptr %5, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.FIL, ptr %24, i32 0, i32 2
  %26 = load i8, ptr %25, align 1, !tbaa !14
  %27 = zext i8 %26 to i32
  store i32 %27, ptr %8, align 4, !tbaa !12
  %28 = icmp ne i32 %27, 0
  br i1 %28, label %29, label %31

29:                                               ; preds = %23, %3
  %30 = load i32, ptr %8, align 4, !tbaa !12
  store i32 %30, ptr %4, align 4
  store i32 1, ptr %17, align 4
  br label %259

31:                                               ; preds = %23
  %32 = load i64, ptr %6, align 8, !tbaa !9
  %33 = icmp eq i64 %32, 0
  br i1 %33, label %47, label %34

34:                                               ; preds = %31
  %35 = load ptr, ptr %5, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.FIL, ptr %35, i32 0, i32 0
  %37 = getelementptr inbounds %struct.FFOBJID, ptr %36, i32 0, i32 5
  %38 = load i64, ptr %37, align 8, !tbaa !18
  %39 = icmp ne i64 %38, 0
  br i1 %39, label %47, label %40

40:                                               ; preds = %34
  %41 = load ptr, ptr %5, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.FIL, ptr %41, i32 0, i32 1
  %43 = load i8, ptr %42, align 8, !tbaa !19
  %44 = zext i8 %43 to i32
  %45 = and i32 %44, 2
  %46 = icmp ne i32 %45, 0
  br i1 %46, label %48, label %47

47:                                               ; preds = %40, %34, %31
  store i32 7, ptr %4, align 4
  store i32 1, ptr %17, align 4
  br label %259

48:                                               ; preds = %40
  %49 = load ptr, ptr %9, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.FATFS, ptr %49, i32 0, i32 0
  %51 = load i8, ptr %50, align 8, !tbaa !20
  %52 = zext i8 %51 to i32
  %53 = icmp ne i32 %52, 4
  br i1 %53, label %54, label %58

54:                                               ; preds = %48
  %55 = load i64, ptr %6, align 8, !tbaa !9
  %56 = icmp uge i64 %55, 4294967296
  br i1 %56, label %57, label %58

57:                                               ; preds = %54
  store i32 7, ptr %4, align 4
  store i32 1, ptr %17, align 4
  br label %259

58:                                               ; preds = %54, %48
  %59 = load ptr, ptr %9, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.FATFS, ptr %59, i32 0, i32 8
  %61 = load i16, ptr %60, align 2, !tbaa !22
  %62 = zext i16 %61 to i32
  %63 = mul i32 %62, 512
  store i32 %63, ptr %10, align 4, !tbaa !12
  %64 = load i64, ptr %6, align 8, !tbaa !9
  %65 = load i32, ptr %10, align 4, !tbaa !12
  %66 = zext i32 %65 to i64
  %67 = udiv i64 %64, %66
  %68 = trunc i64 %67 to i32
  %69 = load i64, ptr %6, align 8, !tbaa !9
  %70 = load i32, ptr %10, align 4, !tbaa !12
  %71 = sub i32 %70, 1
  %72 = zext i32 %71 to i64
  %73 = and i64 %69, %72
  %74 = icmp ne i64 %73, 0
  %75 = zext i1 %74 to i64
  %76 = select i1 %74, i32 1, i32 0
  %77 = add i32 %68, %76
  store i32 %77, ptr %15, align 4, !tbaa !12
  %78 = load ptr, ptr %9, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.FATFS, ptr %78, i32 0, i32 11
  %80 = load i32, ptr %79, align 8, !tbaa !23
  store i32 %80, ptr %12, align 4, !tbaa !12
  store i32 0, ptr %16, align 4, !tbaa !12
  %81 = load i32, ptr %12, align 4, !tbaa !12
  %82 = icmp ult i32 %81, 2
  br i1 %82, label %89, label %83

83:                                               ; preds = %58
  %84 = load i32, ptr %12, align 4, !tbaa !12
  %85 = load ptr, ptr %9, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.FATFS, ptr %85, i32 0, i32 17
  %87 = load i32, ptr %86, align 8, !tbaa !24
  %88 = icmp uge i32 %84, %87
  br i1 %88, label %89, label %90

89:                                               ; preds = %83, %58
  store i32 2, ptr %12, align 4, !tbaa !12
  br label %90

90:                                               ; preds = %89, %83
  %91 = load ptr, ptr %9, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.FATFS, ptr %91, i32 0, i32 0
  %93 = load i8, ptr %92, align 8, !tbaa !20
  %94 = zext i8 %93 to i32
  %95 = icmp eq i32 %94, 4
  br i1 %95, label %96, label %128

96:                                               ; preds = %90
  %97 = load ptr, ptr %9, align 8, !tbaa !5
  %98 = load i32, ptr %12, align 4, !tbaa !12
  %99 = load i32, ptr %15, align 4, !tbaa !12
  %100 = call i32 @find_bitmap(ptr noundef %97, i32 noundef %98, i32 noundef %99)
  store i32 %100, ptr %13, align 4, !tbaa !12
  %101 = load i32, ptr %13, align 4, !tbaa !12
  %102 = icmp eq i32 %101, 0
  br i1 %102, label %103, label %104

103:                                              ; preds = %96
  store i32 7, ptr %8, align 4, !tbaa !12
  br label %104

104:                                              ; preds = %103, %96
  %105 = load i32, ptr %13, align 4, !tbaa !12
  %106 = icmp eq i32 %105, -1
  br i1 %106, label %107, label %108

107:                                              ; preds = %104
  store i32 1, ptr %8, align 4, !tbaa !12
  br label %108

108:                                              ; preds = %107, %104
  %109 = load i32, ptr %8, align 4, !tbaa !12
  %110 = icmp eq i32 %109, 0
  br i1 %110, label %111, label %127

111:                                              ; preds = %108
  %112 = load i8, ptr %7, align 1, !tbaa !11
  %113 = icmp ne i8 %112, 0
  br i1 %113, label %114, label %123

114:                                              ; preds = %111
  %115 = load ptr, ptr %9, align 8, !tbaa !5
  %116 = load i32, ptr %13, align 4, !tbaa !12
  %117 = load i32, ptr %15, align 4, !tbaa !12
  %118 = call i32 @change_bitmap(ptr noundef %115, i32 noundef %116, i32 noundef %117, i32 noundef 1)
  store i32 %118, ptr %8, align 4, !tbaa !12
  %119 = load i32, ptr %13, align 4, !tbaa !12
  %120 = load i32, ptr %15, align 4, !tbaa !12
  %121 = add i32 %119, %120
  %122 = sub i32 %121, 1
  store i32 %122, ptr %16, align 4, !tbaa !12
  br label %126

123:                                              ; preds = %111
  %124 = load i32, ptr %13, align 4, !tbaa !12
  %125 = sub i32 %124, 1
  store i32 %125, ptr %16, align 4, !tbaa !12
  br label %126

126:                                              ; preds = %123, %114
  br label %127

127:                                              ; preds = %126, %108
  br label %208

128:                                              ; preds = %90
  %129 = load i32, ptr %12, align 4, !tbaa !12
  store i32 %129, ptr %11, align 4, !tbaa !12
  store i32 %129, ptr %13, align 4, !tbaa !12
  store i32 0, ptr %14, align 4, !tbaa !12
  br label %130

130:                                              ; preds = %167, %128
  %131 = load ptr, ptr %5, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.FIL, ptr %131, i32 0, i32 0
  %133 = load i32, ptr %11, align 4, !tbaa !12
  %134 = call i32 @get_fat(ptr noundef %132, i32 noundef %133)
  store i32 %134, ptr %10, align 4, !tbaa !12
  %135 = load i32, ptr %11, align 4, !tbaa !12
  %136 = add i32 %135, 1
  store i32 %136, ptr %11, align 4, !tbaa !12
  %137 = load ptr, ptr %9, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.FATFS, ptr %137, i32 0, i32 17
  %139 = load i32, ptr %138, align 8, !tbaa !24
  %140 = icmp uge i32 %136, %139
  br i1 %140, label %141, label %142

141:                                              ; preds = %130
  store i32 2, ptr %11, align 4, !tbaa !12
  br label %142

142:                                              ; preds = %141, %130
  %143 = load i32, ptr %10, align 4, !tbaa !12
  %144 = icmp eq i32 %143, 1
  br i1 %144, label %145, label %146

145:                                              ; preds = %142
  store i32 2, ptr %8, align 4, !tbaa !12
  br label %168

146:                                              ; preds = %142
  %147 = load i32, ptr %10, align 4, !tbaa !12
  %148 = icmp eq i32 %147, -1
  br i1 %148, label %149, label %150

149:                                              ; preds = %146
  store i32 1, ptr %8, align 4, !tbaa !12
  br label %168

150:                                              ; preds = %146
  %151 = load i32, ptr %10, align 4, !tbaa !12
  %152 = icmp eq i32 %151, 0
  br i1 %152, label %153, label %160

153:                                              ; preds = %150
  %154 = load i32, ptr %14, align 4, !tbaa !12
  %155 = add i32 %154, 1
  store i32 %155, ptr %14, align 4, !tbaa !12
  %156 = load i32, ptr %15, align 4, !tbaa !12
  %157 = icmp eq i32 %155, %156
  br i1 %157, label %158, label %159

158:                                              ; preds = %153
  br label %168

159:                                              ; preds = %153
  br label %162

160:                                              ; preds = %150
  %161 = load i32, ptr %11, align 4, !tbaa !12
  store i32 %161, ptr %13, align 4, !tbaa !12
  store i32 0, ptr %14, align 4, !tbaa !12
  br label %162

162:                                              ; preds = %160, %159
  %163 = load i32, ptr %11, align 4, !tbaa !12
  %164 = load i32, ptr %12, align 4, !tbaa !12
  %165 = icmp eq i32 %163, %164
  br i1 %165, label %166, label %167

166:                                              ; preds = %162
  store i32 7, ptr %8, align 4, !tbaa !12
  br label %168

167:                                              ; preds = %162
  br label %130

168:                                              ; preds = %166, %158, %149, %145
  %169 = load i32, ptr %8, align 4, !tbaa !12
  %170 = icmp eq i32 %169, 0
  br i1 %170, label %171, label %207

171:                                              ; preds = %168
  %172 = load i8, ptr %7, align 1, !tbaa !11
  %173 = icmp ne i8 %172, 0
  br i1 %173, label %174, label %203

174:                                              ; preds = %171
  %175 = load i32, ptr %13, align 4, !tbaa !12
  store i32 %175, ptr %11, align 4, !tbaa !12
  %176 = load i32, ptr %15, align 4, !tbaa !12
  store i32 %176, ptr %10, align 4, !tbaa !12
  br label %177

177:                                              ; preds = %197, %174
  %178 = load i32, ptr %10, align 4, !tbaa !12
  %179 = icmp ne i32 %178, 0
  br i1 %179, label %180, label %202

180:                                              ; preds = %177
  %181 = load ptr, ptr %9, align 8, !tbaa !5
  %182 = load i32, ptr %11, align 4, !tbaa !12
  %183 = load i32, ptr %10, align 4, !tbaa !12
  %184 = icmp eq i32 %183, 1
  br i1 %184, label %185, label %186

185:                                              ; preds = %180
  br label %189

186:                                              ; preds = %180
  %187 = load i32, ptr %11, align 4, !tbaa !12
  %188 = add i32 %187, 1
  br label %189

189:                                              ; preds = %186, %185
  %190 = phi i32 [ -1, %185 ], [ %188, %186 ]
  %191 = call i32 @put_fat(ptr noundef %181, i32 noundef %182, i32 noundef %190)
  store i32 %191, ptr %8, align 4, !tbaa !12
  %192 = load i32, ptr %8, align 4, !tbaa !12
  %193 = icmp ne i32 %192, 0
  br i1 %193, label %194, label %195

194:                                              ; preds = %189
  br label %202

195:                                              ; preds = %189
  %196 = load i32, ptr %11, align 4, !tbaa !12
  store i32 %196, ptr %16, align 4, !tbaa !12
  br label %197

197:                                              ; preds = %195
  %198 = load i32, ptr %11, align 4, !tbaa !12
  %199 = add i32 %198, 1
  store i32 %199, ptr %11, align 4, !tbaa !12
  %200 = load i32, ptr %10, align 4, !tbaa !12
  %201 = add i32 %200, -1
  store i32 %201, ptr %10, align 4, !tbaa !12
  br label %177, !llvm.loop !25

202:                                              ; preds = %194, %177
  br label %206

203:                                              ; preds = %171
  %204 = load i32, ptr %13, align 4, !tbaa !12
  %205 = sub i32 %204, 1
  store i32 %205, ptr %16, align 4, !tbaa !12
  br label %206

206:                                              ; preds = %203, %202
  br label %207

207:                                              ; preds = %206, %168
  br label %208

208:                                              ; preds = %207, %127
  %209 = load i32, ptr %8, align 4, !tbaa !12
  %210 = icmp eq i32 %209, 0
  br i1 %210, label %211, label %257

211:                                              ; preds = %208
  %212 = load i32, ptr %16, align 4, !tbaa !12
  %213 = load ptr, ptr %9, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.FATFS, ptr %213, i32 0, i32 11
  store i32 %212, ptr %214, align 8, !tbaa !23
  %215 = load i8, ptr %7, align 1, !tbaa !11
  %216 = icmp ne i8 %215, 0
  br i1 %216, label %217, label %256

217:                                              ; preds = %211
  %218 = load i32, ptr %13, align 4, !tbaa !12
  %219 = load ptr, ptr %5, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.FIL, ptr %219, i32 0, i32 0
  %221 = getelementptr inbounds %struct.FFOBJID, ptr %220, i32 0, i32 4
  store i32 %218, ptr %221, align 4, !tbaa !27
  %222 = load i64, ptr %6, align 8, !tbaa !9
  %223 = load ptr, ptr %5, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.FIL, ptr %223, i32 0, i32 0
  %225 = getelementptr inbounds %struct.FFOBJID, ptr %224, i32 0, i32 5
  store i64 %222, ptr %225, align 8, !tbaa !18
  %226 = load ptr, ptr %5, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct.FIL, ptr %226, i32 0, i32 0
  %228 = getelementptr inbounds %struct.FFOBJID, ptr %227, i32 0, i32 3
  store i8 2, ptr %228, align 1, !tbaa !28
  %229 = load ptr, ptr %5, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.FIL, ptr %229, i32 0, i32 1
  %231 = load i8, ptr %230, align 8, !tbaa !19
  %232 = zext i8 %231 to i32
  %233 = or i32 %232, 64
  %234 = trunc i32 %233 to i8
  store i8 %234, ptr %230, align 8, !tbaa !19
  %235 = load ptr, ptr %9, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.FATFS, ptr %235, i32 0, i32 12
  %237 = load i32, ptr %236, align 4, !tbaa !29
  %238 = load ptr, ptr %9, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.FATFS, ptr %238, i32 0, i32 17
  %240 = load i32, ptr %239, align 8, !tbaa !24
  %241 = sub i32 %240, 2
  %242 = icmp ule i32 %237, %241
  br i1 %242, label %243, label %255

243:                                              ; preds = %217
  %244 = load i32, ptr %15, align 4, !tbaa !12
  %245 = load ptr, ptr %9, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.FATFS, ptr %245, i32 0, i32 12
  %247 = load i32, ptr %246, align 4, !tbaa !29
  %248 = sub i32 %247, %244
  store i32 %248, ptr %246, align 4, !tbaa !29
  %249 = load ptr, ptr %9, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.FATFS, ptr %249, i32 0, i32 5
  %251 = load i8, ptr %250, align 1, !tbaa !30
  %252 = zext i8 %251 to i32
  %253 = or i32 %252, 1
  %254 = trunc i32 %253 to i8
  store i8 %254, ptr %250, align 1, !tbaa !30
  br label %255

255:                                              ; preds = %243, %217
  br label %256

256:                                              ; preds = %255, %211
  br label %257

257:                                              ; preds = %256, %208
  %258 = load i32, ptr %8, align 4, !tbaa !12
  store i32 %258, ptr %4, align 4
  store i32 1, ptr %17, align 4
  br label %259

259:                                              ; preds = %257, %57, %47, %29
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 4, 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 8, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #2
  %260 = load i32, ptr %4, align 4
  ret i32 %260
}

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

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

; Function Attrs: nounwind uwtable
declare hidden i32 @put_fat(ptr noundef, i32 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 = { 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 = !{!"long", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"int", !7, i64 0}
!14 = !{!15, !7, i64 49}
!15 = !{!"", !16, i64 0, !7, i64 48, !7, i64 49, !10, i64 56, !13, i64 64, !10, i64 72, !10, i64 80, !6, i64 88, !6, i64 96, !7, i64 104}
!16 = !{!"", !6, i64 0, !17, i64 8, !7, i64 10, !7, i64 11, !13, i64 12, !10, i64 16, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !13, i64 44}
!17 = !{!"short", !7, i64 0}
!18 = !{!15, !10, i64 16}
!19 = !{!15, !7, i64 48}
!20 = !{!21, !7, i64 0}
!21 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5, !17, i64 6, !17, i64 8, !17, i64 10, !6, i64 16, !6, i64 24, !13, i64 32, !13, i64 36, !13, i64 40, !13, i64 44, !13, i64 48, !13, i64 52, !13, i64 56, !13, i64 60, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !7, i64 112}
!22 = !{!21, !17, i64 10}
!23 = !{!21, !13, i64 32}
!24 = !{!21, !13, i64 56}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!15, !13, i64 12}
!28 = !{!15, !7, i64 11}
!29 = !{!21, !13, i64 36}
!30 = !{!21, !7, i64 5}


; 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 @get_fat(ptr noundef, i32 noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @f_expand(ptr noundef %0, i64 noundef %1, i8 noundef zeroext %2) local_unnamed_addr #1 {
  %4 = alloca ptr, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #2
  %5 = call i32 @validate(ptr noundef %0, ptr noundef nonnull %4)
  %.not = icmp eq i32 %5, 0
  br i1 %.not, label %6, label %.thread110

6:                                                ; preds = %3
  %7 = getelementptr inbounds i8, ptr %0, i64 49
  %8 = load i8, ptr %7, align 1, !tbaa !5
  %9 = zext i8 %8 to i32
  %.not85 = icmp eq i8 %8, 0
  br i1 %.not85, label %10, label %.thread110

10:                                               ; preds = %6
  %11 = icmp eq i64 %1, 0
  br i1 %11, label %.thread110, label %12

12:                                               ; preds = %10
  %13 = getelementptr inbounds i8, ptr %0, i64 16
  %14 = load i64, ptr %13, align 8, !tbaa !14
  %.not86 = icmp eq i64 %14, 0
  br i1 %.not86, label %15, label %.thread110

15:                                               ; preds = %12
  %16 = getelementptr inbounds i8, ptr %0, i64 48
  %17 = load i8, ptr %16, align 8, !tbaa !15
  %18 = and i8 %17, 2
  %.not87 = icmp eq i8 %18, 0
  br i1 %.not87, label %.thread110, label %19

19:                                               ; preds = %15
  %20 = load ptr, ptr %4, align 8, !tbaa !16
  %21 = load i8, ptr %20, align 8, !tbaa !17
  %22 = icmp ne i8 %21, 4
  %23 = icmp ugt i64 %1, 4294967295
  %or.cond = and i1 %23, %22
  br i1 %or.cond, label %.thread110, label %24

24:                                               ; preds = %19
  %25 = getelementptr inbounds i8, ptr %20, i64 10
  %26 = load i16, ptr %25, align 2, !tbaa !19
  %27 = zext i16 %26 to i32
  %28 = shl nuw nsw i32 %27, 9
  %29 = zext nneg i32 %28 to i64
  %30 = udiv i64 %1, %29
  %31 = trunc i64 %30 to i32
  %32 = add nsw i32 %28, -1
  %33 = zext i32 %32 to i64
  %34 = and i64 %33, %1
  %.not88 = icmp ne i64 %34, 0
  %35 = zext i1 %.not88 to i32
  %36 = add i32 %35, %31
  %37 = getelementptr inbounds i8, ptr %20, i64 32
  %38 = load i32, ptr %37, align 8, !tbaa !20
  %39 = icmp ult i32 %38, 2
  br i1 %39, label %43, label %40

40:                                               ; preds = %24
  %41 = getelementptr inbounds i8, ptr %20, i64 56
  %42 = load i32, ptr %41, align 8, !tbaa !21
  %.not89 = icmp ult i32 %38, %42
  br i1 %.not89, label %44, label %43

43:                                               ; preds = %40, %24
  br label %44

44:                                               ; preds = %43, %40
  %.067 = phi i32 [ 2, %43 ], [ %38, %40 ]
  %45 = icmp eq i8 %21, 4
  br i1 %45, label %46, label %.preheader126

46:                                               ; preds = %44
  %47 = call i32 @find_bitmap(ptr noundef nonnull %20, i32 noundef %.067, i32 noundef %36)
  %48 = icmp eq i32 %47, 0
  %spec.select = select i1 %48, i32 7, i32 0
  %49 = icmp eq i32 %47, -1
  %.273 = select i1 %49, i32 1, i32 %spec.select
  %50 = icmp eq i32 %.273, 0
  br i1 %50, label %51, label %.thread110

51:                                               ; preds = %46
  %.not94 = icmp eq i8 %2, 0
  %.pre139 = load ptr, ptr %4, align 8, !tbaa !16
  br i1 %.not94, label %.thread122, label %70

.preheader126:                                    ; preds = %44, %60
  %.068 = phi i32 [ %spec.store.select, %60 ], [ %.067, %44 ]
  %.065 = phi i32 [ %.166, %60 ], [ %.067, %44 ]
  %.063 = phi i32 [ %.164, %60 ], [ 0, %44 ]
  %52 = call i32 @get_fat(ptr noundef %0, i32 noundef %.068)
  %53 = add i32 %.068, 1
  %54 = load ptr, ptr %4, align 8, !tbaa !16
  %55 = getelementptr inbounds i8, ptr %54, i64 56
  %56 = load i32, ptr %55, align 8, !tbaa !21
  %.not90 = icmp ult i32 %53, %56
  %spec.store.select = select i1 %.not90, i32 %53, i32 2
  switch i32 %52, label %60 [
    i32 1, label %.thread110.loopexit159
    i32 -1, label %.thread110
    i32 0, label %57
  ]

57:                                               ; preds = %.preheader126
  %58 = add i32 %.063, 1
  %59 = icmp eq i32 %58, %36
  br i1 %59, label %62, label %60

60:                                               ; preds = %.preheader126, %57
  %.166 = phi i32 [ %.065, %57 ], [ %spec.store.select, %.preheader126 ]
  %.164 = phi i32 [ %58, %57 ], [ 0, %.preheader126 ]
  %61 = icmp eq i32 %spec.store.select, %.067
  br i1 %61, label %.thread110, label %.preheader126

62:                                               ; preds = %57
  %.not91 = icmp eq i8 %2, 0
  br i1 %.not91, label %.thread122, label %.preheader

.preheader:                                       ; preds = %62
  %.not92131 = icmp eq i32 %36, 0
  br i1 %.not92131, label %._crit_edge, label %.lr.ph

63:                                               ; preds = %.lr.ph
  %64 = add i32 %.070132, -1
  %.not92 = icmp eq i32 %64, 0
  br i1 %.not92, label %._crit_edge.loopexit, label %.lr.ph, !llvm.loop !22

.lr.ph:                                           ; preds = %.preheader, %63
  %.169133 = phi i32 [ %67, %63 ], [ %.065, %.preheader ]
  %.070132 = phi i32 [ %64, %63 ], [ %36, %.preheader ]
  %65 = load ptr, ptr %4, align 8, !tbaa !16
  %66 = icmp eq i32 %.070132, 1
  %67 = add i32 %.169133, 1
  %68 = select i1 %66, i32 -1, i32 %67
  %69 = call i32 @put_fat(ptr noundef %65, i32 noundef %.169133, i32 noundef %68)
  %.not93 = icmp eq i32 %69, 0
  br i1 %.not93, label %63, label %.thread110

70:                                               ; preds = %51
  %71 = call i32 @change_bitmap(ptr noundef %.pre139, i32 noundef %47, i32 noundef %36, i32 noundef 1)
  %72 = icmp eq i32 %71, 0
  br i1 %72, label %.thread114, label %.thread110

.thread114:                                       ; preds = %70
  %73 = add i32 %36, -1
  %74 = add i32 %73, %47
  %75 = load ptr, ptr %4, align 8, !tbaa !16
  br label %._crit_edge

.thread122:                                       ; preds = %62, %51
  %76 = phi ptr [ %.pre139, %51 ], [ %54, %62 ]
  %.1.ph.ph.in = phi i32 [ %47, %51 ], [ %.065, %62 ]
  %.1.ph.ph = add i32 %.1.ph.ph.in, -1
  %77 = getelementptr inbounds i8, ptr %76, i64 32
  store i32 %.1.ph.ph, ptr %77, align 8, !tbaa !20
  br label %.thread110

._crit_edge.loopexit:                             ; preds = %63
  %.pre = load ptr, ptr %4, align 8, !tbaa !16
  br label %._crit_edge

._crit_edge:                                      ; preds = %.preheader, %._crit_edge.loopexit, %.thread114
  %.sink148 = phi ptr [ %75, %.thread114 ], [ %54, %.preheader ], [ %.pre, %._crit_edge.loopexit ]
  %.0.lcssa.sink = phi i32 [ %74, %.thread114 ], [ 0, %.preheader ], [ %.169133, %._crit_edge.loopexit ]
  %.3105119 = phi i32 [ %47, %.thread114 ], [ %.065, %.preheader ], [ %.065, %._crit_edge.loopexit ]
  %78 = getelementptr inbounds i8, ptr %.sink148, i64 32
  store i32 %.0.lcssa.sink, ptr %78, align 8, !tbaa !20
  %79 = getelementptr inbounds i8, ptr %0, i64 12
  store i32 %.3105119, ptr %79, align 4, !tbaa !24
  store i64 %1, ptr %13, align 8, !tbaa !14
  %80 = getelementptr inbounds i8, ptr %0, i64 11
  store i8 2, ptr %80, align 1, !tbaa !25
  %81 = load i8, ptr %16, align 8, !tbaa !15
  %82 = or i8 %81, 64
  store i8 %82, ptr %16, align 8, !tbaa !15
  %83 = getelementptr inbounds i8, ptr %.sink148, i64 36
  %84 = load i32, ptr %83, align 4, !tbaa !26
  %85 = getelementptr inbounds i8, ptr %.sink148, i64 56
  %86 = load i32, ptr %85, align 8, !tbaa !21
  %87 = add i32 %86, -2
  %.not96 = icmp ugt i32 %84, %87
  br i1 %.not96, label %.thread110, label %88

88:                                               ; preds = %._crit_edge
  %89 = sub i32 %84, %36
  store i32 %89, ptr %83, align 4, !tbaa !26
  %90 = getelementptr inbounds i8, ptr %.sink148, i64 5
  %91 = load i8, ptr %90, align 1, !tbaa !27
  %92 = or i8 %91, 1
  store i8 %92, ptr %90, align 1, !tbaa !27
  br label %.thread110

.thread110.loopexit159:                           ; preds = %.preheader126
  br label %.thread110

.thread110:                                       ; preds = %60, %.lr.ph, %.preheader126, %.thread110.loopexit159, %46, %.thread122, %70, %._crit_edge, %88, %19, %10, %12, %15, %3, %6
  %.062 = phi i32 [ %5, %3 ], [ %9, %6 ], [ 7, %15 ], [ 7, %12 ], [ 7, %10 ], [ 7, %19 ], [ 0, %88 ], [ 0, %._crit_edge ], [ %71, %70 ], [ 0, %.thread122 ], [ %.273, %46 ], [ 1, %.preheader126 ], [ %69, %.lr.ph ], [ 7, %60 ], [ 2, %.thread110.loopexit159 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #2
  ret i32 %.062
}

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

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

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

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, !9, i64 49}
!6 = !{!"", !7, i64 0, !9, i64 48, !9, i64 49, !13, i64 56, !12, i64 64, !13, i64 72, !13, i64 80, !8, i64 88, !8, i64 96, !9, i64 104}
!7 = !{!"", !8, i64 0, !11, i64 8, !9, i64 10, !9, i64 11, !12, i64 12, !13, i64 16, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!"short", !9, i64 0}
!12 = !{!"int", !9, i64 0}
!13 = !{!"long", !9, i64 0}
!14 = !{!6, !13, i64 16}
!15 = !{!6, !9, i64 48}
!16 = !{!8, !8, i64 0}
!17 = !{!18, !9, i64 0}
!18 = !{!"", !9, i64 0, !9, i64 1, !9, i64 2, !9, i64 3, !9, i64 4, !9, i64 5, !11, i64 6, !11, i64 8, !11, i64 10, !8, i64 16, !8, i64 24, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !12, i64 60, !13, i64 64, !13, i64 72, !13, i64 80, !13, i64 88, !13, i64 96, !13, i64 104, !9, i64 112}
!19 = !{!18, !11, i64 10}
!20 = !{!18, !12, i64 32}
!21 = !{!18, !12, i64 56}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!6, !12, i64 12}
!25 = !{!6, !9, i64 11}
!26 = !{!18, !12, i64 36}
!27 = !{!18, !9, i64 5}


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