; LLVM IR from reazon-research/OpenArm :: control/canfd_control/Drivers/STM32H7xx_HAL_Driver/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_CfgTypeDef, i8, [16 x %struct.USB_EPTypeDef], [16 x %struct.USB_EPTypeDef], i32, i32, i32, [12 x i32], i32, i32, i32, i32, i32, ptr }
%struct.USB_CfgTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.USB_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i32, ptr, i32, i32, i8, i16, i32, 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_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_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 %1099

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 %1100

30:                                               ; preds = %23
  %31 = load i32, ptr %4, align 4, !tbaa !13
  %32 = zext i32 %31 to i64
  %33 = add i64 %32, 2048
  %34 = inttoptr i64 %33 to ptr
  %35 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %34, i32 0, i32 2
  %36 = load volatile i32, ptr %35, align 4, !tbaa !14
  %37 = zext i32 %36 to i64
  %38 = and i64 %37, 4194048
  %39 = lshr i64 %38, 8
  %40 = trunc i64 %39 to i32
  %41 = load ptr, ptr %2, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %41, i32 0, i32 11
  store i32 %40, ptr %42, align 4, !tbaa !16
  %43 = load ptr, ptr %2, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %43, i32 0, i32 0
  %45 = load ptr, ptr %44, align 8, !tbaa !9
  %46 = call i32 @USB_ReadInterrupts(ptr noundef %45)
  %47 = zext i32 %46 to i64
  %48 = and i64 %47, 2
  %49 = icmp eq i64 %48, 2
  br i1 %49, label %50, label %59

50:                                               ; preds = %30
  %51 = load ptr, ptr %2, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %51, i32 0, i32 0
  %53 = load ptr, ptr %52, align 8, !tbaa !9
  %54 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %53, i32 0, i32 5
  %55 = load volatile i32, ptr %54, align 4, !tbaa !17
  %56 = zext i32 %55 to i64
  %57 = and i64 %56, 2
  %58 = trunc i64 %57 to i32
  store volatile i32 %58, ptr %54, align 4, !tbaa !17
  br label %59

59:                                               ; preds = %50, %30
  %60 = load ptr, ptr %2, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %60, i32 0, i32 0
  %62 = load ptr, ptr %61, align 8, !tbaa !9
  %63 = call i32 @USB_ReadInterrupts(ptr noundef %62)
  %64 = zext i32 %63 to i64
  %65 = and i64 %64, 16
  %66 = icmp eq i64 %65, 16
  br i1 %66, label %67, label %158

67:                                               ; preds = %59
  %68 = load ptr, ptr %2, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %68, i32 0, i32 0
  %70 = load ptr, ptr %69, align 8, !tbaa !9
  %71 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %70, i32 0, i32 6
  %72 = load volatile i32, ptr %71, align 4, !tbaa !19
  %73 = zext i32 %72 to i64
  %74 = and i64 %73, -17
  %75 = trunc i64 %74 to i32
  store volatile i32 %75, ptr %71, align 4, !tbaa !19
  %76 = load ptr, ptr %3, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %76, i32 0, i32 8
  %78 = load volatile i32, ptr %77, align 4, !tbaa !20
  store i32 %78, ptr %11, align 4, !tbaa !13
  %79 = load ptr, ptr %2, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %79, i32 0, i32 4
  %81 = load i32, ptr %11, align 4, !tbaa !13
  %82 = zext i32 %81 to i64
  %83 = and i64 %82, 15
  %84 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %80, i64 0, i64 %83
  store ptr %84, ptr %5, align 8, !tbaa !5
  %85 = load i32, ptr %11, align 4, !tbaa !13
  %86 = zext i32 %85 to i64
  %87 = and i64 %86, 1966080
  %88 = lshr i64 %87, 17
  %89 = icmp eq i64 %88, 2
  br i1 %89, label %90, label %125

90:                                               ; preds = %67
  %91 = load i32, ptr %11, align 4, !tbaa !13
  %92 = zext i32 %91 to i64
  %93 = and i64 %92, 32752
  %94 = icmp ne i64 %93, 0
  br i1 %94, label %95, label %124

95:                                               ; preds = %90
  %96 = load ptr, ptr %3, align 8, !tbaa !5
  %97 = load ptr, ptr %5, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %97, i32 0, i32 7
  %99 = load ptr, ptr %98, align 8, !tbaa !21
  %100 = load i32, ptr %11, align 4, !tbaa !13
  %101 = zext i32 %100 to i64
  %102 = and i64 %101, 32752
  %103 = lshr i64 %102, 4
  %104 = trunc i64 %103 to i16
  %105 = call ptr @USB_ReadPacket(ptr noundef %96, ptr noundef %99, i16 noundef zeroext %104)
  %106 = load i32, ptr %11, align 4, !tbaa !13
  %107 = zext i32 %106 to i64
  %108 = and i64 %107, 32752
  %109 = lshr i64 %108, 4
  %110 = load ptr, ptr %5, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %110, i32 0, i32 7
  %112 = load ptr, ptr %111, align 8, !tbaa !21
  %113 = getelementptr inbounds i8, ptr %112, i64 %109
  store ptr %113, ptr %111, align 8, !tbaa !21
  %114 = load i32, ptr %11, align 4, !tbaa !13
  %115 = zext i32 %114 to i64
  %116 = and i64 %115, 32752
  %117 = lshr i64 %116, 4
  %118 = load ptr, ptr %5, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %118, i32 0, i32 9
  %120 = load i32, ptr %119, align 4, !tbaa !24
  %121 = zext i32 %120 to i64
  %122 = add i64 %121, %117
  %123 = trunc i64 %122 to i32
  store i32 %123, ptr %119, align 4, !tbaa !24
  br label %124

124:                                              ; preds = %95, %90
  br label %149

125:                                              ; preds = %67
  %126 = load i32, ptr %11, align 4, !tbaa !13
  %127 = zext i32 %126 to i64
  %128 = and i64 %127, 1966080
  %129 = lshr i64 %128, 17
  %130 = icmp eq i64 %129, 6
  br i1 %130, label %131, label %147

131:                                              ; preds = %125
  %132 = load ptr, ptr %3, align 8, !tbaa !5
  %133 = load ptr, ptr %2, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %133, i32 0, i32 8
  %135 = getelementptr inbounds [12 x i32], ptr %134, i64 0, i64 0
  %136 = call ptr @USB_ReadPacket(ptr noundef %132, ptr noundef %135, i16 noundef zeroext 8)
  %137 = load i32, ptr %11, align 4, !tbaa !13
  %138 = zext i32 %137 to i64
  %139 = and i64 %138, 32752
  %140 = lshr i64 %139, 4
  %141 = load ptr, ptr %5, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %141, i32 0, i32 9
  %143 = load i32, ptr %142, align 4, !tbaa !24
  %144 = zext i32 %143 to i64
  %145 = add i64 %144, %140
  %146 = trunc i64 %145 to i32
  store i32 %146, ptr %142, align 4, !tbaa !24
  br label %148

147:                                              ; preds = %125
  br label %148

148:                                              ; preds = %147, %131
  br label %149

149:                                              ; preds = %148, %124
  %150 = load ptr, ptr %2, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %150, i32 0, i32 0
  %152 = load ptr, ptr %151, align 8, !tbaa !9
  %153 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %152, i32 0, i32 6
  %154 = load volatile i32, ptr %153, align 4, !tbaa !19
  %155 = zext i32 %154 to i64
  %156 = or i64 %155, 16
  %157 = trunc i64 %156 to i32
  store volatile i32 %157, ptr %153, align 4, !tbaa !19
  br label %158

158:                                              ; preds = %149, %59
  %159 = load ptr, ptr %2, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %159, i32 0, i32 0
  %161 = load ptr, ptr %160, align 8, !tbaa !9
  %162 = call i32 @USB_ReadInterrupts(ptr noundef %161)
  %163 = zext i32 %162 to i64
  %164 = and i64 %163, 524288
  %165 = icmp eq i64 %164, 524288
  br i1 %165, label %166, label %321

166:                                              ; preds = %158
  store i32 0, ptr %9, align 4, !tbaa !13
  %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 = call i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef %169)
  store i32 %170, ptr %7, align 4, !tbaa !13
  br label %171

171:                                              ; preds = %315, %166
  %172 = load i32, ptr %7, align 4, !tbaa !13
  %173 = icmp ne i32 %172, 0
  br i1 %173, label %174, label %320

174:                                              ; preds = %171
  %175 = load i32, ptr %7, align 4, !tbaa !13
  %176 = and i32 %175, 1
  %177 = icmp ne i32 %176, 0
  br i1 %177, label %178, label %315

178:                                              ; preds = %174
  %179 = load ptr, ptr %2, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %179, i32 0, i32 0
  %181 = load ptr, ptr %180, align 8, !tbaa !9
  %182 = load i32, ptr %9, align 4, !tbaa !13
  %183 = trunc i32 %182 to i8
  %184 = call i32 @USB_ReadDevOutEPInterrupt(ptr noundef %181, i8 noundef zeroext %183)
  store i32 %184, ptr %8, align 4, !tbaa !13
  %185 = load i32, ptr %8, align 4, !tbaa !13
  %186 = zext i32 %185 to i64
  %187 = and i64 %186, 1
  %188 = icmp eq i64 %187, 1
  br i1 %188, label %189, label %202

189:                                              ; preds = %178
  %190 = load i32, ptr %4, align 4, !tbaa !13
  %191 = zext i32 %190 to i64
  %192 = add i64 %191, 2816
  %193 = load i32, ptr %9, align 4, !tbaa !13
  %194 = zext i32 %193 to i64
  %195 = mul i64 %194, 32
  %196 = add i64 %192, %195
  %197 = inttoptr i64 %196 to ptr
  %198 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %197, i32 0, i32 2
  store volatile i32 1, ptr %198, align 4, !tbaa !25
  %199 = load ptr, ptr %2, align 8, !tbaa !5
  %200 = load i32, ptr %9, align 4, !tbaa !13
  %201 = call i32 @PCD_EP_OutXfrComplete_int(ptr noundef %199, i32 noundef %200)
  br label %202

202:                                              ; preds = %189, %178
  %203 = load i32, ptr %8, align 4, !tbaa !13
  %204 = zext i32 %203 to i64
  %205 = and i64 %204, 8
  %206 = icmp eq i64 %205, 8
  br i1 %206, label %207, label %220

207:                                              ; preds = %202
  %208 = load i32, ptr %4, align 4, !tbaa !13
  %209 = zext i32 %208 to i64
  %210 = add i64 %209, 2816
  %211 = load i32, ptr %9, align 4, !tbaa !13
  %212 = zext i32 %211 to i64
  %213 = mul i64 %212, 32
  %214 = add i64 %210, %213
  %215 = inttoptr i64 %214 to ptr
  %216 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %215, i32 0, i32 2
  store volatile i32 8, ptr %216, align 4, !tbaa !25
  %217 = load ptr, ptr %2, align 8, !tbaa !5
  %218 = load i32, ptr %9, align 4, !tbaa !13
  %219 = call i32 @PCD_EP_OutSetupPacket_int(ptr noundef %217, i32 noundef %218)
  br label %220

220:                                              ; preds = %207, %202
  %221 = load i32, ptr %8, align 4, !tbaa !13
  %222 = zext i32 %221 to i64
  %223 = and i64 %222, 16
  %224 = icmp eq i64 %223, 16
  br i1 %224, label %225, label %235

225:                                              ; preds = %220
  %226 = load i32, ptr %4, align 4, !tbaa !13
  %227 = zext i32 %226 to i64
  %228 = add i64 %227, 2816
  %229 = load i32, ptr %9, align 4, !tbaa !13
  %230 = zext i32 %229 to i64
  %231 = mul i64 %230, 32
  %232 = add i64 %228, %231
  %233 = inttoptr i64 %232 to ptr
  %234 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %233, i32 0, i32 2
  store volatile i32 16, ptr %234, align 4, !tbaa !25
  br label %235

235:                                              ; preds = %225, %220
  %236 = load i32, ptr %8, align 4, !tbaa !13
  %237 = zext i32 %236 to i64
  %238 = and i64 %237, 2
  %239 = icmp eq i64 %238, 2
  br i1 %239, label %240, label %284

240:                                              ; preds = %235
  %241 = load ptr, ptr %3, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %241, i32 0, i32 5
  %243 = load volatile i32, ptr %242, align 4, !tbaa !17
  %244 = zext i32 %243 to i64
  %245 = and i64 %244, 128
  %246 = icmp eq i64 %245, 128
  br i1 %246, label %247, label %257

247:                                              ; preds = %240
  %248 = load i32, ptr %4, align 4, !tbaa !13
  %249 = zext i32 %248 to i64
  %250 = add i64 %249, 2048
  %251 = inttoptr i64 %250 to ptr
  %252 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %251, i32 0, i32 1
  %253 = load volatile i32, ptr %252, align 4, !tbaa !27
  %254 = zext i32 %253 to i64
  %255 = or i64 %254, 1024
  %256 = trunc i64 %255 to i32
  store volatile i32 %256, ptr %252, align 4, !tbaa !27
  br label %257

257:                                              ; preds = %247, %240
  %258 = load ptr, ptr %2, align 8, !tbaa !5
  %259 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %258, i32 0, i32 4
  %260 = load i32, ptr %9, align 4, !tbaa !13
  %261 = zext i32 %260 to i64
  %262 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %259, i64 0, i64 %261
  store ptr %262, ptr %5, align 8, !tbaa !5
  %263 = load ptr, ptr %5, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %263, i32 0, i32 3
  %265 = load i8, ptr %264, align 1, !tbaa !28
  %266 = zext i8 %265 to i32
  %267 = icmp eq i32 %266, 1
  br i1 %267, label %268, label %274

268:                                              ; preds = %257
  %269 = load ptr, ptr %5, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %269, i32 0, i32 3
  store i8 0, ptr %270, align 1, !tbaa !28
  %271 = load ptr, ptr %2, align 8, !tbaa !5
  %272 = load i32, ptr %9, align 4, !tbaa !13
  %273 = trunc i32 %272 to i8
  call void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef %271, i8 noundef zeroext %273)
  br label %274

274:                                              ; preds = %268, %257
  %275 = load i32, ptr %4, align 4, !tbaa !13
  %276 = zext i32 %275 to i64
  %277 = add i64 %276, 2816
  %278 = load i32, ptr %9, align 4, !tbaa !13
  %279 = zext i32 %278 to i64
  %280 = mul i64 %279, 32
  %281 = add i64 %277, %280
  %282 = inttoptr i64 %281 to ptr
  %283 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %282, i32 0, i32 2
  store volatile i32 2, ptr %283, align 4, !tbaa !25
  br label %284

284:                                              ; preds = %274, %235
  %285 = load i32, ptr %8, align 4, !tbaa !13
  %286 = zext i32 %285 to i64
  %287 = and i64 %286, 32
  %288 = icmp eq i64 %287, 32
  br i1 %288, label %289, label %299

289:                                              ; preds = %284
  %290 = load i32, ptr %4, align 4, !tbaa !13
  %291 = zext i32 %290 to i64
  %292 = add i64 %291, 2816
  %293 = load i32, ptr %9, align 4, !tbaa !13
  %294 = zext i32 %293 to i64
  %295 = mul i64 %294, 32
  %296 = add i64 %292, %295
  %297 = inttoptr i64 %296 to ptr
  %298 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %297, i32 0, i32 2
  store volatile i32 32, ptr %298, align 4, !tbaa !25
  br label %299

299:                                              ; preds = %289, %284
  %300 = load i32, ptr %8, align 4, !tbaa !13
  %301 = zext i32 %300 to i64
  %302 = and i64 %301, 8192
  %303 = icmp eq i64 %302, 8192
  br i1 %303, label %304, label %314

304:                                              ; preds = %299
  %305 = load i32, ptr %4, align 4, !tbaa !13
  %306 = zext i32 %305 to i64
  %307 = add i64 %306, 2816
  %308 = load i32, ptr %9, align 4, !tbaa !13
  %309 = zext i32 %308 to i64
  %310 = mul i64 %309, 32
  %311 = add i64 %307, %310
  %312 = inttoptr i64 %311 to ptr
  %313 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %312, i32 0, i32 2
  store volatile i32 8192, ptr %313, align 4, !tbaa !25
  br label %314

314:                                              ; preds = %304, %299
  br label %315

315:                                              ; preds = %314, %174
  %316 = load i32, ptr %9, align 4, !tbaa !13
  %317 = add i32 %316, 1
  store i32 %317, ptr %9, align 4, !tbaa !13
  %318 = load i32, ptr %7, align 4, !tbaa !13
  %319 = lshr i32 %318, 1
  store i32 %319, ptr %7, align 4, !tbaa !13
  br label %171, !llvm.loop !29

320:                                              ; preds = %171
  br label %321

321:                                              ; preds = %320, %158
  %322 = load ptr, ptr %2, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %322, i32 0, i32 0
  %324 = load ptr, ptr %323, align 8, !tbaa !9
  %325 = call i32 @USB_ReadInterrupts(ptr noundef %324)
  %326 = zext i32 %325 to i64
  %327 = and i64 %326, 262144
  %328 = icmp eq i64 %327, 262144
  br i1 %328, label %329, label %518

329:                                              ; preds = %321
  %330 = load ptr, ptr %2, align 8, !tbaa !5
  %331 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %330, i32 0, i32 0
  %332 = load ptr, ptr %331, align 8, !tbaa !9
  %333 = call i32 @USB_ReadDevAllInEpInterrupt(ptr noundef %332)
  store i32 %333, ptr %7, align 4, !tbaa !13
  store i32 0, ptr %9, align 4, !tbaa !13
  br label %334

334:                                              ; preds = %512, %329
  %335 = load i32, ptr %7, align 4, !tbaa !13
  %336 = icmp ne i32 %335, 0
  br i1 %336, label %337, label %517

337:                                              ; preds = %334
  %338 = load i32, ptr %7, align 4, !tbaa !13
  %339 = and i32 %338, 1
  %340 = icmp ne i32 %339, 0
  br i1 %340, label %341, label %512

341:                                              ; preds = %337
  %342 = load ptr, ptr %2, align 8, !tbaa !5
  %343 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %342, i32 0, i32 0
  %344 = load ptr, ptr %343, align 8, !tbaa !9
  %345 = load i32, ptr %9, align 4, !tbaa !13
  %346 = trunc i32 %345 to i8
  %347 = call i32 @USB_ReadDevInEPInterrupt(ptr noundef %344, i8 noundef zeroext %346)
  store i32 %347, ptr %8, align 4, !tbaa !13
  %348 = load i32, ptr %8, align 4, !tbaa !13
  %349 = zext i32 %348 to i64
  %350 = and i64 %349, 1
  %351 = icmp eq i64 %350, 1
  br i1 %351, label %352, label %422

352:                                              ; preds = %341
  %353 = load i32, ptr %9, align 4, !tbaa !13
  %354 = and i32 %353, 15
  %355 = zext i32 %354 to i64
  %356 = shl i64 1, %355
  %357 = trunc i64 %356 to i32
  store i32 %357, ptr %10, align 4, !tbaa !13
  %358 = load i32, ptr %10, align 4, !tbaa !13
  %359 = xor i32 %358, -1
  %360 = load i32, ptr %4, align 4, !tbaa !13
  %361 = zext i32 %360 to i64
  %362 = add i64 %361, 2048
  %363 = inttoptr i64 %362 to ptr
  %364 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %363, i32 0, i32 13
  %365 = load volatile i32, ptr %364, align 4, !tbaa !31
  %366 = and i32 %365, %359
  store volatile i32 %366, ptr %364, align 4, !tbaa !31
  %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 1, ptr %375, align 4, !tbaa !32
  %376 = load ptr, ptr %2, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %376, i32 0, i32 1
  %378 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %377, i32 0, i32 2
  %379 = load i32, ptr %378, align 8, !tbaa !34
  %380 = icmp eq i32 %379, 1
  br i1 %380, label %381, label %418

381:                                              ; preds = %352
  %382 = load ptr, ptr %2, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %382, i32 0, i32 3
  %384 = load i32, ptr %9, align 4, !tbaa !13
  %385 = zext i32 %384 to i64
  %386 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %383, i64 0, i64 %385
  %387 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %386, i32 0, i32 6
  %388 = load i32, ptr %387, align 8, !tbaa !35
  %389 = load ptr, ptr %2, align 8, !tbaa !5
  %390 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %389, i32 0, i32 3
  %391 = load i32, ptr %9, align 4, !tbaa !13
  %392 = zext i32 %391 to i64
  %393 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %390, i64 0, i64 %392
  %394 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %393, i32 0, i32 7
  %395 = load ptr, ptr %394, align 8, !tbaa !21
  %396 = zext i32 %388 to i64
  %397 = getelementptr inbounds i8, ptr %395, i64 %396
  store ptr %397, ptr %394, align 8, !tbaa !21
  %398 = load i32, ptr %9, align 4, !tbaa !13
  %399 = icmp eq i32 %398, 0
  br i1 %399, label %400, label %417

400:                                              ; preds = %381
  %401 = load ptr, ptr %2, align 8, !tbaa !5
  %402 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %401, i32 0, i32 3
  %403 = load i32, ptr %9, align 4, !tbaa !13
  %404 = zext i32 %403 to i64
  %405 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %402, i64 0, i64 %404
  %406 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %405, i32 0, i32 8
  %407 = load i32, ptr %406, align 8, !tbaa !36
  %408 = icmp eq i32 %407, 0
  br i1 %408, label %409, label %417

409:                                              ; preds = %400
  %410 = load ptr, ptr %2, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %410, i32 0, i32 0
  %412 = load ptr, ptr %411, align 8, !tbaa !9
  %413 = load ptr, ptr %2, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %413, i32 0, i32 8
  %415 = getelementptr inbounds [12 x i32], ptr %414, i64 0, i64 0
  %416 = call i32 @USB_EP0_OutStart(ptr noundef %412, i8 noundef zeroext 1, ptr noundef %415)
  br label %417

417:                                              ; preds = %409, %400, %381
  br label %418

418:                                              ; preds = %417, %352
  %419 = load ptr, ptr %2, align 8, !tbaa !5
  %420 = load i32, ptr %9, align 4, !tbaa !13
  %421 = trunc i32 %420 to i8
  call void @HAL_PCD_DataInStageCallback(ptr noundef %419, i8 noundef zeroext %421)
  br label %422

422:                                              ; preds = %418, %341
  %423 = load i32, ptr %8, align 4, !tbaa !13
  %424 = zext i32 %423 to i64
  %425 = and i64 %424, 8
  %426 = icmp eq i64 %425, 8
  br i1 %426, label %427, label %437

427:                                              ; preds = %422
  %428 = load i32, ptr %4, align 4, !tbaa !13
  %429 = zext i32 %428 to i64
  %430 = add i64 %429, 2304
  %431 = load i32, ptr %9, align 4, !tbaa !13
  %432 = zext i32 %431 to i64
  %433 = mul i64 %432, 32
  %434 = add i64 %430, %433
  %435 = inttoptr i64 %434 to ptr
  %436 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %435, i32 0, i32 2
  store volatile i32 8, ptr %436, align 4, !tbaa !32
  br label %437

437:                                              ; preds = %427, %422
  %438 = load i32, ptr %8, align 4, !tbaa !13
  %439 = zext i32 %438 to i64
  %440 = and i64 %439, 16
  %441 = icmp eq i64 %440, 16
  br i1 %441, label %442, label %452

442:                                              ; preds = %437
  %443 = load i32, ptr %4, align 4, !tbaa !13
  %444 = zext i32 %443 to i64
  %445 = add i64 %444, 2304
  %446 = load i32, ptr %9, align 4, !tbaa !13
  %447 = zext i32 %446 to i64
  %448 = mul i64 %447, 32
  %449 = add i64 %445, %448
  %450 = inttoptr i64 %449 to ptr
  %451 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %450, i32 0, i32 2
  store volatile i32 16, ptr %451, align 4, !tbaa !32
  br label %452

452:                                              ; preds = %442, %437
  %453 = load i32, ptr %8, align 4, !tbaa !13
  %454 = zext i32 %453 to i64
  %455 = and i64 %454, 64
  %456 = icmp eq i64 %455, 64
  br i1 %456, label %457, label %467

457:                                              ; preds = %452
  %458 = load i32, ptr %4, align 4, !tbaa !13
  %459 = zext i32 %458 to i64
  %460 = add i64 %459, 2304
  %461 = load i32, ptr %9, align 4, !tbaa !13
  %462 = zext i32 %461 to i64
  %463 = mul i64 %462, 32
  %464 = add i64 %460, %463
  %465 = inttoptr i64 %464 to ptr
  %466 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %465, i32 0, i32 2
  store volatile i32 64, ptr %466, align 4, !tbaa !32
  br label %467

467:                                              ; preds = %457, %452
  %468 = load i32, ptr %8, align 4, !tbaa !13
  %469 = zext i32 %468 to i64
  %470 = and i64 %469, 2
  %471 = icmp eq i64 %470, 2
  br i1 %471, label %472, label %502

472:                                              ; preds = %467
  %473 = load ptr, ptr %3, align 8, !tbaa !5
  %474 = load i32, ptr %9, align 4, !tbaa !13
  %475 = call i32 @USB_FlushTxFifo(ptr noundef %473, i32 noundef %474)
  %476 = load ptr, ptr %2, align 8, !tbaa !5
  %477 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %476, i32 0, i32 3
  %478 = load i32, ptr %9, align 4, !tbaa !13
  %479 = zext i32 %478 to i64
  %480 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %477, i64 0, i64 %479
  store ptr %480, ptr %5, align 8, !tbaa !5
  %481 = load ptr, ptr %5, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %481, i32 0, i32 3
  %483 = load i8, ptr %482, align 1, !tbaa !28
  %484 = zext i8 %483 to i32
  %485 = icmp eq i32 %484, 1
  br i1 %485, label %486, label %492

486:                                              ; preds = %472
  %487 = load ptr, ptr %5, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %487, i32 0, i32 3
  store i8 0, ptr %488, align 1, !tbaa !28
  %489 = load ptr, ptr %2, align 8, !tbaa !5
  %490 = load i32, ptr %9, align 4, !tbaa !13
  %491 = trunc i32 %490 to i8
  call void @HAL_PCD_ISOINIncompleteCallback(ptr noundef %489, i8 noundef zeroext %491)
  br label %492

492:                                              ; preds = %486, %472
  %493 = load i32, ptr %4, align 4, !tbaa !13
  %494 = zext i32 %493 to i64
  %495 = add i64 %494, 2304
  %496 = load i32, ptr %9, align 4, !tbaa !13
  %497 = zext i32 %496 to i64
  %498 = mul i64 %497, 32
  %499 = add i64 %495, %498
  %500 = inttoptr i64 %499 to ptr
  %501 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %500, i32 0, i32 2
  store volatile i32 2, ptr %501, align 4, !tbaa !32
  br label %502

502:                                              ; preds = %492, %467
  %503 = load i32, ptr %8, align 4, !tbaa !13
  %504 = zext i32 %503 to i64
  %505 = and i64 %504, 128
  %506 = icmp eq i64 %505, 128
  br i1 %506, label %507, label %511

507:                                              ; preds = %502
  %508 = load ptr, ptr %2, align 8, !tbaa !5
  %509 = load i32, ptr %9, align 4, !tbaa !13
  %510 = call i32 @PCD_WriteEmptyTxFifo(ptr noundef %508, i32 noundef %509)
  br label %511

511:                                              ; preds = %507, %502
  br label %512

512:                                              ; preds = %511, %337
  %513 = load i32, ptr %9, align 4, !tbaa !13
  %514 = add i32 %513, 1
  store i32 %514, ptr %9, align 4, !tbaa !13
  %515 = load i32, ptr %7, align 4, !tbaa !13
  %516 = lshr i32 %515, 1
  store i32 %516, ptr %7, align 4, !tbaa !13
  br label %334, !llvm.loop !37

517:                                              ; preds = %334
  br label %518

518:                                              ; preds = %517, %321
  %519 = load ptr, ptr %2, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %519, i32 0, i32 0
  %521 = load ptr, ptr %520, align 8, !tbaa !9
  %522 = call i32 @USB_ReadInterrupts(ptr noundef %521)
  %523 = zext i32 %522 to i64
  %524 = and i64 %523, 2147483648
  %525 = icmp eq i64 %524, 2147483648
  br i1 %525, label %526, label %555

526:                                              ; preds = %518
  %527 = load i32, ptr %4, align 4, !tbaa !13
  %528 = zext i32 %527 to i64
  %529 = add i64 %528, 2048
  %530 = inttoptr i64 %529 to ptr
  %531 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %530, i32 0, i32 1
  %532 = load volatile i32, ptr %531, align 4, !tbaa !27
  %533 = zext i32 %532 to i64
  %534 = and i64 %533, -2
  %535 = trunc i64 %534 to i32
  store volatile i32 %535, ptr %531, align 4, !tbaa !27
  %536 = load ptr, ptr %2, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %536, i32 0, i32 9
  %538 = load i32, ptr %537, align 4, !tbaa !38
  %539 = icmp eq i32 %538, 1
  br i1 %539, label %540, label %544

540:                                              ; preds = %526
  %541 = load ptr, ptr %2, align 8, !tbaa !5
  %542 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %541, i32 0, i32 9
  store i32 0, ptr %542, align 4, !tbaa !38
  %543 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCDEx_LPM_Callback(ptr noundef %543, i32 noundef 0)
  br label %546

544:                                              ; preds = %526
  %545 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ResumeCallback(ptr noundef %545)
  br label %546

546:                                              ; preds = %544, %540
  %547 = load ptr, ptr %2, align 8, !tbaa !5
  %548 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %547, i32 0, i32 0
  %549 = load ptr, ptr %548, align 8, !tbaa !9
  %550 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %549, i32 0, i32 5
  %551 = load volatile i32, ptr %550, align 4, !tbaa !17
  %552 = zext i32 %551 to i64
  %553 = and i64 %552, 2147483648
  %554 = trunc i64 %553 to i32
  store volatile i32 %554, ptr %550, align 4, !tbaa !17
  br label %555

555:                                              ; preds = %546, %518
  %556 = load ptr, ptr %2, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %556, i32 0, i32 0
  %558 = load ptr, ptr %557, align 8, !tbaa !9
  %559 = call i32 @USB_ReadInterrupts(ptr noundef %558)
  %560 = zext i32 %559 to i64
  %561 = and i64 %560, 2048
  %562 = icmp eq i64 %561, 2048
  br i1 %562, label %563, label %584

563:                                              ; preds = %555
  %564 = load i32, ptr %4, align 4, !tbaa !13
  %565 = zext i32 %564 to i64
  %566 = add i64 %565, 2048
  %567 = inttoptr i64 %566 to ptr
  %568 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %567, i32 0, i32 2
  %569 = load volatile i32, ptr %568, align 4, !tbaa !14
  %570 = zext i32 %569 to i64
  %571 = and i64 %570, 1
  %572 = icmp eq i64 %571, 1
  br i1 %572, label %573, label %575

573:                                              ; preds = %563
  %574 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SuspendCallback(ptr noundef %574)
  br label %575

575:                                              ; preds = %573, %563
  %576 = load ptr, ptr %2, align 8, !tbaa !5
  %577 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %576, i32 0, i32 0
  %578 = load ptr, ptr %577, align 8, !tbaa !9
  %579 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %578, i32 0, i32 5
  %580 = load volatile i32, ptr %579, align 4, !tbaa !17
  %581 = zext i32 %580 to i64
  %582 = and i64 %581, 2048
  %583 = trunc i64 %582 to i32
  store volatile i32 %583, ptr %579, align 4, !tbaa !17
  br label %584

584:                                              ; preds = %575, %555
  %585 = load ptr, ptr %2, align 8, !tbaa !5
  %586 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %585, i32 0, i32 0
  %587 = load ptr, ptr %586, align 8, !tbaa !9
  %588 = call i32 @USB_ReadInterrupts(ptr noundef %587)
  %589 = zext i32 %588 to i64
  %590 = and i64 %589, 134217728
  %591 = icmp eq i64 %590, 134217728
  br i1 %591, label %592, label %623

592:                                              ; preds = %584
  %593 = load ptr, ptr %2, align 8, !tbaa !5
  %594 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %593, i32 0, i32 0
  %595 = load ptr, ptr %594, align 8, !tbaa !9
  %596 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %595, i32 0, i32 5
  %597 = load volatile i32, ptr %596, align 4, !tbaa !17
  %598 = zext i32 %597 to i64
  %599 = and i64 %598, 134217728
  %600 = trunc i64 %599 to i32
  store volatile i32 %600, ptr %596, align 4, !tbaa !17
  %601 = load ptr, ptr %2, align 8, !tbaa !5
  %602 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %601, i32 0, i32 9
  %603 = load i32, ptr %602, align 4, !tbaa !38
  %604 = icmp eq i32 %603, 0
  br i1 %604, label %605, label %620

605:                                              ; preds = %592
  %606 = load ptr, ptr %2, align 8, !tbaa !5
  %607 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %606, i32 0, i32 9
  store i32 1, ptr %607, align 4, !tbaa !38
  %608 = load ptr, ptr %2, align 8, !tbaa !5
  %609 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %608, i32 0, i32 0
  %610 = load ptr, ptr %609, align 8, !tbaa !9
  %611 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %610, i32 0, i32 20
  %612 = load volatile i32, ptr %611, align 4, !tbaa !39
  %613 = zext i32 %612 to i64
  %614 = and i64 %613, 60
  %615 = lshr i64 %614, 2
  %616 = trunc i64 %615 to i32
  %617 = load ptr, ptr %2, align 8, !tbaa !5
  %618 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %617, i32 0, i32 10
  store i32 %616, ptr %618, align 8, !tbaa !40
  %619 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCDEx_LPM_Callback(ptr noundef %619, i32 noundef 1)
  br label %622

620:                                              ; preds = %592
  %621 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SuspendCallback(ptr noundef %621)
  br label %622

622:                                              ; preds = %620, %605
  br label %623

623:                                              ; preds = %622, %584
  %624 = load ptr, ptr %2, align 8, !tbaa !5
  %625 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %624, i32 0, i32 0
  %626 = load ptr, ptr %625, align 8, !tbaa !9
  %627 = call i32 @USB_ReadInterrupts(ptr noundef %626)
  %628 = zext i32 %627 to i64
  %629 = and i64 %628, 4096
  %630 = icmp eq i64 %629, 4096
  br i1 %630, label %631, label %794

631:                                              ; preds = %623
  %632 = load i32, ptr %4, align 4, !tbaa !13
  %633 = zext i32 %632 to i64
  %634 = add i64 %633, 2048
  %635 = inttoptr i64 %634 to ptr
  %636 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %635, i32 0, i32 1
  %637 = load volatile i32, ptr %636, align 4, !tbaa !27
  %638 = zext i32 %637 to i64
  %639 = and i64 %638, -2
  %640 = trunc i64 %639 to i32
  store volatile i32 %640, ptr %636, align 4, !tbaa !27
  %641 = load ptr, ptr %2, align 8, !tbaa !5
  %642 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %641, i32 0, i32 0
  %643 = load ptr, ptr %642, align 8, !tbaa !9
  %644 = call i32 @USB_FlushTxFifo(ptr noundef %643, i32 noundef 16)
  store i32 0, ptr %6, align 4, !tbaa !13
  br label %645

645:                                              ; preds = %710, %631
  %646 = load i32, ptr %6, align 4, !tbaa !13
  %647 = load ptr, ptr %2, align 8, !tbaa !5
  %648 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %647, i32 0, i32 1
  %649 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %648, i32 0, i32 0
  %650 = load i32, ptr %649, align 8, !tbaa !41
  %651 = icmp ult i32 %646, %650
  br i1 %651, label %652, label %713

652:                                              ; preds = %645
  %653 = load i32, ptr %4, align 4, !tbaa !13
  %654 = zext i32 %653 to i64
  %655 = add i64 %654, 2304
  %656 = load i32, ptr %6, align 4, !tbaa !13
  %657 = zext i32 %656 to i64
  %658 = mul i64 %657, 32
  %659 = add i64 %655, %658
  %660 = inttoptr i64 %659 to ptr
  %661 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %660, i32 0, i32 2
  store volatile i32 64383, ptr %661, align 4, !tbaa !32
  %662 = load i32, ptr %4, align 4, !tbaa !13
  %663 = zext i32 %662 to i64
  %664 = add i64 %663, 2304
  %665 = load i32, ptr %6, align 4, !tbaa !13
  %666 = zext i32 %665 to i64
  %667 = mul i64 %666, 32
  %668 = add i64 %664, %667
  %669 = inttoptr i64 %668 to ptr
  %670 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %669, i32 0, i32 0
  %671 = load volatile i32, ptr %670, align 4, !tbaa !42
  %672 = zext i32 %671 to i64
  %673 = and i64 %672, -2097153
  %674 = trunc i64 %673 to i32
  store volatile i32 %674, ptr %670, align 4, !tbaa !42
  %675 = load i32, ptr %4, align 4, !tbaa !13
  %676 = zext i32 %675 to i64
  %677 = add i64 %676, 2816
  %678 = load i32, ptr %6, align 4, !tbaa !13
  %679 = zext i32 %678 to i64
  %680 = mul i64 %679, 32
  %681 = add i64 %677, %680
  %682 = inttoptr i64 %681 to ptr
  %683 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %682, i32 0, i32 2
  store volatile i32 64383, ptr %683, align 4, !tbaa !25
  %684 = load i32, ptr %4, align 4, !tbaa !13
  %685 = zext i32 %684 to i64
  %686 = add i64 %685, 2816
  %687 = load i32, ptr %6, align 4, !tbaa !13
  %688 = zext i32 %687 to i64
  %689 = mul i64 %688, 32
  %690 = add i64 %686, %689
  %691 = inttoptr i64 %690 to ptr
  %692 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %691, i32 0, i32 0
  %693 = load volatile i32, ptr %692, align 4, !tbaa !43
  %694 = zext i32 %693 to i64
  %695 = and i64 %694, -2097153
  %696 = trunc i64 %695 to i32
  store volatile i32 %696, ptr %692, align 4, !tbaa !43
  %697 = load i32, ptr %4, align 4, !tbaa !13
  %698 = zext i32 %697 to i64
  %699 = add i64 %698, 2816
  %700 = load i32, ptr %6, align 4, !tbaa !13
  %701 = zext i32 %700 to i64
  %702 = mul i64 %701, 32
  %703 = add i64 %699, %702
  %704 = inttoptr i64 %703 to ptr
  %705 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %704, i32 0, i32 0
  %706 = load volatile i32, ptr %705, align 4, !tbaa !43
  %707 = zext i32 %706 to i64
  %708 = or i64 %707, 134217728
  %709 = trunc i64 %708 to i32
  store volatile i32 %709, ptr %705, align 4, !tbaa !43
  br label %710

710:                                              ; preds = %652
  %711 = load i32, ptr %6, align 4, !tbaa !13
  %712 = add i32 %711, 1
  store i32 %712, ptr %6, align 4, !tbaa !13
  br label %645, !llvm.loop !44

713:                                              ; preds = %645
  %714 = load i32, ptr %4, align 4, !tbaa !13
  %715 = zext i32 %714 to i64
  %716 = add i64 %715, 2048
  %717 = inttoptr i64 %716 to ptr
  %718 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %717, i32 0, i32 7
  %719 = load volatile i32, ptr %718, align 4, !tbaa !45
  %720 = or i32 %719, 65537
  store volatile i32 %720, ptr %718, align 4, !tbaa !45
  %721 = load ptr, ptr %2, align 8, !tbaa !5
  %722 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %721, i32 0, i32 1
  %723 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %722, i32 0, i32 11
  %724 = load i32, ptr %723, align 4, !tbaa !46
  %725 = icmp ne i32 %724, 0
  br i1 %725, label %726, label %745

726:                                              ; preds = %713
  %727 = load i32, ptr %4, align 4, !tbaa !13
  %728 = zext i32 %727 to i64
  %729 = add i64 %728, 2048
  %730 = inttoptr i64 %729 to ptr
  %731 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %730, i32 0, i32 19
  %732 = load volatile i32, ptr %731, align 4, !tbaa !47
  %733 = zext i32 %732 to i64
  %734 = or i64 %733, 11
  %735 = trunc i64 %734 to i32
  store volatile i32 %735, ptr %731, align 4, !tbaa !47
  %736 = load i32, ptr %4, align 4, !tbaa !13
  %737 = zext i32 %736 to i64
  %738 = add i64 %737, 2048
  %739 = inttoptr i64 %738 to ptr
  %740 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %739, i32 0, i32 17
  %741 = load volatile i32, ptr %740, align 4, !tbaa !48
  %742 = zext i32 %741 to i64
  %743 = or i64 %742, 11
  %744 = trunc i64 %743 to i32
  store volatile i32 %744, ptr %740, align 4, !tbaa !48
  br label %764

745:                                              ; preds = %713
  %746 = load i32, ptr %4, align 4, !tbaa !13
  %747 = zext i32 %746 to i64
  %748 = add i64 %747, 2048
  %749 = inttoptr i64 %748 to ptr
  %750 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %749, i32 0, i32 5
  %751 = load volatile i32, ptr %750, align 4, !tbaa !49
  %752 = zext i32 %751 to i64
  %753 = or i64 %752, 8235
  %754 = trunc i64 %753 to i32
  store volatile i32 %754, ptr %750, align 4, !tbaa !49
  %755 = load i32, ptr %4, align 4, !tbaa !13
  %756 = zext i32 %755 to i64
  %757 = add i64 %756, 2048
  %758 = inttoptr i64 %757 to ptr
  %759 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %758, i32 0, i32 4
  %760 = load volatile i32, ptr %759, align 4, !tbaa !50
  %761 = zext i32 %760 to i64
  %762 = or i64 %761, 11
  %763 = trunc i64 %762 to i32
  store volatile i32 %763, ptr %759, align 4, !tbaa !50
  br label %764

764:                                              ; preds = %745, %726
  %765 = load i32, ptr %4, align 4, !tbaa !13
  %766 = zext i32 %765 to i64
  %767 = add i64 %766, 2048
  %768 = inttoptr i64 %767 to ptr
  %769 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %768, i32 0, i32 0
  %770 = load volatile i32, ptr %769, align 4, !tbaa !51
  %771 = zext i32 %770 to i64
  %772 = and i64 %771, -2033
  %773 = trunc i64 %772 to i32
  store volatile i32 %773, ptr %769, align 4, !tbaa !51
  %774 = load ptr, ptr %2, align 8, !tbaa !5
  %775 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %774, i32 0, i32 0
  %776 = load ptr, ptr %775, align 8, !tbaa !9
  %777 = load ptr, ptr %2, align 8, !tbaa !5
  %778 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %777, i32 0, i32 1
  %779 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %778, i32 0, i32 2
  %780 = load i32, ptr %779, align 8, !tbaa !34
  %781 = trunc i32 %780 to i8
  %782 = load ptr, ptr %2, align 8, !tbaa !5
  %783 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %782, i32 0, i32 8
  %784 = getelementptr inbounds [12 x i32], ptr %783, i64 0, i64 0
  %785 = call i32 @USB_EP0_OutStart(ptr noundef %776, i8 noundef zeroext %781, ptr noundef %784)
  %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 !17
  %791 = zext i32 %790 to i64
  %792 = and i64 %791, 4096
  %793 = trunc i64 %792 to i32
  store volatile i32 %793, ptr %789, align 4, !tbaa !17
  br label %794

794:                                              ; preds = %764, %623
  %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, 8192
  %801 = icmp eq i64 %800, 8192
  br i1 %801, label %802, label %834

802:                                              ; preds = %794
  %803 = load ptr, ptr %2, align 8, !tbaa !5
  %804 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %803, i32 0, i32 0
  %805 = load ptr, ptr %804, align 8, !tbaa !9
  %806 = call i32 @USB_ActivateSetup(ptr noundef %805)
  %807 = load ptr, ptr %2, align 8, !tbaa !5
  %808 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %807, i32 0, i32 0
  %809 = load ptr, ptr %808, align 8, !tbaa !9
  %810 = call zeroext i8 @USB_GetDevSpeed(ptr noundef %809)
  %811 = zext i8 %810 to i32
  %812 = load ptr, ptr %2, align 8, !tbaa !5
  %813 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %812, i32 0, i32 1
  %814 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %813, i32 0, i32 3
  store i32 %811, ptr %814, align 4, !tbaa !52
  %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 @HAL_RCC_GetHCLKFreq()
  %819 = load ptr, ptr %2, align 8, !tbaa !5
  %820 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %819, i32 0, i32 1
  %821 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %820, i32 0, i32 3
  %822 = load i32, ptr %821, align 4, !tbaa !52
  %823 = trunc i32 %822 to i8
  %824 = call i32 @USB_SetTurnaroundTime(ptr noundef %817, i32 noundef %818, i8 noundef zeroext %823)
  %825 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ResetCallback(ptr noundef %825)
  %826 = load ptr, ptr %2, align 8, !tbaa !5
  %827 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %826, i32 0, i32 0
  %828 = load ptr, ptr %827, align 8, !tbaa !9
  %829 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %828, i32 0, i32 5
  %830 = load volatile i32, ptr %829, align 4, !tbaa !17
  %831 = zext i32 %830 to i64
  %832 = and i64 %831, 8192
  %833 = trunc i64 %832 to i32
  store volatile i32 %833, ptr %829, align 4, !tbaa !17
  br label %834

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

842:                                              ; preds = %834
  %843 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SOFCallback(ptr noundef %843)
  %844 = load ptr, ptr %2, align 8, !tbaa !5
  %845 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %844, i32 0, i32 0
  %846 = load ptr, ptr %845, align 8, !tbaa !9
  %847 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %846, i32 0, i32 5
  %848 = load volatile i32, ptr %847, align 4, !tbaa !17
  %849 = zext i32 %848 to i64
  %850 = and i64 %849, 8
  %851 = trunc i64 %850 to i32
  store volatile i32 %851, ptr %847, align 4, !tbaa !17
  br label %852

852:                                              ; preds = %842, %834
  %853 = load ptr, ptr %2, align 8, !tbaa !5
  %854 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %853, i32 0, i32 0
  %855 = load ptr, ptr %854, align 8, !tbaa !9
  %856 = call i32 @USB_ReadInterrupts(ptr noundef %855)
  %857 = zext i32 %856 to i64
  %858 = and i64 %857, 128
  %859 = icmp eq i64 %858, 128
  br i1 %859, label %860, label %894

860:                                              ; preds = %852
  %861 = load ptr, ptr %3, align 8, !tbaa !5
  %862 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %861, i32 0, i32 6
  %863 = load volatile i32, ptr %862, align 4, !tbaa !19
  %864 = zext i32 %863 to i64
  %865 = and i64 %864, -129
  %866 = trunc i64 %865 to i32
  store volatile i32 %866, ptr %862, align 4, !tbaa !19
  store i32 1, ptr %9, align 4, !tbaa !13
  br label %867

867:                                              ; preds = %890, %860
  %868 = load i32, ptr %9, align 4, !tbaa !13
  %869 = load ptr, ptr %2, align 8, !tbaa !5
  %870 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %869, i32 0, i32 1
  %871 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %870, i32 0, i32 0
  %872 = load i32, ptr %871, align 8, !tbaa !41
  %873 = icmp ult i32 %868, %872
  br i1 %873, label %874, label %893

874:                                              ; preds = %867
  %875 = load ptr, ptr %2, align 8, !tbaa !5
  %876 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %875, i32 0, i32 4
  %877 = load i32, ptr %9, align 4, !tbaa !13
  %878 = zext i32 %877 to i64
  %879 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %876, i64 0, i64 %878
  %880 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %879, i32 0, i32 3
  %881 = load i8, ptr %880, align 1, !tbaa !28
  %882 = zext i8 %881 to i32
  %883 = icmp eq i32 %882, 1
  br i1 %883, label %884, label %889

884:                                              ; preds = %874
  %885 = load ptr, ptr %2, align 8, !tbaa !5
  %886 = load i32, ptr %9, align 4, !tbaa !13
  %887 = trunc i32 %886 to i8
  %888 = call i32 @HAL_PCD_EP_Abort(ptr noundef %885, i8 noundef zeroext %887)
  br label %889

889:                                              ; preds = %884, %874
  br label %890

890:                                              ; preds = %889
  %891 = load i32, ptr %9, align 4, !tbaa !13
  %892 = add i32 %891, 1
  store i32 %892, ptr %9, align 4, !tbaa !13
  br label %867, !llvm.loop !53

893:                                              ; preds = %867
  br label %894

894:                                              ; preds = %893, %852
  %895 = load ptr, ptr %2, align 8, !tbaa !5
  %896 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %895, i32 0, i32 0
  %897 = load ptr, ptr %896, align 8, !tbaa !9
  %898 = call i32 @USB_ReadInterrupts(ptr noundef %897)
  %899 = zext i32 %898 to i64
  %900 = and i64 %899, 1048576
  %901 = icmp eq i64 %900, 1048576
  br i1 %901, label %902, label %960

902:                                              ; preds = %894
  store i32 1, ptr %9, align 4, !tbaa !13
  br label %903

903:                                              ; preds = %948, %902
  %904 = load i32, ptr %9, align 4, !tbaa !13
  %905 = load ptr, ptr %2, align 8, !tbaa !5
  %906 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %905, i32 0, i32 1
  %907 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %906, i32 0, i32 0
  %908 = load i32, ptr %907, align 8, !tbaa !41
  %909 = icmp ult i32 %904, %908
  br i1 %909, label %910, label %951

910:                                              ; preds = %903
  %911 = load i32, ptr %4, align 4, !tbaa !13
  %912 = zext i32 %911 to i64
  %913 = add i64 %912, 2304
  %914 = load i32, ptr %9, align 4, !tbaa !13
  %915 = zext i32 %914 to i64
  %916 = mul i64 %915, 32
  %917 = add i64 %913, %916
  %918 = inttoptr i64 %917 to ptr
  %919 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %918, i32 0, i32 0
  %920 = load volatile i32, ptr %919, align 4, !tbaa !42
  store i32 %920, ptr %11, align 4, !tbaa !13
  %921 = load ptr, ptr %2, align 8, !tbaa !5
  %922 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %921, i32 0, i32 3
  %923 = load i32, ptr %9, align 4, !tbaa !13
  %924 = zext i32 %923 to i64
  %925 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %922, i64 0, i64 %924
  %926 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %925, i32 0, i32 4
  %927 = load i8, ptr %926, align 4, !tbaa !54
  %928 = zext i8 %927 to i32
  %929 = icmp eq i32 %928, 1
  br i1 %929, label %930, label %947

930:                                              ; preds = %910
  %931 = load i32, ptr %11, align 4, !tbaa !13
  %932 = zext i32 %931 to i64
  %933 = and i64 %932, 2147483648
  %934 = icmp eq i64 %933, 2147483648
  br i1 %934, label %935, label %947

935:                                              ; preds = %930
  %936 = load ptr, ptr %2, align 8, !tbaa !5
  %937 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %936, i32 0, i32 3
  %938 = load i32, ptr %9, align 4, !tbaa !13
  %939 = zext i32 %938 to i64
  %940 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %937, i64 0, i64 %939
  %941 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %940, i32 0, i32 3
  store i8 1, ptr %941, align 1, !tbaa !28
  %942 = load ptr, ptr %2, align 8, !tbaa !5
  %943 = load i32, ptr %9, align 4, !tbaa !13
  %944 = or i32 %943, 128
  %945 = trunc i32 %944 to i8
  %946 = call i32 @HAL_PCD_EP_Abort(ptr noundef %942, i8 noundef zeroext %945)
  br label %947

947:                                              ; preds = %935, %930, %910
  br label %948

948:                                              ; preds = %947
  %949 = load i32, ptr %9, align 4, !tbaa !13
  %950 = add i32 %949, 1
  store i32 %950, ptr %9, align 4, !tbaa !13
  br label %903, !llvm.loop !55

951:                                              ; preds = %903
  %952 = load ptr, ptr %2, align 8, !tbaa !5
  %953 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %952, i32 0, i32 0
  %954 = load ptr, ptr %953, align 8, !tbaa !9
  %955 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %954, i32 0, i32 5
  %956 = load volatile i32, ptr %955, align 4, !tbaa !17
  %957 = zext i32 %956 to i64
  %958 = and i64 %957, 1048576
  %959 = trunc i64 %958 to i32
  store volatile i32 %959, ptr %955, align 4, !tbaa !17
  br label %960

960:                                              ; preds = %951, %894
  %961 = load ptr, ptr %2, align 8, !tbaa !5
  %962 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %961, i32 0, i32 0
  %963 = load ptr, ptr %962, align 8, !tbaa !9
  %964 = call i32 @USB_ReadInterrupts(ptr noundef %963)
  %965 = zext i32 %964 to i64
  %966 = and i64 %965, 2097152
  %967 = icmp eq i64 %966, 2097152
  br i1 %967, label %968, label %1052

968:                                              ; preds = %960
  store i32 1, ptr %9, align 4, !tbaa !13
  br label %969

969:                                              ; preds = %1040, %968
  %970 = load i32, ptr %9, align 4, !tbaa !13
  %971 = load ptr, ptr %2, align 8, !tbaa !5
  %972 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %971, i32 0, i32 1
  %973 = getelementptr inbounds %struct.USB_CfgTypeDef, ptr %972, i32 0, i32 0
  %974 = load i32, ptr %973, align 8, !tbaa !41
  %975 = icmp ult i32 %970, %974
  br i1 %975, label %976, label %1043

976:                                              ; preds = %969
  %977 = load i32, ptr %4, align 4, !tbaa !13
  %978 = zext i32 %977 to i64
  %979 = add i64 %978, 2816
  %980 = load i32, ptr %9, align 4, !tbaa !13
  %981 = zext i32 %980 to i64
  %982 = mul i64 %981, 32
  %983 = add i64 %979, %982
  %984 = inttoptr i64 %983 to ptr
  %985 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %984, i32 0, i32 0
  %986 = load volatile i32, ptr %985, align 4, !tbaa !43
  store i32 %986, ptr %11, align 4, !tbaa !13
  %987 = load ptr, ptr %2, align 8, !tbaa !5
  %988 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %987, i32 0, i32 4
  %989 = load i32, ptr %9, align 4, !tbaa !13
  %990 = zext i32 %989 to i64
  %991 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %988, i64 0, i64 %990
  %992 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %991, i32 0, i32 4
  %993 = load i8, ptr %992, align 4, !tbaa !54
  %994 = zext i8 %993 to i32
  %995 = icmp eq i32 %994, 1
  br i1 %995, label %996, label %1039

996:                                              ; preds = %976
  %997 = load i32, ptr %11, align 4, !tbaa !13
  %998 = zext i32 %997 to i64
  %999 = and i64 %998, 2147483648
  %1000 = icmp eq i64 %999, 2147483648
  br i1 %1000, label %1001, label %1039

1001:                                             ; preds = %996
  %1002 = load i32, ptr %11, align 4, !tbaa !13
  %1003 = and i32 %1002, 65536
  %1004 = load ptr, ptr %2, align 8, !tbaa !5
  %1005 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1004, i32 0, i32 11
  %1006 = load i32, ptr %1005, align 4, !tbaa !16
  %1007 = and i32 %1006, 1
  %1008 = icmp eq i32 %1003, %1007
  br i1 %1008, label %1009, label %1039

1009:                                             ; preds = %1001
  %1010 = load ptr, ptr %2, align 8, !tbaa !5
  %1011 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1010, i32 0, i32 4
  %1012 = load i32, ptr %9, align 4, !tbaa !13
  %1013 = zext i32 %1012 to i64
  %1014 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %1011, i64 0, i64 %1013
  %1015 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %1014, i32 0, i32 3
  store i8 1, ptr %1015, align 1, !tbaa !28
  %1016 = load ptr, ptr %3, align 8, !tbaa !5
  %1017 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %1016, i32 0, i32 6
  %1018 = load volatile i32, ptr %1017, align 4, !tbaa !19
  %1019 = zext i32 %1018 to i64
  %1020 = or i64 %1019, 128
  %1021 = trunc i64 %1020 to i32
  store volatile i32 %1021, ptr %1017, align 4, !tbaa !19
  %1022 = load ptr, ptr %3, align 8, !tbaa !5
  %1023 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %1022, i32 0, i32 5
  %1024 = load volatile i32, ptr %1023, align 4, !tbaa !17
  %1025 = zext i32 %1024 to i64
  %1026 = and i64 %1025, 128
  %1027 = icmp eq i64 %1026, 0
  br i1 %1027, label %1028, label %1038

1028:                                             ; preds = %1009
  %1029 = load i32, ptr %4, align 4, !tbaa !13
  %1030 = zext i32 %1029 to i64
  %1031 = add i64 %1030, 2048
  %1032 = inttoptr i64 %1031 to ptr
  %1033 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %1032, i32 0, i32 1
  %1034 = load volatile i32, ptr %1033, align 4, !tbaa !27
  %1035 = zext i32 %1034 to i64
  %1036 = or i64 %1035, 512
  %1037 = trunc i64 %1036 to i32
  store volatile i32 %1037, ptr %1033, align 4, !tbaa !27
  br label %1043

1038:                                             ; preds = %1009
  br label %1039

1039:                                             ; preds = %1038, %1001, %996, %976
  br label %1040

1040:                                             ; preds = %1039
  %1041 = load i32, ptr %9, align 4, !tbaa !13
  %1042 = add i32 %1041, 1
  store i32 %1042, ptr %9, align 4, !tbaa !13
  br label %969, !llvm.loop !56

1043:                                             ; preds = %1028, %969
  %1044 = load ptr, ptr %2, align 8, !tbaa !5
  %1045 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1044, i32 0, i32 0
  %1046 = load ptr, ptr %1045, align 8, !tbaa !9
  %1047 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %1046, i32 0, i32 5
  %1048 = load volatile i32, ptr %1047, align 4, !tbaa !17
  %1049 = zext i32 %1048 to i64
  %1050 = and i64 %1049, 2097152
  %1051 = trunc i64 %1050 to i32
  store volatile i32 %1051, ptr %1047, align 4, !tbaa !17
  br label %1052

1052:                                             ; preds = %1043, %960
  %1053 = load ptr, ptr %2, align 8, !tbaa !5
  %1054 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1053, i32 0, i32 0
  %1055 = load ptr, ptr %1054, align 8, !tbaa !9
  %1056 = call i32 @USB_ReadInterrupts(ptr noundef %1055)
  %1057 = zext i32 %1056 to i64
  %1058 = and i64 %1057, 1073741824
  %1059 = icmp eq i64 %1058, 1073741824
  br i1 %1059, label %1060, label %1070

1060:                                             ; preds = %1052
  %1061 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ConnectCallback(ptr noundef %1061)
  %1062 = load ptr, ptr %2, align 8, !tbaa !5
  %1063 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1062, i32 0, i32 0
  %1064 = load ptr, ptr %1063, align 8, !tbaa !9
  %1065 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %1064, i32 0, i32 5
  %1066 = load volatile i32, ptr %1065, align 4, !tbaa !17
  %1067 = zext i32 %1066 to i64
  %1068 = and i64 %1067, 1073741824
  %1069 = trunc i64 %1068 to i32
  store volatile i32 %1069, ptr %1065, align 4, !tbaa !17
  br label %1070

1070:                                             ; preds = %1060, %1052
  %1071 = load ptr, ptr %2, align 8, !tbaa !5
  %1072 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1071, i32 0, i32 0
  %1073 = load ptr, ptr %1072, align 8, !tbaa !9
  %1074 = call i32 @USB_ReadInterrupts(ptr noundef %1073)
  %1075 = zext i32 %1074 to i64
  %1076 = and i64 %1075, 4
  %1077 = icmp eq i64 %1076, 4
  br i1 %1077, label %1078, label %1098

1078:                                             ; preds = %1070
  %1079 = load ptr, ptr %2, align 8, !tbaa !5
  %1080 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1079, i32 0, i32 0
  %1081 = load ptr, ptr %1080, align 8, !tbaa !9
  %1082 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %1081, i32 0, i32 1
  %1083 = load volatile i32, ptr %1082, align 4, !tbaa !57
  store i32 %1083, ptr %11, align 4, !tbaa !13
  %1084 = load i32, ptr %11, align 4, !tbaa !13
  %1085 = zext i32 %1084 to i64
  %1086 = and i64 %1085, 4
  %1087 = icmp eq i64 %1086, 4
  br i1 %1087, label %1088, label %1090

1088:                                             ; preds = %1078
  %1089 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_DisconnectCallback(ptr noundef %1089)
  br label %1090

1090:                                             ; preds = %1088, %1078
  %1091 = load i32, ptr %11, align 4, !tbaa !13
  %1092 = load ptr, ptr %2, align 8, !tbaa !5
  %1093 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %1092, i32 0, i32 0
  %1094 = load ptr, ptr %1093, align 8, !tbaa !9
  %1095 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %1094, i32 0, i32 1
  %1096 = load volatile i32, ptr %1095, align 4, !tbaa !57
  %1097 = or i32 %1096, %1091
  store volatile i32 %1097, ptr %1095, align 4, !tbaa !57
  br label %1098

1098:                                             ; preds = %1090, %1070
  br label %1099

1099:                                             ; preds = %1098, %1
  store i32 0, ptr %12, align 4
  br label %1100

1100:                                             ; preds = %1099, %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
  %1101 = load i32, ptr %12, align 4
  switch i32 %1101, label %1103 [
    i32 0, label %1102
    i32 1, label %1102
  ]

1102:                                             ; preds = %1100, %1100
  ret void

1103:                                             ; preds = %1100
  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

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef, i8 noundef zeroext) #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 dso_local void @HAL_PCD_ISOINIncompleteCallback(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 i32 @HAL_PCD_EP_Abort(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 832, !12, i64 1600, !12, i64 1604, !12, i64 1608, !7, i64 1612, !12, i64 1660, !12, i64 1664, !12, i64 1668, !12, i64 1672, !12, i64 1676, !6, i64 1680}
!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 8}
!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, !12, i64 48, !12, i64 52, !12, i64 56, !12, i64 60, !12, i64 64, !12, i64 68, !7, i64 72, !12, i64 132}
!16 = !{!10, !12, i64 1668}
!17 = !{!18, !12, i64 20}
!18 = !{!"", !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}
!19 = !{!18, !12, i64 24}
!20 = !{!18, !12, i64 32}
!21 = !{!22, !6, i64 16}
!22 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5, !12, i64 8, !6, i64 16, !12, i64 24, !12, i64 28, !7, i64 32, !23, i64 34, !12, i64 36, !12, i64 40}
!23 = !{!"short", !7, i64 0}
!24 = !{!22, !12, i64 28}
!25 = !{!26, !12, i64 8}
!26 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !7, i64 24}
!27 = !{!15, !12, i64 4}
!28 = !{!22, !7, i64 3}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!15, !12, i64 52}
!32 = !{!33, !12, i64 8}
!33 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28}
!34 = !{!10, !12, i64 16}
!35 = !{!22, !12, i64 8}
!36 = !{!22, !12, i64 24}
!37 = distinct !{!37, !30}
!38 = !{!10, !12, i64 1660}
!39 = !{!18, !12, i64 84}
!40 = !{!10, !12, i64 1664}
!41 = !{!10, !12, i64 8}
!42 = !{!33, !12, i64 0}
!43 = !{!26, !12, i64 0}
!44 = distinct !{!44, !30}
!45 = !{!15, !12, i64 28}
!46 = !{!10, !12, i64 52}
!47 = !{!15, !12, i64 132}
!48 = !{!15, !12, i64 68}
!49 = !{!15, !12, i64 20}
!50 = !{!15, !12, i64 16}
!51 = !{!15, !12, i64 0}
!52 = !{!10, !12, i64 20}
!53 = distinct !{!53, !30}
!54 = !{!22, !7, i64 4}
!55 = distinct !{!55, !30}
!56 = distinct !{!56, !30}
!57 = !{!18, !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_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i32, ptr, i32, i32, i8, i16, 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 %527

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 %527, label %10

10:                                               ; preds = %6
  %11 = and i64 %3, 4294967295
  %12 = add nuw nsw i64 %11, 2048
  %13 = inttoptr i64 %12 to ptr
  %14 = getelementptr inbounds i8, ptr %13, i64 8
  %15 = load volatile i32, ptr %14, align 4, !tbaa !12
  %16 = lshr i32 %15, 8
  %17 = and i32 %16, 16383
  %18 = getelementptr inbounds i8, ptr %0, i64 1668
  store i32 %17, ptr %18, align 4, !tbaa !14
  %19 = load ptr, ptr %0, align 8, !tbaa !5
  %20 = tail call i32 @USB_ReadInterrupts(ptr noundef %19) #2
  %21 = and i32 %20, 2
  %.not = icmp eq i32 %21, 0
  %.pre = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not, label %26, label %22

22:                                               ; preds = %10
  %23 = getelementptr inbounds i8, ptr %.pre, i64 20
  %24 = load volatile i32, ptr %23, align 4, !tbaa !15
  %25 = and i32 %24, 2
  store volatile i32 %25, ptr %23, align 4, !tbaa !15
  br label %26

26:                                               ; preds = %22, %10
  %27 = tail call i32 @USB_ReadInterrupts(ptr noundef %.pre) #2
  %28 = and i32 %27, 16
  %.not225 = icmp eq i32 %28, 0
  %.pre304 = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not225, label %68, label %29

29:                                               ; preds = %26
  %30 = getelementptr inbounds i8, ptr %.pre304, i64 24
  %31 = load volatile i32, ptr %30, align 4, !tbaa !17
  %32 = and i32 %31, -17
  store volatile i32 %32, ptr %30, align 4, !tbaa !17
  %33 = getelementptr inbounds i8, ptr %2, i64 32
  %34 = load volatile i32, ptr %33, align 4, !tbaa !18
  %35 = getelementptr inbounds i8, ptr %0, i64 832
  %36 = zext i32 %34 to i64
  %37 = and i64 %36, 15
  %38 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %35, i64 0, i64 %37
  %39 = lshr i64 %36, 17
  %40 = and i64 %39, 15
  switch i64 %40, label %63 [
    i64 2, label %41
    i64 6, label %55
  ]

41:                                               ; preds = %29
  %42 = and i64 %36, 32752
  %.not226 = icmp eq i64 %42, 0
  br i1 %.not226, label %63, label %43

43:                                               ; preds = %41
  %44 = getelementptr inbounds i8, ptr %38, i64 16
  %45 = load ptr, ptr %44, align 8, !tbaa !19
  %46 = lshr exact i64 %42, 4
  %47 = trunc nuw nsw i64 %46 to i16
  %48 = tail call ptr @USB_ReadPacket(ptr noundef nonnull %2, ptr noundef %45, i16 noundef zeroext %47) #2
  %49 = load ptr, ptr %44, align 8, !tbaa !19
  %50 = getelementptr inbounds i8, ptr %49, i64 %46
  store ptr %50, ptr %44, align 8, !tbaa !19
  %51 = getelementptr inbounds i8, ptr %38, i64 28
  %52 = load i32, ptr %51, align 4, !tbaa !22
  %53 = trunc nuw nsw i64 %46 to i32
  %54 = add i32 %52, %53
  store i32 %54, ptr %51, align 4, !tbaa !22
  br label %63

55:                                               ; preds = %29
  %56 = getelementptr inbounds i8, ptr %0, i64 1612
  %57 = tail call ptr @USB_ReadPacket(ptr noundef nonnull %2, ptr noundef nonnull %56, i16 noundef zeroext 8) #2
  %58 = lshr i32 %34, 4
  %59 = and i32 %58, 2047
  %60 = getelementptr inbounds i8, ptr %38, i64 28
  %61 = load i32, ptr %60, align 4, !tbaa !22
  %62 = add i32 %61, %59
  store i32 %62, ptr %60, align 4, !tbaa !22
  br label %63

63:                                               ; preds = %29, %55, %41, %43
  %64 = load ptr, ptr %0, align 8, !tbaa !5
  %65 = getelementptr inbounds i8, ptr %64, i64 24
  %66 = load volatile i32, ptr %65, align 4, !tbaa !17
  %67 = or i32 %66, 16
  store volatile i32 %67, ptr %65, align 4, !tbaa !17
  br label %68

68:                                               ; preds = %63, %26
  %69 = phi ptr [ %64, %63 ], [ %.pre304, %26 ]
  %70 = tail call i32 @USB_ReadInterrupts(ptr noundef %69) #2
  %71 = and i32 %70, 524288
  %.not227 = icmp eq i32 %71, 0
  br i1 %.not227, label %.loopexit266, label %72

72:                                               ; preds = %68
  %73 = load ptr, ptr %0, align 8, !tbaa !5
  %74 = tail call i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef %73) #2
  %.not228267 = icmp eq i32 %74, 0
  br i1 %.not228267, label %.loopexit266, label %.lr.ph

.lr.ph:                                           ; preds = %72
  %75 = add nuw nsw i64 %11, 2816
  %76 = getelementptr inbounds i8, ptr %2, i64 20
  %77 = getelementptr inbounds i8, ptr %13, i64 4
  %78 = getelementptr inbounds i8, ptr %0, i64 832
  br label %79

79:                                               ; preds = %.lr.ph, %141
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %141 ]
  %.0220268 = phi i32 [ %74, %.lr.ph ], [ %142, %141 ]
  %80 = and i32 %.0220268, 1
  %.not254 = icmp eq i32 %80, 0
  br i1 %.not254, label %141, label %81

81:                                               ; preds = %79
  %82 = load ptr, ptr %0, align 8, !tbaa !5
  %83 = trunc nuw nsw i64 %indvars.iv to i32
  %84 = trunc i64 %indvars.iv to i8
  %85 = tail call i32 @USB_ReadDevOutEPInterrupt(ptr noundef %82, i8 noundef zeroext %84) #2
  %86 = zext i32 %85 to i64
  %87 = and i64 %86, 1
  %.not255 = icmp eq i64 %87, 0
  br i1 %.not255, label %94, label %88

88:                                               ; preds = %81
  %89 = shl nuw nsw i64 %indvars.iv, 5
  %90 = add nuw nsw i64 %75, %89
  %91 = inttoptr i64 %90 to ptr
  %92 = getelementptr inbounds i8, ptr %91, i64 8
  store volatile i32 1, ptr %92, align 4, !tbaa !23
  %93 = tail call i32 @PCD_EP_OutXfrComplete_int(ptr noundef nonnull %0, i32 noundef %83)
  br label %94

94:                                               ; preds = %88, %81
  %95 = and i64 %86, 8
  %.not256 = icmp eq i64 %95, 0
  br i1 %.not256, label %102, label %96

96:                                               ; preds = %94
  %97 = shl nuw nsw i64 %indvars.iv, 5
  %98 = add nuw nsw i64 %75, %97
  %99 = inttoptr i64 %98 to ptr
  %100 = getelementptr inbounds i8, ptr %99, i64 8
  store volatile i32 8, ptr %100, align 4, !tbaa !23
  %101 = tail call i32 @PCD_EP_OutSetupPacket_int(ptr noundef nonnull %0, i32 noundef %83)
  br label %102

102:                                              ; preds = %96, %94
  %103 = and i64 %86, 16
  %.not257 = icmp eq i64 %103, 0
  br i1 %.not257, label %109, label %104

104:                                              ; preds = %102
  %105 = shl nuw nsw i64 %indvars.iv, 5
  %106 = add nuw nsw i64 %75, %105
  %107 = inttoptr i64 %106 to ptr
  %108 = getelementptr inbounds i8, ptr %107, i64 8
  store volatile i32 16, ptr %108, align 4, !tbaa !23
  br label %109

109:                                              ; preds = %104, %102
  %110 = and i64 %86, 2
  %.not258 = icmp eq i64 %110, 0
  br i1 %.not258, label %127, label %111

111:                                              ; preds = %109
  %112 = load volatile i32, ptr %76, align 4, !tbaa !15
  %113 = and i32 %112, 128
  %.not259 = icmp eq i32 %113, 0
  br i1 %.not259, label %117, label %114

114:                                              ; preds = %111
  %115 = load volatile i32, ptr %77, align 4, !tbaa !25
  %116 = or i32 %115, 1024
  store volatile i32 %116, ptr %77, align 4, !tbaa !25
  br label %117

117:                                              ; preds = %114, %111
  %118 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %78, i64 0, i64 %indvars.iv, i32 3
  %119 = load i8, ptr %118, align 1, !tbaa !26
  %120 = icmp eq i8 %119, 1
  br i1 %120, label %121, label %122

121:                                              ; preds = %117
  store i8 0, ptr %118, align 1, !tbaa !26
  tail call void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext %84)
  br label %122

122:                                              ; preds = %121, %117
  %123 = shl nuw nsw i64 %indvars.iv, 5
  %124 = add nuw nsw i64 %75, %123
  %125 = inttoptr i64 %124 to ptr
  %126 = getelementptr inbounds i8, ptr %125, i64 8
  store volatile i32 2, ptr %126, align 4, !tbaa !23
  br label %127

127:                                              ; preds = %122, %109
  %128 = and i64 %86, 32
  %.not260 = icmp eq i64 %128, 0
  br i1 %.not260, label %134, label %129

129:                                              ; preds = %127
  %130 = shl nuw nsw i64 %indvars.iv, 5
  %131 = add nuw nsw i64 %75, %130
  %132 = inttoptr i64 %131 to ptr
  %133 = getelementptr inbounds i8, ptr %132, i64 8
  store volatile i32 32, ptr %133, align 4, !tbaa !23
  br label %134

134:                                              ; preds = %129, %127
  %135 = and i64 %86, 8192
  %.not261 = icmp eq i64 %135, 0
  br i1 %.not261, label %141, label %136

136:                                              ; preds = %134
  %137 = shl nuw nsw i64 %indvars.iv, 5
  %138 = add nuw nsw i64 %75, %137
  %139 = inttoptr i64 %138 to ptr
  %140 = getelementptr inbounds i8, ptr %139, i64 8
  store volatile i32 8192, ptr %140, align 4, !tbaa !23
  br label %141

141:                                              ; preds = %134, %136, %79
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %142 = lshr i32 %.0220268, 1
  %.not228 = icmp ult i32 %.0220268, 2
  br i1 %.not228, label %.loopexit266, label %79, !llvm.loop !27

.loopexit266:                                     ; preds = %141, %72, %68
  %143 = load ptr, ptr %0, align 8, !tbaa !5
  %144 = tail call i32 @USB_ReadInterrupts(ptr noundef %143) #2
  %145 = and i32 %144, 262144
  %.not229 = icmp eq i32 %145, 0
  br i1 %.not229, label %.loopexit265, label %146

146:                                              ; preds = %.loopexit266
  %147 = load ptr, ptr %0, align 8, !tbaa !5
  %148 = tail call i32 @USB_ReadDevAllInEpInterrupt(ptr noundef %147) #2
  %.not230270 = icmp eq i32 %148, 0
  br i1 %.not230270, label %.loopexit265, label %.lr.ph273

.lr.ph273:                                        ; preds = %146
  %149 = getelementptr inbounds i8, ptr %13, i64 52
  %150 = add nuw nsw i64 %11, 2304
  %151 = getelementptr inbounds i8, ptr %0, i64 16
  %152 = getelementptr inbounds i8, ptr %0, i64 64
  %153 = getelementptr inbounds i8, ptr %0, i64 1612
  %154 = and i32 %148, 1
  %.not247.peel = icmp eq i32 %154, 0
  br i1 %.not247.peel, label %211, label %155

155:                                              ; preds = %.lr.ph273
  %156 = load ptr, ptr %0, align 8, !tbaa !5
  %157 = tail call i32 @USB_ReadDevInEPInterrupt(ptr noundef %156, i8 noundef zeroext 0) #2
  %158 = zext i32 %157 to i64
  %159 = and i64 %158, 1
  %.not248.peel = icmp eq i64 %159, 0
  br i1 %.not248.peel, label %181, label %160

160:                                              ; preds = %155
  %161 = load volatile i32, ptr %149, align 4, !tbaa !29
  %162 = and i32 %161, -2
  store volatile i32 %162, ptr %149, align 4, !tbaa !29
  %163 = inttoptr i64 %150 to ptr
  %164 = getelementptr inbounds i8, ptr %163, i64 8
  store volatile i32 1, ptr %164, align 4, !tbaa !30
  %165 = load i32, ptr %151, align 8, !tbaa !32
  %166 = icmp eq i32 %165, 1
  br i1 %166, label %167, label %180

167:                                              ; preds = %160
  %168 = getelementptr inbounds i8, ptr %0, i64 72
  %169 = load i32, ptr %168, align 8, !tbaa !33
  %170 = getelementptr inbounds i8, ptr %0, i64 80
  %171 = load ptr, ptr %170, align 8, !tbaa !19
  %172 = zext i32 %169 to i64
  %173 = getelementptr inbounds i8, ptr %171, i64 %172
  store ptr %173, ptr %170, align 8, !tbaa !19
  %174 = getelementptr inbounds i8, ptr %0, i64 88
  %175 = load i32, ptr %174, align 8, !tbaa !34
  %176 = icmp eq i32 %175, 0
  br i1 %176, label %177, label %180

177:                                              ; preds = %167
  %178 = load ptr, ptr %0, align 8, !tbaa !5
  %179 = tail call i32 @USB_EP0_OutStart(ptr noundef %178, i8 noundef zeroext 1, ptr noundef nonnull %153) #2
  br label %180

180:                                              ; preds = %177, %167, %160
  tail call void @HAL_PCD_DataInStageCallback(ptr noundef nonnull %0, i8 noundef zeroext 0)
  br label %181

181:                                              ; preds = %180, %155
  %182 = and i64 %158, 8
  %.not249.peel = icmp eq i64 %182, 0
  br i1 %.not249.peel, label %186, label %183

183:                                              ; preds = %181
  %184 = inttoptr i64 %150 to ptr
  %185 = getelementptr inbounds i8, ptr %184, i64 8
  store volatile i32 8, ptr %185, align 4, !tbaa !30
  br label %186

186:                                              ; preds = %183, %181
  %187 = and i64 %158, 16
  %.not250.peel = icmp eq i64 %187, 0
  br i1 %.not250.peel, label %191, label %188

188:                                              ; preds = %186
  %189 = inttoptr i64 %150 to ptr
  %190 = getelementptr inbounds i8, ptr %189, i64 8
  store volatile i32 16, ptr %190, align 4, !tbaa !30
  br label %191

191:                                              ; preds = %188, %186
  %192 = and i64 %158, 64
  %.not251.peel = icmp eq i64 %192, 0
  br i1 %.not251.peel, label %196, label %193

193:                                              ; preds = %191
  %194 = inttoptr i64 %150 to ptr
  %195 = getelementptr inbounds i8, ptr %194, i64 8
  store volatile i32 64, ptr %195, align 4, !tbaa !30
  br label %196

196:                                              ; preds = %193, %191
  %197 = and i64 %158, 2
  %.not252.peel = icmp eq i64 %197, 0
  br i1 %.not252.peel, label %207, label %198

198:                                              ; preds = %196
  %199 = tail call i32 @USB_FlushTxFifo(ptr noundef %2, i32 noundef 0) #2
  %200 = getelementptr inbounds i8, ptr %0, i64 67
  %201 = load i8, ptr %200, align 1, !tbaa !26
  %202 = icmp eq i8 %201, 1
  br i1 %202, label %203, label %204

203:                                              ; preds = %198
  store i8 0, ptr %200, align 1, !tbaa !26
  tail call void @HAL_PCD_ISOINIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext 0)
  br label %204

204:                                              ; preds = %203, %198
  %205 = inttoptr i64 %150 to ptr
  %206 = getelementptr inbounds i8, ptr %205, i64 8
  store volatile i32 2, ptr %206, align 4, !tbaa !30
  br label %207

207:                                              ; preds = %204, %196
  %208 = and i64 %158, 128
  %.not253.peel = icmp eq i64 %208, 0
  br i1 %.not253.peel, label %211, label %209

209:                                              ; preds = %207
  %210 = tail call i32 @PCD_WriteEmptyTxFifo(ptr noundef nonnull %0, i32 noundef 0)
  br label %211

211:                                              ; preds = %209, %207, %.lr.ph273
  %.not230.peel = icmp eq i32 %148, 1
  br i1 %.not230.peel, label %.loopexit265, label %.peel.next

.peel.next:                                       ; preds = %211, %279
  %indvars.iv286 = phi i64 [ %indvars.iv.next287, %279 ], [ 1, %211 ]
  %.1221271.in = phi i32 [ %.1221271, %279 ], [ %148, %211 ]
  %.1221271 = lshr i32 %.1221271.in, 1
  %212 = and i32 %.1221271.in, 2
  %.not247 = icmp eq i32 %212, 0
  br i1 %.not247, label %279, label %213

213:                                              ; preds = %.peel.next
  %214 = load ptr, ptr %0, align 8, !tbaa !5
  %215 = trunc nuw nsw i64 %indvars.iv286 to i32
  %216 = trunc i64 %indvars.iv286 to i8
  %217 = tail call i32 @USB_ReadDevInEPInterrupt(ptr noundef %214, i8 noundef zeroext %216) #2
  %218 = zext i32 %217 to i64
  %219 = and i64 %218, 1
  %.not248 = icmp eq i64 %219, 0
  br i1 %.not248, label %241, label %220

220:                                              ; preds = %213
  %221 = and i32 %215, 15
  %222 = shl nuw nsw i32 1, %221
  %223 = xor i32 %222, -1
  %224 = load volatile i32, ptr %149, align 4, !tbaa !29
  %225 = and i32 %224, %223
  store volatile i32 %225, ptr %149, align 4, !tbaa !29
  %226 = shl nuw nsw i64 %indvars.iv286, 5
  %227 = add nuw nsw i64 %150, %226
  %228 = inttoptr i64 %227 to ptr
  %229 = getelementptr inbounds i8, ptr %228, i64 8
  store volatile i32 1, ptr %229, align 4, !tbaa !30
  %230 = load i32, ptr %151, align 8, !tbaa !32
  %231 = icmp eq i32 %230, 1
  br i1 %231, label %232, label %240

232:                                              ; preds = %220
  %233 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %152, i64 0, i64 %indvars.iv286
  %234 = getelementptr inbounds i8, ptr %233, i64 8
  %235 = load i32, ptr %234, align 8, !tbaa !33
  %236 = getelementptr inbounds i8, ptr %233, i64 16
  %237 = load ptr, ptr %236, align 8, !tbaa !19
  %238 = zext i32 %235 to i64
  %239 = getelementptr inbounds i8, ptr %237, i64 %238
  store ptr %239, ptr %236, align 8, !tbaa !19
  br label %240

240:                                              ; preds = %232, %220
  tail call void @HAL_PCD_DataInStageCallback(ptr noundef nonnull %0, i8 noundef zeroext %216)
  br label %241

241:                                              ; preds = %240, %213
  %242 = and i64 %218, 8
  %.not249 = icmp eq i64 %242, 0
  br i1 %.not249, label %248, label %243

243:                                              ; preds = %241
  %244 = shl nuw nsw i64 %indvars.iv286, 5
  %245 = add nuw nsw i64 %150, %244
  %246 = inttoptr i64 %245 to ptr
  %247 = getelementptr inbounds i8, ptr %246, i64 8
  store volatile i32 8, ptr %247, align 4, !tbaa !30
  br label %248

248:                                              ; preds = %243, %241
  %249 = and i64 %218, 16
  %.not250 = icmp eq i64 %249, 0
  br i1 %.not250, label %255, label %250

250:                                              ; preds = %248
  %251 = shl nuw nsw i64 %indvars.iv286, 5
  %252 = add nuw nsw i64 %150, %251
  %253 = inttoptr i64 %252 to ptr
  %254 = getelementptr inbounds i8, ptr %253, i64 8
  store volatile i32 16, ptr %254, align 4, !tbaa !30
  br label %255

255:                                              ; preds = %250, %248
  %256 = and i64 %218, 64
  %.not251 = icmp eq i64 %256, 0
  br i1 %.not251, label %262, label %257

257:                                              ; preds = %255
  %258 = shl nuw nsw i64 %indvars.iv286, 5
  %259 = add nuw nsw i64 %150, %258
  %260 = inttoptr i64 %259 to ptr
  %261 = getelementptr inbounds i8, ptr %260, i64 8
  store volatile i32 64, ptr %261, align 4, !tbaa !30
  br label %262

262:                                              ; preds = %257, %255
  %263 = and i64 %218, 2
  %.not252 = icmp eq i64 %263, 0
  br i1 %.not252, label %275, label %264

264:                                              ; preds = %262
  %265 = tail call i32 @USB_FlushTxFifo(ptr noundef %2, i32 noundef %215) #2
  %266 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %152, i64 0, i64 %indvars.iv286, i32 3
  %267 = load i8, ptr %266, align 1, !tbaa !26
  %268 = icmp eq i8 %267, 1
  br i1 %268, label %269, label %270

269:                                              ; preds = %264
  store i8 0, ptr %266, align 1, !tbaa !26
  tail call void @HAL_PCD_ISOINIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext %216)
  br label %270

270:                                              ; preds = %269, %264
  %271 = shl nuw nsw i64 %indvars.iv286, 5
  %272 = add nuw nsw i64 %150, %271
  %273 = inttoptr i64 %272 to ptr
  %274 = getelementptr inbounds i8, ptr %273, i64 8
  store volatile i32 2, ptr %274, align 4, !tbaa !30
  br label %275

275:                                              ; preds = %270, %262
  %276 = and i64 %218, 128
  %.not253 = icmp eq i64 %276, 0
  br i1 %.not253, label %279, label %277

277:                                              ; preds = %275
  %278 = tail call i32 @PCD_WriteEmptyTxFifo(ptr noundef nonnull %0, i32 noundef %215)
  br label %279

279:                                              ; preds = %275, %277, %.peel.next
  %indvars.iv.next287 = add nuw nsw i64 %indvars.iv286, 1
  %.not230 = icmp ult i32 %.1221271.in, 4
  br i1 %.not230, label %.loopexit265, label %.peel.next, !llvm.loop !35

.loopexit265:                                     ; preds = %279, %211, %146, %.loopexit266
  %280 = load ptr, ptr %0, align 8, !tbaa !5
  %281 = tail call i32 @USB_ReadInterrupts(ptr noundef %280) #2
  %.not231 = icmp sgt i32 %281, -1
  br i1 %.not231, label %.loopexit265._crit_edge, label %282

.loopexit265._crit_edge:                          ; preds = %.loopexit265
  %.pre307 = load ptr, ptr %0, align 8, !tbaa !5
  br label %296

282:                                              ; preds = %.loopexit265
  %283 = getelementptr inbounds i8, ptr %13, i64 4
  %284 = load volatile i32, ptr %283, align 4, !tbaa !25
  %285 = and i32 %284, -2
  store volatile i32 %285, ptr %283, align 4, !tbaa !25
  %286 = getelementptr inbounds i8, ptr %0, i64 1660
  %287 = load i32, ptr %286, align 4, !tbaa !37
  %288 = icmp eq i32 %287, 1
  br i1 %288, label %289, label %290

289:                                              ; preds = %282
  store i32 0, ptr %286, align 4, !tbaa !37
  tail call void @HAL_PCDEx_LPM_Callback(ptr noundef nonnull %0, i32 noundef 0) #2
  br label %291

290:                                              ; preds = %282
  tail call void @HAL_PCD_ResumeCallback(ptr noundef nonnull %0)
  br label %291

291:                                              ; preds = %290, %289
  %292 = load ptr, ptr %0, align 8, !tbaa !5
  %293 = getelementptr inbounds i8, ptr %292, i64 20
  %294 = load volatile i32, ptr %293, align 4, !tbaa !15
  %295 = and i32 %294, -2147483648
  store volatile i32 %295, ptr %293, align 4, !tbaa !15
  br label %296

296:                                              ; preds = %.loopexit265._crit_edge, %291
  %297 = phi ptr [ %.pre307, %.loopexit265._crit_edge ], [ %292, %291 ]
  %298 = tail call i32 @USB_ReadInterrupts(ptr noundef %297) #2
  %299 = and i32 %298, 2048
  %.not232 = icmp eq i32 %299, 0
  br i1 %.not232, label %._crit_edge308, label %300

._crit_edge308:                                   ; preds = %296
  %.pre309 = load ptr, ptr %0, align 8, !tbaa !5
  br label %309

300:                                              ; preds = %296
  %301 = load volatile i32, ptr %14, align 4, !tbaa !12
  %302 = and i32 %301, 1
  %.not233 = icmp eq i32 %302, 0
  br i1 %.not233, label %304, label %303

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

304:                                              ; preds = %303, %300
  %305 = load ptr, ptr %0, align 8, !tbaa !5
  %306 = getelementptr inbounds i8, ptr %305, i64 20
  %307 = load volatile i32, ptr %306, align 4, !tbaa !15
  %308 = and i32 %307, 2048
  store volatile i32 %308, ptr %306, align 4, !tbaa !15
  br label %309

309:                                              ; preds = %._crit_edge308, %304
  %310 = phi ptr [ %.pre309, %._crit_edge308 ], [ %305, %304 ]
  %311 = tail call i32 @USB_ReadInterrupts(ptr noundef %310) #2
  %312 = and i32 %311, 134217728
  %.not234 = icmp eq i32 %312, 0
  br i1 %.not234, label %328, label %313

313:                                              ; preds = %309
  %314 = load ptr, ptr %0, align 8, !tbaa !5
  %315 = getelementptr inbounds i8, ptr %314, i64 20
  %316 = load volatile i32, ptr %315, align 4, !tbaa !15
  %317 = and i32 %316, 134217728
  store volatile i32 %317, ptr %315, align 4, !tbaa !15
  %318 = getelementptr inbounds i8, ptr %0, i64 1660
  %319 = load i32, ptr %318, align 4, !tbaa !37
  %320 = icmp eq i32 %319, 0
  br i1 %320, label %321, label %327

321:                                              ; preds = %313
  store i32 1, ptr %318, align 4, !tbaa !37
  %322 = getelementptr inbounds i8, ptr %314, i64 84
  %323 = load volatile i32, ptr %322, align 4, !tbaa !38
  %324 = lshr i32 %323, 2
  %325 = and i32 %324, 15
  %326 = getelementptr inbounds i8, ptr %0, i64 1664
  store i32 %325, ptr %326, align 8, !tbaa !39
  tail call void @HAL_PCDEx_LPM_Callback(ptr noundef nonnull %0, i32 noundef 1) #2
  br label %328

327:                                              ; preds = %313
  tail call void @HAL_PCD_SuspendCallback(ptr noundef nonnull %0)
  br label %328

328:                                              ; preds = %321, %327, %309
  %329 = load ptr, ptr %0, align 8, !tbaa !5
  %330 = tail call i32 @USB_ReadInterrupts(ptr noundef %329) #2
  %331 = and i32 %330, 4096
  %.not235 = icmp eq i32 %331, 0
  br i1 %.not235, label %._crit_edge310, label %332

._crit_edge310:                                   ; preds = %328
  %.pre311 = load ptr, ptr %0, align 8, !tbaa !5
  br label %379

332:                                              ; preds = %328
  %333 = getelementptr inbounds i8, ptr %13, i64 4
  %334 = load volatile i32, ptr %333, align 4, !tbaa !25
  %335 = and i32 %334, -2
  store volatile i32 %335, ptr %333, align 4, !tbaa !25
  %336 = load ptr, ptr %0, align 8, !tbaa !5
  %337 = tail call i32 @USB_FlushTxFifo(ptr noundef %336, i32 noundef 16) #2
  %338 = getelementptr inbounds i8, ptr %0, i64 8
  %339 = load i32, ptr %338, align 8, !tbaa !40
  %.not284 = icmp eq i32 %339, 0
  br i1 %.not284, label %._crit_edge, label %.lr.ph275

.lr.ph275:                                        ; preds = %332
  %340 = add nuw nsw i64 %11, 2304
  %341 = add nuw nsw i64 %11, 2816
  %wide.trip.count = zext i32 %339 to i64
  br label %342

342:                                              ; preds = %.lr.ph275, %342
  %indvars.iv290 = phi i64 [ 0, %.lr.ph275 ], [ %indvars.iv.next291, %342 ]
  %343 = shl nuw nsw i64 %indvars.iv290, 5
  %344 = add nuw nsw i64 %340, %343
  %345 = inttoptr i64 %344 to ptr
  %346 = getelementptr inbounds i8, ptr %345, i64 8
  store volatile i32 64383, ptr %346, align 4, !tbaa !30
  %347 = load volatile i32, ptr %345, align 4, !tbaa !41
  %348 = and i32 %347, -2097153
  store volatile i32 %348, ptr %345, align 4, !tbaa !41
  %349 = add nuw nsw i64 %341, %343
  %350 = inttoptr i64 %349 to ptr
  %351 = getelementptr inbounds i8, ptr %350, i64 8
  store volatile i32 64383, ptr %351, align 4, !tbaa !23
  %352 = load volatile i32, ptr %350, align 4, !tbaa !42
  %353 = and i32 %352, -2097153
  store volatile i32 %353, ptr %350, align 4, !tbaa !42
  %354 = load volatile i32, ptr %350, align 4, !tbaa !42
  %355 = or i32 %354, 134217728
  store volatile i32 %355, ptr %350, align 4, !tbaa !42
  %indvars.iv.next291 = add nuw nsw i64 %indvars.iv290, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next291, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %342, !llvm.loop !43

._crit_edge:                                      ; preds = %342, %332
  %356 = getelementptr inbounds i8, ptr %13, i64 28
  %357 = load volatile i32, ptr %356, align 4, !tbaa !44
  %358 = or i32 %357, 65537
  store volatile i32 %358, ptr %356, align 4, !tbaa !44
  %359 = getelementptr inbounds i8, ptr %0, i64 52
  %360 = load i32, ptr %359, align 4, !tbaa !45
  %.not236 = icmp eq i32 %360, 0
  %. = select i1 %.not236, i64 20, i64 132
  %.330 = select i1 %.not236, i32 8235, i32 11
  %.331 = select i1 %.not236, i64 16, i64 68
  %361 = getelementptr inbounds i8, ptr %13, i64 %.
  %362 = load volatile i32, ptr %361, align 4, !tbaa !46
  %363 = or i32 %362, %.330
  store volatile i32 %363, ptr %361, align 4, !tbaa !46
  %364 = getelementptr inbounds i8, ptr %13, i64 %.331
  %365 = load volatile i32, ptr %364, align 4, !tbaa !46
  %366 = or i32 %365, 11
  store volatile i32 %366, ptr %364, align 4, !tbaa !46
  %367 = load volatile i32, ptr %13, align 4, !tbaa !47
  %368 = and i32 %367, -2033
  store volatile i32 %368, ptr %13, align 4, !tbaa !47
  %369 = load ptr, ptr %0, align 8, !tbaa !5
  %370 = getelementptr inbounds i8, ptr %0, i64 16
  %371 = load i32, ptr %370, align 8, !tbaa !32
  %372 = trunc i32 %371 to i8
  %373 = getelementptr inbounds i8, ptr %0, i64 1612
  %374 = tail call i32 @USB_EP0_OutStart(ptr noundef %369, i8 noundef zeroext %372, ptr noundef nonnull %373) #2
  %375 = load ptr, ptr %0, align 8, !tbaa !5
  %376 = getelementptr inbounds i8, ptr %375, i64 20
  %377 = load volatile i32, ptr %376, align 4, !tbaa !15
  %378 = and i32 %377, 4096
  store volatile i32 %378, ptr %376, align 4, !tbaa !15
  br label %379

379:                                              ; preds = %._crit_edge310, %._crit_edge
  %380 = phi ptr [ %.pre311, %._crit_edge310 ], [ %375, %._crit_edge ]
  %381 = tail call i32 @USB_ReadInterrupts(ptr noundef %380) #2
  %382 = and i32 %381, 8192
  %.not237 = icmp eq i32 %382, 0
  %.pre312 = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not237, label %398, label %383

383:                                              ; preds = %379
  %384 = tail call i32 @USB_ActivateSetup(ptr noundef %.pre312) #2
  %385 = load ptr, ptr %0, align 8, !tbaa !5
  %386 = tail call zeroext i8 @USB_GetDevSpeed(ptr noundef %385) #2
  %387 = zext i8 %386 to i32
  %388 = getelementptr inbounds i8, ptr %0, i64 20
  store i32 %387, ptr %388, align 4, !tbaa !48
  %389 = load ptr, ptr %0, align 8, !tbaa !5
  %390 = tail call i32 @HAL_RCC_GetHCLKFreq() #2
  %391 = load i32, ptr %388, align 4, !tbaa !48
  %392 = trunc i32 %391 to i8
  %393 = tail call i32 @USB_SetTurnaroundTime(ptr noundef %389, i32 noundef %390, i8 noundef zeroext %392) #2
  tail call void @HAL_PCD_ResetCallback(ptr noundef nonnull %0)
  %394 = load ptr, ptr %0, align 8, !tbaa !5
  %395 = getelementptr inbounds i8, ptr %394, i64 20
  %396 = load volatile i32, ptr %395, align 4, !tbaa !15
  %397 = and i32 %396, 8192
  store volatile i32 %397, ptr %395, align 4, !tbaa !15
  br label %398

398:                                              ; preds = %383, %379
  %399 = phi ptr [ %394, %383 ], [ %.pre312, %379 ]
  %400 = tail call i32 @USB_ReadInterrupts(ptr noundef %399) #2
  %401 = and i32 %400, 8
  %.not238 = icmp eq i32 %401, 0
  br i1 %.not238, label %._crit_edge313, label %402

._crit_edge313:                                   ; preds = %398
  %.pre314 = load ptr, ptr %0, align 8, !tbaa !5
  br label %407

402:                                              ; preds = %398
  tail call void @HAL_PCD_SOFCallback(ptr noundef nonnull %0)
  %403 = load ptr, ptr %0, align 8, !tbaa !5
  %404 = getelementptr inbounds i8, ptr %403, i64 20
  %405 = load volatile i32, ptr %404, align 4, !tbaa !15
  %406 = and i32 %405, 8
  store volatile i32 %406, ptr %404, align 4, !tbaa !15
  br label %407

407:                                              ; preds = %._crit_edge313, %402
  %408 = phi ptr [ %.pre314, %._crit_edge313 ], [ %403, %402 ]
  %409 = tail call i32 @USB_ReadInterrupts(ptr noundef %408) #2
  %410 = and i32 %409, 128
  %.not239 = icmp eq i32 %410, 0
  br i1 %.not239, label %.loopexit264, label %411

411:                                              ; preds = %407
  %412 = getelementptr inbounds i8, ptr %2, i64 24
  %413 = load volatile i32, ptr %412, align 4, !tbaa !17
  %414 = and i32 %413, -129
  store volatile i32 %414, ptr %412, align 4, !tbaa !17
  %415 = getelementptr inbounds i8, ptr %0, i64 8
  %416 = load i32, ptr %415, align 8, !tbaa !40
  %417 = icmp ugt i32 %416, 1
  br i1 %417, label %.lr.ph278, label %.loopexit264

.lr.ph278:                                        ; preds = %411
  %418 = getelementptr inbounds i8, ptr %0, i64 832
  br label %419

419:                                              ; preds = %.lr.ph278, %427
  %420 = phi i32 [ %416, %.lr.ph278 ], [ %428, %427 ]
  %indvars.iv293 = phi i64 [ 1, %.lr.ph278 ], [ %indvars.iv.next294, %427 ]
  %421 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %418, i64 0, i64 %indvars.iv293, i32 3
  %422 = load i8, ptr %421, align 1, !tbaa !26
  %423 = icmp eq i8 %422, 1
  br i1 %423, label %424, label %427

424:                                              ; preds = %419
  %425 = trunc i64 %indvars.iv293 to i8
  %426 = tail call i32 @HAL_PCD_EP_Abort(ptr noundef nonnull %0, i8 noundef zeroext %425)
  %.pre315 = load i32, ptr %415, align 8, !tbaa !40
  br label %427

427:                                              ; preds = %419, %424
  %428 = phi i32 [ %420, %419 ], [ %.pre315, %424 ]
  %indvars.iv.next294 = add nuw nsw i64 %indvars.iv293, 1
  %429 = zext i32 %428 to i64
  %430 = icmp ult i64 %indvars.iv.next294, %429
  br i1 %430, label %419, label %.loopexit264, !llvm.loop !49

.loopexit264:                                     ; preds = %427, %411, %407
  %431 = load ptr, ptr %0, align 8, !tbaa !5
  %432 = tail call i32 @USB_ReadInterrupts(ptr noundef %431) #2
  %433 = and i32 %432, 1048576
  %.not240 = icmp eq i32 %433, 0
  br i1 %.not240, label %.loopexit264._crit_edge, label %.preheader263

.loopexit264._crit_edge:                          ; preds = %.loopexit264
  %.pre317 = load ptr, ptr %0, align 8, !tbaa !5
  br label %462

.preheader263:                                    ; preds = %.loopexit264
  %434 = getelementptr inbounds i8, ptr %0, i64 8
  %435 = load i32, ptr %434, align 8, !tbaa !40
  %436 = icmp ugt i32 %435, 1
  br i1 %436, label %.lr.ph280, label %._crit_edge281

.lr.ph280:                                        ; preds = %.preheader263
  %437 = add nuw nsw i64 %11, 2304
  %438 = getelementptr inbounds i8, ptr %0, i64 64
  br label %439

439:                                              ; preds = %.lr.ph280, %454
  %440 = phi i32 [ %435, %.lr.ph280 ], [ %455, %454 ]
  %indvars.iv296 = phi i64 [ 1, %.lr.ph280 ], [ %indvars.iv.next297, %454 ]
  %441 = shl nuw nsw i64 %indvars.iv296, 5
  %442 = add nuw nsw i64 %437, %441
  %443 = inttoptr i64 %442 to ptr
  %444 = load volatile i32, ptr %443, align 4, !tbaa !41
  %445 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %438, i64 0, i64 %indvars.iv296
  %446 = getelementptr inbounds i8, ptr %445, i64 4
  %447 = load i8, ptr %446, align 4, !tbaa !50
  %448 = icmp ne i8 %447, 1
  %.not246 = icmp sgt i32 %444, -1
  %or.cond = select i1 %448, i1 true, i1 %.not246
  br i1 %or.cond, label %454, label %449

449:                                              ; preds = %439
  %450 = getelementptr inbounds i8, ptr %445, i64 3
  store i8 1, ptr %450, align 1, !tbaa !26
  %451 = trunc i64 %indvars.iv296 to i8
  %452 = or i8 %451, -128
  %453 = tail call i32 @HAL_PCD_EP_Abort(ptr noundef nonnull %0, i8 noundef zeroext %452)
  %.pre316 = load i32, ptr %434, align 8, !tbaa !40
  br label %454

454:                                              ; preds = %439, %449
  %455 = phi i32 [ %440, %439 ], [ %.pre316, %449 ]
  %indvars.iv.next297 = add nuw nsw i64 %indvars.iv296, 1
  %456 = zext i32 %455 to i64
  %457 = icmp ult i64 %indvars.iv.next297, %456
  br i1 %457, label %439, label %._crit_edge281, !llvm.loop !51

._crit_edge281:                                   ; preds = %454, %.preheader263
  %458 = load ptr, ptr %0, align 8, !tbaa !5
  %459 = getelementptr inbounds i8, ptr %458, i64 20
  %460 = load volatile i32, ptr %459, align 4, !tbaa !15
  %461 = and i32 %460, 1048576
  store volatile i32 %461, ptr %459, align 4, !tbaa !15
  br label %462

462:                                              ; preds = %.loopexit264._crit_edge, %._crit_edge281
  %463 = phi ptr [ %.pre317, %.loopexit264._crit_edge ], [ %458, %._crit_edge281 ]
  %464 = tail call i32 @USB_ReadInterrupts(ptr noundef %463) #2
  %465 = and i32 %464, 2097152
  %.not241 = icmp eq i32 %465, 0
  br i1 %.not241, label %._crit_edge318, label %.preheader

._crit_edge318:                                   ; preds = %462
  %.pre319 = load ptr, ptr %0, align 8, !tbaa !5
  br label %503

.preheader:                                       ; preds = %462
  %466 = getelementptr inbounds i8, ptr %0, i64 8
  %467 = load i32, ptr %466, align 8, !tbaa !40
  %468 = icmp ugt i32 %467, 1
  br i1 %468, label %.lr.ph283, label %.loopexit

.lr.ph283:                                        ; preds = %.preheader
  %469 = add nuw nsw i64 %11, 2816
  %470 = getelementptr inbounds i8, ptr %0, i64 832
  %471 = getelementptr inbounds i8, ptr %2, i64 24
  %472 = getelementptr inbounds i8, ptr %2, i64 20
  %wide.trip.count302 = zext i32 %467 to i64
  br label %473

473:                                              ; preds = %.lr.ph283, %498
  %indvars.iv299 = phi i64 [ 1, %.lr.ph283 ], [ %indvars.iv.next300, %498 ]
  %474 = shl nuw nsw i64 %indvars.iv299, 5
  %475 = add nuw nsw i64 %469, %474
  %476 = inttoptr i64 %475 to ptr
  %477 = load volatile i32, ptr %476, align 4, !tbaa !42
  %478 = getelementptr inbounds [16 x %struct.USB_EPTypeDef], ptr %470, i64 0, i64 %indvars.iv299
  %479 = getelementptr inbounds i8, ptr %478, i64 4
  %480 = load i8, ptr %479, align 4, !tbaa !50
  %481 = icmp ne i8 %480, 1
  %.not242 = icmp sgt i32 %477, -1
  %or.cond262 = select i1 %481, i1 true, i1 %.not242
  br i1 %or.cond262, label %498, label %482

482:                                              ; preds = %473
  %483 = and i32 %477, 65536
  %484 = load i32, ptr %18, align 4, !tbaa !14
  %485 = and i32 %484, 1
  %486 = icmp eq i32 %483, %485
  br i1 %486, label %487, label %498

487:                                              ; preds = %482
  %488 = getelementptr inbounds i8, ptr %478, i64 3
  store i8 1, ptr %488, align 1, !tbaa !26
  %489 = load volatile i32, ptr %471, align 4, !tbaa !17
  %490 = or i32 %489, 128
  store volatile i32 %490, ptr %471, align 4, !tbaa !17
  %491 = load volatile i32, ptr %472, align 4, !tbaa !15
  %492 = and i32 %491, 128
  %493 = icmp eq i32 %492, 0
  br i1 %493, label %494, label %498

494:                                              ; preds = %487
  %495 = getelementptr inbounds i8, ptr %13, i64 4
  %496 = load volatile i32, ptr %495, align 4, !tbaa !25
  %497 = or i32 %496, 512
  store volatile i32 %497, ptr %495, align 4, !tbaa !25
  br label %.loopexit

498:                                              ; preds = %473, %482, %487
  %indvars.iv.next300 = add nuw nsw i64 %indvars.iv299, 1
  %exitcond303.not = icmp eq i64 %indvars.iv.next300, %wide.trip.count302
  br i1 %exitcond303.not, label %.loopexit, label %473, !llvm.loop !52

.loopexit:                                        ; preds = %498, %.preheader, %494
  %499 = load ptr, ptr %0, align 8, !tbaa !5
  %500 = getelementptr inbounds i8, ptr %499, i64 20
  %501 = load volatile i32, ptr %500, align 4, !tbaa !15
  %502 = and i32 %501, 2097152
  store volatile i32 %502, ptr %500, align 4, !tbaa !15
  br label %503

503:                                              ; preds = %._crit_edge318, %.loopexit
  %504 = phi ptr [ %.pre319, %._crit_edge318 ], [ %499, %.loopexit ]
  %505 = tail call i32 @USB_ReadInterrupts(ptr noundef %504) #2
  %506 = and i32 %505, 1073741824
  %.not243 = icmp eq i32 %506, 0
  br i1 %.not243, label %._crit_edge320, label %507

._crit_edge320:                                   ; preds = %503
  %.pre321 = load ptr, ptr %0, align 8, !tbaa !5
  br label %512

507:                                              ; preds = %503
  tail call void @HAL_PCD_ConnectCallback(ptr noundef nonnull %0)
  %508 = load ptr, ptr %0, align 8, !tbaa !5
  %509 = getelementptr inbounds i8, ptr %508, i64 20
  %510 = load volatile i32, ptr %509, align 4, !tbaa !15
  %511 = and i32 %510, 1073741824
  store volatile i32 %511, ptr %509, align 4, !tbaa !15
  br label %512

512:                                              ; preds = %._crit_edge320, %507
  %513 = phi ptr [ %.pre321, %._crit_edge320 ], [ %508, %507 ]
  %514 = tail call i32 @USB_ReadInterrupts(ptr noundef %513) #2
  %515 = and i32 %514, 4
  %.not244 = icmp eq i32 %515, 0
  br i1 %.not244, label %527, label %516

516:                                              ; preds = %512
  %517 = load ptr, ptr %0, align 8, !tbaa !5
  %518 = getelementptr inbounds i8, ptr %517, i64 4
  %519 = load volatile i32, ptr %518, align 4, !tbaa !53
  %520 = and i32 %519, 4
  %.not245 = icmp eq i32 %520, 0
  br i1 %.not245, label %522, label %521

521:                                              ; preds = %516
  tail call void @HAL_PCD_DisconnectCallback(ptr noundef nonnull %0)
  %.pre322 = load ptr, ptr %0, align 8, !tbaa !5
  br label %522

522:                                              ; preds = %521, %516
  %523 = phi ptr [ %.pre322, %521 ], [ %517, %516 ]
  %524 = getelementptr inbounds i8, ptr %523, i64 4
  %525 = load volatile i32, ptr %524, align 4, !tbaa !53
  %526 = or i32 %525, %519
  store volatile i32 %526, ptr %524, align 4, !tbaa !53
  br label %527

527:                                              ; preds = %1, %522, %512, %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

; Function Attrs: nounwind uwtable
declare dso_local void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef, i8 noundef zeroext) 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 dso_local void @HAL_PCD_ISOINIncompleteCallback(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 i32 @HAL_PCD_EP_Abort(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 832, !11, i64 1600, !11, i64 1604, !11, i64 1608, !8, i64 1612, !11, i64 1660, !11, i64 1664, !11, i64 1668, !11, i64 1672, !11, i64 1676, !7, i64 1680}
!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 8}
!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, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !8, i64 72, !11, i64 132}
!14 = !{!6, !11, i64 1668}
!15 = !{!16, !11, i64 20}
!16 = !{!"", !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}
!17 = !{!16, !11, i64 24}
!18 = !{!16, !11, i64 32}
!19 = !{!20, !7, i64 16}
!20 = !{!"", !8, i64 0, !8, i64 1, !8, i64 2, !8, i64 3, !8, i64 4, !8, i64 5, !11, i64 8, !7, i64 16, !11, i64 24, !11, i64 28, !8, i64 32, !21, i64 34, !11, i64 36, !11, i64 40}
!21 = !{!"short", !8, i64 0}
!22 = !{!20, !11, i64 28}
!23 = !{!24, !11, i64 8}
!24 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !8, i64 24}
!25 = !{!13, !11, i64 4}
!26 = !{!20, !8, i64 3}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!13, !11, i64 52}
!30 = !{!31, !11, i64 8}
!31 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28}
!32 = !{!6, !11, i64 16}
!33 = !{!20, !11, i64 8}
!34 = !{!20, !11, i64 24}
!35 = distinct !{!35, !28, !36}
!36 = !{!"llvm.loop.peeled.count", i32 1}
!37 = !{!6, !11, i64 1660}
!38 = !{!16, !11, i64 84}
!39 = !{!6, !11, i64 1664}
!40 = !{!6, !11, i64 8}
!41 = !{!31, !11, i64 0}
!42 = !{!24, !11, i64 0}
!43 = distinct !{!43, !28}
!44 = !{!13, !11, i64 28}
!45 = !{!6, !11, i64 52}
!46 = !{!11, !11, i64 0}
!47 = !{!13, !11, i64 0}
!48 = !{!6, !11, i64 20}
!49 = distinct !{!49, !28}
!50 = !{!20, !8, i64 4}
!51 = distinct !{!51, !28}
!52 = distinct !{!52, !28}
!53 = !{!16, !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