; LLVM IR from facebookresearch/habitat-sim :: src/deps/basis-universal/encoder (apg_bmp)

; 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._entire_file_t = type { ptr, i64 }
%struct._bmp_dib_BITMAPINFOHEADER_t = type { i32, i32, i32, i16, i16, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct._bmp_file_header_t = type <{ [2 x i8], i32, i16, i16, i32 }>

; Function Attrs: nounwind uwtable
define dso_local ptr @apg_bmp_read(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3) #0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca %struct._entire_file_t, align 8
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i8, align 1
  %19 = alloca i32, align 4
  %20 = alloca i8, align 1
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca [4 x i32], align 16
  %24 = alloca i32, align 4
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i32, align 4
  %31 = alloca i64, align 8
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i64, align 8
  %35 = alloca i32, align 4
  %36 = alloca i64, align 8
  %37 = alloca i32, align 4
  %38 = alloca i8, align 1
  %39 = alloca i64, align 8
  %40 = alloca i32, align 4
  %41 = alloca i64, align 8
  %42 = alloca i32, align 4
  %43 = alloca i8, align 1
  %44 = alloca i8, align 1
  %45 = alloca i8, align 1
  %46 = alloca i64, align 8
  %47 = alloca i32, align 4
  %48 = alloca i8, align 1
  %49 = alloca i64, align 8
  %50 = alloca i32, align 4
  %51 = alloca i8, align 1
  %52 = alloca i8, align 1
  %53 = alloca i8, align 1
  %54 = alloca i8, align 1
  %55 = alloca i64, align 8
  %56 = alloca i32, align 4
  %57 = alloca i64, align 8
  %58 = alloca i32, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  %59 = load ptr, ptr %6, align 8, !tbaa !5
  %60 = icmp ne ptr %59, null
  br i1 %60, label %61, label %70

61:                                               ; preds = %4
  %62 = load ptr, ptr %7, align 8, !tbaa !5
  %63 = icmp ne ptr %62, null
  br i1 %63, label %64, label %70

64:                                               ; preds = %61
  %65 = load ptr, ptr %8, align 8, !tbaa !5
  %66 = icmp ne ptr %65, null
  br i1 %66, label %67, label %70

67:                                               ; preds = %64
  %68 = load ptr, ptr %9, align 8, !tbaa !5
  %69 = icmp ne ptr %68, null
  br i1 %69, label %71, label %70

70:                                               ; preds = %67, %64, %61, %4
  store ptr null, ptr %5, align 8
  br label %1032

71:                                               ; preds = %67
  call void @llvm.lifetime.start.p0(i64 16, ptr %10) #7
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = call zeroext i1 @_read_entire_file(ptr noundef %72, ptr noundef %10)
  br i1 %73, label %75, label %74

74:                                               ; preds = %71
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1031

75:                                               ; preds = %71
  %76 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %77 = load i64, ptr %76, align 8, !tbaa !9
  %78 = icmp ult i64 %77, 54
  br i1 %78, label %79, label %82

79:                                               ; preds = %75
  %80 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %81 = load ptr, ptr %80, align 8, !tbaa !12
  call void @free(ptr noundef %81) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1031

82:                                               ; preds = %75
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  %83 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %84 = load ptr, ptr %83, align 8, !tbaa !12
  store ptr %84, ptr %12, align 8, !tbaa !5
  %85 = load ptr, ptr %12, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %87 = load i64, ptr %86, align 8, !tbaa !9
  %88 = call zeroext i1 @_validate_file_hdr(ptr noundef %85, i64 noundef %87)
  br i1 %88, label %92, label %89

89:                                               ; preds = %82
  %90 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %91 = load ptr, ptr %90, align 8, !tbaa !12
  call void @free(ptr noundef %91) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1030

92:                                               ; preds = %82
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #7
  %93 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %94 = load ptr, ptr %93, align 8, !tbaa !12
  %95 = getelementptr inbounds i8, ptr %94, i64 14
  store ptr %95, ptr %13, align 8, !tbaa !5
  %96 = load ptr, ptr %13, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %98 = load i64, ptr %97, align 8, !tbaa !9
  %99 = call zeroext i1 @_validate_dib_hdr(ptr noundef %96, i64 noundef %98)
  br i1 %99, label %103, label %100

100:                                              ; preds = %92
  %101 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %102 = load ptr, ptr %101, align 8, !tbaa !12
  call void @free(ptr noundef %102) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1029

103:                                              ; preds = %92
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  %104 = load ptr, ptr %13, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %104, i32 0, i32 1
  %106 = load i32, ptr %105, align 1, !tbaa !13
  %107 = call i32 @llvm.abs.i32(i32 %106, i1 true)
  %108 = load ptr, ptr %7, align 8, !tbaa !5
  store i32 %107, ptr %108, align 4, !tbaa !17
  store i32 %107, ptr %14, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #7
  %109 = load ptr, ptr %13, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %109, i32 0, i32 2
  %111 = load i32, ptr %110, align 1, !tbaa !18
  %112 = call i32 @llvm.abs.i32(i32 %111, i1 true)
  %113 = load ptr, ptr %8, align 8, !tbaa !5
  store i32 %112, ptr %113, align 4, !tbaa !17
  store i32 %112, ptr %15, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  store i32 3, ptr %16, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #7
  store i32 3, ptr %17, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #7
  store i8 0, ptr %18, align 1, !tbaa !19
  %114 = load ptr, ptr %13, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %114, i32 0, i32 4
  %116 = load i16, ptr %115, align 1, !tbaa !21
  %117 = zext i16 %116 to i32
  switch i32 %117, label %123 [
    i32 32, label %118
    i32 24, label %119
    i32 8, label %120
    i32 4, label %121
    i32 1, label %122
  ]

118:                                              ; preds = %103
  store i32 4, ptr %17, align 4, !tbaa !17
  store i32 4, ptr %16, align 4, !tbaa !17
  br label %126

119:                                              ; preds = %103
  store i32 3, ptr %17, align 4, !tbaa !17
  store i32 3, ptr %16, align 4, !tbaa !17
  br label %126

120:                                              ; preds = %103
  store i32 3, ptr %16, align 4, !tbaa !17
  store i8 1, ptr %18, align 1, !tbaa !19
  store i32 1, ptr %17, align 4, !tbaa !17
  br label %126

121:                                              ; preds = %103
  store i32 3, ptr %16, align 4, !tbaa !17
  store i8 1, ptr %18, align 1, !tbaa !19
  store i32 1, ptr %17, align 4, !tbaa !17
  br label %126

122:                                              ; preds = %103
  store i32 3, ptr %16, align 4, !tbaa !17
  store i8 1, ptr %18, align 1, !tbaa !19
  store i32 1, ptr %17, align 4, !tbaa !17
  br label %126

123:                                              ; preds = %103
  %124 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %125 = load ptr, ptr %124, align 8, !tbaa !12
  call void @free(ptr noundef %125) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1028

126:                                              ; preds = %122, %121, %120, %119, %118
  %127 = load i32, ptr %16, align 4, !tbaa !17
  %128 = load ptr, ptr %9, align 8, !tbaa !5
  store i32 %127, ptr %128, align 4, !tbaa !17
  %129 = load ptr, ptr %13, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %129, i32 0, i32 9
  %131 = load i32, ptr %130, align 1, !tbaa !22
  %132 = icmp ugt i32 %131, 0
  br i1 %132, label %133, label %134

133:                                              ; preds = %126
  store i8 1, ptr %18, align 1, !tbaa !19
  br label %134

134:                                              ; preds = %133, %126
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  %135 = load ptr, ptr %13, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %135, i32 0, i32 0
  %137 = load i32, ptr %136, align 1, !tbaa !23
  %138 = add i32 14, %137
  store i32 %138, ptr %19, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 1, ptr %20) #7
  store i8 0, ptr %20, align 1, !tbaa !19
  %139 = load ptr, ptr %13, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %139, i32 0, i32 5
  %141 = load i32, ptr %140, align 1, !tbaa !24
  %142 = icmp eq i32 3, %141
  br i1 %142, label %148, label %143

143:                                              ; preds = %134
  %144 = load ptr, ptr %13, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %144, i32 0, i32 5
  %146 = load i32, ptr %145, align 1, !tbaa !24
  %147 = icmp eq i32 6, %146
  br i1 %147, label %148, label %151

148:                                              ; preds = %143, %134
  store i8 1, ptr %20, align 1, !tbaa !19
  %149 = load i32, ptr %19, align 4, !tbaa !17
  %150 = add i32 %149, 12
  store i32 %150, ptr %19, align 4, !tbaa !17
  br label %151

151:                                              ; preds = %148, %143
  %152 = load i32, ptr %19, align 4, !tbaa !17
  %153 = zext i32 %152 to i64
  %154 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %155 = load i64, ptr %154, align 8, !tbaa !9
  %156 = icmp ugt i64 %153, %155
  br i1 %156, label %157, label %160

157:                                              ; preds = %151
  %158 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %159 = load ptr, ptr %158, align 8, !tbaa !12
  call void @free(ptr noundef %159) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1027

160:                                              ; preds = %151
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  %161 = load i32, ptr %14, align 4, !tbaa !17
  %162 = load i32, ptr %17, align 4, !tbaa !17
  %163 = mul i32 %161, %162
  store i32 %163, ptr %21, align 4, !tbaa !17
  %164 = load ptr, ptr %13, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %164, i32 0, i32 4
  %166 = load i16, ptr %165, align 1, !tbaa !21
  %167 = zext i16 %166 to i32
  %168 = icmp eq i32 4, %167
  br i1 %168, label %169, label %182

169:                                              ; preds = %160
  %170 = load i32, ptr %14, align 4, !tbaa !17
  %171 = urem i32 %170, 2
  %172 = icmp ugt i32 %171, 0
  br i1 %172, label %173, label %177

173:                                              ; preds = %169
  %174 = load i32, ptr %14, align 4, !tbaa !17
  %175 = udiv i32 %174, 2
  %176 = add i32 %175, 1
  br label %180

177:                                              ; preds = %169
  %178 = load i32, ptr %14, align 4, !tbaa !17
  %179 = udiv i32 %178, 2
  br label %180

180:                                              ; preds = %177, %173
  %181 = phi i32 [ %176, %173 ], [ %179, %177 ]
  store i32 %181, ptr %21, align 4, !tbaa !17
  br label %182

182:                                              ; preds = %180, %160
  %183 = load ptr, ptr %13, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %183, i32 0, i32 4
  %185 = load i16, ptr %184, align 1, !tbaa !21
  %186 = zext i16 %185 to i32
  %187 = icmp eq i32 1, %186
  br i1 %187, label %188, label %201

188:                                              ; preds = %182
  %189 = load i32, ptr %14, align 4, !tbaa !17
  %190 = urem i32 %189, 8
  %191 = icmp ugt i32 %190, 0
  br i1 %191, label %192, label %196

192:                                              ; preds = %188
  %193 = load i32, ptr %14, align 4, !tbaa !17
  %194 = udiv i32 %193, 8
  %195 = add i32 %194, 1
  br label %199

196:                                              ; preds = %188
  %197 = load i32, ptr %14, align 4, !tbaa !17
  %198 = udiv i32 %197, 8
  br label %199

199:                                              ; preds = %196, %192
  %200 = phi i32 [ %195, %192 ], [ %198, %196 ]
  store i32 %200, ptr %21, align 4, !tbaa !17
  br label %201

201:                                              ; preds = %199, %182
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  %202 = load i32, ptr %21, align 4, !tbaa !17
  %203 = urem i32 %202, 4
  %204 = icmp eq i32 0, %203
  br i1 %204, label %205, label %206

205:                                              ; preds = %201
  br label %210

206:                                              ; preds = %201
  %207 = load i32, ptr %21, align 4, !tbaa !17
  %208 = urem i32 %207, 4
  %209 = sub i32 4, %208
  br label %210

210:                                              ; preds = %206, %205
  %211 = phi i32 [ 0, %205 ], [ %209, %206 ]
  store i32 %211, ptr %22, align 4, !tbaa !17
  %212 = load ptr, ptr %12, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct._bmp_file_header_t, ptr %212, i32 0, i32 4
  %214 = load i32, ptr %213, align 1, !tbaa !25
  %215 = load i32, ptr %21, align 4, !tbaa !17
  %216 = load i32, ptr %22, align 4, !tbaa !17
  %217 = add i32 %215, %216
  %218 = load i32, ptr %15, align 4, !tbaa !17
  %219 = mul i32 %217, %218
  %220 = add i32 %214, %219
  %221 = zext i32 %220 to i64
  %222 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %223 = load i64, ptr %222, align 8, !tbaa !9
  %224 = icmp ugt i64 %221, %223
  br i1 %224, label %225, label %228

225:                                              ; preds = %210
  %226 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %227 = load ptr, ptr %226, align 8, !tbaa !12
  call void @free(ptr noundef %227) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1026

228:                                              ; preds = %210
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #7
  call void @llvm.memset.p0.i64(ptr align 16 %23, i8 0, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  store i32 0, ptr %24, align 4, !tbaa !17
  %229 = load i8, ptr %20, align 1, !tbaa !19, !range !27, !noundef !28
  %230 = trunc i8 %229 to i1
  br i1 %230, label %231, label %262

231:                                              ; preds = %228
  %232 = load ptr, ptr %13, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %232, i32 0, i32 11
  %234 = load i32, ptr %233, align 1, !tbaa !29
  %235 = load ptr, ptr %13, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %235, i32 0, i32 12
  %237 = load i32, ptr %236, align 1, !tbaa !30
  %238 = or i32 %234, %237
  %239 = load ptr, ptr %13, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %239, i32 0, i32 13
  %241 = load i32, ptr %240, align 1, !tbaa !31
  %242 = or i32 %238, %241
  %243 = xor i32 %242, -1
  store i32 %243, ptr %24, align 4, !tbaa !17
  %244 = load ptr, ptr %13, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %244, i32 0, i32 11
  %246 = load i32, ptr %245, align 1, !tbaa !29
  %247 = call i32 @_bitscan(i32 noundef %246)
  %248 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 0
  store i32 %247, ptr %248, align 16, !tbaa !17
  %249 = load ptr, ptr %13, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %249, i32 0, i32 12
  %251 = load i32, ptr %250, align 1, !tbaa !30
  %252 = call i32 @_bitscan(i32 noundef %251)
  %253 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 1
  store i32 %252, ptr %253, align 4, !tbaa !17
  %254 = load ptr, ptr %13, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %254, i32 0, i32 13
  %256 = load i32, ptr %255, align 1, !tbaa !31
  %257 = call i32 @_bitscan(i32 noundef %256)
  %258 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 2
  store i32 %257, ptr %258, align 8, !tbaa !17
  %259 = load i32, ptr %24, align 4, !tbaa !17
  %260 = call i32 @_bitscan(i32 noundef %259)
  %261 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 3
  store i32 %260, ptr %261, align 4, !tbaa !17
  br label %262

262:                                              ; preds = %231, %228
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %263 = load i32, ptr %14, align 4, !tbaa !17
  %264 = zext i32 %263 to i64
  %265 = load i32, ptr %15, align 4, !tbaa !17
  %266 = zext i32 %265 to i64
  %267 = mul i64 %264, %266
  %268 = load i32, ptr %16, align 4, !tbaa !17
  %269 = zext i32 %268 to i64
  %270 = mul i64 %267, %269
  %271 = call noalias ptr @malloc(i64 noundef %270) #8
  store ptr %271, ptr %25, align 8, !tbaa !5
  %272 = load ptr, ptr %25, align 8, !tbaa !5
  %273 = icmp ne ptr %272, null
  br i1 %273, label %277, label %274

274:                                              ; preds = %262
  %275 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %276 = load ptr, ptr %275, align 8, !tbaa !12
  call void @free(ptr noundef %276) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1025

277:                                              ; preds = %262
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #7
  %278 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %279 = load ptr, ptr %278, align 8, !tbaa !12
  %280 = load i32, ptr %19, align 4, !tbaa !17
  %281 = zext i32 %280 to i64
  %282 = getelementptr inbounds i8, ptr %279, i64 %281
  store ptr %282, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #7
  %283 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %284 = load ptr, ptr %283, align 8, !tbaa !12
  %285 = load ptr, ptr %12, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct._bmp_file_header_t, ptr %285, i32 0, i32 4
  %287 = load i32, ptr %286, align 1, !tbaa !25
  %288 = zext i32 %287 to i64
  %289 = getelementptr inbounds i8, ptr %284, i64 %288
  store ptr %289, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #7
  %290 = load i32, ptr %14, align 4, !tbaa !17
  %291 = load i32, ptr %16, align 4, !tbaa !17
  %292 = mul i32 %290, %291
  %293 = zext i32 %292 to i64
  store i64 %293, ptr %28, align 8, !tbaa !32
  %294 = load ptr, ptr %13, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %294, i32 0, i32 4
  %296 = load i16, ptr %295, align 1, !tbaa !21
  %297 = zext i16 %296 to i32
  %298 = icmp eq i32 32, %297
  br i1 %298, label %299, label %404

299:                                              ; preds = %277
  %300 = load ptr, ptr %12, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct._bmp_file_header_t, ptr %300, i32 0, i32 4
  %302 = load i32, ptr %301, align 1, !tbaa !25
  %303 = zext i32 %302 to i64
  %304 = load i32, ptr %15, align 4, !tbaa !17
  %305 = zext i32 %304 to i64
  %306 = load i32, ptr %14, align 4, !tbaa !17
  %307 = zext i32 %306 to i64
  %308 = mul i64 %305, %307
  %309 = load i32, ptr %17, align 4, !tbaa !17
  %310 = zext i32 %309 to i64
  %311 = mul i64 %308, %310
  %312 = add i64 %303, %311
  %313 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %314 = load i64, ptr %313, align 8, !tbaa !9
  %315 = icmp ugt i64 %312, %314
  br i1 %315, label %316, label %320

316:                                              ; preds = %299
  %317 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %318 = load ptr, ptr %317, align 8, !tbaa !12
  call void @free(ptr noundef %318) #7
  %319 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %319) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1024

320:                                              ; preds = %299
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #7
  store i64 0, ptr %29, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #7
  store i32 0, ptr %30, align 4, !tbaa !17
  br label %321

321:                                              ; preds = %400, %320
  %322 = load i32, ptr %30, align 4, !tbaa !17
  %323 = load i32, ptr %15, align 4, !tbaa !17
  %324 = icmp ult i32 %322, %323
  br i1 %324, label %326, label %325

325:                                              ; preds = %321
  store i32 3, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #7
  br label %403

326:                                              ; preds = %321
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #7
  %327 = load i32, ptr %30, align 4, !tbaa !17
  %328 = zext i32 %327 to i64
  %329 = load i64, ptr %28, align 8, !tbaa !32
  %330 = mul i64 %328, %329
  store i64 %330, ptr %31, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #7
  store i32 0, ptr %32, align 4, !tbaa !17
  br label %331

331:                                              ; preds = %392, %326
  %332 = load i32, ptr %32, align 4, !tbaa !17
  %333 = load i32, ptr %14, align 4, !tbaa !17
  %334 = icmp ult i32 %332, %333
  br i1 %334, label %336, label %335

335:                                              ; preds = %331
  store i32 6, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #7
  br label %395

336:                                              ; preds = %331
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #7
  %337 = load ptr, ptr %27, align 8, !tbaa !5
  %338 = load i64, ptr %29, align 8, !tbaa !32
  %339 = getelementptr inbounds i8, ptr %337, i64 %338
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 1 %339, i64 4, i1 false)
  %340 = load i32, ptr %33, align 4, !tbaa !17
  %341 = load ptr, ptr %13, align 8, !tbaa !5
  %342 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %341, i32 0, i32 11
  %343 = load i32, ptr %342, align 1, !tbaa !29
  %344 = and i32 %340, %343
  %345 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 0
  %346 = load i32, ptr %345, align 16, !tbaa !17
  %347 = lshr i32 %344, %346
  %348 = trunc i32 %347 to i8
  %349 = load ptr, ptr %25, align 8, !tbaa !5
  %350 = load i64, ptr %31, align 8, !tbaa !32
  %351 = add i64 %350, 1
  store i64 %351, ptr %31, align 8, !tbaa !32
  %352 = getelementptr inbounds i8, ptr %349, i64 %350
  store i8 %348, ptr %352, align 1, !tbaa !33
  %353 = load i32, ptr %33, align 4, !tbaa !17
  %354 = load ptr, ptr %13, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %354, i32 0, i32 12
  %356 = load i32, ptr %355, align 1, !tbaa !30
  %357 = and i32 %353, %356
  %358 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 1
  %359 = load i32, ptr %358, align 4, !tbaa !17
  %360 = lshr i32 %357, %359
  %361 = trunc i32 %360 to i8
  %362 = load ptr, ptr %25, align 8, !tbaa !5
  %363 = load i64, ptr %31, align 8, !tbaa !32
  %364 = add i64 %363, 1
  store i64 %364, ptr %31, align 8, !tbaa !32
  %365 = getelementptr inbounds i8, ptr %362, i64 %363
  store i8 %361, ptr %365, align 1, !tbaa !33
  %366 = load i32, ptr %33, align 4, !tbaa !17
  %367 = load ptr, ptr %13, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %367, i32 0, i32 13
  %369 = load i32, ptr %368, align 1, !tbaa !31
  %370 = and i32 %366, %369
  %371 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 2
  %372 = load i32, ptr %371, align 8, !tbaa !17
  %373 = lshr i32 %370, %372
  %374 = trunc i32 %373 to i8
  %375 = load ptr, ptr %25, align 8, !tbaa !5
  %376 = load i64, ptr %31, align 8, !tbaa !32
  %377 = add i64 %376, 1
  store i64 %377, ptr %31, align 8, !tbaa !32
  %378 = getelementptr inbounds i8, ptr %375, i64 %376
  store i8 %374, ptr %378, align 1, !tbaa !33
  %379 = load i32, ptr %33, align 4, !tbaa !17
  %380 = load i32, ptr %24, align 4, !tbaa !17
  %381 = and i32 %379, %380
  %382 = getelementptr inbounds [4 x i32], ptr %23, i64 0, i64 3
  %383 = load i32, ptr %382, align 4, !tbaa !17
  %384 = lshr i32 %381, %383
  %385 = trunc i32 %384 to i8
  %386 = load ptr, ptr %25, align 8, !tbaa !5
  %387 = load i64, ptr %31, align 8, !tbaa !32
  %388 = add i64 %387, 1
  store i64 %388, ptr %31, align 8, !tbaa !32
  %389 = getelementptr inbounds i8, ptr %386, i64 %387
  store i8 %385, ptr %389, align 1, !tbaa !33
  %390 = load i64, ptr %29, align 8, !tbaa !32
  %391 = add i64 %390, 4
  store i64 %391, ptr %29, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #7
  br label %392

392:                                              ; preds = %336
  %393 = load i32, ptr %32, align 4, !tbaa !17
  %394 = add i32 %393, 1
  store i32 %394, ptr %32, align 4, !tbaa !17
  br label %331, !llvm.loop !34

395:                                              ; preds = %335
  %396 = load i32, ptr %22, align 4, !tbaa !17
  %397 = zext i32 %396 to i64
  %398 = load i64, ptr %29, align 8, !tbaa !32
  %399 = add i64 %398, %397
  store i64 %399, ptr %29, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #7
  br label %400

400:                                              ; preds = %395
  %401 = load i32, ptr %30, align 4, !tbaa !17
  %402 = add i32 %401, 1
  store i32 %402, ptr %30, align 4, !tbaa !17
  br label %321, !llvm.loop !36

403:                                              ; preds = %325
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  br label %1020

404:                                              ; preds = %277
  %405 = load ptr, ptr %13, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %405, i32 0, i32 4
  %407 = load i16, ptr %406, align 1, !tbaa !21
  %408 = zext i16 %407 to i32
  %409 = icmp eq i32 8, %408
  br i1 %409, label %410, label %531

410:                                              ; preds = %404
  %411 = load i8, ptr %18, align 1, !tbaa !19, !range !27, !noundef !28
  %412 = trunc i8 %411 to i1
  br i1 %412, label %413, label %531

413:                                              ; preds = %410
  %414 = load ptr, ptr %12, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct._bmp_file_header_t, ptr %414, i32 0, i32 4
  %416 = load i32, ptr %415, align 1, !tbaa !25
  %417 = load i32, ptr %15, align 4, !tbaa !17
  %418 = load i32, ptr %14, align 4, !tbaa !17
  %419 = mul i32 %417, %418
  %420 = add i32 %416, %419
  %421 = zext i32 %420 to i64
  %422 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %423 = load i64, ptr %422, align 8, !tbaa !9
  %424 = icmp ugt i64 %421, %423
  br i1 %424, label %425, label %429

425:                                              ; preds = %413
  %426 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %427 = load ptr, ptr %426, align 8, !tbaa !12
  call void @free(ptr noundef %427) #7
  %428 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %428) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1024

429:                                              ; preds = %413
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #7
  store i64 0, ptr %34, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #7
  store i32 0, ptr %35, align 4, !tbaa !17
  br label %430

430:                                              ; preds = %522, %429
  %431 = load i32, ptr %35, align 4, !tbaa !17
  %432 = load i32, ptr %15, align 4, !tbaa !17
  %433 = icmp ult i32 %431, %432
  br i1 %433, label %435, label %434

434:                                              ; preds = %430
  store i32 9, ptr %11, align 4
  br label %525

435:                                              ; preds = %430
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #7
  %436 = load i32, ptr %15, align 4, !tbaa !17
  %437 = sub i32 %436, 1
  %438 = load i32, ptr %35, align 4, !tbaa !17
  %439 = sub i32 %437, %438
  %440 = zext i32 %439 to i64
  %441 = load i64, ptr %28, align 8, !tbaa !32
  %442 = mul i64 %440, %441
  store i64 %442, ptr %36, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #7
  store i32 0, ptr %37, align 4, !tbaa !17
  br label %443

443:                                              ; preds = %509, %435
  %444 = load i32, ptr %37, align 4, !tbaa !17
  %445 = load i32, ptr %14, align 4, !tbaa !17
  %446 = icmp ult i32 %444, %445
  br i1 %446, label %448, label %447

447:                                              ; preds = %443
  store i32 12, ptr %11, align 4
  br label %512

448:                                              ; preds = %443
  call void @llvm.lifetime.start.p0(i64 1, ptr %38) #7
  %449 = load ptr, ptr %27, align 8, !tbaa !5
  %450 = load i64, ptr %34, align 8, !tbaa !32
  %451 = getelementptr inbounds i8, ptr %449, i64 %450
  %452 = load i8, ptr %451, align 1, !tbaa !33
  store i8 %452, ptr %38, align 1, !tbaa !33
  %453 = load i32, ptr %19, align 4, !tbaa !17
  %454 = load i8, ptr %38, align 1, !tbaa !33
  %455 = zext i8 %454 to i32
  %456 = mul nsw i32 %455, 4
  %457 = add i32 %453, %456
  %458 = add i32 %457, 2
  %459 = zext i32 %458 to i64
  %460 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %461 = load i64, ptr %460, align 8, !tbaa !9
  %462 = icmp uge i64 %459, %461
  br i1 %462, label %463, label %467

463:                                              ; preds = %448
  %464 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %465 = load ptr, ptr %464, align 8, !tbaa !12
  call void @free(ptr noundef %465) #7
  %466 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %466, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %506

467:                                              ; preds = %448
  %468 = load ptr, ptr %26, align 8, !tbaa !5
  %469 = load i8, ptr %38, align 1, !tbaa !33
  %470 = zext i8 %469 to i32
  %471 = mul nsw i32 %470, 4
  %472 = add nsw i32 %471, 2
  %473 = sext i32 %472 to i64
  %474 = getelementptr inbounds i8, ptr %468, i64 %473
  %475 = load i8, ptr %474, align 1, !tbaa !33
  %476 = load ptr, ptr %25, align 8, !tbaa !5
  %477 = load i64, ptr %36, align 8, !tbaa !32
  %478 = add i64 %477, 1
  store i64 %478, ptr %36, align 8, !tbaa !32
  %479 = getelementptr inbounds i8, ptr %476, i64 %477
  store i8 %475, ptr %479, align 1, !tbaa !33
  %480 = load ptr, ptr %26, align 8, !tbaa !5
  %481 = load i8, ptr %38, align 1, !tbaa !33
  %482 = zext i8 %481 to i32
  %483 = mul nsw i32 %482, 4
  %484 = add nsw i32 %483, 1
  %485 = sext i32 %484 to i64
  %486 = getelementptr inbounds i8, ptr %480, i64 %485
  %487 = load i8, ptr %486, align 1, !tbaa !33
  %488 = load ptr, ptr %25, align 8, !tbaa !5
  %489 = load i64, ptr %36, align 8, !tbaa !32
  %490 = add i64 %489, 1
  store i64 %490, ptr %36, align 8, !tbaa !32
  %491 = getelementptr inbounds i8, ptr %488, i64 %489
  store i8 %487, ptr %491, align 1, !tbaa !33
  %492 = load ptr, ptr %26, align 8, !tbaa !5
  %493 = load i8, ptr %38, align 1, !tbaa !33
  %494 = zext i8 %493 to i32
  %495 = mul nsw i32 %494, 4
  %496 = add nsw i32 %495, 0
  %497 = sext i32 %496 to i64
  %498 = getelementptr inbounds i8, ptr %492, i64 %497
  %499 = load i8, ptr %498, align 1, !tbaa !33
  %500 = load ptr, ptr %25, align 8, !tbaa !5
  %501 = load i64, ptr %36, align 8, !tbaa !32
  %502 = add i64 %501, 1
  store i64 %502, ptr %36, align 8, !tbaa !32
  %503 = getelementptr inbounds i8, ptr %500, i64 %501
  store i8 %499, ptr %503, align 1, !tbaa !33
  %504 = load i64, ptr %34, align 8, !tbaa !32
  %505 = add i64 %504, 1
  store i64 %505, ptr %34, align 8, !tbaa !32
  store i32 0, ptr %11, align 4
  br label %506

506:                                              ; preds = %467, %463
  call void @llvm.lifetime.end.p0(i64 1, ptr %38) #7
  %507 = load i32, ptr %11, align 4
  switch i32 %507, label %512 [
    i32 0, label %508
  ]

508:                                              ; preds = %506
  br label %509

509:                                              ; preds = %508
  %510 = load i32, ptr %37, align 4, !tbaa !17
  %511 = add i32 %510, 1
  store i32 %511, ptr %37, align 4, !tbaa !17
  br label %443, !llvm.loop !37

512:                                              ; preds = %506, %447
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #7
  %513 = load i32, ptr %11, align 4
  switch i32 %513, label %519 [
    i32 12, label %514
  ]

514:                                              ; preds = %512
  %515 = load i32, ptr %22, align 4, !tbaa !17
  %516 = zext i32 %515 to i64
  %517 = load i64, ptr %34, align 8, !tbaa !32
  %518 = add i64 %517, %516
  store i64 %518, ptr %34, align 8, !tbaa !32
  store i32 0, ptr %11, align 4
  br label %519

519:                                              ; preds = %514, %512
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #7
  %520 = load i32, ptr %11, align 4
  switch i32 %520, label %525 [
    i32 0, label %521
  ]

521:                                              ; preds = %519
  br label %522

522:                                              ; preds = %521
  %523 = load i32, ptr %35, align 4, !tbaa !17
  %524 = add i32 %523, 1
  store i32 %524, ptr %35, align 4, !tbaa !17
  br label %430, !llvm.loop !38

525:                                              ; preds = %519, %434
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #7
  %526 = load i32, ptr %11, align 4
  switch i32 %526, label %528 [
    i32 9, label %527
  ]

527:                                              ; preds = %525
  store i32 0, ptr %11, align 4
  br label %528

528:                                              ; preds = %527, %525
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  %529 = load i32, ptr %11, align 4
  switch i32 %529, label %1024 [
    i32 0, label %530
  ]

530:                                              ; preds = %528
  br label %1019

531:                                              ; preds = %410, %404
  %532 = load ptr, ptr %13, align 8, !tbaa !5
  %533 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %532, i32 0, i32 4
  %534 = load i16, ptr %533, align 1, !tbaa !21
  %535 = zext i16 %534 to i32
  %536 = icmp eq i32 4, %535
  br i1 %536, label %537, label %767

537:                                              ; preds = %531
  %538 = load i8, ptr %18, align 1, !tbaa !19, !range !27, !noundef !28
  %539 = trunc i8 %538 to i1
  br i1 %539, label %540, label %767

540:                                              ; preds = %537
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #7
  store i64 0, ptr %39, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #7
  store i32 0, ptr %40, align 4, !tbaa !17
  br label %541

541:                                              ; preds = %758, %540
  %542 = load i32, ptr %40, align 4, !tbaa !17
  %543 = load i32, ptr %15, align 4, !tbaa !17
  %544 = icmp ult i32 %542, %543
  br i1 %544, label %546, label %545

545:                                              ; preds = %541
  store i32 15, ptr %11, align 4
  br label %761

546:                                              ; preds = %541
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #7
  %547 = load i32, ptr %15, align 4, !tbaa !17
  %548 = sub i32 %547, 1
  %549 = load i32, ptr %40, align 4, !tbaa !17
  %550 = sub i32 %548, %549
  %551 = zext i32 %550 to i64
  %552 = load i64, ptr %28, align 8, !tbaa !32
  %553 = mul i64 %551, %552
  store i64 %553, ptr %41, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #7
  store i32 0, ptr %42, align 4, !tbaa !17
  br label %554

554:                                              ; preds = %745, %546
  %555 = load i32, ptr %42, align 4, !tbaa !17
  %556 = load i32, ptr %14, align 4, !tbaa !17
  %557 = icmp ult i32 %555, %556
  br i1 %557, label %559, label %558

558:                                              ; preds = %554
  store i32 18, ptr %11, align 4
  br label %748

559:                                              ; preds = %554
  %560 = load ptr, ptr %12, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct._bmp_file_header_t, ptr %560, i32 0, i32 4
  %562 = load i32, ptr %561, align 1, !tbaa !25
  %563 = zext i32 %562 to i64
  %564 = load i64, ptr %39, align 8, !tbaa !32
  %565 = add i64 %563, %564
  %566 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %567 = load i64, ptr %566, align 8, !tbaa !9
  %568 = icmp ugt i64 %565, %567
  br i1 %568, label %569, label %573

569:                                              ; preds = %559
  %570 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %571 = load ptr, ptr %570, align 8, !tbaa !12
  call void @free(ptr noundef %571) #7
  %572 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %572) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %748

573:                                              ; preds = %559
  call void @llvm.lifetime.start.p0(i64 1, ptr %43) #7
  %574 = load ptr, ptr %27, align 8, !tbaa !5
  %575 = load i64, ptr %39, align 8, !tbaa !32
  %576 = getelementptr inbounds i8, ptr %574, i64 %575
  %577 = load i8, ptr %576, align 1, !tbaa !33
  store i8 %577, ptr %43, align 1, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 1, ptr %44) #7
  %578 = load i8, ptr %43, align 1, !tbaa !33
  %579 = zext i8 %578 to i32
  %580 = and i32 255, %579
  %581 = ashr i32 %580, 4
  %582 = trunc i32 %581 to i8
  store i8 %582, ptr %44, align 1, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 1, ptr %45) #7
  %583 = load i8, ptr %43, align 1, !tbaa !33
  %584 = zext i8 %583 to i32
  %585 = and i32 15, %584
  %586 = trunc i32 %585 to i8
  store i8 %586, ptr %45, align 1, !tbaa !33
  %587 = load i32, ptr %19, align 4, !tbaa !17
  %588 = load i8, ptr %44, align 1, !tbaa !33
  %589 = zext i8 %588 to i32
  %590 = mul nsw i32 %589, 4
  %591 = add i32 %587, %590
  %592 = add i32 %591, 2
  %593 = zext i32 %592 to i64
  %594 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %595 = load i64, ptr %594, align 8, !tbaa !9
  %596 = icmp uge i64 %593, %595
  br i1 %596, label %597, label %601

597:                                              ; preds = %573
  %598 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %599 = load ptr, ptr %598, align 8, !tbaa !12
  call void @free(ptr noundef %599) #7
  %600 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %600, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %742

601:                                              ; preds = %573
  %602 = load i64, ptr %41, align 8, !tbaa !32
  %603 = add i64 %602, 3
  %604 = load i32, ptr %14, align 4, !tbaa !17
  %605 = load i32, ptr %15, align 4, !tbaa !17
  %606 = mul i32 %604, %605
  %607 = load i32, ptr %16, align 4, !tbaa !17
  %608 = mul i32 %606, %607
  %609 = zext i32 %608 to i64
  %610 = icmp ugt i64 %603, %609
  br i1 %610, label %611, label %615

611:                                              ; preds = %601
  %612 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %613 = load ptr, ptr %612, align 8, !tbaa !12
  call void @free(ptr noundef %613) #7
  %614 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %614, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %742

615:                                              ; preds = %601
  %616 = load ptr, ptr %26, align 8, !tbaa !5
  %617 = load i8, ptr %44, align 1, !tbaa !33
  %618 = zext i8 %617 to i32
  %619 = mul nsw i32 %618, 4
  %620 = add nsw i32 %619, 2
  %621 = sext i32 %620 to i64
  %622 = getelementptr inbounds i8, ptr %616, i64 %621
  %623 = load i8, ptr %622, align 1, !tbaa !33
  %624 = load ptr, ptr %25, align 8, !tbaa !5
  %625 = load i64, ptr %41, align 8, !tbaa !32
  %626 = add i64 %625, 1
  store i64 %626, ptr %41, align 8, !tbaa !32
  %627 = getelementptr inbounds i8, ptr %624, i64 %625
  store i8 %623, ptr %627, align 1, !tbaa !33
  %628 = load ptr, ptr %26, align 8, !tbaa !5
  %629 = load i8, ptr %44, align 1, !tbaa !33
  %630 = zext i8 %629 to i32
  %631 = mul nsw i32 %630, 4
  %632 = add nsw i32 %631, 1
  %633 = sext i32 %632 to i64
  %634 = getelementptr inbounds i8, ptr %628, i64 %633
  %635 = load i8, ptr %634, align 1, !tbaa !33
  %636 = load ptr, ptr %25, align 8, !tbaa !5
  %637 = load i64, ptr %41, align 8, !tbaa !32
  %638 = add i64 %637, 1
  store i64 %638, ptr %41, align 8, !tbaa !32
  %639 = getelementptr inbounds i8, ptr %636, i64 %637
  store i8 %635, ptr %639, align 1, !tbaa !33
  %640 = load ptr, ptr %26, align 8, !tbaa !5
  %641 = load i8, ptr %44, align 1, !tbaa !33
  %642 = zext i8 %641 to i32
  %643 = mul nsw i32 %642, 4
  %644 = add nsw i32 %643, 0
  %645 = sext i32 %644 to i64
  %646 = getelementptr inbounds i8, ptr %640, i64 %645
  %647 = load i8, ptr %646, align 1, !tbaa !33
  %648 = load ptr, ptr %25, align 8, !tbaa !5
  %649 = load i64, ptr %41, align 8, !tbaa !32
  %650 = add i64 %649, 1
  store i64 %650, ptr %41, align 8, !tbaa !32
  %651 = getelementptr inbounds i8, ptr %648, i64 %649
  store i8 %647, ptr %651, align 1, !tbaa !33
  %652 = load i32, ptr %42, align 4, !tbaa !17
  %653 = add i32 %652, 1
  store i32 %653, ptr %42, align 4, !tbaa !17
  %654 = load i32, ptr %14, align 4, !tbaa !17
  %655 = icmp uge i32 %653, %654
  br i1 %655, label %656, label %674

656:                                              ; preds = %615
  store i32 0, ptr %42, align 4, !tbaa !17
  %657 = load i32, ptr %40, align 4, !tbaa !17
  %658 = add i32 %657, 1
  store i32 %658, ptr %40, align 4, !tbaa !17
  %659 = load i32, ptr %40, align 4, !tbaa !17
  %660 = load i32, ptr %15, align 4, !tbaa !17
  %661 = icmp uge i32 %659, %660
  br i1 %661, label %662, label %666

662:                                              ; preds = %656
  %663 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %664 = load ptr, ptr %663, align 8, !tbaa !12
  call void @free(ptr noundef %664) #7
  %665 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %665, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %742

666:                                              ; preds = %656
  %667 = load i32, ptr %15, align 4, !tbaa !17
  %668 = sub i32 %667, 1
  %669 = load i32, ptr %40, align 4, !tbaa !17
  %670 = sub i32 %668, %669
  %671 = zext i32 %670 to i64
  %672 = load i64, ptr %28, align 8, !tbaa !32
  %673 = mul i64 %671, %672
  store i64 %673, ptr %41, align 8, !tbaa !32
  br label %674

674:                                              ; preds = %666, %615
  %675 = load i32, ptr %19, align 4, !tbaa !17
  %676 = load i8, ptr %45, align 1, !tbaa !33
  %677 = zext i8 %676 to i32
  %678 = mul nsw i32 %677, 4
  %679 = add i32 %675, %678
  %680 = add i32 %679, 2
  %681 = zext i32 %680 to i64
  %682 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %683 = load i64, ptr %682, align 8, !tbaa !9
  %684 = icmp uge i64 %681, %683
  br i1 %684, label %685, label %689

685:                                              ; preds = %674
  %686 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %687 = load ptr, ptr %686, align 8, !tbaa !12
  call void @free(ptr noundef %687) #7
  %688 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %688, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %742

689:                                              ; preds = %674
  %690 = load i64, ptr %41, align 8, !tbaa !32
  %691 = add i64 %690, 3
  %692 = load i32, ptr %14, align 4, !tbaa !17
  %693 = load i32, ptr %15, align 4, !tbaa !17
  %694 = mul i32 %692, %693
  %695 = load i32, ptr %16, align 4, !tbaa !17
  %696 = mul i32 %694, %695
  %697 = zext i32 %696 to i64
  %698 = icmp ugt i64 %691, %697
  br i1 %698, label %699, label %703

699:                                              ; preds = %689
  %700 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %701 = load ptr, ptr %700, align 8, !tbaa !12
  call void @free(ptr noundef %701) #7
  %702 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %702, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %742

703:                                              ; preds = %689
  %704 = load ptr, ptr %26, align 8, !tbaa !5
  %705 = load i8, ptr %45, align 1, !tbaa !33
  %706 = zext i8 %705 to i32
  %707 = mul nsw i32 %706, 4
  %708 = add nsw i32 %707, 2
  %709 = sext i32 %708 to i64
  %710 = getelementptr inbounds i8, ptr %704, i64 %709
  %711 = load i8, ptr %710, align 1, !tbaa !33
  %712 = load ptr, ptr %25, align 8, !tbaa !5
  %713 = load i64, ptr %41, align 8, !tbaa !32
  %714 = add i64 %713, 1
  store i64 %714, ptr %41, align 8, !tbaa !32
  %715 = getelementptr inbounds i8, ptr %712, i64 %713
  store i8 %711, ptr %715, align 1, !tbaa !33
  %716 = load ptr, ptr %26, align 8, !tbaa !5
  %717 = load i8, ptr %45, align 1, !tbaa !33
  %718 = zext i8 %717 to i32
  %719 = mul nsw i32 %718, 4
  %720 = add nsw i32 %719, 1
  %721 = sext i32 %720 to i64
  %722 = getelementptr inbounds i8, ptr %716, i64 %721
  %723 = load i8, ptr %722, align 1, !tbaa !33
  %724 = load ptr, ptr %25, align 8, !tbaa !5
  %725 = load i64, ptr %41, align 8, !tbaa !32
  %726 = add i64 %725, 1
  store i64 %726, ptr %41, align 8, !tbaa !32
  %727 = getelementptr inbounds i8, ptr %724, i64 %725
  store i8 %723, ptr %727, align 1, !tbaa !33
  %728 = load ptr, ptr %26, align 8, !tbaa !5
  %729 = load i8, ptr %45, align 1, !tbaa !33
  %730 = zext i8 %729 to i32
  %731 = mul nsw i32 %730, 4
  %732 = add nsw i32 %731, 0
  %733 = sext i32 %732 to i64
  %734 = getelementptr inbounds i8, ptr %728, i64 %733
  %735 = load i8, ptr %734, align 1, !tbaa !33
  %736 = load ptr, ptr %25, align 8, !tbaa !5
  %737 = load i64, ptr %41, align 8, !tbaa !32
  %738 = add i64 %737, 1
  store i64 %738, ptr %41, align 8, !tbaa !32
  %739 = getelementptr inbounds i8, ptr %736, i64 %737
  store i8 %735, ptr %739, align 1, !tbaa !33
  %740 = load i64, ptr %39, align 8, !tbaa !32
  %741 = add i64 %740, 1
  store i64 %741, ptr %39, align 8, !tbaa !32
  store i32 0, ptr %11, align 4
  br label %742

742:                                              ; preds = %703, %699, %685, %662, %611, %597
  call void @llvm.lifetime.end.p0(i64 1, ptr %45) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %44) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %43) #7
  %743 = load i32, ptr %11, align 4
  switch i32 %743, label %748 [
    i32 0, label %744
  ]

744:                                              ; preds = %742
  br label %745

745:                                              ; preds = %744
  %746 = load i32, ptr %42, align 4, !tbaa !17
  %747 = add i32 %746, 1
  store i32 %747, ptr %42, align 4, !tbaa !17
  br label %554, !llvm.loop !39

748:                                              ; preds = %742, %569, %558
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #7
  %749 = load i32, ptr %11, align 4
  switch i32 %749, label %755 [
    i32 18, label %750
  ]

750:                                              ; preds = %748
  %751 = load i32, ptr %22, align 4, !tbaa !17
  %752 = zext i32 %751 to i64
  %753 = load i64, ptr %39, align 8, !tbaa !32
  %754 = add i64 %753, %752
  store i64 %754, ptr %39, align 8, !tbaa !32
  store i32 0, ptr %11, align 4
  br label %755

755:                                              ; preds = %750, %748
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #7
  %756 = load i32, ptr %11, align 4
  switch i32 %756, label %761 [
    i32 0, label %757
  ]

757:                                              ; preds = %755
  br label %758

758:                                              ; preds = %757
  %759 = load i32, ptr %40, align 4, !tbaa !17
  %760 = add i32 %759, 1
  store i32 %760, ptr %40, align 4, !tbaa !17
  br label %541, !llvm.loop !40

761:                                              ; preds = %755, %545
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #7
  %762 = load i32, ptr %11, align 4
  switch i32 %762, label %764 [
    i32 15, label %763
  ]

763:                                              ; preds = %761
  store i32 0, ptr %11, align 4
  br label %764

764:                                              ; preds = %763, %761
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #7
  %765 = load i32, ptr %11, align 4
  switch i32 %765, label %1024 [
    i32 0, label %766
  ]

766:                                              ; preds = %764
  br label %1018

767:                                              ; preds = %537, %531
  %768 = load ptr, ptr %13, align 8, !tbaa !5
  %769 = getelementptr inbounds %struct._bmp_dib_BITMAPINFOHEADER_t, ptr %768, i32 0, i32 4
  %770 = load i16, ptr %769, align 1, !tbaa !21
  %771 = zext i16 %770 to i32
  %772 = icmp eq i32 1, %771
  br i1 %772, label %773, label %916

773:                                              ; preds = %767
  %774 = load i8, ptr %18, align 1, !tbaa !19, !range !27, !noundef !28
  %775 = trunc i8 %774 to i1
  br i1 %775, label %776, label %916

776:                                              ; preds = %773
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #7
  store i64 0, ptr %46, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #7
  store i32 0, ptr %47, align 4, !tbaa !17
  br label %777

777:                                              ; preds = %907, %776
  %778 = load i32, ptr %47, align 4, !tbaa !17
  %779 = load i32, ptr %15, align 4, !tbaa !17
  %780 = icmp ult i32 %778, %779
  br i1 %780, label %782, label %781

781:                                              ; preds = %777
  store i32 21, ptr %11, align 4
  br label %910

782:                                              ; preds = %777
  call void @llvm.lifetime.start.p0(i64 1, ptr %48) #7
  store i8 0, ptr %48, align 1, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #7
  %783 = load i32, ptr %15, align 4, !tbaa !17
  %784 = sub i32 %783, 1
  %785 = load i32, ptr %47, align 4, !tbaa !17
  %786 = sub i32 %784, %785
  %787 = zext i32 %786 to i64
  %788 = load i64, ptr %28, align 8, !tbaa !32
  %789 = mul i64 %787, %788
  store i64 %789, ptr %49, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #7
  store i32 0, ptr %50, align 4, !tbaa !17
  br label %790

790:                                              ; preds = %893, %782
  %791 = load i32, ptr %50, align 4, !tbaa !17
  %792 = load i32, ptr %14, align 4, !tbaa !17
  %793 = icmp ult i32 %791, %792
  br i1 %793, label %795, label %794

794:                                              ; preds = %790
  store i32 24, ptr %11, align 4
  br label %896

795:                                              ; preds = %790
  %796 = load i8, ptr %48, align 1, !tbaa !33
  %797 = zext i8 %796 to i32
  %798 = icmp eq i32 8, %797
  br i1 %798, label %799, label %802

799:                                              ; preds = %795
  %800 = load i64, ptr %46, align 8, !tbaa !32
  %801 = add i64 %800, 1
  store i64 %801, ptr %46, align 8, !tbaa !32
  store i8 0, ptr %48, align 1, !tbaa !33
  br label %802

802:                                              ; preds = %799, %795
  %803 = load ptr, ptr %12, align 8, !tbaa !5
  %804 = getelementptr inbounds %struct._bmp_file_header_t, ptr %803, i32 0, i32 4
  %805 = load i32, ptr %804, align 1, !tbaa !25
  %806 = zext i32 %805 to i64
  %807 = load i64, ptr %46, align 8, !tbaa !32
  %808 = add i64 %806, %807
  %809 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %810 = load i64, ptr %809, align 8, !tbaa !9
  %811 = icmp ugt i64 %808, %810
  br i1 %811, label %812, label %816

812:                                              ; preds = %802
  %813 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %814 = load ptr, ptr %813, align 8, !tbaa !12
  call void @free(ptr noundef %814) #7
  %815 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %815, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %896

816:                                              ; preds = %802
  call void @llvm.lifetime.start.p0(i64 1, ptr %51) #7
  %817 = load ptr, ptr %27, align 8, !tbaa !5
  %818 = load i64, ptr %46, align 8, !tbaa !32
  %819 = getelementptr inbounds i8, ptr %817, i64 %818
  %820 = load i8, ptr %819, align 1, !tbaa !33
  store i8 %820, ptr %51, align 1, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 1, ptr %52) #7
  %821 = load i8, ptr %48, align 1, !tbaa !33
  %822 = zext i8 %821 to i32
  %823 = ashr i32 128, %822
  %824 = trunc i32 %823 to i8
  store i8 %824, ptr %52, align 1, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 1, ptr %53) #7
  %825 = load i8, ptr %51, align 1, !tbaa !33
  %826 = zext i8 %825 to i32
  %827 = load i8, ptr %52, align 1, !tbaa !33
  %828 = zext i8 %827 to i32
  %829 = and i32 %826, %828
  %830 = trunc i32 %829 to i8
  store i8 %830, ptr %53, align 1, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 1, ptr %54) #7
  %831 = load i8, ptr %53, align 1, !tbaa !33
  %832 = zext i8 %831 to i32
  %833 = icmp sgt i32 %832, 0
  %834 = zext i1 %833 to i64
  %835 = select i1 %833, i32 1, i32 0
  %836 = trunc i32 %835 to i8
  store i8 %836, ptr %54, align 1, !tbaa !33
  %837 = load i32, ptr %19, align 4, !tbaa !17
  %838 = load i8, ptr %54, align 1, !tbaa !33
  %839 = zext i8 %838 to i32
  %840 = mul nsw i32 %839, 4
  %841 = add i32 %837, %840
  %842 = add i32 %841, 2
  %843 = zext i32 %842 to i64
  %844 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %845 = load i64, ptr %844, align 8, !tbaa !9
  %846 = icmp uge i64 %843, %845
  br i1 %846, label %847, label %851

847:                                              ; preds = %816
  %848 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %849 = load ptr, ptr %848, align 8, !tbaa !12
  call void @free(ptr noundef %849) #7
  %850 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %850, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %890

851:                                              ; preds = %816
  %852 = load ptr, ptr %26, align 8, !tbaa !5
  %853 = load i8, ptr %54, align 1, !tbaa !33
  %854 = zext i8 %853 to i32
  %855 = mul nsw i32 %854, 4
  %856 = add nsw i32 %855, 2
  %857 = sext i32 %856 to i64
  %858 = getelementptr inbounds i8, ptr %852, i64 %857
  %859 = load i8, ptr %858, align 1, !tbaa !33
  %860 = load ptr, ptr %25, align 8, !tbaa !5
  %861 = load i64, ptr %49, align 8, !tbaa !32
  %862 = add i64 %861, 1
  store i64 %862, ptr %49, align 8, !tbaa !32
  %863 = getelementptr inbounds i8, ptr %860, i64 %861
  store i8 %859, ptr %863, align 1, !tbaa !33
  %864 = load ptr, ptr %26, align 8, !tbaa !5
  %865 = load i8, ptr %54, align 1, !tbaa !33
  %866 = zext i8 %865 to i32
  %867 = mul nsw i32 %866, 4
  %868 = add nsw i32 %867, 1
  %869 = sext i32 %868 to i64
  %870 = getelementptr inbounds i8, ptr %864, i64 %869
  %871 = load i8, ptr %870, align 1, !tbaa !33
  %872 = load ptr, ptr %25, align 8, !tbaa !5
  %873 = load i64, ptr %49, align 8, !tbaa !32
  %874 = add i64 %873, 1
  store i64 %874, ptr %49, align 8, !tbaa !32
  %875 = getelementptr inbounds i8, ptr %872, i64 %873
  store i8 %871, ptr %875, align 1, !tbaa !33
  %876 = load ptr, ptr %26, align 8, !tbaa !5
  %877 = load i8, ptr %54, align 1, !tbaa !33
  %878 = zext i8 %877 to i32
  %879 = mul nsw i32 %878, 4
  %880 = add nsw i32 %879, 0
  %881 = sext i32 %880 to i64
  %882 = getelementptr inbounds i8, ptr %876, i64 %881
  %883 = load i8, ptr %882, align 1, !tbaa !33
  %884 = load ptr, ptr %25, align 8, !tbaa !5
  %885 = load i64, ptr %49, align 8, !tbaa !32
  %886 = add i64 %885, 1
  store i64 %886, ptr %49, align 8, !tbaa !32
  %887 = getelementptr inbounds i8, ptr %884, i64 %885
  store i8 %883, ptr %887, align 1, !tbaa !33
  %888 = load i8, ptr %48, align 1, !tbaa !33
  %889 = add i8 %888, 1
  store i8 %889, ptr %48, align 1, !tbaa !33
  store i32 0, ptr %11, align 4
  br label %890

890:                                              ; preds = %851, %847
  call void @llvm.lifetime.end.p0(i64 1, ptr %54) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %53) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %51) #7
  %891 = load i32, ptr %11, align 4
  switch i32 %891, label %896 [
    i32 0, label %892
  ]

892:                                              ; preds = %890
  br label %893

893:                                              ; preds = %892
  %894 = load i32, ptr %50, align 4, !tbaa !17
  %895 = add i32 %894, 1
  store i32 %895, ptr %50, align 4, !tbaa !17
  br label %790, !llvm.loop !41

896:                                              ; preds = %890, %812, %794
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #7
  %897 = load i32, ptr %11, align 4
  switch i32 %897, label %904 [
    i32 24, label %898
  ]

898:                                              ; preds = %896
  %899 = load i32, ptr %22, align 4, !tbaa !17
  %900 = add i32 %899, 1
  %901 = zext i32 %900 to i64
  %902 = load i64, ptr %46, align 8, !tbaa !32
  %903 = add i64 %902, %901
  store i64 %903, ptr %46, align 8, !tbaa !32
  store i32 0, ptr %11, align 4
  br label %904

904:                                              ; preds = %898, %896
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %48) #7
  %905 = load i32, ptr %11, align 4
  switch i32 %905, label %910 [
    i32 0, label %906
  ]

906:                                              ; preds = %904
  br label %907

907:                                              ; preds = %906
  %908 = load i32, ptr %47, align 4, !tbaa !17
  %909 = add i32 %908, 1
  store i32 %909, ptr %47, align 4, !tbaa !17
  br label %777, !llvm.loop !42

910:                                              ; preds = %904, %781
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #7
  %911 = load i32, ptr %11, align 4
  switch i32 %911, label %913 [
    i32 21, label %912
  ]

912:                                              ; preds = %910
  store i32 0, ptr %11, align 4
  br label %913

913:                                              ; preds = %912, %910
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #7
  %914 = load i32, ptr %11, align 4
  switch i32 %914, label %1024 [
    i32 0, label %915
  ]

915:                                              ; preds = %913
  br label %1017

916:                                              ; preds = %773, %767
  %917 = load ptr, ptr %12, align 8, !tbaa !5
  %918 = getelementptr inbounds %struct._bmp_file_header_t, ptr %917, i32 0, i32 4
  %919 = load i32, ptr %918, align 1, !tbaa !25
  %920 = load i32, ptr %15, align 4, !tbaa !17
  %921 = load i32, ptr %14, align 4, !tbaa !17
  %922 = mul i32 %920, %921
  %923 = load i32, ptr %16, align 4, !tbaa !17
  %924 = mul i32 %922, %923
  %925 = add i32 %919, %924
  %926 = zext i32 %925 to i64
  %927 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 1
  %928 = load i64, ptr %927, align 8, !tbaa !9
  %929 = icmp ugt i64 %926, %928
  br i1 %929, label %930, label %934

930:                                              ; preds = %916
  %931 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %932 = load ptr, ptr %931, align 8, !tbaa !12
  call void @free(ptr noundef %932) #7
  %933 = load ptr, ptr %25, align 8, !tbaa !5
  call void @free(ptr noundef %933) #7
  store ptr null, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1024

934:                                              ; preds = %916
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #7
  store i64 0, ptr %55, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #7
  store i32 0, ptr %56, align 4, !tbaa !17
  br label %935

935:                                              ; preds = %1013, %934
  %936 = load i32, ptr %56, align 4, !tbaa !17
  %937 = load i32, ptr %15, align 4, !tbaa !17
  %938 = icmp ult i32 %936, %937
  br i1 %938, label %940, label %939

939:                                              ; preds = %935
  store i32 27, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #7
  br label %1016

940:                                              ; preds = %935
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #7
  %941 = load i32, ptr %15, align 4, !tbaa !17
  %942 = sub i32 %941, 1
  %943 = load i32, ptr %56, align 4, !tbaa !17
  %944 = sub i32 %942, %943
  %945 = zext i32 %944 to i64
  %946 = load i64, ptr %28, align 8, !tbaa !32
  %947 = mul i64 %945, %946
  store i64 %947, ptr %57, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #7
  store i32 0, ptr %58, align 4, !tbaa !17
  br label %948

948:                                              ; preds = %1005, %940
  %949 = load i32, ptr %58, align 4, !tbaa !17
  %950 = load i32, ptr %14, align 4, !tbaa !17
  %951 = icmp ult i32 %949, %950
  br i1 %951, label %953, label %952

952:                                              ; preds = %948
  store i32 30, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #7
  br label %1008

953:                                              ; preds = %948
  %954 = load i32, ptr %16, align 4, !tbaa !17
  %955 = icmp ugt i32 %954, 3
  br i1 %955, label %956, label %966

956:                                              ; preds = %953
  %957 = load ptr, ptr %27, align 8, !tbaa !5
  %958 = load i64, ptr %55, align 8, !tbaa !32
  %959 = add i64 %958, 3
  %960 = getelementptr inbounds i8, ptr %957, i64 %959
  %961 = load i8, ptr %960, align 1, !tbaa !33
  %962 = load ptr, ptr %25, align 8, !tbaa !5
  %963 = load i64, ptr %57, align 8, !tbaa !32
  %964 = add i64 %963, 1
  store i64 %964, ptr %57, align 8, !tbaa !32
  %965 = getelementptr inbounds i8, ptr %962, i64 %963
  store i8 %961, ptr %965, align 1, !tbaa !33
  br label %966

966:                                              ; preds = %956, %953
  %967 = load i32, ptr %16, align 4, !tbaa !17
  %968 = icmp ugt i32 %967, 2
  br i1 %968, label %969, label %979

969:                                              ; preds = %966
  %970 = load ptr, ptr %27, align 8, !tbaa !5
  %971 = load i64, ptr %55, align 8, !tbaa !32
  %972 = add i64 %971, 2
  %973 = getelementptr inbounds i8, ptr %970, i64 %972
  %974 = load i8, ptr %973, align 1, !tbaa !33
  %975 = load ptr, ptr %25, align 8, !tbaa !5
  %976 = load i64, ptr %57, align 8, !tbaa !32
  %977 = add i64 %976, 1
  store i64 %977, ptr %57, align 8, !tbaa !32
  %978 = getelementptr inbounds i8, ptr %975, i64 %976
  store i8 %974, ptr %978, align 1, !tbaa !33
  br label %979

979:                                              ; preds = %969, %966
  %980 = load i32, ptr %16, align 4, !tbaa !17
  %981 = icmp ugt i32 %980, 1
  br i1 %981, label %982, label %992

982:                                              ; preds = %979
  %983 = load ptr, ptr %27, align 8, !tbaa !5
  %984 = load i64, ptr %55, align 8, !tbaa !32
  %985 = add i64 %984, 1
  %986 = getelementptr inbounds i8, ptr %983, i64 %985
  %987 = load i8, ptr %986, align 1, !tbaa !33
  %988 = load ptr, ptr %25, align 8, !tbaa !5
  %989 = load i64, ptr %57, align 8, !tbaa !32
  %990 = add i64 %989, 1
  store i64 %990, ptr %57, align 8, !tbaa !32
  %991 = getelementptr inbounds i8, ptr %988, i64 %989
  store i8 %987, ptr %991, align 1, !tbaa !33
  br label %992

992:                                              ; preds = %982, %979
  %993 = load ptr, ptr %27, align 8, !tbaa !5
  %994 = load i64, ptr %55, align 8, !tbaa !32
  %995 = getelementptr inbounds i8, ptr %993, i64 %994
  %996 = load i8, ptr %995, align 1, !tbaa !33
  %997 = load ptr, ptr %25, align 8, !tbaa !5
  %998 = load i64, ptr %57, align 8, !tbaa !32
  %999 = add i64 %998, 1
  store i64 %999, ptr %57, align 8, !tbaa !32
  %1000 = getelementptr inbounds i8, ptr %997, i64 %998
  store i8 %996, ptr %1000, align 1, !tbaa !33
  %1001 = load i32, ptr %17, align 4, !tbaa !17
  %1002 = zext i32 %1001 to i64
  %1003 = load i64, ptr %55, align 8, !tbaa !32
  %1004 = add i64 %1003, %1002
  store i64 %1004, ptr %55, align 8, !tbaa !32
  br label %1005

1005:                                             ; preds = %992
  %1006 = load i32, ptr %58, align 4, !tbaa !17
  %1007 = add i32 %1006, 1
  store i32 %1007, ptr %58, align 4, !tbaa !17
  br label %948, !llvm.loop !43

1008:                                             ; preds = %952
  %1009 = load i32, ptr %22, align 4, !tbaa !17
  %1010 = zext i32 %1009 to i64
  %1011 = load i64, ptr %55, align 8, !tbaa !32
  %1012 = add i64 %1011, %1010
  store i64 %1012, ptr %55, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #7
  br label %1013

1013:                                             ; preds = %1008
  %1014 = load i32, ptr %56, align 4, !tbaa !17
  %1015 = add i32 %1014, 1
  store i32 %1015, ptr %56, align 4, !tbaa !17
  br label %935, !llvm.loop !44

1016:                                             ; preds = %939
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #7
  br label %1017

1017:                                             ; preds = %1016, %915
  br label %1018

1018:                                             ; preds = %1017, %766
  br label %1019

1019:                                             ; preds = %1018, %530
  br label %1020

1020:                                             ; preds = %1019, %403
  %1021 = getelementptr inbounds %struct._entire_file_t, ptr %10, i32 0, i32 0
  %1022 = load ptr, ptr %1021, align 8, !tbaa !12
  call void @free(ptr noundef %1022) #7
  %1023 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %1023, ptr %5, align 8
  store i32 1, ptr %11, align 4
  br label %1024

1024:                                             ; preds = %1020, %930, %913, %764, %528, %425, %316
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #7
  br label %1025

1025:                                             ; preds = %1024, %274
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #7
  br label %1026

1026:                                             ; preds = %1025, %225
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  br label %1027

1027:                                             ; preds = %1026, %157
  call void @llvm.lifetime.end.p0(i64 1, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #7
  br label %1028

1028:                                             ; preds = %1027, %123
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  br label %1029

1029:                                             ; preds = %1028, %100
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #7
  br label %1030

1030:                                             ; preds = %1029, %89
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  br label %1031

1031:                                             ; preds = %1030, %79, %74
  call void @llvm.lifetime.end.p0(i64 16, ptr %10) #7
  br label %1032

1032:                                             ; preds = %1031, %70
  %1033 = load ptr, ptr %5, align 8
  ret ptr %1033
}

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

; Function Attrs: nounwind uwtable
declare hidden zeroext i1 @_read_entire_file(ptr noundef, ptr noundef) #0

; Function Attrs: nounwind
declare void @free(ptr noundef) #2

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

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

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #4

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

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #5

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #6

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

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

!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, !11, i64 8}
!10 = !{!"_entire_file_t", !6, i64 0, !11, i64 8}
!11 = !{!"long", !7, i64 0}
!12 = !{!10, !6, i64 0}
!13 = !{!14, !15, i64 4}
!14 = !{!"_bmp_dib_BITMAPINFOHEADER_t", !15, i64 0, !15, i64 4, !15, i64 8, !16, i64 12, !16, i64 14, !15, i64 16, !15, i64 20, !15, i64 24, !15, i64 28, !15, i64 32, !15, i64 36, !15, i64 40, !15, i64 44, !15, i64 48}
!15 = !{!"int", !7, i64 0}
!16 = !{!"short", !7, i64 0}
!17 = !{!15, !15, i64 0}
!18 = !{!14, !15, i64 8}
!19 = !{!20, !20, i64 0}
!20 = !{!"_Bool", !7, i64 0}
!21 = !{!14, !16, i64 14}
!22 = !{!14, !15, i64 32}
!23 = !{!14, !15, i64 0}
!24 = !{!14, !15, i64 16}
!25 = !{!26, !15, i64 10}
!26 = !{!"_bmp_file_header_t", !7, i64 0, !15, i64 2, !16, i64 6, !16, i64 8, !15, i64 10}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!14, !15, i64 40}
!30 = !{!14, !15, i64 44}
!31 = !{!14, !15, i64 48}
!32 = !{!11, !11, i64 0}
!33 = !{!7, !7, i64 0}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}
!36 = distinct !{!36, !35}
!37 = distinct !{!37, !35}
!38 = distinct !{!38, !35}
!39 = distinct !{!39, !35}
!40 = distinct !{!40, !35}
!41 = distinct !{!41, !35}
!42 = distinct !{!42, !35}
!43 = distinct !{!43, !35}
!44 = distinct !{!44, !35}


; 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._entire_file_t = type { ptr, i64 }

; Function Attrs: nounwind uwtable
define dso_local noalias noundef ptr @apg_bmp_read(ptr noundef %0, ptr noundef writeonly %1, ptr noundef writeonly %2, ptr noundef writeonly %3) local_unnamed_addr #0 {
  %5 = alloca %struct._entire_file_t, align 8
  %6 = insertelement <4 x ptr> poison, ptr %0, i64 0
  %7 = insertelement <4 x ptr> %6, ptr %1, i64 1
  %8 = insertelement <4 x ptr> %7, ptr %2, i64 2
  %9 = insertelement <4 x ptr> %8, ptr %3, i64 3
  %10 = icmp eq <4 x ptr> %9, zeroinitializer
  %11 = bitcast <4 x i1> %10 to i4
  %12 = icmp eq i4 %11, 0
  br i1 %12, label %13, label %388

13:                                               ; preds = %4
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #5
  %14 = call zeroext i1 @_read_entire_file(ptr noundef nonnull %0, ptr noundef nonnull %5)
  br i1 %14, label %15, label %.thread432

15:                                               ; preds = %13
  %16 = getelementptr inbounds i8, ptr %5, i64 8
  %17 = load i64, ptr %16, align 8, !tbaa !5
  %18 = icmp ult i64 %17, 54
  %19 = load ptr, ptr %5, align 8, !tbaa !11
  br i1 %18, label %20, label %21

20:                                               ; preds = %15
  call void @free(ptr noundef %19) #5
  br label %.thread432

21:                                               ; preds = %15
  %22 = call zeroext i1 @_validate_file_hdr(ptr noundef %19, i64 noundef %17)
  %23 = load ptr, ptr %5, align 8, !tbaa !11
  br i1 %22, label %25, label %24

24:                                               ; preds = %21
  call void @free(ptr noundef %23) #5
  br label %.thread432

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %23, i64 14
  %27 = load i64, ptr %16, align 8, !tbaa !5
  %28 = call zeroext i1 @_validate_dib_hdr(ptr noundef nonnull %26, i64 noundef %27)
  br i1 %28, label %31, label %29

29:                                               ; preds = %25
  %30 = load ptr, ptr %5, align 8, !tbaa !11
  call void @free(ptr noundef %30) #5
  br label %.thread432

31:                                               ; preds = %25
  %32 = getelementptr inbounds i8, ptr %23, i64 18
  %33 = load i32, ptr %32, align 1, !tbaa !12
  %34 = call i32 @llvm.abs.i32(i32 %33, i1 true)
  store i32 %34, ptr %1, align 4, !tbaa !16
  %35 = getelementptr inbounds i8, ptr %23, i64 22
  %36 = load i32, ptr %35, align 1, !tbaa !17
  %37 = call i32 @llvm.abs.i32(i32 %36, i1 true)
  store i32 %37, ptr %2, align 4, !tbaa !16
  %38 = getelementptr inbounds i8, ptr %23, i64 28
  %39 = load i16, ptr %38, align 1, !tbaa !18
  switch i16 %39, label %44 [
    i16 32, label %46
    i16 24, label %40
    i16 8, label %41
    i16 4, label %42
    i16 1, label %43
  ]

40:                                               ; preds = %31
  br label %46

41:                                               ; preds = %31
  br label %46

42:                                               ; preds = %31
  br label %46

43:                                               ; preds = %31
  br label %46

44:                                               ; preds = %31
  %45 = load ptr, ptr %5, align 8, !tbaa !11
  call void @free(ptr noundef %45) #5
  br label %.thread432

46:                                               ; preds = %31, %43, %42, %41, %40
  %.0340 = phi i8 [ 1, %43 ], [ 1, %42 ], [ 1, %41 ], [ 0, %40 ], [ 0, %31 ]
  %.0327 = phi i32 [ 1, %43 ], [ 1, %42 ], [ 1, %41 ], [ 3, %40 ], [ 4, %31 ]
  %47 = phi i1 [ false, %43 ], [ false, %42 ], [ false, %41 ], [ false, %40 ], [ true, %31 ]
  %.0326 = phi i32 [ 3, %43 ], [ 3, %42 ], [ 3, %41 ], [ 3, %40 ], [ 4, %31 ]
  store i32 %.0326, ptr %3, align 4, !tbaa !16
  %48 = getelementptr inbounds i8, ptr %23, i64 46
  %49 = load i32, ptr %48, align 1, !tbaa !19
  %.not = icmp eq i32 %49, 0
  %spec.select = select i1 %.not, i8 %.0340, i8 1
  %50 = load i32, ptr %26, align 1, !tbaa !20
  %51 = getelementptr inbounds i8, ptr %23, i64 30
  %52 = load i32, ptr %51, align 1, !tbaa !21
  %53 = add i32 %50, 14
  switch i32 %52, label %56 [
    i32 6, label %54
    i32 3, label %54
  ]

54:                                               ; preds = %46, %46
  %55 = add i32 %50, 26
  br label %56

56:                                               ; preds = %46, %54
  %.0343 = phi i1 [ true, %54 ], [ false, %46 ]
  %.0342 = phi i32 [ %55, %54 ], [ %53, %46 ]
  %57 = zext i32 %.0342 to i64
  %58 = load i64, ptr %16, align 8, !tbaa !5
  %59 = icmp ult i64 %58, %57
  br i1 %59, label %60, label %62

60:                                               ; preds = %56
  %61 = load ptr, ptr %5, align 8, !tbaa !11
  call void @free(ptr noundef %61) #5
  br label %.thread432

62:                                               ; preds = %56
  %63 = mul i32 %.0327, %34
  switch i16 %39, label %72 [
    i16 4, label %.thread
    i16 1, label %67
  ]

.thread:                                          ; preds = %62
  %64 = and i32 %34, 1
  %65 = lshr i32 %34, 1
  %66 = add nuw nsw i32 %65, %64
  br label %72

67:                                               ; preds = %62
  %68 = and i32 %34, 7
  %.not398 = icmp ne i32 %68, 0
  %69 = lshr i32 %34, 3
  %70 = zext i1 %.not398 to i32
  %71 = add nuw nsw i32 %69, %70
  br label %72

72:                                               ; preds = %62, %.thread, %67
  %.1361 = phi i32 [ %71, %67 ], [ %66, %.thread ], [ %63, %62 ]
  %73 = and i32 %.1361, 3
  %74 = icmp eq i32 %73, 0
  %75 = sub nuw nsw i32 4, %73
  %76 = select i1 %74, i32 0, i32 %75
  %77 = getelementptr inbounds i8, ptr %19, i64 10
  %78 = load i32, ptr %77, align 1, !tbaa !22
  %79 = add i32 %76, %.1361
  %80 = mul i32 %79, %37
  %81 = add i32 %80, %78
  %82 = zext i32 %81 to i64
  %83 = icmp ult i64 %58, %82
  br i1 %83, label %84, label %86

84:                                               ; preds = %72
  %85 = load ptr, ptr %5, align 8, !tbaa !11
  call void @free(ptr noundef %85) #5
  br label %.thread432

86:                                               ; preds = %72
  br i1 %.0343, label %87, label %103

87:                                               ; preds = %86
  %88 = getelementptr inbounds i8, ptr %23, i64 54
  %89 = load i32, ptr %88, align 1, !tbaa !24
  %90 = getelementptr inbounds i8, ptr %23, i64 58
  %91 = load i32, ptr %90, align 1, !tbaa !25
  %92 = getelementptr inbounds i8, ptr %23, i64 62
  %93 = load i32, ptr %92, align 1, !tbaa !26
  %94 = or i32 %91, %93
  %95 = or i32 %94, %89
  %96 = xor i32 %95, -1
  %97 = call i32 @_bitscan(i32 noundef %89)
  %98 = load i32, ptr %90, align 1, !tbaa !25
  %99 = call i32 @_bitscan(i32 noundef %98)
  %100 = load i32, ptr %92, align 1, !tbaa !26
  %101 = call i32 @_bitscan(i32 noundef %100)
  %102 = call i32 @_bitscan(i32 noundef %96)
  br label %103

103:                                              ; preds = %87, %86
  %.0376 = phi i32 [ %96, %87 ], [ 0, %86 ]
  %.sroa.9.0 = phi i32 [ %102, %87 ], [ 0, %86 ]
  %.sroa.7.0 = phi i32 [ %101, %87 ], [ 0, %86 ]
  %.sroa.5.0 = phi i32 [ %99, %87 ], [ 0, %86 ]
  %.sroa.0.0 = phi i32 [ %97, %87 ], [ 0, %86 ]
  %104 = zext nneg i32 %34 to i64
  %105 = zext nneg i32 %37 to i64
  %106 = mul nuw nsw i64 %105, %104
  %107 = zext nneg i32 %.0326 to i64
  %108 = mul nuw i64 %106, %107
  %109 = call noalias ptr @malloc(i64 noundef %108) #6
  %.not399 = icmp eq ptr %109, null
  %110 = load ptr, ptr %5, align 8, !tbaa !11
  br i1 %.not399, label %111, label %112

111:                                              ; preds = %103
  call void @free(ptr noundef %110) #5
  br label %.thread432

112:                                              ; preds = %103
  %113 = getelementptr inbounds i8, ptr %110, i64 %57
  %114 = load i32, ptr %77, align 1, !tbaa !22
  %115 = zext i32 %114 to i64
  %116 = getelementptr inbounds i8, ptr %110, i64 %115
  %117 = mul i32 %.0326, %34
  %118 = zext i32 %117 to i64
  %119 = load i16, ptr %38, align 1, !tbaa !18
  switch i16 %119, label %.thread447 [
    i16 32, label %120
    i16 8, label %157
    i16 4, label %199
    i16 1, label %273
  ]

120:                                              ; preds = %112
  %121 = zext nneg i32 %.0327 to i64
  %122 = mul nuw i64 %106, %121
  %123 = add nuw i64 %122, %115
  %124 = load i64, ptr %16, align 8, !tbaa !5
  %125 = icmp ugt i64 %123, %124
  br i1 %125, label %156, label %.preheader462

.preheader462:                                    ; preds = %120
  %.not557 = icmp eq i32 %36, 0
  br i1 %.not557, label %.thread429, label %.lr.ph538

.lr.ph538:                                        ; preds = %.preheader462
  %.not558 = icmp eq i32 %33, 0
  %126 = zext nneg i32 %76 to i64
  br i1 %.not558, label %.thread429, label %.lr.ph538.split.us

.lr.ph538.split.us:                               ; preds = %.lr.ph538
  %127 = getelementptr inbounds i8, ptr %23, i64 62
  %128 = getelementptr inbounds i8, ptr %23, i64 58
  %129 = getelementptr inbounds i8, ptr %23, i64 54
  %130 = load i32, ptr %129, align 1, !tbaa !24
  %131 = load i32, ptr %128, align 1, !tbaa !25
  %132 = load i32, ptr %127, align 1, !tbaa !26
  %smax590 = call i32 @llvm.abs.i32(i32 %33, i1 false)
  %smax595 = call i32 @llvm.abs.i32(i32 %36, i1 false)
  %wide.trip.count596 = zext i32 %smax595 to i64
  br label %.lr.ph.us539

.lr.ph.us539:                                     ; preds = %._crit_edge.us540, %.lr.ph538.split.us
  %indvars.iv592 = phi i64 [ %indvars.iv.next593, %._crit_edge.us540 ], [ 0, %.lr.ph538.split.us ]
  %.0374536.us = phi i64 [ %155, %._crit_edge.us540 ], [ 0, %.lr.ph538.split.us ]
  %133 = mul nuw nsw i64 %indvars.iv592, %118
  br label %134

134:                                              ; preds = %.lr.ph.us539, %134
  %.0371535.us = phi i32 [ 0, %.lr.ph.us539 ], [ %154, %134 ]
  %.0372534.us = phi i64 [ %133, %.lr.ph.us539 ], [ %151, %134 ]
  %.1375533.us = phi i64 [ %.0374536.us, %.lr.ph.us539 ], [ %153, %134 ]
  %135 = getelementptr inbounds i8, ptr %116, i64 %.1375533.us
  %.0.copyload.us = load i32, ptr %135, align 1
  %136 = and i32 %130, %.0.copyload.us
  %137 = lshr i32 %136, %.sroa.0.0
  %138 = trunc i32 %137 to i8
  %139 = getelementptr inbounds i8, ptr %109, i64 %.0372534.us
  store i8 %138, ptr %139, align 1, !tbaa !27
  %140 = and i32 %131, %.0.copyload.us
  %141 = lshr i32 %140, %.sroa.5.0
  %142 = trunc i32 %141 to i8
  %143 = getelementptr i8, ptr %139, i64 1
  store i8 %142, ptr %143, align 1, !tbaa !27
  %144 = and i32 %132, %.0.copyload.us
  %145 = lshr i32 %144, %.sroa.7.0
  %146 = trunc i32 %145 to i8
  %147 = getelementptr i8, ptr %139, i64 2
  store i8 %146, ptr %147, align 1, !tbaa !27
  %148 = and i32 %.0.copyload.us, %.0376
  %149 = lshr i32 %148, %.sroa.9.0
  %150 = trunc i32 %149 to i8
  %151 = add i64 %.0372534.us, 4
  %152 = getelementptr i8, ptr %139, i64 3
  store i8 %150, ptr %152, align 1, !tbaa !27
  %153 = add i64 %.1375533.us, 4
  %154 = add nuw nsw i32 %.0371535.us, 1
  %exitcond591.not = icmp eq i32 %154, %smax590
  br i1 %exitcond591.not, label %._crit_edge.us540, label %134, !llvm.loop !28

._crit_edge.us540:                                ; preds = %134
  %155 = add i64 %153, %126
  %indvars.iv.next593 = add nuw nsw i64 %indvars.iv592, 1
  %exitcond597.not = icmp eq i64 %indvars.iv.next593, %wide.trip.count596
  br i1 %exitcond597.not, label %.thread429, label %.lr.ph.us539, !llvm.loop !30

156:                                              ; preds = %120
  call void @free(ptr noundef %110) #5
  call void @free(ptr noundef nonnull %109) #5
  br label %.thread432

157:                                              ; preds = %112
  %158 = trunc nuw i8 %spec.select to i1
  br i1 %158, label %159, label %.thread447

159:                                              ; preds = %157
  %160 = mul i32 %37, %34
  %161 = add i32 %114, %160
  %162 = zext i32 %161 to i64
  %163 = load i64, ptr %16, align 8
  %164 = icmp ult i64 %163, %162
  br i1 %164, label %198, label %.preheader464

.preheader464:                                    ; preds = %159
  %.not412525.not = icmp eq i32 %36, 0
  br i1 %.not412525.not, label %.thread429, label %.lr.ph528

.lr.ph528:                                        ; preds = %.preheader464
  %.not411.not521.not = icmp eq i32 %33, 0
  %165 = add i32 %.0342, 2
  %166 = zext nneg i32 %76 to i64
  br i1 %.not411.not521.not, label %.thread429, label %.lr.ph.us529.preheader

.lr.ph.us529.preheader:                           ; preds = %.lr.ph528
  %smax582 = call i32 @llvm.abs.i32(i32 %33, i1 false)
  %smax587 = call i32 @llvm.abs.i32(i32 %36, i1 false)
  %wide.trip.count588 = zext i32 %smax587 to i64
  br label %.lr.ph.us529

.lr.ph.us529:                                     ; preds = %.lr.ph.us529.preheader, %._crit_edge.us530
  %indvars.iv584 = phi i64 [ 0, %.lr.ph.us529.preheader ], [ %indvars.iv.next585, %._crit_edge.us530 ]
  %.0366526.us = phi i64 [ 0, %.lr.ph.us529.preheader ], [ %197, %._crit_edge.us530 ]
  %167 = trunc nuw nsw i64 %indvars.iv584 to i32
  %168 = xor i32 %167, -1
  %169 = add nsw i32 %37, %168
  %170 = zext i32 %169 to i64
  %171 = mul nuw i64 %170, %118
  br label %172

172:                                              ; preds = %.lr.ph.us529, %179
  %.0362524.us = phi i32 [ 0, %.lr.ph.us529 ], [ %196, %179 ]
  %.0363523.us = phi i64 [ %171, %.lr.ph.us529 ], [ %193, %179 ]
  %.1367522.us = phi i64 [ %.0366526.us, %.lr.ph.us529 ], [ %195, %179 ]
  %173 = getelementptr inbounds i8, ptr %116, i64 %.1367522.us
  %174 = load i8, ptr %173, align 1, !tbaa !27
  %175 = zext i8 %174 to i32
  %176 = shl nuw nsw i32 %175, 2
  %177 = add i32 %165, %176
  %178 = zext i32 %177 to i64
  %.not410.us = icmp ugt i64 %163, %178
  br i1 %.not410.us, label %179, label %.split.us532

179:                                              ; preds = %172
  %180 = or disjoint i32 %176, 2
  %181 = zext nneg i32 %180 to i64
  %182 = getelementptr inbounds i8, ptr %113, i64 %181
  %183 = load i8, ptr %182, align 1, !tbaa !27
  %184 = getelementptr inbounds i8, ptr %109, i64 %.0363523.us
  store i8 %183, ptr %184, align 1, !tbaa !27
  %185 = or disjoint i32 %176, 1
  %186 = zext nneg i32 %185 to i64
  %187 = getelementptr inbounds i8, ptr %113, i64 %186
  %188 = load i8, ptr %187, align 1, !tbaa !27
  %189 = getelementptr i8, ptr %184, i64 1
  store i8 %188, ptr %189, align 1, !tbaa !27
  %190 = zext nneg i32 %176 to i64
  %191 = getelementptr inbounds i8, ptr %113, i64 %190
  %192 = load i8, ptr %191, align 1, !tbaa !27
  %193 = add i64 %.0363523.us, 3
  %194 = getelementptr i8, ptr %184, i64 2
  store i8 %192, ptr %194, align 1, !tbaa !27
  %195 = add i64 %.1367522.us, 1
  %196 = add nuw i32 %.0362524.us, 1
  %exitcond583.not = icmp eq i32 %196, %smax582
  br i1 %exitcond583.not, label %._crit_edge.us530, label %172, !llvm.loop !31

._crit_edge.us530:                                ; preds = %179
  %197 = add i64 %195, %166
  %indvars.iv.next585 = add nuw nsw i64 %indvars.iv584, 1
  %exitcond589.not = icmp eq i64 %indvars.iv.next585, %wide.trip.count588
  br i1 %exitcond589.not, label %.thread429, label %.lr.ph.us529, !llvm.loop !32

198:                                              ; preds = %159
  call void @free(ptr noundef %110) #5
  call void @free(ptr noundef nonnull %109) #5
  br label %.thread432

.split.us532:                                     ; preds = %172
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

199:                                              ; preds = %112
  %200 = trunc nuw i8 %spec.select to i1
  br i1 %200, label %.preheader466, label %.thread447

.preheader466:                                    ; preds = %199
  %.not409503.not = icmp eq i32 %36, 0
  br i1 %.not409503.not, label %.thread429, label %.lr.ph506

.lr.ph506:                                        ; preds = %.preheader466
  %factor.op.mul502 = mul i32 %37, %34
  %201 = add nsw i32 %37, -1
  %factor.op.mul.reass = mul i32 %factor.op.mul502, %.0326
  %.not408.not496.not = icmp eq i32 %33, 0
  %202 = load i64, ptr %16, align 8
  %203 = add i32 %.0342, 2
  %204 = zext i32 %factor.op.mul.reass to i64
  %205 = zext nneg i32 %76 to i64
  br i1 %.not408.not496.not, label %.thread429, label %.lr.ph.us507

.lr.ph.us507:                                     ; preds = %.lr.ph506, %._crit_edge.us508
  %.0350505.us = phi i32 [ %272, %._crit_edge.us508 ], [ 0, %.lr.ph506 ]
  %.0355504.us = phi i64 [ %271, %._crit_edge.us508 ], [ 0, %.lr.ph506 ]
  %206 = sub nsw i32 %201, %.0350505.us
  %207 = zext i32 %206 to i64
  %208 = mul nuw i64 %207, %118
  br label %209

209:                                              ; preds = %.lr.ph.us507, %254
  %.0344500.us = phi i32 [ 0, %.lr.ph.us507 ], [ %270, %254 ]
  %.0347499.us = phi i64 [ %208, %.lr.ph.us507 ], [ %252, %254 ]
  %.1351498.us = phi i32 [ %.0350505.us, %.lr.ph.us507 ], [ %.2352.us, %254 ]
  %.1356497.us = phi i64 [ %.0355504.us, %.lr.ph.us507 ], [ %269, %254 ]
  %210 = add i64 %.1356497.us, %115
  %211 = icmp ugt i64 %210, %202
  br i1 %211, label %.split.us510, label %212

212:                                              ; preds = %209
  %213 = getelementptr inbounds i8, ptr %116, i64 %.1356497.us
  %214 = load i8, ptr %213, align 1, !tbaa !27
  %215 = lshr i8 %214, 2
  %216 = and i8 %215, 60
  %217 = zext nneg i8 %216 to i32
  %218 = add i32 %203, %217
  %219 = zext i32 %218 to i64
  %.not404.us = icmp ugt i64 %202, %219
  br i1 %.not404.us, label %220, label %.split512.us

220:                                              ; preds = %212
  %221 = add i64 %.0347499.us, 3
  %222 = icmp ugt i64 %221, %204
  br i1 %222, label %.split514.us, label %223

223:                                              ; preds = %220
  %224 = or disjoint i32 %217, 2
  %225 = zext nneg i32 %224 to i64
  %226 = getelementptr inbounds i8, ptr %113, i64 %225
  %227 = load i8, ptr %226, align 1, !tbaa !27
  %228 = getelementptr inbounds i8, ptr %109, i64 %.0347499.us
  store i8 %227, ptr %228, align 1, !tbaa !27
  %229 = or disjoint i32 %217, 1
  %230 = zext nneg i32 %229 to i64
  %231 = getelementptr inbounds i8, ptr %113, i64 %230
  %232 = load i8, ptr %231, align 1, !tbaa !27
  %233 = getelementptr i8, ptr %228, i64 1
  store i8 %232, ptr %233, align 1, !tbaa !27
  %234 = zext nneg i8 %216 to i64
  %235 = getelementptr inbounds i8, ptr %113, i64 %234
  %236 = load i8, ptr %235, align 1, !tbaa !27
  %237 = getelementptr i8, ptr %228, i64 2
  store i8 %236, ptr %237, align 1, !tbaa !27
  %238 = add nuw nsw i32 %.0344500.us, 1
  %.not405.us = icmp ult i32 %238, %34
  br i1 %.not405.us, label %245, label %239

239:                                              ; preds = %223
  %240 = add i32 %.1351498.us, 1
  %.not406.us = icmp ult i32 %240, %37
  br i1 %.not406.us, label %241, label %.split516.us

241:                                              ; preds = %239
  %242 = sub nsw i32 %201, %240
  %243 = zext i32 %242 to i64
  %244 = mul nuw i64 %243, %118
  br label %245

245:                                              ; preds = %241, %223
  %.2352.us = phi i32 [ %240, %241 ], [ %.1351498.us, %223 ]
  %.1348.us = phi i64 [ %244, %241 ], [ %221, %223 ]
  %.1345.us = phi i32 [ 0, %241 ], [ %238, %223 ]
  %246 = shl i8 %214, 2
  %247 = and i8 %246, 60
  %248 = zext nneg i8 %247 to i32
  %249 = add i32 %203, %248
  %250 = zext i32 %249 to i64
  %.not407.us = icmp ugt i64 %202, %250
  br i1 %.not407.us, label %251, label %.split518.us

251:                                              ; preds = %245
  %252 = add i64 %.1348.us, 3
  %253 = icmp ugt i64 %252, %204
  br i1 %253, label %.split520.us, label %254

254:                                              ; preds = %251
  %255 = or disjoint i32 %248, 2
  %256 = zext nneg i32 %255 to i64
  %257 = getelementptr inbounds i8, ptr %113, i64 %256
  %258 = load i8, ptr %257, align 1, !tbaa !27
  %259 = getelementptr inbounds i8, ptr %109, i64 %.1348.us
  store i8 %258, ptr %259, align 1, !tbaa !27
  %260 = or disjoint i32 %248, 1
  %261 = zext nneg i32 %260 to i64
  %262 = getelementptr inbounds i8, ptr %113, i64 %261
  %263 = load i8, ptr %262, align 1, !tbaa !27
  %264 = getelementptr i8, ptr %259, i64 1
  store i8 %263, ptr %264, align 1, !tbaa !27
  %265 = zext nneg i8 %247 to i64
  %266 = getelementptr inbounds i8, ptr %113, i64 %265
  %267 = load i8, ptr %266, align 1, !tbaa !27
  %268 = getelementptr i8, ptr %259, i64 2
  store i8 %267, ptr %268, align 1, !tbaa !27
  %269 = add i64 %.1356497.us, 1
  %270 = add nuw i32 %.1345.us, 1
  %.not408.not.us = icmp ult i32 %270, %34
  br i1 %.not408.not.us, label %209, label %._crit_edge.us508, !llvm.loop !33

._crit_edge.us508:                                ; preds = %254
  %271 = add i64 %269, %205
  %272 = add i32 %.2352.us, 1
  %.not409.us = icmp ult i32 %272, %37
  br i1 %.not409.us, label %.lr.ph.us507, label %.thread429, !llvm.loop !34

.split.us510:                                     ; preds = %209
  call void @free(ptr noundef %110) #5
  call void @free(ptr noundef %109) #5
  br label %.thread432

.split512.us:                                     ; preds = %212
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

.split514.us:                                     ; preds = %220
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

.split516.us:                                     ; preds = %239
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

.split518.us:                                     ; preds = %245
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

.split520.us:                                     ; preds = %251
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

273:                                              ; preds = %112
  %274 = trunc nuw i8 %spec.select to i1
  br i1 %274, label %.preheader468, label %.thread447

.preheader468:                                    ; preds = %273
  %.not403490.not = icmp eq i32 %36, 0
  br i1 %.not403490.not, label %.thread429, label %.lr.ph493

.lr.ph493:                                        ; preds = %.preheader468
  %.not402.not485.not = icmp eq i32 %33, 0
  %275 = load i64, ptr %16, align 8
  %276 = add i32 %.0342, 2
  %277 = add nuw nsw i32 %76, 1
  %278 = zext nneg i32 %277 to i64
  br i1 %.not402.not485.not, label %.thread429, label %.lr.ph493.split.us

.lr.ph493.split.us:                               ; preds = %.lr.ph493
  %smax = call i32 @llvm.abs.i32(i32 %33, i1 false)
  %smax580 = call i32 @llvm.abs.i32(i32 %36, i1 false)
  %wide.trip.count = zext i32 %smax580 to i64
  br label %.lr.ph.us

.lr.ph.us:                                        ; preds = %._crit_edge.us, %.lr.ph493.split.us
  %indvars.iv = phi i64 [ %indvars.iv.next, %._crit_edge.us ], [ 0, %.lr.ph493.split.us ]
  %.0335491.us = phi i64 [ %317, %._crit_edge.us ], [ 0, %.lr.ph493.split.us ]
  %279 = trunc nuw nsw i64 %indvars.iv to i32
  %280 = xor i32 %279, -1
  %281 = add nsw i32 %37, %280
  %282 = zext i32 %281 to i64
  %283 = mul nuw i64 %282, %118
  br label %284

284:                                              ; preds = %.lr.ph.us, %299
  %.0328489.us = phi i32 [ 0, %.lr.ph.us ], [ %316, %299 ]
  %.0329488.us = phi i64 [ %283, %.lr.ph.us ], [ %313, %299 ]
  %.0331487.us = phi i8 [ 0, %.lr.ph.us ], [ %315, %299 ]
  %.1336486.us = phi i64 [ %.0335491.us, %.lr.ph.us ], [ %spec.select415.us, %299 ]
  %285 = icmp eq i8 %.0331487.us, 8
  %286 = zext i1 %285 to i64
  %spec.select415.us = add i64 %.1336486.us, %286
  %spec.select416.us = select i1 %285, i8 0, i8 %.0331487.us
  %287 = add i64 %spec.select415.us, %115
  %288 = icmp ugt i64 %287, %275
  br i1 %288, label %.split.us, label %289

289:                                              ; preds = %284
  %290 = getelementptr inbounds i8, ptr %116, i64 %spec.select415.us
  %291 = load i8, ptr %290, align 1, !tbaa !27
  %292 = zext nneg i8 %spec.select416.us to i32
  %293 = lshr i32 128, %292
  %294 = trunc nuw i32 %293 to i8
  %295 = and i8 %291, %294
  %.not400.not.us = icmp eq i8 %295, 0
  %296 = select i1 %.not400.not.us, i32 0, i32 4
  %297 = add i32 %276, %296
  %298 = zext i32 %297 to i64
  %.not401.us = icmp ugt i64 %275, %298
  br i1 %.not401.us, label %299, label %.split495.us

299:                                              ; preds = %289
  %300 = or disjoint i32 %296, 2
  %301 = zext nneg i32 %300 to i64
  %302 = getelementptr inbounds i8, ptr %113, i64 %301
  %303 = load i8, ptr %302, align 1, !tbaa !27
  %304 = getelementptr inbounds i8, ptr %109, i64 %.0329488.us
  store i8 %303, ptr %304, align 1, !tbaa !27
  %305 = or disjoint i32 %296, 1
  %306 = zext nneg i32 %305 to i64
  %307 = getelementptr inbounds i8, ptr %113, i64 %306
  %308 = load i8, ptr %307, align 1, !tbaa !27
  %309 = getelementptr i8, ptr %304, i64 1
  store i8 %308, ptr %309, align 1, !tbaa !27
  %310 = zext nneg i32 %296 to i64
  %311 = getelementptr inbounds i8, ptr %113, i64 %310
  %312 = load i8, ptr %311, align 1, !tbaa !27
  %313 = add i64 %.0329488.us, 3
  %314 = getelementptr i8, ptr %304, i64 2
  store i8 %312, ptr %314, align 1, !tbaa !27
  %315 = add i8 %spec.select416.us, 1
  %316 = add nuw i32 %.0328489.us, 1
  %exitcond.not = icmp eq i32 %316, %smax
  br i1 %exitcond.not, label %._crit_edge.us, label %284, !llvm.loop !35

._crit_edge.us:                                   ; preds = %299
  %317 = add i64 %spec.select415.us, %278
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond581.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond581.not, label %.thread429, label %.lr.ph.us, !llvm.loop !36

.split.us:                                        ; preds = %284
  call void @free(ptr noundef %110) #5
  br label %.thread432

.split495.us:                                     ; preds = %289
  call void @free(ptr noundef nonnull %110) #5
  br label %.thread432

.thread447:                                       ; preds = %112, %157, %199, %273
  %318 = mul i32 %37, %34
  %319 = mul i32 %318, %.0326
  %320 = add i32 %114, %319
  %321 = zext i32 %320 to i64
  %322 = load i64, ptr %16, align 8, !tbaa !5
  %323 = icmp ult i64 %322, %321
  br i1 %323, label %387, label %.preheader

.preheader:                                       ; preds = %.thread447
  %.not559 = icmp eq i32 %36, 0
  br i1 %.not559, label %.thread429, label %.lr.ph548

.lr.ph548:                                        ; preds = %.preheader
  %.not560 = icmp eq i32 %33, 0
  %324 = zext nneg i32 %.0327 to i64
  %325 = zext nneg i32 %76 to i64
  br i1 %.not560, label %.thread429, label %.lr.ph548.split.us

.lr.ph548.split.us:                               ; preds = %.lr.ph548
  %smax606 = call i32 @llvm.abs.i32(i32 %33, i1 false)
  %smax611 = call i32 @llvm.abs.i32(i32 %36, i1 false)
  %wide.trip.count612 = zext i32 %smax611 to i64
  br i1 %47, label %.lr.ph.us552.us.preheader, label %.lr.ph.us552.preheader

.lr.ph.us552.preheader:                           ; preds = %.lr.ph548.split.us
  %xtraiter = and i32 %smax606, 1
  %326 = icmp eq i32 %smax606, 1
  %unroll_iter = and i32 %smax606, -2
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  br label %.lr.ph.us552

.lr.ph.us552.us.preheader:                        ; preds = %.lr.ph548.split.us
  %xtraiter655 = and i32 %smax606, 1
  %327 = icmp eq i32 %smax606, 1
  %unroll_iter658 = and i32 %smax606, -2
  %invariant.gep = getelementptr i8, ptr %109, i64 4
  %lcmp.mod656.not = icmp eq i32 %xtraiter655, 0
  br label %.lr.ph.us552.us

.lr.ph.us552.us:                                  ; preds = %.lr.ph.us552.us.preheader, %._crit_edge.split.us.us.us
  %indvars.iv608 = phi i64 [ %indvars.iv.next609, %._crit_edge.split.us.us.us ], [ 0, %.lr.ph.us552.us.preheader ]
  %.0308546.us.us = phi i64 [ %348, %._crit_edge.split.us.us.us ], [ 0, %.lr.ph.us552.us.preheader ]
  %328 = trunc nuw nsw i64 %indvars.iv608 to i32
  %329 = xor i32 %328, -1
  %330 = add nsw i32 %37, %329
  %331 = zext i32 %330 to i64
  %332 = mul nuw i64 %331, %118
  br i1 %327, label %._crit_edge.split.us.us.us.unr-lcssa, label %.lr.ph.us552.us.new

.lr.ph.us552.us.new:                              ; preds = %.lr.ph.us552.us, %.lr.ph.us552.us.new
  %.0306543.us.us.us = phi i64 [ %339, %.lr.ph.us552.us.new ], [ %332, %.lr.ph.us552.us ]
  %.1309542.us.us.us = phi i64 [ %342, %.lr.ph.us552.us.new ], [ %.0308546.us.us, %.lr.ph.us552.us ]
  %niter659 = phi i32 [ %niter659.next.1, %.lr.ph.us552.us.new ], [ 0, %.lr.ph.us552.us ]
  %333 = getelementptr i8, ptr %109, i64 %.0306543.us.us.us
  %334 = getelementptr i8, ptr %116, i64 %.1309542.us.us.us
  %335 = load <4 x i8>, ptr %334, align 1, !tbaa !27
  %336 = shufflevector <4 x i8> %335, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
  store <4 x i8> %336, ptr %333, align 1, !tbaa !27
  %337 = add i64 %.1309542.us.us.us, %324
  %gep = getelementptr i8, ptr %invariant.gep, i64 %.0306543.us.us.us
  %338 = getelementptr i8, ptr %116, i64 %337
  %339 = add i64 %.0306543.us.us.us, 8
  %340 = load <4 x i8>, ptr %338, align 1, !tbaa !27
  %341 = shufflevector <4 x i8> %340, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
  store <4 x i8> %341, ptr %gep, align 1, !tbaa !27
  %342 = add i64 %337, %324
  %niter659.next.1 = add i32 %niter659, 2
  %niter659.ncmp.1 = icmp eq i32 %niter659.next.1, %unroll_iter658
  br i1 %niter659.ncmp.1, label %._crit_edge.split.us.us.us.unr-lcssa, label %.lr.ph.us552.us.new, !llvm.loop !37

._crit_edge.split.us.us.us.unr-lcssa:             ; preds = %.lr.ph.us552.us.new, %.lr.ph.us552.us
  %.lcssa.ph = phi i64 [ poison, %.lr.ph.us552.us ], [ %342, %.lr.ph.us552.us.new ]
  %.0306543.us.us.us.unr = phi i64 [ %332, %.lr.ph.us552.us ], [ %339, %.lr.ph.us552.us.new ]
  %.1309542.us.us.us.unr = phi i64 [ %.0308546.us.us, %.lr.ph.us552.us ], [ %342, %.lr.ph.us552.us.new ]
  br i1 %lcmp.mod656.not, label %._crit_edge.split.us.us.us, label %._crit_edge.split.us.us.us.epilog-lcssa

._crit_edge.split.us.us.us.epilog-lcssa:          ; preds = %._crit_edge.split.us.us.us.unr-lcssa
  %343 = getelementptr i8, ptr %109, i64 %.0306543.us.us.us.unr
  %344 = getelementptr i8, ptr %116, i64 %.1309542.us.us.us.unr
  %345 = load <4 x i8>, ptr %344, align 1, !tbaa !27
  %346 = shufflevector <4 x i8> %345, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
  store <4 x i8> %346, ptr %343, align 1, !tbaa !27
  %347 = add i64 %.1309542.us.us.us.unr, %324
  br label %._crit_edge.split.us.us.us

._crit_edge.split.us.us.us:                       ; preds = %._crit_edge.split.us.us.us.unr-lcssa, %._crit_edge.split.us.us.us.epilog-lcssa
  %.lcssa = phi i64 [ %.lcssa.ph, %._crit_edge.split.us.us.us.unr-lcssa ], [ %347, %._crit_edge.split.us.us.us.epilog-lcssa ]
  %348 = add i64 %.lcssa, %325
  %indvars.iv.next609 = add nuw nsw i64 %indvars.iv608, 1
  %exitcond613.not = icmp eq i64 %indvars.iv.next609, %wide.trip.count612
  br i1 %exitcond613.not, label %.thread429, label %.lr.ph.us552.us, !llvm.loop !38

.lr.ph.us552:                                     ; preds = %.lr.ph.us552.preheader, %._crit_edge.split.us553
  %indvars.iv600 = phi i64 [ %indvars.iv.next601, %._crit_edge.split.us553 ], [ 0, %.lr.ph.us552.preheader ]
  %.0308546.us = phi i64 [ %386, %._crit_edge.split.us553 ], [ 0, %.lr.ph.us552.preheader ]
  %349 = trunc nuw nsw i64 %indvars.iv600 to i32
  %350 = xor i32 %349, -1
  %351 = add nsw i32 %37, %350
  %352 = zext i32 %351 to i64
  %353 = mul nuw i64 %352, %118
  br i1 %326, label %._crit_edge.split.us553.unr-lcssa, label %.lr.ph.us552.new

.lr.ph.us552.new:                                 ; preds = %.lr.ph.us552, %.lr.ph.us552.new
  %.0306543.us550 = phi i64 [ %373, %.lr.ph.us552.new ], [ %353, %.lr.ph.us552 ]
  %.1309542.us551 = phi i64 [ %375, %.lr.ph.us552.new ], [ %.0308546.us, %.lr.ph.us552 ]
  %niter = phi i32 [ %niter.next.1, %.lr.ph.us552.new ], [ 0, %.lr.ph.us552 ]
  %354 = getelementptr i8, ptr %116, i64 %.1309542.us551
  %355 = getelementptr i8, ptr %354, i64 2
  %356 = load i8, ptr %355, align 1, !tbaa !27
  %357 = getelementptr inbounds i8, ptr %109, i64 %.0306543.us550
  store i8 %356, ptr %357, align 1, !tbaa !27
  %358 = getelementptr i8, ptr %354, i64 1
  %359 = load i8, ptr %358, align 1, !tbaa !27
  %360 = getelementptr i8, ptr %357, i64 1
  store i8 %359, ptr %360, align 1, !tbaa !27
  %361 = load i8, ptr %354, align 1, !tbaa !27
  %362 = getelementptr i8, ptr %357, i64 2
  store i8 %361, ptr %362, align 1, !tbaa !27
  %363 = add i64 %.1309542.us551, %324
  %364 = getelementptr i8, ptr %116, i64 %363
  %365 = getelementptr i8, ptr %364, i64 2
  %366 = load i8, ptr %365, align 1, !tbaa !27
  %367 = getelementptr i8, ptr %109, i64 %.0306543.us550
  %368 = getelementptr i8, ptr %367, i64 3
  store i8 %366, ptr %368, align 1, !tbaa !27
  %369 = getelementptr i8, ptr %364, i64 1
  %370 = load i8, ptr %369, align 1, !tbaa !27
  %371 = getelementptr i8, ptr %367, i64 4
  store i8 %370, ptr %371, align 1, !tbaa !27
  %372 = load i8, ptr %364, align 1, !tbaa !27
  %373 = add i64 %.0306543.us550, 6
  %374 = getelementptr i8, ptr %367, i64 5
  store i8 %372, ptr %374, align 1, !tbaa !27
  %375 = add i64 %363, %324
  %niter.next.1 = add i32 %niter, 2
  %niter.ncmp.1 = icmp eq i32 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.split.us553.unr-lcssa, label %.lr.ph.us552.new, !llvm.loop !37

._crit_edge.split.us553.unr-lcssa:                ; preds = %.lr.ph.us552.new, %.lr.ph.us552
  %.lcssa641.ph = phi i64 [ poison, %.lr.ph.us552 ], [ %375, %.lr.ph.us552.new ]
  %.0306543.us550.unr = phi i64 [ %353, %.lr.ph.us552 ], [ %373, %.lr.ph.us552.new ]
  %.1309542.us551.unr = phi i64 [ %.0308546.us, %.lr.ph.us552 ], [ %375, %.lr.ph.us552.new ]
  br i1 %lcmp.mod.not, label %._crit_edge.split.us553, label %._crit_edge.split.us553.epilog-lcssa

._crit_edge.split.us553.epilog-lcssa:             ; preds = %._crit_edge.split.us553.unr-lcssa
  %376 = getelementptr i8, ptr %116, i64 %.1309542.us551.unr
  %377 = getelementptr i8, ptr %376, i64 2
  %378 = load i8, ptr %377, align 1, !tbaa !27
  %379 = getelementptr inbounds i8, ptr %109, i64 %.0306543.us550.unr
  store i8 %378, ptr %379, align 1, !tbaa !27
  %380 = getelementptr i8, ptr %376, i64 1
  %381 = load i8, ptr %380, align 1, !tbaa !27
  %382 = getelementptr i8, ptr %379, i64 1
  store i8 %381, ptr %382, align 1, !tbaa !27
  %383 = load i8, ptr %376, align 1, !tbaa !27
  %384 = getelementptr i8, ptr %379, i64 2
  store i8 %383, ptr %384, align 1, !tbaa !27
  %385 = add i64 %.1309542.us551.unr, %324
  br label %._crit_edge.split.us553

._crit_edge.split.us553:                          ; preds = %._crit_edge.split.us553.unr-lcssa, %._crit_edge.split.us553.epilog-lcssa
  %.lcssa641 = phi i64 [ %.lcssa641.ph, %._crit_edge.split.us553.unr-lcssa ], [ %385, %._crit_edge.split.us553.epilog-lcssa ]
  %386 = add i64 %.lcssa641, %325
  %indvars.iv.next601 = add nuw nsw i64 %indvars.iv600, 1
  %exitcond605.not = icmp eq i64 %indvars.iv.next601, %wide.trip.count612
  br i1 %exitcond605.not, label %.thread429, label %.lr.ph.us552, !llvm.loop !38

387:                                              ; preds = %.thread447
  call void @free(ptr noundef %110) #5
  call void @free(ptr noundef nonnull %109) #5
  br label %.thread432

.thread429:                                       ; preds = %._crit_edge.us, %._crit_edge.us508, %._crit_edge.us530, %._crit_edge.us540, %._crit_edge.split.us553, %._crit_edge.split.us.us.us, %.lr.ph548, %.lr.ph493, %.lr.ph506, %.lr.ph528, %.lr.ph538, %.preheader468, %.preheader466, %.preheader464, %.preheader462, %.preheader
  call void @free(ptr noundef %110) #5
  br label %.thread432

.thread432:                                       ; preds = %.split.us, %.split495.us, %.split.us510, %.split512.us, %.split514.us, %.split516.us, %.split518.us, %.split520.us, %.split.us532, %24, %44, %84, %156, %198, %387, %.thread429, %111, %60, %29, %13, %20
  %.22 = phi ptr [ null, %20 ], [ null, %13 ], [ null, %24 ], [ null, %29 ], [ null, %44 ], [ null, %60 ], [ null, %84 ], [ null, %111 ], [ null, %156 ], [ %109, %.thread429 ], [ null, %198 ], [ %109, %.split.us532 ], [ null, %387 ], [ null, %.split.us510 ], [ %109, %.split512.us ], [ %109, %.split514.us ], [ %109, %.split516.us ], [ %109, %.split518.us ], [ %109, %.split520.us ], [ %109, %.split495.us ], [ %109, %.split.us ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #5
  br label %388

388:                                              ; preds = %4, %.thread432
  %.23 = phi ptr [ %.22, %.thread432 ], [ null, %4 ]
  ret ptr %.23
}

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

; Function Attrs: nounwind uwtable
declare hidden zeroext i1 @_read_entire_file(ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #2

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

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

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

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

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #4

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

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

!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 8}
!6 = !{!"_entire_file_t", !7, i64 0, !10, i64 8}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long", !8, i64 0}
!11 = !{!6, !7, i64 0}
!12 = !{!13, !14, i64 4}
!13 = !{!"_bmp_dib_BITMAPINFOHEADER_t", !14, i64 0, !14, i64 4, !14, i64 8, !15, i64 12, !15, i64 14, !14, i64 16, !14, i64 20, !14, i64 24, !14, i64 28, !14, i64 32, !14, i64 36, !14, i64 40, !14, i64 44, !14, i64 48}
!14 = !{!"int", !8, i64 0}
!15 = !{!"short", !8, i64 0}
!16 = !{!14, !14, i64 0}
!17 = !{!13, !14, i64 8}
!18 = !{!13, !15, i64 14}
!19 = !{!13, !14, i64 32}
!20 = !{!13, !14, i64 0}
!21 = !{!13, !14, i64 16}
!22 = !{!23, !14, i64 10}
!23 = !{!"_bmp_file_header_t", !8, i64 0, !14, i64 2, !15, i64 6, !15, i64 8, !14, i64 10}
!24 = !{!13, !14, i64 40}
!25 = !{!13, !14, i64 44}
!26 = !{!13, !14, i64 48}
!27 = !{!8, !8, i64 0}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = distinct !{!30, !29}
!31 = distinct !{!31, !29}
!32 = distinct !{!32, !29}
!33 = distinct !{!33, !29}
!34 = distinct !{!34, !29}
!35 = distinct !{!35, !29}
!36 = distinct !{!36, !29}
!37 = distinct !{!37, !29}
!38 = distinct !{!38, !29}


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