; LLVM IR from ctlst-tech/catpilot :: bsp/mcu/core/stm32/h753/hal/src (stm32h7xx_hal_pcd)

; 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.PCD_HandleTypeDef = type { ptr, %struct.USB_OTG_CfgTypeDef, i8, [16 x %struct.USB_OTG_EPTypeDef], [16 x %struct.USB_OTG_EPTypeDef], i32, i32, i32, [12 x i32], i32, i32, i32, i32, ptr }
%struct.USB_OTG_CfgTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.USB_OTG_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i16, i32, ptr, i32, i32, i32 }
%struct.USB_OTG_GlobalTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [2 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [39 x i32], i32, [15 x i32] }
%struct.USB_OTG_OUTEndpointTypeDef = type { i32, i32, i32, i32, i32, i32, [2 x i32] }
%struct.USB_OTG_DeviceTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [15 x i32], i32 }
%struct.USB_OTG_INEndpointTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32 }

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

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

declare i32 @USB_FlushTxFifo(ptr noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @HAL_PCD_IRQHandler(ptr noundef %0) #2 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #3
  %13 = load ptr, ptr %2, align 8, !tbaa !5
  %14 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %13, i32 0, i32 0
  %15 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %15, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #3
  %16 = load ptr, ptr %3, align 8, !tbaa !5
  %17 = ptrtoint ptr %16 to i32
  store i32 %17, ptr %4, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  %18 = load ptr, ptr %2, align 8, !tbaa !5
  %19 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %18, i32 0, i32 0
  %20 = load ptr, ptr %19, align 8, !tbaa !9
  %21 = call i32 @USB_GetMode(ptr noundef %20)
  %22 = icmp eq i32 %21, 0
  br i1 %22, label %23, label %861

23:                                               ; preds = %1
  %24 = load ptr, ptr %2, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %24, i32 0, i32 0
  %26 = load ptr, ptr %25, align 8, !tbaa !9
  %27 = call i32 @USB_ReadInterrupts(ptr noundef %26)
  %28 = icmp eq i32 %27, 0
  br i1 %28, label %29, label %30

29:                                               ; preds = %23
  store i32 1, ptr %12, align 4
  br label %862

30:                                               ; preds = %23
  %31 = load ptr, ptr %2, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %31, i32 0, i32 0
  %33 = load ptr, ptr %32, align 8, !tbaa !9
  %34 = call i32 @USB_ReadInterrupts(ptr noundef %33)
  %35 = zext i32 %34 to i64
  %36 = and i64 %35, 2
  %37 = icmp eq i64 %36, 2
  br i1 %37, label %38, label %47

38:                                               ; preds = %30
  %39 = load ptr, ptr %2, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %39, i32 0, i32 0
  %41 = load ptr, ptr %40, align 8, !tbaa !9
  %42 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %41, i32 0, i32 5
  %43 = load volatile i32, ptr %42, align 4, !tbaa !14
  %44 = zext i32 %43 to i64
  %45 = and i64 %44, 2
  %46 = trunc i64 %45 to i32
  store volatile i32 %46, ptr %42, align 4, !tbaa !14
  br label %47

47:                                               ; preds = %38, %30
  %48 = load ptr, ptr %2, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %48, i32 0, i32 0
  %50 = load ptr, ptr %49, align 8, !tbaa !9
  %51 = call i32 @USB_ReadInterrupts(ptr noundef %50)
  %52 = zext i32 %51 to i64
  %53 = and i64 %52, 16
  %54 = icmp eq i64 %53, 16
  br i1 %54, label %55, label %146

55:                                               ; preds = %47
  %56 = load ptr, ptr %2, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %56, i32 0, i32 0
  %58 = load ptr, ptr %57, align 8, !tbaa !9
  %59 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %58, i32 0, i32 6
  %60 = load volatile i32, ptr %59, align 4, !tbaa !16
  %61 = zext i32 %60 to i64
  %62 = and i64 %61, -17
  %63 = trunc i64 %62 to i32
  store volatile i32 %63, ptr %59, align 4, !tbaa !16
  %64 = load ptr, ptr %3, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %64, i32 0, i32 8
  %66 = load volatile i32, ptr %65, align 4, !tbaa !17
  store i32 %66, ptr %11, align 4, !tbaa !13
  %67 = load ptr, ptr %2, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %67, i32 0, i32 4
  %69 = load i32, ptr %11, align 4, !tbaa !13
  %70 = zext i32 %69 to i64
  %71 = and i64 %70, 15
  %72 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %68, i64 0, i64 %71
  store ptr %72, ptr %5, align 8, !tbaa !5
  %73 = load i32, ptr %11, align 4, !tbaa !13
  %74 = zext i32 %73 to i64
  %75 = and i64 %74, 1966080
  %76 = lshr i64 %75, 17
  %77 = icmp eq i64 %76, 2
  br i1 %77, label %78, label %113

78:                                               ; preds = %55
  %79 = load i32, ptr %11, align 4, !tbaa !13
  %80 = zext i32 %79 to i64
  %81 = and i64 %80, 32752
  %82 = icmp ne i64 %81, 0
  br i1 %82, label %83, label %112

83:                                               ; preds = %78
  %84 = load ptr, ptr %3, align 8, !tbaa !5
  %85 = load ptr, ptr %5, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %85, i32 0, i32 8
  %87 = load ptr, ptr %86, align 8, !tbaa !18
  %88 = load i32, ptr %11, align 4, !tbaa !13
  %89 = zext i32 %88 to i64
  %90 = and i64 %89, 32752
  %91 = lshr i64 %90, 4
  %92 = trunc i64 %91 to i16
  %93 = call ptr @USB_ReadPacket(ptr noundef %84, ptr noundef %87, i16 noundef zeroext %92)
  %94 = load i32, ptr %11, align 4, !tbaa !13
  %95 = zext i32 %94 to i64
  %96 = and i64 %95, 32752
  %97 = lshr i64 %96, 4
  %98 = load ptr, ptr %5, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %98, i32 0, i32 8
  %100 = load ptr, ptr %99, align 8, !tbaa !18
  %101 = getelementptr inbounds i8, ptr %100, i64 %97
  store ptr %101, ptr %99, align 8, !tbaa !18
  %102 = load i32, ptr %11, align 4, !tbaa !13
  %103 = zext i32 %102 to i64
  %104 = and i64 %103, 32752
  %105 = lshr i64 %104, 4
  %106 = load ptr, ptr %5, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %106, i32 0, i32 11
  %108 = load i32, ptr %107, align 8, !tbaa !21
  %109 = zext i32 %108 to i64
  %110 = add i64 %109, %105
  %111 = trunc i64 %110 to i32
  store i32 %111, ptr %107, align 8, !tbaa !21
  br label %112

112:                                              ; preds = %83, %78
  br label %137

113:                                              ; preds = %55
  %114 = load i32, ptr %11, align 4, !tbaa !13
  %115 = zext i32 %114 to i64
  %116 = and i64 %115, 1966080
  %117 = lshr i64 %116, 17
  %118 = icmp eq i64 %117, 6
  br i1 %118, label %119, label %135

119:                                              ; preds = %113
  %120 = load ptr, ptr %3, align 8, !tbaa !5
  %121 = load ptr, ptr %2, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %121, i32 0, i32 8
  %123 = getelementptr inbounds [12 x i32], ptr %122, i64 0, i64 0
  %124 = call ptr @USB_ReadPacket(ptr noundef %120, ptr noundef %123, i16 noundef zeroext 8)
  %125 = load i32, ptr %11, align 4, !tbaa !13
  %126 = zext i32 %125 to i64
  %127 = and i64 %126, 32752
  %128 = lshr i64 %127, 4
  %129 = load ptr, ptr %5, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %129, i32 0, i32 11
  %131 = load i32, ptr %130, align 8, !tbaa !21
  %132 = zext i32 %131 to i64
  %133 = add i64 %132, %128
  %134 = trunc i64 %133 to i32
  store i32 %134, ptr %130, align 8, !tbaa !21
  br label %136

135:                                              ; preds = %113
  br label %136

136:                                              ; preds = %135, %119
  br label %137

137:                                              ; preds = %136, %112
  %138 = load ptr, ptr %2, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %138, i32 0, i32 0
  %140 = load ptr, ptr %139, align 8, !tbaa !9
  %141 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %140, i32 0, i32 6
  %142 = load volatile i32, ptr %141, align 4, !tbaa !16
  %143 = zext i32 %142 to i64
  %144 = or i64 %143, 16
  %145 = trunc i64 %144 to i32
  store volatile i32 %145, ptr %141, align 4, !tbaa !16
  br label %146

146:                                              ; preds = %137, %47
  %147 = load ptr, ptr %2, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %147, i32 0, i32 0
  %149 = load ptr, ptr %148, align 8, !tbaa !9
  %150 = call i32 @USB_ReadInterrupts(ptr noundef %149)
  %151 = zext i32 %150 to i64
  %152 = and i64 %151, 524288
  %153 = icmp eq i64 %152, 524288
  br i1 %153, label %154, label %260

154:                                              ; preds = %146
  store i32 0, ptr %9, align 4, !tbaa !13
  %155 = load ptr, ptr %2, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %155, i32 0, i32 0
  %157 = load ptr, ptr %156, align 8, !tbaa !9
  %158 = call i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef %157)
  store i32 %158, ptr %7, align 4, !tbaa !13
  br label %159

159:                                              ; preds = %254, %154
  %160 = load i32, ptr %7, align 4, !tbaa !13
  %161 = icmp ne i32 %160, 0
  br i1 %161, label %162, label %259

162:                                              ; preds = %159
  %163 = load i32, ptr %7, align 4, !tbaa !13
  %164 = and i32 %163, 1
  %165 = icmp ne i32 %164, 0
  br i1 %165, label %166, label %254

166:                                              ; preds = %162
  %167 = load ptr, ptr %2, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %167, i32 0, i32 0
  %169 = load ptr, ptr %168, align 8, !tbaa !9
  %170 = load i32, ptr %9, align 4, !tbaa !13
  %171 = trunc i32 %170 to i8
  %172 = call i32 @USB_ReadDevOutEPInterrupt(ptr noundef %169, i8 noundef zeroext %171)
  store i32 %172, ptr %8, align 4, !tbaa !13
  %173 = load i32, ptr %8, align 4, !tbaa !13
  %174 = zext i32 %173 to i64
  %175 = and i64 %174, 1
  %176 = icmp eq i64 %175, 1
  br i1 %176, label %177, label %190

177:                                              ; preds = %166
  %178 = load i32, ptr %4, align 4, !tbaa !13
  %179 = zext i32 %178 to i64
  %180 = add i64 %179, 2816
  %181 = load i32, ptr %9, align 4, !tbaa !13
  %182 = zext i32 %181 to i64
  %183 = mul i64 %182, 32
  %184 = add i64 %180, %183
  %185 = inttoptr i64 %184 to ptr
  %186 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %185, i32 0, i32 2
  store volatile i32 1, ptr %186, align 4, !tbaa !22
  %187 = load ptr, ptr %2, align 8, !tbaa !5
  %188 = load i32, ptr %9, align 4, !tbaa !13
  %189 = call i32 @PCD_EP_OutXfrComplete_int(ptr noundef %187, i32 noundef %188)
  br label %190

190:                                              ; preds = %177, %166
  %191 = load i32, ptr %8, align 4, !tbaa !13
  %192 = zext i32 %191 to i64
  %193 = and i64 %192, 8
  %194 = icmp eq i64 %193, 8
  br i1 %194, label %195, label %208

195:                                              ; preds = %190
  %196 = load i32, ptr %4, align 4, !tbaa !13
  %197 = zext i32 %196 to i64
  %198 = add i64 %197, 2816
  %199 = load i32, ptr %9, align 4, !tbaa !13
  %200 = zext i32 %199 to i64
  %201 = mul i64 %200, 32
  %202 = add i64 %198, %201
  %203 = inttoptr i64 %202 to ptr
  %204 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %203, i32 0, i32 2
  store volatile i32 8, ptr %204, align 4, !tbaa !22
  %205 = load ptr, ptr %2, align 8, !tbaa !5
  %206 = load i32, ptr %9, align 4, !tbaa !13
  %207 = call i32 @PCD_EP_OutSetupPacket_int(ptr noundef %205, i32 noundef %206)
  br label %208

208:                                              ; preds = %195, %190
  %209 = load i32, ptr %8, align 4, !tbaa !13
  %210 = zext i32 %209 to i64
  %211 = and i64 %210, 16
  %212 = icmp eq i64 %211, 16
  br i1 %212, label %213, label %223

213:                                              ; preds = %208
  %214 = load i32, ptr %4, align 4, !tbaa !13
  %215 = zext i32 %214 to i64
  %216 = add i64 %215, 2816
  %217 = load i32, ptr %9, align 4, !tbaa !13
  %218 = zext i32 %217 to i64
  %219 = mul i64 %218, 32
  %220 = add i64 %216, %219
  %221 = inttoptr i64 %220 to ptr
  %222 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %221, i32 0, i32 2
  store volatile i32 16, ptr %222, align 4, !tbaa !22
  br label %223

223:                                              ; preds = %213, %208
  %224 = load i32, ptr %8, align 4, !tbaa !13
  %225 = zext i32 %224 to i64
  %226 = and i64 %225, 32
  %227 = icmp eq i64 %226, 32
  br i1 %227, label %228, label %238

228:                                              ; preds = %223
  %229 = load i32, ptr %4, align 4, !tbaa !13
  %230 = zext i32 %229 to i64
  %231 = add i64 %230, 2816
  %232 = load i32, ptr %9, align 4, !tbaa !13
  %233 = zext i32 %232 to i64
  %234 = mul i64 %233, 32
  %235 = add i64 %231, %234
  %236 = inttoptr i64 %235 to ptr
  %237 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %236, i32 0, i32 2
  store volatile i32 32, ptr %237, align 4, !tbaa !22
  br label %238

238:                                              ; preds = %228, %223
  %239 = load i32, ptr %8, align 4, !tbaa !13
  %240 = zext i32 %239 to i64
  %241 = and i64 %240, 8192
  %242 = icmp eq i64 %241, 8192
  br i1 %242, label %243, label %253

243:                                              ; preds = %238
  %244 = load i32, ptr %4, align 4, !tbaa !13
  %245 = zext i32 %244 to i64
  %246 = add i64 %245, 2816
  %247 = load i32, ptr %9, align 4, !tbaa !13
  %248 = zext i32 %247 to i64
  %249 = mul i64 %248, 32
  %250 = add i64 %246, %249
  %251 = inttoptr i64 %250 to ptr
  %252 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %251, i32 0, i32 2
  store volatile i32 8192, ptr %252, align 4, !tbaa !22
  br label %253

253:                                              ; preds = %243, %238
  br label %254

254:                                              ; preds = %253, %162
  %255 = load i32, ptr %9, align 4, !tbaa !13
  %256 = add i32 %255, 1
  store i32 %256, ptr %9, align 4, !tbaa !13
  %257 = load i32, ptr %7, align 4, !tbaa !13
  %258 = lshr i32 %257, 1
  store i32 %258, ptr %7, align 4, !tbaa !13
  br label %159, !llvm.loop !24

259:                                              ; preds = %159
  br label %260

260:                                              ; preds = %259, %146
  %261 = load ptr, ptr %2, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %261, i32 0, i32 0
  %263 = load ptr, ptr %262, align 8, !tbaa !9
  %264 = call i32 @USB_ReadInterrupts(ptr noundef %263)
  %265 = zext i32 %264 to i64
  %266 = and i64 %265, 262144
  %267 = icmp eq i64 %266, 262144
  br i1 %267, label %268, label %440

268:                                              ; preds = %260
  %269 = load ptr, ptr %2, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %269, i32 0, i32 0
  %271 = load ptr, ptr %270, align 8, !tbaa !9
  %272 = call i32 @USB_ReadDevAllInEpInterrupt(ptr noundef %271)
  store i32 %272, ptr %7, align 4, !tbaa !13
  store i32 0, ptr %9, align 4, !tbaa !13
  br label %273

273:                                              ; preds = %434, %268
  %274 = load i32, ptr %7, align 4, !tbaa !13
  %275 = icmp ne i32 %274, 0
  br i1 %275, label %276, label %439

276:                                              ; preds = %273
  %277 = load i32, ptr %7, align 4, !tbaa !13
  %278 = and i32 %277, 1
  %279 = icmp ne i32 %278, 0
  br i1 %279, label %280, label %434

280:                                              ; preds = %276
  %281 = load ptr, ptr %2, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %281, i32 0, i32 0
  %283 = load ptr, ptr %282, align 8, !tbaa !9
  %284 = load i32, ptr %9, align 4, !tbaa !13
  %285 = trunc i32 %284 to i8
  %286 = call i32 @USB_ReadDevInEPInterrupt(ptr noundef %283, i8 noundef zeroext %285)
  store i32 %286, ptr %8, align 4, !tbaa !13
  %287 = load i32, ptr %8, align 4, !tbaa !13
  %288 = zext i32 %287 to i64
  %289 = and i64 %288, 1
  %290 = icmp eq i64 %289, 1
  br i1 %290, label %291, label %361

291:                                              ; preds = %280
  %292 = load i32, ptr %9, align 4, !tbaa !13
  %293 = and i32 %292, 15
  %294 = zext i32 %293 to i64
  %295 = shl i64 1, %294
  %296 = trunc i64 %295 to i32
  store i32 %296, ptr %10, align 4, !tbaa !13
  %297 = load i32, ptr %10, align 4, !tbaa !13
  %298 = xor i32 %297, -1
  %299 = load i32, ptr %4, align 4, !tbaa !13
  %300 = zext i32 %299 to i64
  %301 = add i64 %300, 2048
  %302 = inttoptr i64 %301 to ptr
  %303 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %302, i32 0, i32 13
  %304 = load volatile i32, ptr %303, align 4, !tbaa !26
  %305 = and i32 %304, %298
  store volatile i32 %305, ptr %303, align 4, !tbaa !26
  %306 = load i32, ptr %4, align 4, !tbaa !13
  %307 = zext i32 %306 to i64
  %308 = add i64 %307, 2304
  %309 = load i32, ptr %9, align 4, !tbaa !13
  %310 = zext i32 %309 to i64
  %311 = mul i64 %310, 32
  %312 = add i64 %308, %311
  %313 = inttoptr i64 %312 to ptr
  %314 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %313, i32 0, i32 2
  store volatile i32 1, ptr %314, align 4, !tbaa !28
  %315 = load ptr, ptr %2, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %315, i32 0, i32 1
  %317 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %316, i32 0, i32 3
  %318 = load i32, ptr %317, align 4, !tbaa !30
  %319 = icmp eq i32 %318, 1
  br i1 %319, label %320, label %357

320:                                              ; preds = %291
  %321 = load ptr, ptr %2, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %321, i32 0, i32 3
  %323 = load i32, ptr %9, align 4, !tbaa !13
  %324 = zext i32 %323 to i64
  %325 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %322, i64 0, i64 %324
  %326 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %325, i32 0, i32 7
  %327 = load i32, ptr %326, align 8, !tbaa !31
  %328 = load ptr, ptr %2, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %328, i32 0, i32 3
  %330 = load i32, ptr %9, align 4, !tbaa !13
  %331 = zext i32 %330 to i64
  %332 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %329, i64 0, i64 %331
  %333 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %332, i32 0, i32 8
  %334 = load ptr, ptr %333, align 8, !tbaa !18
  %335 = zext i32 %327 to i64
  %336 = getelementptr inbounds i8, ptr %334, i64 %335
  store ptr %336, ptr %333, align 8, !tbaa !18
  %337 = load i32, ptr %9, align 4, !tbaa !13
  %338 = icmp eq i32 %337, 0
  br i1 %338, label %339, label %356

339:                                              ; preds = %320
  %340 = load ptr, ptr %2, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %340, i32 0, i32 3
  %342 = load i32, ptr %9, align 4, !tbaa !13
  %343 = zext i32 %342 to i64
  %344 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %341, i64 0, i64 %343
  %345 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %344, i32 0, i32 10
  %346 = load i32, ptr %345, align 4, !tbaa !32
  %347 = icmp eq i32 %346, 0
  br i1 %347, label %348, label %356

348:                                              ; preds = %339
  %349 = load ptr, ptr %2, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %349, i32 0, i32 0
  %351 = load ptr, ptr %350, align 8, !tbaa !9
  %352 = load ptr, ptr %2, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %352, i32 0, i32 8
  %354 = getelementptr inbounds [12 x i32], ptr %353, i64 0, i64 0
  %355 = call i32 @USB_EP0_OutStart(ptr noundef %351, i8 noundef zeroext 1, ptr noundef %354)
  br label %356

356:                                              ; preds = %348, %339, %320
  br label %357

357:                                              ; preds = %356, %291
  %358 = load ptr, ptr %2, align 8, !tbaa !5
  %359 = load i32, ptr %9, align 4, !tbaa !13
  %360 = trunc i32 %359 to i8
  call void @HAL_PCD_DataInStageCallback(ptr noundef %358, i8 noundef zeroext %360)
  br label %361

361:                                              ; preds = %357, %280
  %362 = load i32, ptr %8, align 4, !tbaa !13
  %363 = zext i32 %362 to i64
  %364 = and i64 %363, 8
  %365 = icmp eq i64 %364, 8
  br i1 %365, label %366, label %376

366:                                              ; preds = %361
  %367 = load i32, ptr %4, align 4, !tbaa !13
  %368 = zext i32 %367 to i64
  %369 = add i64 %368, 2304
  %370 = load i32, ptr %9, align 4, !tbaa !13
  %371 = zext i32 %370 to i64
  %372 = mul i64 %371, 32
  %373 = add i64 %369, %372
  %374 = inttoptr i64 %373 to ptr
  %375 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %374, i32 0, i32 2
  store volatile i32 8, ptr %375, align 4, !tbaa !28
  br label %376

376:                                              ; preds = %366, %361
  %377 = load i32, ptr %8, align 4, !tbaa !13
  %378 = zext i32 %377 to i64
  %379 = and i64 %378, 16
  %380 = icmp eq i64 %379, 16
  br i1 %380, label %381, label %391

381:                                              ; preds = %376
  %382 = load i32, ptr %4, align 4, !tbaa !13
  %383 = zext i32 %382 to i64
  %384 = add i64 %383, 2304
  %385 = load i32, ptr %9, align 4, !tbaa !13
  %386 = zext i32 %385 to i64
  %387 = mul i64 %386, 32
  %388 = add i64 %384, %387
  %389 = inttoptr i64 %388 to ptr
  %390 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %389, i32 0, i32 2
  store volatile i32 16, ptr %390, align 4, !tbaa !28
  br label %391

391:                                              ; preds = %381, %376
  %392 = load i32, ptr %8, align 4, !tbaa !13
  %393 = zext i32 %392 to i64
  %394 = and i64 %393, 64
  %395 = icmp eq i64 %394, 64
  br i1 %395, label %396, label %406

396:                                              ; preds = %391
  %397 = load i32, ptr %4, align 4, !tbaa !13
  %398 = zext i32 %397 to i64
  %399 = add i64 %398, 2304
  %400 = load i32, ptr %9, align 4, !tbaa !13
  %401 = zext i32 %400 to i64
  %402 = mul i64 %401, 32
  %403 = add i64 %399, %402
  %404 = inttoptr i64 %403 to ptr
  %405 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %404, i32 0, i32 2
  store volatile i32 64, ptr %405, align 4, !tbaa !28
  br label %406

406:                                              ; preds = %396, %391
  %407 = load i32, ptr %8, align 4, !tbaa !13
  %408 = zext i32 %407 to i64
  %409 = and i64 %408, 2
  %410 = icmp eq i64 %409, 2
  br i1 %410, label %411, label %424

411:                                              ; preds = %406
  %412 = load ptr, ptr %3, align 8, !tbaa !5
  %413 = load i32, ptr %9, align 4, !tbaa !13
  %414 = call i32 @USB_FlushTxFifo(ptr noundef %412, i32 noundef %413)
  %415 = load i32, ptr %4, align 4, !tbaa !13
  %416 = zext i32 %415 to i64
  %417 = add i64 %416, 2304
  %418 = load i32, ptr %9, align 4, !tbaa !13
  %419 = zext i32 %418 to i64
  %420 = mul i64 %419, 32
  %421 = add i64 %417, %420
  %422 = inttoptr i64 %421 to ptr
  %423 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %422, i32 0, i32 2
  store volatile i32 2, ptr %423, align 4, !tbaa !28
  br label %424

424:                                              ; preds = %411, %406
  %425 = load i32, ptr %8, align 4, !tbaa !13
  %426 = zext i32 %425 to i64
  %427 = and i64 %426, 128
  %428 = icmp eq i64 %427, 128
  br i1 %428, label %429, label %433

429:                                              ; preds = %424
  %430 = load ptr, ptr %2, align 8, !tbaa !5
  %431 = load i32, ptr %9, align 4, !tbaa !13
  %432 = call i32 @PCD_WriteEmptyTxFifo(ptr noundef %430, i32 noundef %431)
  br label %433

433:                                              ; preds = %429, %424
  br label %434

434:                                              ; preds = %433, %276
  %435 = load i32, ptr %9, align 4, !tbaa !13
  %436 = add i32 %435, 1
  store i32 %436, ptr %9, align 4, !tbaa !13
  %437 = load i32, ptr %7, align 4, !tbaa !13
  %438 = lshr i32 %437, 1
  store i32 %438, ptr %7, align 4, !tbaa !13
  br label %273, !llvm.loop !33

439:                                              ; preds = %273
  br label %440

440:                                              ; preds = %439, %260
  %441 = load ptr, ptr %2, align 8, !tbaa !5
  %442 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %441, i32 0, i32 0
  %443 = load ptr, ptr %442, align 8, !tbaa !9
  %444 = call i32 @USB_ReadInterrupts(ptr noundef %443)
  %445 = zext i32 %444 to i64
  %446 = and i64 %445, 2147483648
  %447 = icmp eq i64 %446, 2147483648
  br i1 %447, label %448, label %477

448:                                              ; preds = %440
  %449 = load i32, ptr %4, align 4, !tbaa !13
  %450 = zext i32 %449 to i64
  %451 = add i64 %450, 2048
  %452 = inttoptr i64 %451 to ptr
  %453 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %452, i32 0, i32 1
  %454 = load volatile i32, ptr %453, align 4, !tbaa !34
  %455 = zext i32 %454 to i64
  %456 = and i64 %455, -2
  %457 = trunc i64 %456 to i32
  store volatile i32 %457, ptr %453, align 4, !tbaa !34
  %458 = load ptr, ptr %2, align 8, !tbaa !5
  %459 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %458, i32 0, i32 9
  %460 = load i32, ptr %459, align 4, !tbaa !35
  %461 = icmp eq i32 %460, 1
  br i1 %461, label %462, label %466

462:                                              ; preds = %448
  %463 = load ptr, ptr %2, align 8, !tbaa !5
  %464 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %463, i32 0, i32 9
  store i32 0, ptr %464, align 4, !tbaa !35
  %465 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCDEx_LPM_Callback(ptr noundef %465, i32 noundef 0)
  br label %468

466:                                              ; preds = %448
  %467 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ResumeCallback(ptr noundef %467)
  br label %468

468:                                              ; preds = %466, %462
  %469 = load ptr, ptr %2, align 8, !tbaa !5
  %470 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %469, i32 0, i32 0
  %471 = load ptr, ptr %470, align 8, !tbaa !9
  %472 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %471, i32 0, i32 5
  %473 = load volatile i32, ptr %472, align 4, !tbaa !14
  %474 = zext i32 %473 to i64
  %475 = and i64 %474, 2147483648
  %476 = trunc i64 %475 to i32
  store volatile i32 %476, ptr %472, align 4, !tbaa !14
  br label %477

477:                                              ; preds = %468, %440
  %478 = load ptr, ptr %2, align 8, !tbaa !5
  %479 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %478, i32 0, i32 0
  %480 = load ptr, ptr %479, align 8, !tbaa !9
  %481 = call i32 @USB_ReadInterrupts(ptr noundef %480)
  %482 = zext i32 %481 to i64
  %483 = and i64 %482, 2048
  %484 = icmp eq i64 %483, 2048
  br i1 %484, label %485, label %506

485:                                              ; preds = %477
  %486 = load i32, ptr %4, align 4, !tbaa !13
  %487 = zext i32 %486 to i64
  %488 = add i64 %487, 2048
  %489 = inttoptr i64 %488 to ptr
  %490 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %489, i32 0, i32 2
  %491 = load volatile i32, ptr %490, align 4, !tbaa !36
  %492 = zext i32 %491 to i64
  %493 = and i64 %492, 1
  %494 = icmp eq i64 %493, 1
  br i1 %494, label %495, label %497

495:                                              ; preds = %485
  %496 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SuspendCallback(ptr noundef %496)
  br label %497

497:                                              ; preds = %495, %485
  %498 = load ptr, ptr %2, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %498, i32 0, i32 0
  %500 = load ptr, ptr %499, align 8, !tbaa !9
  %501 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %500, i32 0, i32 5
  %502 = load volatile i32, ptr %501, align 4, !tbaa !14
  %503 = zext i32 %502 to i64
  %504 = and i64 %503, 2048
  %505 = trunc i64 %504 to i32
  store volatile i32 %505, ptr %501, align 4, !tbaa !14
  br label %506

506:                                              ; preds = %497, %477
  %507 = load ptr, ptr %2, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %507, i32 0, i32 0
  %509 = load ptr, ptr %508, align 8, !tbaa !9
  %510 = call i32 @USB_ReadInterrupts(ptr noundef %509)
  %511 = zext i32 %510 to i64
  %512 = and i64 %511, 134217728
  %513 = icmp eq i64 %512, 134217728
  br i1 %513, label %514, label %545

514:                                              ; preds = %506
  %515 = load ptr, ptr %2, align 8, !tbaa !5
  %516 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %515, i32 0, i32 0
  %517 = load ptr, ptr %516, align 8, !tbaa !9
  %518 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %517, i32 0, i32 5
  %519 = load volatile i32, ptr %518, align 4, !tbaa !14
  %520 = zext i32 %519 to i64
  %521 = and i64 %520, 134217728
  %522 = trunc i64 %521 to i32
  store volatile i32 %522, ptr %518, align 4, !tbaa !14
  %523 = load ptr, ptr %2, align 8, !tbaa !5
  %524 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %523, i32 0, i32 9
  %525 = load i32, ptr %524, align 4, !tbaa !35
  %526 = icmp eq i32 %525, 0
  br i1 %526, label %527, label %542

527:                                              ; preds = %514
  %528 = load ptr, ptr %2, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %528, i32 0, i32 9
  store i32 1, ptr %529, align 4, !tbaa !35
  %530 = load ptr, ptr %2, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %530, i32 0, i32 0
  %532 = load ptr, ptr %531, align 8, !tbaa !9
  %533 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %532, i32 0, i32 20
  %534 = load volatile i32, ptr %533, align 4, !tbaa !37
  %535 = zext i32 %534 to i64
  %536 = and i64 %535, 60
  %537 = lshr i64 %536, 2
  %538 = trunc i64 %537 to i32
  %539 = load ptr, ptr %2, align 8, !tbaa !5
  %540 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %539, i32 0, i32 10
  store i32 %538, ptr %540, align 8, !tbaa !38
  %541 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCDEx_LPM_Callback(ptr noundef %541, i32 noundef 1)
  br label %544

542:                                              ; preds = %514
  %543 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SuspendCallback(ptr noundef %543)
  br label %544

544:                                              ; preds = %542, %527
  br label %545

545:                                              ; preds = %544, %506
  %546 = load ptr, ptr %2, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %546, i32 0, i32 0
  %548 = load ptr, ptr %547, align 8, !tbaa !9
  %549 = call i32 @USB_ReadInterrupts(ptr noundef %548)
  %550 = zext i32 %549 to i64
  %551 = and i64 %550, 4096
  %552 = icmp eq i64 %551, 4096
  br i1 %552, label %553, label %716

553:                                              ; preds = %545
  %554 = load i32, ptr %4, align 4, !tbaa !13
  %555 = zext i32 %554 to i64
  %556 = add i64 %555, 2048
  %557 = inttoptr i64 %556 to ptr
  %558 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %557, i32 0, i32 1
  %559 = load volatile i32, ptr %558, align 4, !tbaa !34
  %560 = zext i32 %559 to i64
  %561 = and i64 %560, -2
  %562 = trunc i64 %561 to i32
  store volatile i32 %562, ptr %558, align 4, !tbaa !34
  %563 = load ptr, ptr %2, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %563, i32 0, i32 0
  %565 = load ptr, ptr %564, align 8, !tbaa !9
  %566 = call i32 @USB_FlushTxFifo(ptr noundef %565, i32 noundef 16)
  store i32 0, ptr %6, align 4, !tbaa !13
  br label %567

567:                                              ; preds = %632, %553
  %568 = load i32, ptr %6, align 4, !tbaa !13
  %569 = load ptr, ptr %2, align 8, !tbaa !5
  %570 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %569, i32 0, i32 1
  %571 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %570, i32 0, i32 0
  %572 = load i32, ptr %571, align 8, !tbaa !39
  %573 = icmp ult i32 %568, %572
  br i1 %573, label %574, label %635

574:                                              ; preds = %567
  %575 = load i32, ptr %4, align 4, !tbaa !13
  %576 = zext i32 %575 to i64
  %577 = add i64 %576, 2304
  %578 = load i32, ptr %6, align 4, !tbaa !13
  %579 = zext i32 %578 to i64
  %580 = mul i64 %579, 32
  %581 = add i64 %577, %580
  %582 = inttoptr i64 %581 to ptr
  %583 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %582, i32 0, i32 2
  store volatile i32 64383, ptr %583, align 4, !tbaa !28
  %584 = load i32, ptr %4, align 4, !tbaa !13
  %585 = zext i32 %584 to i64
  %586 = add i64 %585, 2304
  %587 = load i32, ptr %6, align 4, !tbaa !13
  %588 = zext i32 %587 to i64
  %589 = mul i64 %588, 32
  %590 = add i64 %586, %589
  %591 = inttoptr i64 %590 to ptr
  %592 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %591, i32 0, i32 0
  %593 = load volatile i32, ptr %592, align 4, !tbaa !40
  %594 = zext i32 %593 to i64
  %595 = and i64 %594, -2097153
  %596 = trunc i64 %595 to i32
  store volatile i32 %596, ptr %592, align 4, !tbaa !40
  %597 = load i32, ptr %4, align 4, !tbaa !13
  %598 = zext i32 %597 to i64
  %599 = add i64 %598, 2816
  %600 = load i32, ptr %6, align 4, !tbaa !13
  %601 = zext i32 %600 to i64
  %602 = mul i64 %601, 32
  %603 = add i64 %599, %602
  %604 = inttoptr i64 %603 to ptr
  %605 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %604, i32 0, i32 2
  store volatile i32 64383, ptr %605, align 4, !tbaa !22
  %606 = load i32, ptr %4, align 4, !tbaa !13
  %607 = zext i32 %606 to i64
  %608 = add i64 %607, 2816
  %609 = load i32, ptr %6, align 4, !tbaa !13
  %610 = zext i32 %609 to i64
  %611 = mul i64 %610, 32
  %612 = add i64 %608, %611
  %613 = inttoptr i64 %612 to ptr
  %614 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %613, i32 0, i32 0
  %615 = load volatile i32, ptr %614, align 4, !tbaa !41
  %616 = zext i32 %615 to i64
  %617 = and i64 %616, -2097153
  %618 = trunc i64 %617 to i32
  store volatile i32 %618, ptr %614, align 4, !tbaa !41
  %619 = load i32, ptr %4, align 4, !tbaa !13
  %620 = zext i32 %619 to i64
  %621 = add i64 %620, 2816
  %622 = load i32, ptr %6, align 4, !tbaa !13
  %623 = zext i32 %622 to i64
  %624 = mul i64 %623, 32
  %625 = add i64 %621, %624
  %626 = inttoptr i64 %625 to ptr
  %627 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %626, i32 0, i32 0
  %628 = load volatile i32, ptr %627, align 4, !tbaa !41
  %629 = zext i32 %628 to i64
  %630 = or i64 %629, 134217728
  %631 = trunc i64 %630 to i32
  store volatile i32 %631, ptr %627, align 4, !tbaa !41
  br label %632

632:                                              ; preds = %574
  %633 = load i32, ptr %6, align 4, !tbaa !13
  %634 = add i32 %633, 1
  store i32 %634, ptr %6, align 4, !tbaa !13
  br label %567, !llvm.loop !42

635:                                              ; preds = %567
  %636 = load i32, ptr %4, align 4, !tbaa !13
  %637 = zext i32 %636 to i64
  %638 = add i64 %637, 2048
  %639 = inttoptr i64 %638 to ptr
  %640 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %639, i32 0, i32 7
  %641 = load volatile i32, ptr %640, align 4, !tbaa !43
  %642 = or i32 %641, 65537
  store volatile i32 %642, ptr %640, align 4, !tbaa !43
  %643 = load ptr, ptr %2, align 8, !tbaa !5
  %644 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %643, i32 0, i32 1
  %645 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %644, i32 0, i32 11
  %646 = load i32, ptr %645, align 4, !tbaa !44
  %647 = icmp ne i32 %646, 0
  br i1 %647, label %648, label %667

648:                                              ; preds = %635
  %649 = load i32, ptr %4, align 4, !tbaa !13
  %650 = zext i32 %649 to i64
  %651 = add i64 %650, 2048
  %652 = inttoptr i64 %651 to ptr
  %653 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %652, i32 0, i32 19
  %654 = load volatile i32, ptr %653, align 4, !tbaa !45
  %655 = zext i32 %654 to i64
  %656 = or i64 %655, 11
  %657 = trunc i64 %656 to i32
  store volatile i32 %657, ptr %653, align 4, !tbaa !45
  %658 = load i32, ptr %4, align 4, !tbaa !13
  %659 = zext i32 %658 to i64
  %660 = add i64 %659, 2048
  %661 = inttoptr i64 %660 to ptr
  %662 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %661, i32 0, i32 17
  %663 = load volatile i32, ptr %662, align 4, !tbaa !46
  %664 = zext i32 %663 to i64
  %665 = or i64 %664, 11
  %666 = trunc i64 %665 to i32
  store volatile i32 %666, ptr %662, align 4, !tbaa !46
  br label %686

667:                                              ; preds = %635
  %668 = load i32, ptr %4, align 4, !tbaa !13
  %669 = zext i32 %668 to i64
  %670 = add i64 %669, 2048
  %671 = inttoptr i64 %670 to ptr
  %672 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %671, i32 0, i32 5
  %673 = load volatile i32, ptr %672, align 4, !tbaa !47
  %674 = zext i32 %673 to i64
  %675 = or i64 %674, 8235
  %676 = trunc i64 %675 to i32
  store volatile i32 %676, ptr %672, align 4, !tbaa !47
  %677 = load i32, ptr %4, align 4, !tbaa !13
  %678 = zext i32 %677 to i64
  %679 = add i64 %678, 2048
  %680 = inttoptr i64 %679 to ptr
  %681 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %680, i32 0, i32 4
  %682 = load volatile i32, ptr %681, align 4, !tbaa !48
  %683 = zext i32 %682 to i64
  %684 = or i64 %683, 11
  %685 = trunc i64 %684 to i32
  store volatile i32 %685, ptr %681, align 4, !tbaa !48
  br label %686

686:                                              ; preds = %667, %648
  %687 = load i32, ptr %4, align 4, !tbaa !13
  %688 = zext i32 %687 to i64
  %689 = add i64 %688, 2048
  %690 = inttoptr i64 %689 to ptr
  %691 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %690, i32 0, i32 0
  %692 = load volatile i32, ptr %691, align 4, !tbaa !49
  %693 = zext i32 %692 to i64
  %694 = and i64 %693, -2033
  %695 = trunc i64 %694 to i32
  store volatile i32 %695, ptr %691, align 4, !tbaa !49
  %696 = load ptr, ptr %2, align 8, !tbaa !5
  %697 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %696, i32 0, i32 0
  %698 = load ptr, ptr %697, align 8, !tbaa !9
  %699 = load ptr, ptr %2, align 8, !tbaa !5
  %700 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %699, i32 0, i32 1
  %701 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %700, i32 0, i32 3
  %702 = load i32, ptr %701, align 4, !tbaa !30
  %703 = trunc i32 %702 to i8
  %704 = load ptr, ptr %2, align 8, !tbaa !5
  %705 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %704, i32 0, i32 8
  %706 = getelementptr inbounds [12 x i32], ptr %705, i64 0, i64 0
  %707 = call i32 @USB_EP0_OutStart(ptr noundef %698, i8 noundef zeroext %703, ptr noundef %706)
  %708 = load ptr, ptr %2, align 8, !tbaa !5
  %709 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %708, i32 0, i32 0
  %710 = load ptr, ptr %709, align 8, !tbaa !9
  %711 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %710, i32 0, i32 5
  %712 = load volatile i32, ptr %711, align 4, !tbaa !14
  %713 = zext i32 %712 to i64
  %714 = and i64 %713, 4096
  %715 = trunc i64 %714 to i32
  store volatile i32 %715, ptr %711, align 4, !tbaa !14
  br label %716

716:                                              ; preds = %686, %545
  %717 = load ptr, ptr %2, align 8, !tbaa !5
  %718 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %717, i32 0, i32 0
  %719 = load ptr, ptr %718, align 8, !tbaa !9
  %720 = call i32 @USB_ReadInterrupts(ptr noundef %719)
  %721 = zext i32 %720 to i64
  %722 = and i64 %721, 8192
  %723 = icmp eq i64 %722, 8192
  br i1 %723, label %724, label %756

724:                                              ; preds = %716
  %725 = load ptr, ptr %2, align 8, !tbaa !5
  %726 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %725, i32 0, i32 0
  %727 = load ptr, ptr %726, align 8, !tbaa !9
  %728 = call i32 @USB_ActivateSetup(ptr noundef %727)
  %729 = load ptr, ptr %2, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %729, i32 0, i32 0
  %731 = load ptr, ptr %730, align 8, !tbaa !9
  %732 = call zeroext i8 @USB_GetDevSpeed(ptr noundef %731)
  %733 = zext i8 %732 to i32
  %734 = load ptr, ptr %2, align 8, !tbaa !5
  %735 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %734, i32 0, i32 1
  %736 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %735, i32 0, i32 2
  store i32 %733, ptr %736, align 8, !tbaa !50
  %737 = load ptr, ptr %2, align 8, !tbaa !5
  %738 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %737, i32 0, i32 0
  %739 = load ptr, ptr %738, align 8, !tbaa !9
  %740 = call i32 @HAL_RCC_GetHCLKFreq()
  %741 = load ptr, ptr %2, align 8, !tbaa !5
  %742 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %741, i32 0, i32 1
  %743 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %742, i32 0, i32 2
  %744 = load i32, ptr %743, align 8, !tbaa !50
  %745 = trunc i32 %744 to i8
  %746 = call i32 @USB_SetTurnaroundTime(ptr noundef %739, i32 noundef %740, i8 noundef zeroext %745)
  %747 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ResetCallback(ptr noundef %747)
  %748 = load ptr, ptr %2, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %748, i32 0, i32 0
  %750 = load ptr, ptr %749, align 8, !tbaa !9
  %751 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %750, i32 0, i32 5
  %752 = load volatile i32, ptr %751, align 4, !tbaa !14
  %753 = zext i32 %752 to i64
  %754 = and i64 %753, 8192
  %755 = trunc i64 %754 to i32
  store volatile i32 %755, ptr %751, align 4, !tbaa !14
  br label %756

756:                                              ; preds = %724, %716
  %757 = load ptr, ptr %2, align 8, !tbaa !5
  %758 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %757, i32 0, i32 0
  %759 = load ptr, ptr %758, align 8, !tbaa !9
  %760 = call i32 @USB_ReadInterrupts(ptr noundef %759)
  %761 = zext i32 %760 to i64
  %762 = and i64 %761, 8
  %763 = icmp eq i64 %762, 8
  br i1 %763, label %764, label %774

764:                                              ; preds = %756
  %765 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SOFCallback(ptr noundef %765)
  %766 = load ptr, ptr %2, align 8, !tbaa !5
  %767 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %766, i32 0, i32 0
  %768 = load ptr, ptr %767, align 8, !tbaa !9
  %769 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %768, i32 0, i32 5
  %770 = load volatile i32, ptr %769, align 4, !tbaa !14
  %771 = zext i32 %770 to i64
  %772 = and i64 %771, 8
  %773 = trunc i64 %772 to i32
  store volatile i32 %773, ptr %769, align 4, !tbaa !14
  br label %774

774:                                              ; preds = %764, %756
  %775 = load ptr, ptr %2, align 8, !tbaa !5
  %776 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %775, i32 0, i32 0
  %777 = load ptr, ptr %776, align 8, !tbaa !9
  %778 = call i32 @USB_ReadInterrupts(ptr noundef %777)
  %779 = zext i32 %778 to i64
  %780 = and i64 %779, 1048576
  %781 = icmp eq i64 %780, 1048576
  br i1 %781, label %782, label %794

782:                                              ; preds = %774
  store i32 0, ptr %9, align 4, !tbaa !13
  %783 = load ptr, ptr %2, align 8, !tbaa !5
  %784 = load i32, ptr %9, align 4, !tbaa !13
  %785 = trunc i32 %784 to i8
  call void @HAL_PCD_ISOINIncompleteCallback(ptr noundef %783, i8 noundef zeroext %785)
  %786 = load ptr, ptr %2, align 8, !tbaa !5
  %787 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %786, i32 0, i32 0
  %788 = load ptr, ptr %787, align 8, !tbaa !9
  %789 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %788, i32 0, i32 5
  %790 = load volatile i32, ptr %789, align 4, !tbaa !14
  %791 = zext i32 %790 to i64
  %792 = and i64 %791, 1048576
  %793 = trunc i64 %792 to i32
  store volatile i32 %793, ptr %789, align 4, !tbaa !14
  br label %794

794:                                              ; preds = %782, %774
  %795 = load ptr, ptr %2, align 8, !tbaa !5
  %796 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %795, i32 0, i32 0
  %797 = load ptr, ptr %796, align 8, !tbaa !9
  %798 = call i32 @USB_ReadInterrupts(ptr noundef %797)
  %799 = zext i32 %798 to i64
  %800 = and i64 %799, 2097152
  %801 = icmp eq i64 %800, 2097152
  br i1 %801, label %802, label %814

802:                                              ; preds = %794
  store i32 0, ptr %9, align 4, !tbaa !13
  %803 = load ptr, ptr %2, align 8, !tbaa !5
  %804 = load i32, ptr %9, align 4, !tbaa !13
  %805 = trunc i32 %804 to i8
  call void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef %803, i8 noundef zeroext %805)
  %806 = load ptr, ptr %2, align 8, !tbaa !5
  %807 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %806, i32 0, i32 0
  %808 = load ptr, ptr %807, align 8, !tbaa !9
  %809 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %808, i32 0, i32 5
  %810 = load volatile i32, ptr %809, align 4, !tbaa !14
  %811 = zext i32 %810 to i64
  %812 = and i64 %811, 2097152
  %813 = trunc i64 %812 to i32
  store volatile i32 %813, ptr %809, align 4, !tbaa !14
  br label %814

814:                                              ; preds = %802, %794
  %815 = load ptr, ptr %2, align 8, !tbaa !5
  %816 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %815, i32 0, i32 0
  %817 = load ptr, ptr %816, align 8, !tbaa !9
  %818 = call i32 @USB_ReadInterrupts(ptr noundef %817)
  %819 = zext i32 %818 to i64
  %820 = and i64 %819, 1073741824
  %821 = icmp eq i64 %820, 1073741824
  br i1 %821, label %822, label %832

822:                                              ; preds = %814
  %823 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ConnectCallback(ptr noundef %823)
  %824 = load ptr, ptr %2, align 8, !tbaa !5
  %825 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %824, i32 0, i32 0
  %826 = load ptr, ptr %825, align 8, !tbaa !9
  %827 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %826, i32 0, i32 5
  %828 = load volatile i32, ptr %827, align 4, !tbaa !14
  %829 = zext i32 %828 to i64
  %830 = and i64 %829, 1073741824
  %831 = trunc i64 %830 to i32
  store volatile i32 %831, ptr %827, align 4, !tbaa !14
  br label %832

832:                                              ; preds = %822, %814
  %833 = load ptr, ptr %2, align 8, !tbaa !5
  %834 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %833, i32 0, i32 0
  %835 = load ptr, ptr %834, align 8, !tbaa !9
  %836 = call i32 @USB_ReadInterrupts(ptr noundef %835)
  %837 = zext i32 %836 to i64
  %838 = and i64 %837, 4
  %839 = icmp eq i64 %838, 4
  br i1 %839, label %840, label %860

840:                                              ; preds = %832
  %841 = load ptr, ptr %2, align 8, !tbaa !5
  %842 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %841, i32 0, i32 0
  %843 = load ptr, ptr %842, align 8, !tbaa !9
  %844 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %843, i32 0, i32 1
  %845 = load volatile i32, ptr %844, align 4, !tbaa !51
  store i32 %845, ptr %11, align 4, !tbaa !13
  %846 = load i32, ptr %11, align 4, !tbaa !13
  %847 = zext i32 %846 to i64
  %848 = and i64 %847, 4
  %849 = icmp eq i64 %848, 4
  br i1 %849, label %850, label %852

850:                                              ; preds = %840
  %851 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_DisconnectCallback(ptr noundef %851)
  br label %852

852:                                              ; preds = %850, %840
  %853 = load i32, ptr %11, align 4, !tbaa !13
  %854 = load ptr, ptr %2, align 8, !tbaa !5
  %855 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %854, i32 0, i32 0
  %856 = load ptr, ptr %855, align 8, !tbaa !9
  %857 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %856, i32 0, i32 1
  %858 = load volatile i32, ptr %857, align 4, !tbaa !51
  %859 = or i32 %858, %853
  store volatile i32 %859, ptr %857, align 4, !tbaa !51
  br label %860

860:                                              ; preds = %852, %832
  br label %861

861:                                              ; preds = %860, %1
  store i32 0, ptr %12, align 4
  br label %862

862:                                              ; preds = %861, %29
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #3
  %863 = load i32, ptr %12, align 4
  switch i32 %863, label %865 [
    i32 0, label %864
    i32 1, label %864
  ]

864:                                              ; preds = %862, %862
  ret void

865:                                              ; preds = %862
  unreachable
}

declare i32 @USB_GetMode(ptr noundef) #1

declare i32 @USB_ReadInterrupts(ptr noundef) #1

declare ptr @USB_ReadPacket(ptr noundef, ptr noundef, i16 noundef zeroext) #1

declare i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef) #1

declare i32 @USB_ReadDevOutEPInterrupt(ptr noundef, i8 noundef zeroext) #1

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

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

declare i32 @USB_ReadDevAllInEpInterrupt(ptr noundef) #1

declare i32 @USB_ReadDevInEPInterrupt(ptr noundef, i8 noundef zeroext) #1

declare i32 @USB_EP0_OutStart(ptr noundef, i8 noundef zeroext, ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_DataInStageCallback(ptr noundef, i8 noundef zeroext) #2

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

declare void @HAL_PCDEx_LPM_Callback(ptr noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ResumeCallback(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_SuspendCallback(ptr noundef) #2

declare i32 @USB_ActivateSetup(ptr noundef) #1

declare zeroext i8 @USB_GetDevSpeed(ptr noundef) #1

declare i32 @USB_SetTurnaroundTime(ptr noundef, i32 noundef, i8 noundef zeroext) #1

declare i32 @HAL_RCC_GetHCLKFreq() #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ResetCallback(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_SOFCallback(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ISOINIncompleteCallback(ptr noundef, i8 noundef zeroext) #2

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef, i8 noundef zeroext) #2

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ConnectCallback(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_DisconnectCallback(ptr noundef) #2

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

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 0}
!10 = !{!"", !6, i64 0, !11, i64 8, !7, i64 60, !7, i64 64, !7, i64 704, !12, i64 1344, !12, i64 1348, !12, i64 1352, !7, i64 1356, !12, i64 1404, !12, i64 1408, !12, i64 1412, !12, i64 1416, !6, i64 1424}
!11 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !12, i64 48}
!12 = !{!"int", !7, i64 0}
!13 = !{!12, !12, i64 0}
!14 = !{!15, !12, i64 20}
!15 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !7, i64 48, !12, i64 56, !12, i64 60, !12, i64 64, !12, i64 68, !12, i64 72, !12, i64 76, !12, i64 80, !12, i64 84, !12, i64 88, !12, i64 92, !12, i64 96, !7, i64 100, !12, i64 256, !7, i64 260}
!16 = !{!15, !12, i64 24}
!17 = !{!15, !12, i64 32}
!18 = !{!19, !6, i64 16}
!19 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5, !20, i64 6, !12, i64 8, !6, i64 16, !12, i64 24, !12, i64 28, !12, i64 32}
!20 = !{!"short", !7, i64 0}
!21 = !{!19, !12, i64 32}
!22 = !{!23, !12, i64 8}
!23 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !7, i64 24}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!27, !12, i64 52}
!27 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !12, i64 60, !12, i64 64, !12, i64 68, !7, i64 72, !12, i64 132}
!28 = !{!29, !12, i64 8}
!29 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28}
!30 = !{!10, !12, i64 20}
!31 = !{!19, !12, i64 8}
!32 = !{!19, !12, i64 28}
!33 = distinct !{!33, !25}
!34 = !{!27, !12, i64 4}
!35 = !{!10, !12, i64 1404}
!36 = !{!27, !12, i64 8}
!37 = !{!15, !12, i64 84}
!38 = !{!10, !12, i64 1408}
!39 = !{!10, !12, i64 8}
!40 = !{!29, !12, i64 0}
!41 = !{!23, !12, i64 0}
!42 = distinct !{!42, !25}
!43 = !{!27, !12, i64 28}
!44 = !{!10, !12, i64 52}
!45 = !{!27, !12, i64 132}
!46 = !{!27, !12, i64 68}
!47 = !{!27, !12, i64 20}
!48 = !{!27, !12, i64 16}
!49 = !{!27, !12, i64 0}
!50 = !{!10, !12, i64 16}
!51 = !{!15, !12, i64 4}


; 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.USB_OTG_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i16, i32, ptr, i32, i32, i32 }

declare i32 @USB_FlushTxFifo(ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local void @HAL_PCD_IRQHandler(ptr noundef %0) local_unnamed_addr #1 {
  %2 = load ptr, ptr %0, align 8, !tbaa !5
  %3 = ptrtoint ptr %2 to i64
  %4 = tail call i32 @USB_GetMode(ptr noundef %2) #2
  %5 = icmp eq i32 %4, 0
  br i1 %5, label %6, label %424

6:                                                ; preds = %1
  %7 = load ptr, ptr %0, align 8, !tbaa !5
  %8 = tail call i32 @USB_ReadInterrupts(ptr noundef %7) #2
  %9 = icmp eq i32 %8, 0
  br i1 %9, label %424, label %10

10:                                               ; preds = %6
  %11 = load ptr, ptr %0, align 8, !tbaa !5
  %12 = tail call i32 @USB_ReadInterrupts(ptr noundef %11) #2
  %13 = and i32 %12, 2
  %.not = icmp eq i32 %13, 0
  %.pre = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not, label %18, label %14

14:                                               ; preds = %10
  %15 = getelementptr inbounds i8, ptr %.pre, i64 20
  %16 = load volatile i32, ptr %15, align 4, !tbaa !12
  %17 = and i32 %16, 2
  store volatile i32 %17, ptr %15, align 4, !tbaa !12
  br label %18

18:                                               ; preds = %14, %10
  %19 = tail call i32 @USB_ReadInterrupts(ptr noundef %.pre) #2
  %20 = and i32 %19, 16
  %.not174 = icmp eq i32 %20, 0
  %.pre225 = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not174, label %60, label %21

21:                                               ; preds = %18
  %22 = getelementptr inbounds i8, ptr %.pre225, i64 24
  %23 = load volatile i32, ptr %22, align 4, !tbaa !14
  %24 = and i32 %23, -17
  store volatile i32 %24, ptr %22, align 4, !tbaa !14
  %25 = getelementptr inbounds i8, ptr %2, i64 32
  %26 = load volatile i32, ptr %25, align 4, !tbaa !15
  %27 = getelementptr inbounds i8, ptr %0, i64 704
  %28 = zext i32 %26 to i64
  %29 = and i64 %28, 15
  %30 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %27, i64 0, i64 %29
  %31 = lshr i64 %28, 17
  %32 = and i64 %31, 15
  switch i64 %32, label %55 [
    i64 2, label %33
    i64 6, label %47
  ]

33:                                               ; preds = %21
  %34 = and i64 %28, 32752
  %.not175 = icmp eq i64 %34, 0
  br i1 %.not175, label %55, label %35

35:                                               ; preds = %33
  %36 = getelementptr inbounds i8, ptr %30, i64 16
  %37 = load ptr, ptr %36, align 8, !tbaa !16
  %38 = lshr exact i64 %34, 4
  %39 = trunc nuw nsw i64 %38 to i16
  %40 = tail call ptr @USB_ReadPacket(ptr noundef nonnull %2, ptr noundef %37, i16 noundef zeroext %39) #2
  %41 = load ptr, ptr %36, align 8, !tbaa !16
  %42 = getelementptr inbounds i8, ptr %41, i64 %38
  store ptr %42, ptr %36, align 8, !tbaa !16
  %43 = getelementptr inbounds i8, ptr %30, i64 32
  %44 = load i32, ptr %43, align 8, !tbaa !19
  %45 = trunc nuw nsw i64 %38 to i32
  %46 = add i32 %44, %45
  store i32 %46, ptr %43, align 8, !tbaa !19
  br label %55

47:                                               ; preds = %21
  %48 = getelementptr inbounds i8, ptr %0, i64 1356
  %49 = tail call ptr @USB_ReadPacket(ptr noundef nonnull %2, ptr noundef nonnull %48, i16 noundef zeroext 8) #2
  %50 = lshr i32 %26, 4
  %51 = and i32 %50, 2047
  %52 = getelementptr inbounds i8, ptr %30, i64 32
  %53 = load i32, ptr %52, align 8, !tbaa !19
  %54 = add i32 %53, %51
  store i32 %54, ptr %52, align 8, !tbaa !19
  br label %55

55:                                               ; preds = %21, %47, %33, %35
  %56 = load ptr, ptr %0, align 8, !tbaa !5
  %57 = getelementptr inbounds i8, ptr %56, i64 24
  %58 = load volatile i32, ptr %57, align 4, !tbaa !14
  %59 = or i32 %58, 16
  store volatile i32 %59, ptr %57, align 4, !tbaa !14
  br label %60

60:                                               ; preds = %55, %18
  %61 = phi ptr [ %56, %55 ], [ %.pre225, %18 ]
  %62 = tail call i32 @USB_ReadInterrupts(ptr noundef %61) #2
  %63 = and i32 %62, 524288
  %.not176 = icmp eq i32 %63, 0
  br i1 %.not176, label %.loopexit206, label %64

64:                                               ; preds = %60
  %65 = load ptr, ptr %0, align 8, !tbaa !5
  %66 = tail call i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef %65) #2
  %.not177207 = icmp eq i32 %66, 0
  br i1 %.not177207, label %.loopexit206, label %.lr.ph

.lr.ph:                                           ; preds = %64
  %67 = and i64 %3, 4294967295
  %68 = add nuw nsw i64 %67, 2816
  br label %69

69:                                               ; preds = %.lr.ph, %113
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %113 ]
  %.0170208 = phi i32 [ %66, %.lr.ph ], [ %114, %113 ]
  %70 = and i32 %.0170208, 1
  %.not200 = icmp eq i32 %70, 0
  br i1 %.not200, label %113, label %71

71:                                               ; preds = %69
  %72 = load ptr, ptr %0, align 8, !tbaa !5
  %73 = trunc nuw nsw i64 %indvars.iv to i32
  %74 = trunc i64 %indvars.iv to i8
  %75 = tail call i32 @USB_ReadDevOutEPInterrupt(ptr noundef %72, i8 noundef zeroext %74) #2
  %76 = zext i32 %75 to i64
  %77 = and i64 %76, 1
  %.not201 = icmp eq i64 %77, 0
  br i1 %.not201, label %84, label %78

78:                                               ; preds = %71
  %79 = shl nuw nsw i64 %indvars.iv, 5
  %80 = add nuw nsw i64 %68, %79
  %81 = inttoptr i64 %80 to ptr
  %82 = getelementptr inbounds i8, ptr %81, i64 8
  store volatile i32 1, ptr %82, align 4, !tbaa !20
  %83 = tail call i32 @PCD_EP_OutXfrComplete_int(ptr noundef nonnull %0, i32 noundef %73)
  br label %84

84:                                               ; preds = %78, %71
  %85 = and i64 %76, 8
  %.not202 = icmp eq i64 %85, 0
  br i1 %.not202, label %92, label %86

86:                                               ; preds = %84
  %87 = shl nuw nsw i64 %indvars.iv, 5
  %88 = add nuw nsw i64 %68, %87
  %89 = inttoptr i64 %88 to ptr
  %90 = getelementptr inbounds i8, ptr %89, i64 8
  store volatile i32 8, ptr %90, align 4, !tbaa !20
  %91 = tail call i32 @PCD_EP_OutSetupPacket_int(ptr noundef nonnull %0, i32 noundef %73)
  br label %92

92:                                               ; preds = %86, %84
  %93 = and i64 %76, 16
  %.not203 = icmp eq i64 %93, 0
  br i1 %.not203, label %99, label %94

94:                                               ; preds = %92
  %95 = shl nuw nsw i64 %indvars.iv, 5
  %96 = add nuw nsw i64 %68, %95
  %97 = inttoptr i64 %96 to ptr
  %98 = getelementptr inbounds i8, ptr %97, i64 8
  store volatile i32 16, ptr %98, align 4, !tbaa !20
  br label %99

99:                                               ; preds = %94, %92
  %100 = and i64 %76, 32
  %.not204 = icmp eq i64 %100, 0
  br i1 %.not204, label %106, label %101

101:                                              ; preds = %99
  %102 = shl nuw nsw i64 %indvars.iv, 5
  %103 = add nuw nsw i64 %68, %102
  %104 = inttoptr i64 %103 to ptr
  %105 = getelementptr inbounds i8, ptr %104, i64 8
  store volatile i32 32, ptr %105, align 4, !tbaa !20
  br label %106

106:                                              ; preds = %101, %99
  %107 = and i64 %76, 8192
  %.not205 = icmp eq i64 %107, 0
  br i1 %.not205, label %113, label %108

108:                                              ; preds = %106
  %109 = shl nuw nsw i64 %indvars.iv, 5
  %110 = add nuw nsw i64 %68, %109
  %111 = inttoptr i64 %110 to ptr
  %112 = getelementptr inbounds i8, ptr %111, i64 8
  store volatile i32 8192, ptr %112, align 4, !tbaa !20
  br label %113

113:                                              ; preds = %106, %108, %69
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %114 = lshr i32 %.0170208, 1
  %.not177 = icmp ult i32 %.0170208, 2
  br i1 %.not177, label %.loopexit206, label %69, !llvm.loop !22

.loopexit206:                                     ; preds = %113, %64, %60
  %115 = load ptr, ptr %0, align 8, !tbaa !5
  %116 = tail call i32 @USB_ReadInterrupts(ptr noundef %115) #2
  %117 = and i32 %116, 262144
  %.not178 = icmp eq i32 %117, 0
  br i1 %.not178, label %.loopexit, label %118

118:                                              ; preds = %.loopexit206
  %119 = load ptr, ptr %0, align 8, !tbaa !5
  %120 = tail call i32 @USB_ReadDevAllInEpInterrupt(ptr noundef %119) #2
  %.not179210 = icmp eq i32 %120, 0
  br i1 %.not179210, label %.loopexit, label %.lr.ph213

.lr.ph213:                                        ; preds = %118
  %121 = and i64 %3, 4294967295
  %122 = add nuw nsw i64 %121, 2048
  %123 = inttoptr i64 %122 to ptr
  %124 = getelementptr inbounds i8, ptr %123, i64 52
  %125 = add nuw nsw i64 %121, 2304
  %126 = getelementptr inbounds i8, ptr %0, i64 20
  %127 = getelementptr inbounds i8, ptr %0, i64 64
  %128 = getelementptr inbounds i8, ptr %0, i64 1356
  %129 = and i32 %120, 1
  %.not193.peel = icmp eq i32 %129, 0
  br i1 %.not193.peel, label %181, label %130

130:                                              ; preds = %.lr.ph213
  %131 = load ptr, ptr %0, align 8, !tbaa !5
  %132 = tail call i32 @USB_ReadDevInEPInterrupt(ptr noundef %131, i8 noundef zeroext 0) #2
  %133 = zext i32 %132 to i64
  %134 = and i64 %133, 1
  %.not194.peel = icmp eq i64 %134, 0
  br i1 %.not194.peel, label %156, label %135

135:                                              ; preds = %130
  %136 = load volatile i32, ptr %124, align 4, !tbaa !24
  %137 = and i32 %136, -2
  store volatile i32 %137, ptr %124, align 4, !tbaa !24
  %138 = inttoptr i64 %125 to ptr
  %139 = getelementptr inbounds i8, ptr %138, i64 8
  store volatile i32 1, ptr %139, align 4, !tbaa !26
  %140 = load i32, ptr %126, align 4, !tbaa !28
  %141 = icmp eq i32 %140, 1
  br i1 %141, label %142, label %155

142:                                              ; preds = %135
  %143 = getelementptr inbounds i8, ptr %0, i64 72
  %144 = load i32, ptr %143, align 8, !tbaa !29
  %145 = getelementptr inbounds i8, ptr %0, i64 80
  %146 = load ptr, ptr %145, align 8, !tbaa !16
  %147 = zext i32 %144 to i64
  %148 = getelementptr inbounds i8, ptr %146, i64 %147
  store ptr %148, ptr %145, align 8, !tbaa !16
  %149 = getelementptr inbounds i8, ptr %0, i64 92
  %150 = load i32, ptr %149, align 4, !tbaa !30
  %151 = icmp eq i32 %150, 0
  br i1 %151, label %152, label %155

152:                                              ; preds = %142
  %153 = load ptr, ptr %0, align 8, !tbaa !5
  %154 = tail call i32 @USB_EP0_OutStart(ptr noundef %153, i8 noundef zeroext 1, ptr noundef nonnull %128) #2
  br label %155

155:                                              ; preds = %152, %142, %135
  tail call void @HAL_PCD_DataInStageCallback(ptr noundef nonnull %0, i8 noundef zeroext 0)
  br label %156

156:                                              ; preds = %155, %130
  %157 = and i64 %133, 8
  %.not195.peel = icmp eq i64 %157, 0
  br i1 %.not195.peel, label %161, label %158

158:                                              ; preds = %156
  %159 = inttoptr i64 %125 to ptr
  %160 = getelementptr inbounds i8, ptr %159, i64 8
  store volatile i32 8, ptr %160, align 4, !tbaa !26
  br label %161

161:                                              ; preds = %158, %156
  %162 = and i64 %133, 16
  %.not196.peel = icmp eq i64 %162, 0
  br i1 %.not196.peel, label %166, label %163

163:                                              ; preds = %161
  %164 = inttoptr i64 %125 to ptr
  %165 = getelementptr inbounds i8, ptr %164, i64 8
  store volatile i32 16, ptr %165, align 4, !tbaa !26
  br label %166

166:                                              ; preds = %163, %161
  %167 = and i64 %133, 64
  %.not197.peel = icmp eq i64 %167, 0
  br i1 %.not197.peel, label %171, label %168

168:                                              ; preds = %166
  %169 = inttoptr i64 %125 to ptr
  %170 = getelementptr inbounds i8, ptr %169, i64 8
  store volatile i32 64, ptr %170, align 4, !tbaa !26
  br label %171

171:                                              ; preds = %168, %166
  %172 = and i64 %133, 2
  %.not198.peel = icmp eq i64 %172, 0
  br i1 %.not198.peel, label %177, label %173

173:                                              ; preds = %171
  %174 = tail call i32 @USB_FlushTxFifo(ptr noundef %2, i32 noundef 0) #2
  %175 = inttoptr i64 %125 to ptr
  %176 = getelementptr inbounds i8, ptr %175, i64 8
  store volatile i32 2, ptr %176, align 4, !tbaa !26
  br label %177

177:                                              ; preds = %173, %171
  %178 = and i64 %133, 128
  %.not199.peel = icmp eq i64 %178, 0
  br i1 %.not199.peel, label %181, label %179

179:                                              ; preds = %177
  %180 = tail call i32 @PCD_WriteEmptyTxFifo(ptr noundef nonnull %0, i32 noundef 0)
  br label %181

181:                                              ; preds = %179, %177, %.lr.ph213
  %.not179.peel = icmp eq i32 %120, 1
  br i1 %.not179.peel, label %.loopexit, label %.peel.next

.peel.next:                                       ; preds = %181, %244
  %indvars.iv218 = phi i64 [ %indvars.iv.next219, %244 ], [ 1, %181 ]
  %.1171211.in = phi i32 [ %.1171211, %244 ], [ %120, %181 ]
  %.1171211 = lshr i32 %.1171211.in, 1
  %182 = and i32 %.1171211.in, 2
  %.not193 = icmp eq i32 %182, 0
  br i1 %.not193, label %244, label %183

183:                                              ; preds = %.peel.next
  %184 = load ptr, ptr %0, align 8, !tbaa !5
  %185 = trunc nuw nsw i64 %indvars.iv218 to i32
  %186 = trunc i64 %indvars.iv218 to i8
  %187 = tail call i32 @USB_ReadDevInEPInterrupt(ptr noundef %184, i8 noundef zeroext %186) #2
  %188 = zext i32 %187 to i64
  %189 = and i64 %188, 1
  %.not194 = icmp eq i64 %189, 0
  br i1 %.not194, label %211, label %190

190:                                              ; preds = %183
  %191 = and i32 %185, 15
  %192 = shl nuw nsw i32 1, %191
  %193 = xor i32 %192, -1
  %194 = load volatile i32, ptr %124, align 4, !tbaa !24
  %195 = and i32 %194, %193
  store volatile i32 %195, ptr %124, align 4, !tbaa !24
  %196 = shl nuw nsw i64 %indvars.iv218, 5
  %197 = add nuw nsw i64 %125, %196
  %198 = inttoptr i64 %197 to ptr
  %199 = getelementptr inbounds i8, ptr %198, i64 8
  store volatile i32 1, ptr %199, align 4, !tbaa !26
  %200 = load i32, ptr %126, align 4, !tbaa !28
  %201 = icmp eq i32 %200, 1
  br i1 %201, label %202, label %210

202:                                              ; preds = %190
  %203 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %127, i64 0, i64 %indvars.iv218
  %204 = getelementptr inbounds i8, ptr %203, i64 8
  %205 = load i32, ptr %204, align 8, !tbaa !29
  %206 = getelementptr inbounds i8, ptr %203, i64 16
  %207 = load ptr, ptr %206, align 8, !tbaa !16
  %208 = zext i32 %205 to i64
  %209 = getelementptr inbounds i8, ptr %207, i64 %208
  store ptr %209, ptr %206, align 8, !tbaa !16
  br label %210

210:                                              ; preds = %202, %190
  tail call void @HAL_PCD_DataInStageCallback(ptr noundef nonnull %0, i8 noundef zeroext %186)
  br label %211

211:                                              ; preds = %210, %183
  %212 = and i64 %188, 8
  %.not195 = icmp eq i64 %212, 0
  br i1 %.not195, label %218, label %213

213:                                              ; preds = %211
  %214 = shl nuw nsw i64 %indvars.iv218, 5
  %215 = add nuw nsw i64 %125, %214
  %216 = inttoptr i64 %215 to ptr
  %217 = getelementptr inbounds i8, ptr %216, i64 8
  store volatile i32 8, ptr %217, align 4, !tbaa !26
  br label %218

218:                                              ; preds = %213, %211
  %219 = and i64 %188, 16
  %.not196 = icmp eq i64 %219, 0
  br i1 %.not196, label %225, label %220

220:                                              ; preds = %218
  %221 = shl nuw nsw i64 %indvars.iv218, 5
  %222 = add nuw nsw i64 %125, %221
  %223 = inttoptr i64 %222 to ptr
  %224 = getelementptr inbounds i8, ptr %223, i64 8
  store volatile i32 16, ptr %224, align 4, !tbaa !26
  br label %225

225:                                              ; preds = %220, %218
  %226 = and i64 %188, 64
  %.not197 = icmp eq i64 %226, 0
  br i1 %.not197, label %232, label %227

227:                                              ; preds = %225
  %228 = shl nuw nsw i64 %indvars.iv218, 5
  %229 = add nuw nsw i64 %125, %228
  %230 = inttoptr i64 %229 to ptr
  %231 = getelementptr inbounds i8, ptr %230, i64 8
  store volatile i32 64, ptr %231, align 4, !tbaa !26
  br label %232

232:                                              ; preds = %227, %225
  %233 = and i64 %188, 2
  %.not198 = icmp eq i64 %233, 0
  br i1 %.not198, label %240, label %234

234:                                              ; preds = %232
  %235 = tail call i32 @USB_FlushTxFifo(ptr noundef %2, i32 noundef %185) #2
  %236 = shl nuw nsw i64 %indvars.iv218, 5
  %237 = add nuw nsw i64 %125, %236
  %238 = inttoptr i64 %237 to ptr
  %239 = getelementptr inbounds i8, ptr %238, i64 8
  store volatile i32 2, ptr %239, align 4, !tbaa !26
  br label %240

240:                                              ; preds = %234, %232
  %241 = and i64 %188, 128
  %.not199 = icmp eq i64 %241, 0
  br i1 %.not199, label %244, label %242

242:                                              ; preds = %240
  %243 = tail call i32 @PCD_WriteEmptyTxFifo(ptr noundef nonnull %0, i32 noundef %185)
  br label %244

244:                                              ; preds = %240, %242, %.peel.next
  %indvars.iv.next219 = add nuw nsw i64 %indvars.iv218, 1
  %.not179 = icmp ult i32 %.1171211.in, 4
  br i1 %.not179, label %.loopexit, label %.peel.next, !llvm.loop !31

.loopexit:                                        ; preds = %244, %181, %118, %.loopexit206
  %245 = load ptr, ptr %0, align 8, !tbaa !5
  %246 = tail call i32 @USB_ReadInterrupts(ptr noundef %245) #2
  %.not180 = icmp sgt i32 %246, -1
  br i1 %.not180, label %.loopexit._crit_edge, label %247

.loopexit._crit_edge:                             ; preds = %.loopexit
  %.pre228 = load ptr, ptr %0, align 8, !tbaa !5
  br label %264

247:                                              ; preds = %.loopexit
  %248 = and i64 %3, 4294967295
  %249 = add nuw nsw i64 %248, 2048
  %250 = inttoptr i64 %249 to ptr
  %251 = getelementptr inbounds i8, ptr %250, i64 4
  %252 = load volatile i32, ptr %251, align 4, !tbaa !33
  %253 = and i32 %252, -2
  store volatile i32 %253, ptr %251, align 4, !tbaa !33
  %254 = getelementptr inbounds i8, ptr %0, i64 1404
  %255 = load i32, ptr %254, align 4, !tbaa !34
  %256 = icmp eq i32 %255, 1
  br i1 %256, label %257, label %258

257:                                              ; preds = %247
  store i32 0, ptr %254, align 4, !tbaa !34
  tail call void @HAL_PCDEx_LPM_Callback(ptr noundef nonnull %0, i32 noundef 0) #2
  br label %259

258:                                              ; preds = %247
  tail call void @HAL_PCD_ResumeCallback(ptr noundef nonnull %0)
  br label %259

259:                                              ; preds = %258, %257
  %260 = load ptr, ptr %0, align 8, !tbaa !5
  %261 = getelementptr inbounds i8, ptr %260, i64 20
  %262 = load volatile i32, ptr %261, align 4, !tbaa !12
  %263 = and i32 %262, -2147483648
  store volatile i32 %263, ptr %261, align 4, !tbaa !12
  br label %264

264:                                              ; preds = %.loopexit._crit_edge, %259
  %265 = phi ptr [ %.pre228, %.loopexit._crit_edge ], [ %260, %259 ]
  %266 = tail call i32 @USB_ReadInterrupts(ptr noundef %265) #2
  %267 = and i32 %266, 2048
  %.not181 = icmp eq i32 %267, 0
  br i1 %.not181, label %._crit_edge229, label %268

._crit_edge229:                                   ; preds = %264
  %.pre230 = load ptr, ptr %0, align 8, !tbaa !5
  br label %281

268:                                              ; preds = %264
  %269 = and i64 %3, 4294967295
  %270 = add nuw nsw i64 %269, 2048
  %271 = inttoptr i64 %270 to ptr
  %272 = getelementptr inbounds i8, ptr %271, i64 8
  %273 = load volatile i32, ptr %272, align 4, !tbaa !35
  %274 = and i32 %273, 1
  %.not182 = icmp eq i32 %274, 0
  br i1 %.not182, label %276, label %275

275:                                              ; preds = %268
  tail call void @HAL_PCD_SuspendCallback(ptr noundef nonnull %0)
  br label %276

276:                                              ; preds = %275, %268
  %277 = load ptr, ptr %0, align 8, !tbaa !5
  %278 = getelementptr inbounds i8, ptr %277, i64 20
  %279 = load volatile i32, ptr %278, align 4, !tbaa !12
  %280 = and i32 %279, 2048
  store volatile i32 %280, ptr %278, align 4, !tbaa !12
  br label %281

281:                                              ; preds = %._crit_edge229, %276
  %282 = phi ptr [ %.pre230, %._crit_edge229 ], [ %277, %276 ]
  %283 = tail call i32 @USB_ReadInterrupts(ptr noundef %282) #2
  %284 = and i32 %283, 134217728
  %.not183 = icmp eq i32 %284, 0
  br i1 %.not183, label %300, label %285

285:                                              ; preds = %281
  %286 = load ptr, ptr %0, align 8, !tbaa !5
  %287 = getelementptr inbounds i8, ptr %286, i64 20
  %288 = load volatile i32, ptr %287, align 4, !tbaa !12
  %289 = and i32 %288, 134217728
  store volatile i32 %289, ptr %287, align 4, !tbaa !12
  %290 = getelementptr inbounds i8, ptr %0, i64 1404
  %291 = load i32, ptr %290, align 4, !tbaa !34
  %292 = icmp eq i32 %291, 0
  br i1 %292, label %293, label %299

293:                                              ; preds = %285
  store i32 1, ptr %290, align 4, !tbaa !34
  %294 = getelementptr inbounds i8, ptr %286, i64 84
  %295 = load volatile i32, ptr %294, align 4, !tbaa !36
  %296 = lshr i32 %295, 2
  %297 = and i32 %296, 15
  %298 = getelementptr inbounds i8, ptr %0, i64 1408
  store i32 %297, ptr %298, align 8, !tbaa !37
  tail call void @HAL_PCDEx_LPM_Callback(ptr noundef nonnull %0, i32 noundef 1) #2
  br label %300

299:                                              ; preds = %285
  tail call void @HAL_PCD_SuspendCallback(ptr noundef nonnull %0)
  br label %300

300:                                              ; preds = %293, %299, %281
  %301 = load ptr, ptr %0, align 8, !tbaa !5
  %302 = tail call i32 @USB_ReadInterrupts(ptr noundef %301) #2
  %303 = and i32 %302, 4096
  %.not184 = icmp eq i32 %303, 0
  br i1 %.not184, label %._crit_edge231, label %304

._crit_edge231:                                   ; preds = %300
  %.pre232 = load ptr, ptr %0, align 8, !tbaa !5
  br label %354

304:                                              ; preds = %300
  %305 = and i64 %3, 4294967295
  %306 = add nuw nsw i64 %305, 2048
  %307 = inttoptr i64 %306 to ptr
  %308 = getelementptr inbounds i8, ptr %307, i64 4
  %309 = load volatile i32, ptr %308, align 4, !tbaa !33
  %310 = and i32 %309, -2
  store volatile i32 %310, ptr %308, align 4, !tbaa !33
  %311 = load ptr, ptr %0, align 8, !tbaa !5
  %312 = tail call i32 @USB_FlushTxFifo(ptr noundef %311, i32 noundef 16) #2
  %313 = getelementptr inbounds i8, ptr %0, i64 8
  %314 = load i32, ptr %313, align 8, !tbaa !38
  %.not216 = icmp eq i32 %314, 0
  br i1 %.not216, label %._crit_edge, label %.lr.ph215

.lr.ph215:                                        ; preds = %304
  %315 = add nuw nsw i64 %305, 2304
  %316 = add nuw nsw i64 %305, 2816
  %wide.trip.count = zext i32 %314 to i64
  br label %317

317:                                              ; preds = %.lr.ph215, %317
  %indvars.iv222 = phi i64 [ 0, %.lr.ph215 ], [ %indvars.iv.next223, %317 ]
  %318 = shl nuw nsw i64 %indvars.iv222, 5
  %319 = add nuw nsw i64 %315, %318
  %320 = inttoptr i64 %319 to ptr
  %321 = getelementptr inbounds i8, ptr %320, i64 8
  store volatile i32 64383, ptr %321, align 4, !tbaa !26
  %322 = load volatile i32, ptr %320, align 4, !tbaa !39
  %323 = and i32 %322, -2097153
  store volatile i32 %323, ptr %320, align 4, !tbaa !39
  %324 = add nuw nsw i64 %316, %318
  %325 = inttoptr i64 %324 to ptr
  %326 = getelementptr inbounds i8, ptr %325, i64 8
  store volatile i32 64383, ptr %326, align 4, !tbaa !20
  %327 = load volatile i32, ptr %325, align 4, !tbaa !40
  %328 = and i32 %327, -2097153
  store volatile i32 %328, ptr %325, align 4, !tbaa !40
  %329 = load volatile i32, ptr %325, align 4, !tbaa !40
  %330 = or i32 %329, 134217728
  store volatile i32 %330, ptr %325, align 4, !tbaa !40
  %indvars.iv.next223 = add nuw nsw i64 %indvars.iv222, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next223, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %317, !llvm.loop !41

._crit_edge:                                      ; preds = %317, %304
  %331 = getelementptr inbounds i8, ptr %307, i64 28
  %332 = load volatile i32, ptr %331, align 4, !tbaa !42
  %333 = or i32 %332, 65537
  store volatile i32 %333, ptr %331, align 4, !tbaa !42
  %334 = getelementptr inbounds i8, ptr %0, i64 52
  %335 = load i32, ptr %334, align 4, !tbaa !43
  %.not185 = icmp eq i32 %335, 0
  %. = select i1 %.not185, i64 20, i64 132
  %.250 = select i1 %.not185, i32 8235, i32 11
  %.251 = select i1 %.not185, i64 16, i64 68
  %336 = getelementptr inbounds i8, ptr %307, i64 %.
  %337 = load volatile i32, ptr %336, align 4, !tbaa !44
  %338 = or i32 %337, %.250
  store volatile i32 %338, ptr %336, align 4, !tbaa !44
  %339 = getelementptr inbounds i8, ptr %307, i64 %.251
  %340 = load volatile i32, ptr %339, align 4, !tbaa !44
  %341 = or i32 %340, 11
  store volatile i32 %341, ptr %339, align 4, !tbaa !44
  %342 = load volatile i32, ptr %307, align 4, !tbaa !45
  %343 = and i32 %342, -2033
  store volatile i32 %343, ptr %307, align 4, !tbaa !45
  %344 = load ptr, ptr %0, align 8, !tbaa !5
  %345 = getelementptr inbounds i8, ptr %0, i64 20
  %346 = load i32, ptr %345, align 4, !tbaa !28
  %347 = trunc i32 %346 to i8
  %348 = getelementptr inbounds i8, ptr %0, i64 1356
  %349 = tail call i32 @USB_EP0_OutStart(ptr noundef %344, i8 noundef zeroext %347, ptr noundef nonnull %348) #2
  %350 = load ptr, ptr %0, align 8, !tbaa !5
  %351 = getelementptr inbounds i8, ptr %350, i64 20
  %352 = load volatile i32, ptr %351, align 4, !tbaa !12
  %353 = and i32 %352, 4096
  store volatile i32 %353, ptr %351, align 4, !tbaa !12
  br label %354

354:                                              ; preds = %._crit_edge231, %._crit_edge
  %355 = phi ptr [ %.pre232, %._crit_edge231 ], [ %350, %._crit_edge ]
  %356 = tail call i32 @USB_ReadInterrupts(ptr noundef %355) #2
  %357 = and i32 %356, 8192
  %.not186 = icmp eq i32 %357, 0
  %.pre233 = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not186, label %373, label %358

358:                                              ; preds = %354
  %359 = tail call i32 @USB_ActivateSetup(ptr noundef %.pre233) #2
  %360 = load ptr, ptr %0, align 8, !tbaa !5
  %361 = tail call zeroext i8 @USB_GetDevSpeed(ptr noundef %360) #2
  %362 = zext i8 %361 to i32
  %363 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 %362, ptr %363, align 8, !tbaa !46
  %364 = load ptr, ptr %0, align 8, !tbaa !5
  %365 = tail call i32 @HAL_RCC_GetHCLKFreq() #2
  %366 = load i32, ptr %363, align 8, !tbaa !46
  %367 = trunc i32 %366 to i8
  %368 = tail call i32 @USB_SetTurnaroundTime(ptr noundef %364, i32 noundef %365, i8 noundef zeroext %367) #2
  tail call void @HAL_PCD_ResetCallback(ptr noundef nonnull %0)
  %369 = load ptr, ptr %0, align 8, !tbaa !5
  %370 = getelementptr inbounds i8, ptr %369, i64 20
  %371 = load volatile i32, ptr %370, align 4, !tbaa !12
  %372 = and i32 %371, 8192
  store volatile i32 %372, ptr %370, align 4, !tbaa !12
  br label %373

373:                                              ; preds = %358, %354
  %374 = phi ptr [ %369, %358 ], [ %.pre233, %354 ]
  %375 = tail call i32 @USB_ReadInterrupts(ptr noundef %374) #2
  %376 = and i32 %375, 8
  %.not187 = icmp eq i32 %376, 0
  br i1 %.not187, label %._crit_edge234, label %377

._crit_edge234:                                   ; preds = %373
  %.pre235 = load ptr, ptr %0, align 8, !tbaa !5
  br label %382

377:                                              ; preds = %373
  tail call void @HAL_PCD_SOFCallback(ptr noundef nonnull %0)
  %378 = load ptr, ptr %0, align 8, !tbaa !5
  %379 = getelementptr inbounds i8, ptr %378, i64 20
  %380 = load volatile i32, ptr %379, align 4, !tbaa !12
  %381 = and i32 %380, 8
  store volatile i32 %381, ptr %379, align 4, !tbaa !12
  br label %382

382:                                              ; preds = %._crit_edge234, %377
  %383 = phi ptr [ %.pre235, %._crit_edge234 ], [ %378, %377 ]
  %384 = tail call i32 @USB_ReadInterrupts(ptr noundef %383) #2
  %385 = and i32 %384, 1048576
  %.not188 = icmp eq i32 %385, 0
  br i1 %.not188, label %._crit_edge236, label %386

._crit_edge236:                                   ; preds = %382
  %.pre237 = load ptr, ptr %0, align 8, !tbaa !5
  br label %391

386:                                              ; preds = %382
  tail call void @HAL_PCD_ISOINIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext 0)
  %387 = load ptr, ptr %0, align 8, !tbaa !5
  %388 = getelementptr inbounds i8, ptr %387, i64 20
  %389 = load volatile i32, ptr %388, align 4, !tbaa !12
  %390 = and i32 %389, 1048576
  store volatile i32 %390, ptr %388, align 4, !tbaa !12
  br label %391

391:                                              ; preds = %._crit_edge236, %386
  %392 = phi ptr [ %.pre237, %._crit_edge236 ], [ %387, %386 ]
  %393 = tail call i32 @USB_ReadInterrupts(ptr noundef %392) #2
  %394 = and i32 %393, 2097152
  %.not189 = icmp eq i32 %394, 0
  br i1 %.not189, label %._crit_edge238, label %395

._crit_edge238:                                   ; preds = %391
  %.pre239 = load ptr, ptr %0, align 8, !tbaa !5
  br label %400

395:                                              ; preds = %391
  tail call void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext 0)
  %396 = load ptr, ptr %0, align 8, !tbaa !5
  %397 = getelementptr inbounds i8, ptr %396, i64 20
  %398 = load volatile i32, ptr %397, align 4, !tbaa !12
  %399 = and i32 %398, 2097152
  store volatile i32 %399, ptr %397, align 4, !tbaa !12
  br label %400

400:                                              ; preds = %._crit_edge238, %395
  %401 = phi ptr [ %.pre239, %._crit_edge238 ], [ %396, %395 ]
  %402 = tail call i32 @USB_ReadInterrupts(ptr noundef %401) #2
  %403 = and i32 %402, 1073741824
  %.not190 = icmp eq i32 %403, 0
  br i1 %.not190, label %._crit_edge240, label %404

._crit_edge240:                                   ; preds = %400
  %.pre241 = load ptr, ptr %0, align 8, !tbaa !5
  br label %409

404:                                              ; preds = %400
  tail call void @HAL_PCD_ConnectCallback(ptr noundef nonnull %0)
  %405 = load ptr, ptr %0, align 8, !tbaa !5
  %406 = getelementptr inbounds i8, ptr %405, i64 20
  %407 = load volatile i32, ptr %406, align 4, !tbaa !12
  %408 = and i32 %407, 1073741824
  store volatile i32 %408, ptr %406, align 4, !tbaa !12
  br label %409

409:                                              ; preds = %._crit_edge240, %404
  %410 = phi ptr [ %.pre241, %._crit_edge240 ], [ %405, %404 ]
  %411 = tail call i32 @USB_ReadInterrupts(ptr noundef %410) #2
  %412 = and i32 %411, 4
  %.not191 = icmp eq i32 %412, 0
  br i1 %.not191, label %424, label %413

413:                                              ; preds = %409
  %414 = load ptr, ptr %0, align 8, !tbaa !5
  %415 = getelementptr inbounds i8, ptr %414, i64 4
  %416 = load volatile i32, ptr %415, align 4, !tbaa !47
  %417 = and i32 %416, 4
  %.not192 = icmp eq i32 %417, 0
  br i1 %.not192, label %419, label %418

418:                                              ; preds = %413
  tail call void @HAL_PCD_DisconnectCallback(ptr noundef nonnull %0)
  %.pre242 = load ptr, ptr %0, align 8, !tbaa !5
  br label %419

419:                                              ; preds = %418, %413
  %420 = phi ptr [ %.pre242, %418 ], [ %414, %413 ]
  %421 = getelementptr inbounds i8, ptr %420, i64 4
  %422 = load volatile i32, ptr %421, align 4, !tbaa !47
  %423 = or i32 %422, %416
  store volatile i32 %423, ptr %421, align 4, !tbaa !47
  br label %424

424:                                              ; preds = %1, %419, %409, %6
  ret void
}

declare i32 @USB_GetMode(ptr noundef) local_unnamed_addr #0

declare i32 @USB_ReadInterrupts(ptr noundef) local_unnamed_addr #0

declare ptr @USB_ReadPacket(ptr noundef, ptr noundef, i16 noundef zeroext) local_unnamed_addr #0

declare i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef) local_unnamed_addr #0

declare i32 @USB_ReadDevOutEPInterrupt(ptr noundef, i8 noundef zeroext) local_unnamed_addr #0

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

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

declare i32 @USB_ReadDevAllInEpInterrupt(ptr noundef) local_unnamed_addr #0

declare i32 @USB_ReadDevInEPInterrupt(ptr noundef, i8 noundef zeroext) local_unnamed_addr #0

declare i32 @USB_EP0_OutStart(ptr noundef, i8 noundef zeroext, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_DataInStageCallback(ptr noundef, i8 noundef zeroext) local_unnamed_addr #1

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

declare void @HAL_PCDEx_LPM_Callback(ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ResumeCallback(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_SuspendCallback(ptr noundef) local_unnamed_addr #1

declare i32 @USB_ActivateSetup(ptr noundef) local_unnamed_addr #0

declare zeroext i8 @USB_GetDevSpeed(ptr noundef) local_unnamed_addr #0

declare i32 @USB_SetTurnaroundTime(ptr noundef, i32 noundef, i8 noundef zeroext) local_unnamed_addr #0

declare i32 @HAL_RCC_GetHCLKFreq() local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ResetCallback(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_SOFCallback(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ISOINIncompleteCallback(ptr noundef, i8 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef, i8 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ConnectCallback(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_DisconnectCallback(ptr noundef) local_unnamed_addr #1

attributes #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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"", !7, i64 0, !10, i64 8, !8, i64 60, !8, i64 64, !8, i64 704, !11, i64 1344, !11, i64 1348, !11, i64 1352, !8, i64 1356, !11, i64 1404, !11, i64 1408, !11, i64 1412, !11, i64 1416, !7, i64 1424}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48}
!11 = !{!"int", !8, i64 0}
!12 = !{!13, !11, i64 20}
!13 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !8, i64 48, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !11, i64 72, !11, i64 76, !11, i64 80, !11, i64 84, !11, i64 88, !11, i64 92, !11, i64 96, !8, i64 100, !11, i64 256, !8, i64 260}
!14 = !{!13, !11, i64 24}
!15 = !{!13, !11, i64 32}
!16 = !{!17, !7, i64 16}
!17 = !{!"", !8, i64 0, !8, i64 1, !8, i64 2, !8, i64 3, !8, i64 4, !8, i64 5, !18, i64 6, !11, i64 8, !7, i64 16, !11, i64 24, !11, i64 28, !11, i64 32}
!18 = !{!"short", !8, i64 0}
!19 = !{!17, !11, i64 32}
!20 = !{!21, !11, i64 8}
!21 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !8, i64 24}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!25, !11, i64 52}
!25 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !8, i64 72, !11, i64 132}
!26 = !{!27, !11, i64 8}
!27 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28}
!28 = !{!6, !11, i64 20}
!29 = !{!17, !11, i64 8}
!30 = !{!17, !11, i64 28}
!31 = distinct !{!31, !23, !32}
!32 = !{!"llvm.loop.peeled.count", i32 1}
!33 = !{!25, !11, i64 4}
!34 = !{!6, !11, i64 1404}
!35 = !{!25, !11, i64 8}
!36 = !{!13, !11, i64 84}
!37 = !{!6, !11, i64 1408}
!38 = !{!6, !11, i64 8}
!39 = !{!27, !11, i64 0}
!40 = !{!21, !11, i64 0}
!41 = distinct !{!41, !23}
!42 = !{!25, !11, i64 28}
!43 = !{!6, !11, i64 52}
!44 = !{!11, !11, i64 0}
!45 = !{!25, !11, i64 0}
!46 = !{!6, !11, i64 16}
!47 = !{!13, !11, i64 4}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopFullUnrollPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass