; LLVM IR from lichen-community-systems/signaletic :: hosts/daisy/vendor/libDaisy/Drivers/STM32H7xx_HAL_Driver/Src (IRQHandler)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.PCD_HandleTypeDef = type { ptr, %struct.USB_OTG_CfgTypeDef, i8, [16 x %struct.USB_OTG_EPTypeDef], [16 x %struct.USB_OTG_EPTypeDef], i32, i32, i32, [12 x i32], i32, i32, i32, i32, ptr }
%struct.USB_OTG_CfgTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.USB_OTG_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i16, i32, ptr, i32, i32, i32 }
%struct.USB_OTG_GlobalTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [2 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [39 x i32], i32, [15 x i32] }
%struct.USB_OTG_OUTEndpointTypeDef = type { i32, i32, i32, i32, i32, i32, [2 x i32] }
%struct.USB_OTG_DeviceTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [15 x i32], i32 }
%struct.USB_OTG_INEndpointTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32 }

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

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

; Function Attrs: nounwind uwtable
define dso_local void @HAL_PCD_IRQHandler(ptr noundef %0) #1 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %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 ptr, align 8
  %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 4, 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
  store i32 0, ptr %8, align 4, !tbaa !13
  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 8, 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 %866

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

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

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

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

55:                                               ; preds = %47
  store i32 0, ptr %8, align 4, !tbaa !13
  %56 = load ptr, ptr %2, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %56, i32 0, i32 0
  %58 = load ptr, ptr %57, align 8, !tbaa !9
  %59 = call i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef %58)
  store i32 %59, ptr %6, align 4, !tbaa !13
  br label %60

60:                                               ; preds = %169, %55
  %61 = load i32, ptr %6, align 4, !tbaa !13
  %62 = icmp ne i32 %61, 0
  br i1 %62, label %63, label %174

63:                                               ; preds = %60
  %64 = load i32, ptr %6, align 4, !tbaa !13
  %65 = and i32 %64, 1
  %66 = icmp ne i32 %65, 0
  br i1 %66, label %67, label %169

67:                                               ; preds = %63
  %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 = load i32, ptr %8, align 4, !tbaa !13
  %72 = trunc i32 %71 to i8
  %73 = call i32 @USB_ReadDevOutEPInterrupt(ptr noundef %70, i8 noundef zeroext %72)
  store i32 %73, ptr %7, align 4, !tbaa !13
  %74 = load i32, ptr %7, align 4, !tbaa !13
  %75 = zext i32 %74 to i64
  %76 = and i64 %75, 1
  %77 = icmp eq i64 %76, 1
  br i1 %77, label %78, label %91

78:                                               ; preds = %67
  %79 = load i32, ptr %4, align 4, !tbaa !13
  %80 = zext i32 %79 to i64
  %81 = add i64 %80, 2816
  %82 = load i32, ptr %8, align 4, !tbaa !13
  %83 = zext i32 %82 to i64
  %84 = mul i64 %83, 32
  %85 = add i64 %81, %84
  %86 = inttoptr i64 %85 to ptr
  %87 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %86, i32 0, i32 2
  store volatile i32 1, ptr %87, align 4, !tbaa !16
  %88 = load ptr, ptr %2, align 8, !tbaa !5
  %89 = load i32, ptr %8, align 4, !tbaa !13
  %90 = call i32 @PCD_EP_OutXfrComplete_int(ptr noundef %88, i32 noundef %89)
  br label %91

91:                                               ; preds = %78, %67
  %92 = load i32, ptr %7, align 4, !tbaa !13
  %93 = zext i32 %92 to i64
  %94 = and i64 %93, 8
  %95 = icmp eq i64 %94, 8
  br i1 %95, label %96, label %109

96:                                               ; preds = %91
  %97 = load ptr, ptr %2, align 8, !tbaa !5
  %98 = load i32, ptr %8, align 4, !tbaa !13
  %99 = call i32 @PCD_EP_OutSetupPacket_int(ptr noundef %97, i32 noundef %98)
  %100 = load i32, ptr %4, align 4, !tbaa !13
  %101 = zext i32 %100 to i64
  %102 = add i64 %101, 2816
  %103 = load i32, ptr %8, align 4, !tbaa !13
  %104 = zext i32 %103 to i64
  %105 = mul i64 %104, 32
  %106 = add i64 %102, %105
  %107 = inttoptr i64 %106 to ptr
  %108 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %107, i32 0, i32 2
  store volatile i32 8, ptr %108, align 4, !tbaa !16
  br label %109

109:                                              ; preds = %96, %91
  %110 = load i32, ptr %7, align 4, !tbaa !13
  %111 = zext i32 %110 to i64
  %112 = and i64 %111, 16
  %113 = icmp eq i64 %112, 16
  br i1 %113, label %114, label %124

114:                                              ; preds = %109
  %115 = load i32, ptr %4, align 4, !tbaa !13
  %116 = zext i32 %115 to i64
  %117 = add i64 %116, 2816
  %118 = load i32, ptr %8, align 4, !tbaa !13
  %119 = zext i32 %118 to i64
  %120 = mul i64 %119, 32
  %121 = add i64 %117, %120
  %122 = inttoptr i64 %121 to ptr
  %123 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %122, i32 0, i32 2
  store volatile i32 16, ptr %123, align 4, !tbaa !16
  br label %124

124:                                              ; preds = %114, %109
  %125 = load i32, ptr %7, align 4, !tbaa !13
  %126 = zext i32 %125 to i64
  %127 = and i64 %126, 32
  %128 = icmp eq i64 %127, 32
  br i1 %128, label %129, label %153

129:                                              ; preds = %124
  %130 = load ptr, ptr %2, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %130, i32 0, i32 1
  %132 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %131, i32 0, i32 3
  %133 = load i32, ptr %132, align 4, !tbaa !18
  %134 = icmp eq i32 %133, 1
  br i1 %134, label %135, label %143

135:                                              ; preds = %129
  %136 = load ptr, ptr %2, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %136, i32 0, i32 0
  %138 = load ptr, ptr %137, align 8, !tbaa !9
  %139 = load ptr, ptr %2, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %139, i32 0, i32 8
  %141 = getelementptr inbounds [12 x i32], ptr %140, i64 0, i64 0
  %142 = call i32 @USB_EP0_OutStart(ptr noundef %138, i8 noundef zeroext 1, ptr noundef %141)
  br label %143

143:                                              ; preds = %135, %129
  %144 = load i32, ptr %4, align 4, !tbaa !13
  %145 = zext i32 %144 to i64
  %146 = add i64 %145, 2816
  %147 = load i32, ptr %8, align 4, !tbaa !13
  %148 = zext i32 %147 to i64
  %149 = mul i64 %148, 32
  %150 = add i64 %146, %149
  %151 = inttoptr i64 %150 to ptr
  %152 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %151, i32 0, i32 2
  store volatile i32 32, ptr %152, align 4, !tbaa !16
  br label %153

153:                                              ; preds = %143, %124
  %154 = load i32, ptr %7, align 4, !tbaa !13
  %155 = zext i32 %154 to i64
  %156 = and i64 %155, 8192
  %157 = icmp eq i64 %156, 8192
  br i1 %157, label %158, label %168

158:                                              ; preds = %153
  %159 = load i32, ptr %4, align 4, !tbaa !13
  %160 = zext i32 %159 to i64
  %161 = add i64 %160, 2816
  %162 = load i32, ptr %8, align 4, !tbaa !13
  %163 = zext i32 %162 to i64
  %164 = mul i64 %163, 32
  %165 = add i64 %161, %164
  %166 = inttoptr i64 %165 to ptr
  %167 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %166, i32 0, i32 2
  store volatile i32 8192, ptr %167, align 4, !tbaa !16
  br label %168

168:                                              ; preds = %158, %153
  br label %169

169:                                              ; preds = %168, %63
  %170 = load i32, ptr %8, align 4, !tbaa !13
  %171 = add i32 %170, 1
  store i32 %171, ptr %8, align 4, !tbaa !13
  %172 = load i32, ptr %6, align 4, !tbaa !13
  %173 = lshr i32 %172, 1
  store i32 %173, ptr %6, align 4, !tbaa !13
  br label %60, !llvm.loop !19

174:                                              ; preds = %60
  br label %175

175:                                              ; preds = %174, %47
  %176 = load ptr, ptr %2, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %176, i32 0, i32 0
  %178 = load ptr, ptr %177, align 8, !tbaa !9
  %179 = call i32 @USB_ReadInterrupts(ptr noundef %178)
  %180 = zext i32 %179 to i64
  %181 = and i64 %180, 262144
  %182 = icmp eq i64 %181, 262144
  br i1 %182, label %183, label %359

183:                                              ; preds = %175
  %184 = load ptr, ptr %2, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %184, i32 0, i32 0
  %186 = load ptr, ptr %185, align 8, !tbaa !9
  %187 = call i32 @USB_ReadDevAllInEpInterrupt(ptr noundef %186)
  store i32 %187, ptr %6, align 4, !tbaa !13
  store i32 0, ptr %8, align 4, !tbaa !13
  br label %188

188:                                              ; preds = %353, %183
  %189 = load i32, ptr %6, align 4, !tbaa !13
  %190 = icmp ne i32 %189, 0
  br i1 %190, label %191, label %358

191:                                              ; preds = %188
  %192 = load i32, ptr %6, align 4, !tbaa !13
  %193 = and i32 %192, 1
  %194 = icmp ne i32 %193, 0
  br i1 %194, label %195, label %353

195:                                              ; preds = %191
  %196 = load ptr, ptr %2, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %196, i32 0, i32 0
  %198 = load ptr, ptr %197, align 8, !tbaa !9
  %199 = load i32, ptr %8, align 4, !tbaa !13
  %200 = trunc i32 %199 to i8
  %201 = call i32 @USB_ReadDevInEPInterrupt(ptr noundef %198, i8 noundef zeroext %200)
  store i32 %201, ptr %7, align 4, !tbaa !13
  %202 = load i32, ptr %7, align 4, !tbaa !13
  %203 = zext i32 %202 to i64
  %204 = and i64 %203, 1
  %205 = icmp eq i64 %204, 1
  br i1 %205, label %206, label %283

206:                                              ; preds = %195
  %207 = load i32, ptr %8, align 4, !tbaa !13
  %208 = and i32 %207, 15
  %209 = zext i32 %208 to i64
  %210 = shl i64 1, %209
  %211 = trunc i64 %210 to i32
  store i32 %211, ptr %9, align 4, !tbaa !13
  %212 = load i32, ptr %9, align 4, !tbaa !13
  %213 = xor i32 %212, -1
  %214 = load i32, ptr %4, align 4, !tbaa !13
  %215 = zext i32 %214 to i64
  %216 = add i64 %215, 2048
  %217 = inttoptr i64 %216 to ptr
  %218 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %217, i32 0, i32 13
  %219 = load volatile i32, ptr %218, align 4, !tbaa !21
  %220 = and i32 %219, %213
  store volatile i32 %220, ptr %218, align 4, !tbaa !21
  %221 = load i32, ptr %4, align 4, !tbaa !13
  %222 = zext i32 %221 to i64
  %223 = add i64 %222, 2304
  %224 = load i32, ptr %8, align 4, !tbaa !13
  %225 = zext i32 %224 to i64
  %226 = mul i64 %225, 32
  %227 = add i64 %223, %226
  %228 = inttoptr i64 %227 to ptr
  %229 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %228, i32 0, i32 2
  store volatile i32 1, ptr %229, align 4, !tbaa !23
  %230 = load ptr, ptr %2, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %230, i32 0, i32 1
  %232 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %231, i32 0, i32 3
  %233 = load i32, ptr %232, align 4, !tbaa !18
  %234 = icmp eq i32 %233, 1
  br i1 %234, label %235, label %252

235:                                              ; preds = %206
  %236 = load ptr, ptr %2, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %236, i32 0, i32 3
  %238 = load i32, ptr %8, align 4, !tbaa !13
  %239 = zext i32 %238 to i64
  %240 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %237, i64 0, i64 %239
  %241 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %240, i32 0, i32 7
  %242 = load i32, ptr %241, align 8, !tbaa !25
  %243 = load ptr, ptr %2, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %243, i32 0, i32 3
  %245 = load i32, ptr %8, align 4, !tbaa !13
  %246 = zext i32 %245 to i64
  %247 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %244, i64 0, i64 %246
  %248 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %247, i32 0, i32 8
  %249 = load ptr, ptr %248, align 8, !tbaa !28
  %250 = zext i32 %242 to i64
  %251 = getelementptr inbounds i8, ptr %249, i64 %250
  store ptr %251, ptr %248, align 8, !tbaa !28
  br label %252

252:                                              ; preds = %235, %206
  %253 = load ptr, ptr %2, align 8, !tbaa !5
  %254 = load i32, ptr %8, align 4, !tbaa !13
  %255 = trunc i32 %254 to i8
  call void @HAL_PCD_DataInStageCallback(ptr noundef %253, i8 noundef zeroext %255)
  %256 = load ptr, ptr %2, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %256, i32 0, i32 1
  %258 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %257, i32 0, i32 3
  %259 = load i32, ptr %258, align 4, !tbaa !18
  %260 = icmp eq i32 %259, 1
  br i1 %260, label %261, label %282

261:                                              ; preds = %252
  %262 = load i32, ptr %8, align 4, !tbaa !13
  %263 = icmp eq i32 %262, 0
  br i1 %263, label %264, label %281

264:                                              ; preds = %261
  %265 = load ptr, ptr %2, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %265, i32 0, i32 3
  %267 = load i32, ptr %8, align 4, !tbaa !13
  %268 = zext i32 %267 to i64
  %269 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %266, i64 0, i64 %268
  %270 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %269, i32 0, i32 10
  %271 = load i32, ptr %270, align 4, !tbaa !29
  %272 = icmp eq i32 %271, 0
  br i1 %272, label %273, label %281

273:                                              ; preds = %264
  %274 = load ptr, ptr %2, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %274, i32 0, i32 0
  %276 = load ptr, ptr %275, align 8, !tbaa !9
  %277 = load ptr, ptr %2, align 8, !tbaa !5
  %278 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %277, i32 0, i32 8
  %279 = getelementptr inbounds [12 x i32], ptr %278, i64 0, i64 0
  %280 = call i32 @USB_EP0_OutStart(ptr noundef %276, i8 noundef zeroext 1, ptr noundef %279)
  br label %281

281:                                              ; preds = %273, %264, %261
  br label %282

282:                                              ; preds = %281, %252
  br label %283

283:                                              ; preds = %282, %195
  %284 = load i32, ptr %7, align 4, !tbaa !13
  %285 = zext i32 %284 to i64
  %286 = and i64 %285, 8
  %287 = icmp eq i64 %286, 8
  br i1 %287, label %288, label %298

288:                                              ; preds = %283
  %289 = load i32, ptr %4, align 4, !tbaa !13
  %290 = zext i32 %289 to i64
  %291 = add i64 %290, 2304
  %292 = load i32, ptr %8, align 4, !tbaa !13
  %293 = zext i32 %292 to i64
  %294 = mul i64 %293, 32
  %295 = add i64 %291, %294
  %296 = inttoptr i64 %295 to ptr
  %297 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %296, i32 0, i32 2
  store volatile i32 8, ptr %297, align 4, !tbaa !23
  br label %298

298:                                              ; preds = %288, %283
  %299 = load i32, ptr %7, align 4, !tbaa !13
  %300 = zext i32 %299 to i64
  %301 = and i64 %300, 16
  %302 = icmp eq i64 %301, 16
  br i1 %302, label %303, label %313

303:                                              ; preds = %298
  %304 = load i32, ptr %4, align 4, !tbaa !13
  %305 = zext i32 %304 to i64
  %306 = add i64 %305, 2304
  %307 = load i32, ptr %8, align 4, !tbaa !13
  %308 = zext i32 %307 to i64
  %309 = mul i64 %308, 32
  %310 = add i64 %306, %309
  %311 = inttoptr i64 %310 to ptr
  %312 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %311, i32 0, i32 2
  store volatile i32 16, ptr %312, align 4, !tbaa !23
  br label %313

313:                                              ; preds = %303, %298
  %314 = load i32, ptr %7, align 4, !tbaa !13
  %315 = zext i32 %314 to i64
  %316 = and i64 %315, 64
  %317 = icmp eq i64 %316, 64
  br i1 %317, label %318, label %328

318:                                              ; preds = %313
  %319 = load i32, ptr %4, align 4, !tbaa !13
  %320 = zext i32 %319 to i64
  %321 = add i64 %320, 2304
  %322 = load i32, ptr %8, align 4, !tbaa !13
  %323 = zext i32 %322 to i64
  %324 = mul i64 %323, 32
  %325 = add i64 %321, %324
  %326 = inttoptr i64 %325 to ptr
  %327 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %326, i32 0, i32 2
  store volatile i32 64, ptr %327, align 4, !tbaa !23
  br label %328

328:                                              ; preds = %318, %313
  %329 = load i32, ptr %7, align 4, !tbaa !13
  %330 = zext i32 %329 to i64
  %331 = and i64 %330, 2
  %332 = icmp eq i64 %331, 2
  br i1 %332, label %333, label %343

333:                                              ; preds = %328
  %334 = load i32, ptr %4, align 4, !tbaa !13
  %335 = zext i32 %334 to i64
  %336 = add i64 %335, 2304
  %337 = load i32, ptr %8, align 4, !tbaa !13
  %338 = zext i32 %337 to i64
  %339 = mul i64 %338, 32
  %340 = add i64 %336, %339
  %341 = inttoptr i64 %340 to ptr
  %342 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %341, i32 0, i32 2
  store volatile i32 2, ptr %342, align 4, !tbaa !23
  br label %343

343:                                              ; preds = %333, %328
  %344 = load i32, ptr %7, align 4, !tbaa !13
  %345 = zext i32 %344 to i64
  %346 = and i64 %345, 128
  %347 = icmp eq i64 %346, 128
  br i1 %347, label %348, label %352

348:                                              ; preds = %343
  %349 = load ptr, ptr %2, align 8, !tbaa !5
  %350 = load i32, ptr %8, align 4, !tbaa !13
  %351 = call i32 @PCD_WriteEmptyTxFifo(ptr noundef %349, i32 noundef %350)
  br label %352

352:                                              ; preds = %348, %343
  br label %353

353:                                              ; preds = %352, %191
  %354 = load i32, ptr %8, align 4, !tbaa !13
  %355 = add i32 %354, 1
  store i32 %355, ptr %8, align 4, !tbaa !13
  %356 = load i32, ptr %6, align 4, !tbaa !13
  %357 = lshr i32 %356, 1
  store i32 %357, ptr %6, align 4, !tbaa !13
  br label %188, !llvm.loop !30

358:                                              ; preds = %188
  br label %359

359:                                              ; preds = %358, %175
  %360 = load ptr, ptr %2, align 8, !tbaa !5
  %361 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %360, i32 0, i32 0
  %362 = load ptr, ptr %361, align 8, !tbaa !9
  %363 = call i32 @USB_ReadInterrupts(ptr noundef %362)
  %364 = zext i32 %363 to i64
  %365 = and i64 %364, 2147483648
  %366 = icmp eq i64 %365, 2147483648
  br i1 %366, label %367, label %396

367:                                              ; preds = %359
  %368 = load i32, ptr %4, align 4, !tbaa !13
  %369 = zext i32 %368 to i64
  %370 = add i64 %369, 2048
  %371 = inttoptr i64 %370 to ptr
  %372 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %371, i32 0, i32 1
  %373 = load volatile i32, ptr %372, align 4, !tbaa !31
  %374 = zext i32 %373 to i64
  %375 = and i64 %374, -2
  %376 = trunc i64 %375 to i32
  store volatile i32 %376, ptr %372, align 4, !tbaa !31
  %377 = load ptr, ptr %2, align 8, !tbaa !5
  %378 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %377, i32 0, i32 9
  %379 = load i32, ptr %378, align 4, !tbaa !32
  %380 = icmp eq i32 %379, 1
  br i1 %380, label %381, label %385

381:                                              ; preds = %367
  %382 = load ptr, ptr %2, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %382, i32 0, i32 9
  store i32 0, ptr %383, align 4, !tbaa !32
  %384 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCDEx_LPM_Callback(ptr noundef %384, i32 noundef 0)
  br label %387

385:                                              ; preds = %367
  %386 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ResumeCallback(ptr noundef %386)
  br label %387

387:                                              ; preds = %385, %381
  %388 = load ptr, ptr %2, align 8, !tbaa !5
  %389 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %388, i32 0, i32 0
  %390 = load ptr, ptr %389, align 8, !tbaa !9
  %391 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %390, i32 0, i32 5
  %392 = load volatile i32, ptr %391, align 4, !tbaa !14
  %393 = zext i32 %392 to i64
  %394 = and i64 %393, 2147483648
  %395 = trunc i64 %394 to i32
  store volatile i32 %395, ptr %391, align 4, !tbaa !14
  br label %396

396:                                              ; preds = %387, %359
  %397 = load ptr, ptr %2, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %397, i32 0, i32 0
  %399 = load ptr, ptr %398, align 8, !tbaa !9
  %400 = call i32 @USB_ReadInterrupts(ptr noundef %399)
  %401 = zext i32 %400 to i64
  %402 = and i64 %401, 2048
  %403 = icmp eq i64 %402, 2048
  br i1 %403, label %404, label %425

404:                                              ; preds = %396
  %405 = load i32, ptr %4, align 4, !tbaa !13
  %406 = zext i32 %405 to i64
  %407 = add i64 %406, 2048
  %408 = inttoptr i64 %407 to ptr
  %409 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %408, i32 0, i32 2
  %410 = load volatile i32, ptr %409, align 4, !tbaa !33
  %411 = zext i32 %410 to i64
  %412 = and i64 %411, 1
  %413 = icmp eq i64 %412, 1
  br i1 %413, label %414, label %416

414:                                              ; preds = %404
  %415 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SuspendCallback(ptr noundef %415)
  br label %416

416:                                              ; preds = %414, %404
  %417 = load ptr, ptr %2, align 8, !tbaa !5
  %418 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %417, i32 0, i32 0
  %419 = load ptr, ptr %418, align 8, !tbaa !9
  %420 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %419, i32 0, i32 5
  %421 = load volatile i32, ptr %420, align 4, !tbaa !14
  %422 = zext i32 %421 to i64
  %423 = and i64 %422, 2048
  %424 = trunc i64 %423 to i32
  store volatile i32 %424, ptr %420, align 4, !tbaa !14
  br label %425

425:                                              ; preds = %416, %396
  %426 = load ptr, ptr %2, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %426, i32 0, i32 0
  %428 = load ptr, ptr %427, align 8, !tbaa !9
  %429 = call i32 @USB_ReadInterrupts(ptr noundef %428)
  %430 = zext i32 %429 to i64
  %431 = and i64 %430, 134217728
  %432 = icmp eq i64 %431, 134217728
  br i1 %432, label %433, label %464

433:                                              ; preds = %425
  %434 = load ptr, ptr %2, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %434, i32 0, i32 0
  %436 = load ptr, ptr %435, align 8, !tbaa !9
  %437 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %436, i32 0, i32 5
  %438 = load volatile i32, ptr %437, align 4, !tbaa !14
  %439 = zext i32 %438 to i64
  %440 = and i64 %439, 134217728
  %441 = trunc i64 %440 to i32
  store volatile i32 %441, ptr %437, align 4, !tbaa !14
  %442 = load ptr, ptr %2, align 8, !tbaa !5
  %443 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %442, i32 0, i32 9
  %444 = load i32, ptr %443, align 4, !tbaa !32
  %445 = icmp eq i32 %444, 0
  br i1 %445, label %446, label %461

446:                                              ; preds = %433
  %447 = load ptr, ptr %2, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %447, i32 0, i32 9
  store i32 1, ptr %448, align 4, !tbaa !32
  %449 = load ptr, ptr %2, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %449, i32 0, i32 0
  %451 = load ptr, ptr %450, align 8, !tbaa !9
  %452 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %451, i32 0, i32 20
  %453 = load volatile i32, ptr %452, align 4, !tbaa !34
  %454 = zext i32 %453 to i64
  %455 = and i64 %454, 60
  %456 = lshr i64 %455, 2
  %457 = trunc i64 %456 to i32
  %458 = load ptr, ptr %2, align 8, !tbaa !5
  %459 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %458, i32 0, i32 10
  store i32 %457, ptr %459, align 8, !tbaa !35
  %460 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCDEx_LPM_Callback(ptr noundef %460, i32 noundef 1)
  br label %463

461:                                              ; preds = %433
  %462 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SuspendCallback(ptr noundef %462)
  br label %463

463:                                              ; preds = %461, %446
  br label %464

464:                                              ; preds = %463, %425
  %465 = load ptr, ptr %2, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %465, i32 0, i32 0
  %467 = load ptr, ptr %466, align 8, !tbaa !9
  %468 = call i32 @USB_ReadInterrupts(ptr noundef %467)
  %469 = zext i32 %468 to i64
  %470 = and i64 %469, 4096
  %471 = icmp eq i64 %470, 4096
  br i1 %471, label %472, label %622

472:                                              ; preds = %464
  %473 = load i32, ptr %4, align 4, !tbaa !13
  %474 = zext i32 %473 to i64
  %475 = add i64 %474, 2048
  %476 = inttoptr i64 %475 to ptr
  %477 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %476, i32 0, i32 1
  %478 = load volatile i32, ptr %477, align 4, !tbaa !31
  %479 = zext i32 %478 to i64
  %480 = and i64 %479, -2
  %481 = trunc i64 %480 to i32
  store volatile i32 %481, ptr %477, align 4, !tbaa !31
  %482 = load ptr, ptr %2, align 8, !tbaa !5
  %483 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %482, i32 0, i32 0
  %484 = load ptr, ptr %483, align 8, !tbaa !9
  %485 = call i32 @USB_FlushTxFifo(ptr noundef %484, i32 noundef 16)
  store i32 0, ptr %5, align 4, !tbaa !13
  br label %486

486:                                              ; preds = %538, %472
  %487 = load i32, ptr %5, align 4, !tbaa !13
  %488 = load ptr, ptr %2, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %488, i32 0, i32 1
  %490 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %489, i32 0, i32 0
  %491 = load i32, ptr %490, align 8, !tbaa !36
  %492 = icmp ult i32 %487, %491
  br i1 %492, label %493, label %541

493:                                              ; preds = %486
  %494 = load i32, ptr %4, align 4, !tbaa !13
  %495 = zext i32 %494 to i64
  %496 = add i64 %495, 2304
  %497 = load i32, ptr %5, align 4, !tbaa !13
  %498 = zext i32 %497 to i64
  %499 = mul i64 %498, 32
  %500 = add i64 %496, %499
  %501 = inttoptr i64 %500 to ptr
  %502 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %501, i32 0, i32 2
  store volatile i32 64383, ptr %502, align 4, !tbaa !23
  %503 = load i32, ptr %4, align 4, !tbaa !13
  %504 = zext i32 %503 to i64
  %505 = add i64 %504, 2304
  %506 = load i32, ptr %5, align 4, !tbaa !13
  %507 = zext i32 %506 to i64
  %508 = mul i64 %507, 32
  %509 = add i64 %505, %508
  %510 = inttoptr i64 %509 to ptr
  %511 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %510, i32 0, i32 0
  %512 = load volatile i32, ptr %511, align 4, !tbaa !37
  %513 = zext i32 %512 to i64
  %514 = and i64 %513, -2097153
  %515 = trunc i64 %514 to i32
  store volatile i32 %515, ptr %511, align 4, !tbaa !37
  %516 = load i32, ptr %4, align 4, !tbaa !13
  %517 = zext i32 %516 to i64
  %518 = add i64 %517, 2816
  %519 = load i32, ptr %5, align 4, !tbaa !13
  %520 = zext i32 %519 to i64
  %521 = mul i64 %520, 32
  %522 = add i64 %518, %521
  %523 = inttoptr i64 %522 to ptr
  %524 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %523, i32 0, i32 2
  store volatile i32 64383, ptr %524, align 4, !tbaa !16
  %525 = load i32, ptr %4, align 4, !tbaa !13
  %526 = zext i32 %525 to i64
  %527 = add i64 %526, 2816
  %528 = load i32, ptr %5, align 4, !tbaa !13
  %529 = zext i32 %528 to i64
  %530 = mul i64 %529, 32
  %531 = add i64 %527, %530
  %532 = inttoptr i64 %531 to ptr
  %533 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %532, i32 0, i32 0
  %534 = load volatile i32, ptr %533, align 4, !tbaa !38
  %535 = zext i32 %534 to i64
  %536 = and i64 %535, -2097153
  %537 = trunc i64 %536 to i32
  store volatile i32 %537, ptr %533, align 4, !tbaa !38
  br label %538

538:                                              ; preds = %493
  %539 = load i32, ptr %5, align 4, !tbaa !13
  %540 = add i32 %539, 1
  store i32 %540, ptr %5, align 4, !tbaa !13
  br label %486, !llvm.loop !39

541:                                              ; preds = %486
  %542 = load i32, ptr %4, align 4, !tbaa !13
  %543 = zext i32 %542 to i64
  %544 = add i64 %543, 2048
  %545 = inttoptr i64 %544 to ptr
  %546 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %545, i32 0, i32 7
  %547 = load volatile i32, ptr %546, align 4, !tbaa !40
  %548 = or i32 %547, 65537
  store volatile i32 %548, ptr %546, align 4, !tbaa !40
  %549 = load ptr, ptr %2, align 8, !tbaa !5
  %550 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %549, i32 0, i32 1
  %551 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %550, i32 0, i32 11
  %552 = load i32, ptr %551, align 4, !tbaa !41
  %553 = icmp ne i32 %552, 0
  br i1 %553, label %554, label %573

554:                                              ; preds = %541
  %555 = load i32, ptr %4, align 4, !tbaa !13
  %556 = zext i32 %555 to i64
  %557 = add i64 %556, 2048
  %558 = inttoptr i64 %557 to ptr
  %559 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %558, i32 0, i32 19
  %560 = load volatile i32, ptr %559, align 4, !tbaa !42
  %561 = zext i32 %560 to i64
  %562 = or i64 %561, 11
  %563 = trunc i64 %562 to i32
  store volatile i32 %563, ptr %559, align 4, !tbaa !42
  %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 17
  %569 = load volatile i32, ptr %568, align 4, !tbaa !43
  %570 = zext i32 %569 to i64
  %571 = or i64 %570, 11
  %572 = trunc i64 %571 to i32
  store volatile i32 %572, ptr %568, align 4, !tbaa !43
  br label %592

573:                                              ; preds = %541
  %574 = load i32, ptr %4, align 4, !tbaa !13
  %575 = zext i32 %574 to i64
  %576 = add i64 %575, 2048
  %577 = inttoptr i64 %576 to ptr
  %578 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %577, i32 0, i32 5
  %579 = load volatile i32, ptr %578, align 4, !tbaa !44
  %580 = zext i32 %579 to i64
  %581 = or i64 %580, 8235
  %582 = trunc i64 %581 to i32
  store volatile i32 %582, ptr %578, align 4, !tbaa !44
  %583 = load i32, ptr %4, align 4, !tbaa !13
  %584 = zext i32 %583 to i64
  %585 = add i64 %584, 2048
  %586 = inttoptr i64 %585 to ptr
  %587 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %586, i32 0, i32 4
  %588 = load volatile i32, ptr %587, align 4, !tbaa !45
  %589 = zext i32 %588 to i64
  %590 = or i64 %589, 11
  %591 = trunc i64 %590 to i32
  store volatile i32 %591, ptr %587, align 4, !tbaa !45
  br label %592

592:                                              ; preds = %573, %554
  %593 = load i32, ptr %4, align 4, !tbaa !13
  %594 = zext i32 %593 to i64
  %595 = add i64 %594, 2048
  %596 = inttoptr i64 %595 to ptr
  %597 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %596, i32 0, i32 0
  %598 = load volatile i32, ptr %597, align 4, !tbaa !46
  %599 = zext i32 %598 to i64
  %600 = and i64 %599, -2033
  %601 = trunc i64 %600 to i32
  store volatile i32 %601, ptr %597, align 4, !tbaa !46
  %602 = load ptr, ptr %2, align 8, !tbaa !5
  %603 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %602, i32 0, i32 0
  %604 = load ptr, ptr %603, align 8, !tbaa !9
  %605 = load ptr, ptr %2, align 8, !tbaa !5
  %606 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %605, i32 0, i32 1
  %607 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %606, i32 0, i32 3
  %608 = load i32, ptr %607, align 4, !tbaa !18
  %609 = trunc i32 %608 to i8
  %610 = load ptr, ptr %2, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %610, i32 0, i32 8
  %612 = getelementptr inbounds [12 x i32], ptr %611, i64 0, i64 0
  %613 = call i32 @USB_EP0_OutStart(ptr noundef %604, i8 noundef zeroext %609, ptr noundef %612)
  %614 = load ptr, ptr %2, align 8, !tbaa !5
  %615 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %614, i32 0, i32 0
  %616 = load ptr, ptr %615, align 8, !tbaa !9
  %617 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %616, i32 0, i32 5
  %618 = load volatile i32, ptr %617, align 4, !tbaa !14
  %619 = zext i32 %618 to i64
  %620 = and i64 %619, 4096
  %621 = trunc i64 %620 to i32
  store volatile i32 %621, ptr %617, align 4, !tbaa !14
  br label %622

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

630:                                              ; preds = %622
  %631 = load ptr, ptr %2, align 8, !tbaa !5
  %632 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %631, i32 0, i32 0
  %633 = load ptr, ptr %632, align 8, !tbaa !9
  %634 = call i32 @USB_ActivateSetup(ptr noundef %633)
  %635 = load ptr, ptr %2, align 8, !tbaa !5
  %636 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %635, i32 0, i32 0
  %637 = load ptr, ptr %636, align 8, !tbaa !9
  %638 = call zeroext i8 @USB_GetDevSpeed(ptr noundef %637)
  %639 = zext i8 %638 to i32
  %640 = load ptr, ptr %2, align 8, !tbaa !5
  %641 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %640, i32 0, i32 1
  %642 = getelementptr inbounds %struct.USB_OTG_CfgTypeDef, ptr %641, i32 0, i32 2
  store i32 %639, ptr %642, align 8, !tbaa !47
  %643 = load ptr, ptr %2, align 8, !tbaa !5
  %644 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %643, i32 0, i32 0
  %645 = load ptr, ptr %644, align 8, !tbaa !9
  %646 = call i32 @HAL_RCC_GetHCLKFreq()
  %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_OTG_CfgTypeDef, ptr %648, i32 0, i32 2
  %650 = load i32, ptr %649, align 8, !tbaa !47
  %651 = trunc i32 %650 to i8
  %652 = call i32 @USB_SetTurnaroundTime(ptr noundef %645, i32 noundef %646, i8 noundef zeroext %651)
  %653 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_ResetCallback(ptr noundef %653)
  %654 = load ptr, ptr %2, align 8, !tbaa !5
  %655 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %654, i32 0, i32 0
  %656 = load ptr, ptr %655, align 8, !tbaa !9
  %657 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %656, i32 0, i32 5
  %658 = load volatile i32, ptr %657, align 4, !tbaa !14
  %659 = zext i32 %658 to i64
  %660 = and i64 %659, 8192
  %661 = trunc i64 %660 to i32
  store volatile i32 %661, ptr %657, align 4, !tbaa !14
  br label %662

662:                                              ; preds = %630, %622
  %663 = load ptr, ptr %2, align 8, !tbaa !5
  %664 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %663, i32 0, i32 0
  %665 = load ptr, ptr %664, align 8, !tbaa !9
  %666 = call i32 @USB_ReadInterrupts(ptr noundef %665)
  %667 = zext i32 %666 to i64
  %668 = and i64 %667, 16
  %669 = icmp eq i64 %668, 16
  br i1 %669, label %670, label %761

670:                                              ; preds = %662
  %671 = load ptr, ptr %2, align 8, !tbaa !5
  %672 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %671, i32 0, i32 0
  %673 = load ptr, ptr %672, align 8, !tbaa !9
  %674 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %673, i32 0, i32 6
  %675 = load volatile i32, ptr %674, align 4, !tbaa !48
  %676 = zext i32 %675 to i64
  %677 = and i64 %676, -17
  %678 = trunc i64 %677 to i32
  store volatile i32 %678, ptr %674, align 4, !tbaa !48
  %679 = load ptr, ptr %3, align 8, !tbaa !5
  %680 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %679, i32 0, i32 8
  %681 = load volatile i32, ptr %680, align 4, !tbaa !49
  store i32 %681, ptr %10, align 4, !tbaa !13
  %682 = load ptr, ptr %2, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %682, i32 0, i32 4
  %684 = load i32, ptr %10, align 4, !tbaa !13
  %685 = zext i32 %684 to i64
  %686 = and i64 %685, 15
  %687 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %683, i64 0, i64 %686
  store ptr %687, ptr %11, align 8, !tbaa !5
  %688 = load i32, ptr %10, align 4, !tbaa !13
  %689 = zext i32 %688 to i64
  %690 = and i64 %689, 1966080
  %691 = lshr i64 %690, 17
  %692 = icmp eq i64 %691, 2
  br i1 %692, label %693, label %728

693:                                              ; preds = %670
  %694 = load i32, ptr %10, align 4, !tbaa !13
  %695 = zext i32 %694 to i64
  %696 = and i64 %695, 32752
  %697 = icmp ne i64 %696, 0
  br i1 %697, label %698, label %727

698:                                              ; preds = %693
  %699 = load ptr, ptr %3, align 8, !tbaa !5
  %700 = load ptr, ptr %11, align 8, !tbaa !5
  %701 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %700, i32 0, i32 8
  %702 = load ptr, ptr %701, align 8, !tbaa !28
  %703 = load i32, ptr %10, align 4, !tbaa !13
  %704 = zext i32 %703 to i64
  %705 = and i64 %704, 32752
  %706 = lshr i64 %705, 4
  %707 = trunc i64 %706 to i16
  %708 = call ptr @USB_ReadPacket(ptr noundef %699, ptr noundef %702, i16 noundef zeroext %707)
  %709 = load i32, ptr %10, align 4, !tbaa !13
  %710 = zext i32 %709 to i64
  %711 = and i64 %710, 32752
  %712 = lshr i64 %711, 4
  %713 = load ptr, ptr %11, align 8, !tbaa !5
  %714 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %713, i32 0, i32 8
  %715 = load ptr, ptr %714, align 8, !tbaa !28
  %716 = getelementptr inbounds i8, ptr %715, i64 %712
  store ptr %716, ptr %714, align 8, !tbaa !28
  %717 = load i32, ptr %10, align 4, !tbaa !13
  %718 = zext i32 %717 to i64
  %719 = and i64 %718, 32752
  %720 = lshr i64 %719, 4
  %721 = load ptr, ptr %11, align 8, !tbaa !5
  %722 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %721, i32 0, i32 11
  %723 = load i32, ptr %722, align 8, !tbaa !50
  %724 = zext i32 %723 to i64
  %725 = add i64 %724, %720
  %726 = trunc i64 %725 to i32
  store i32 %726, ptr %722, align 8, !tbaa !50
  br label %727

727:                                              ; preds = %698, %693
  br label %752

728:                                              ; preds = %670
  %729 = load i32, ptr %10, align 4, !tbaa !13
  %730 = zext i32 %729 to i64
  %731 = and i64 %730, 1966080
  %732 = lshr i64 %731, 17
  %733 = icmp eq i64 %732, 6
  br i1 %733, label %734, label %750

734:                                              ; preds = %728
  %735 = load ptr, ptr %3, align 8, !tbaa !5
  %736 = load ptr, ptr %2, align 8, !tbaa !5
  %737 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %736, i32 0, i32 8
  %738 = getelementptr inbounds [12 x i32], ptr %737, i64 0, i64 0
  %739 = call ptr @USB_ReadPacket(ptr noundef %735, ptr noundef %738, i16 noundef zeroext 8)
  %740 = load i32, ptr %10, align 4, !tbaa !13
  %741 = zext i32 %740 to i64
  %742 = and i64 %741, 32752
  %743 = lshr i64 %742, 4
  %744 = load ptr, ptr %11, align 8, !tbaa !5
  %745 = getelementptr inbounds %struct.USB_OTG_EPTypeDef, ptr %744, i32 0, i32 11
  %746 = load i32, ptr %745, align 8, !tbaa !50
  %747 = zext i32 %746 to i64
  %748 = add i64 %747, %743
  %749 = trunc i64 %748 to i32
  store i32 %749, ptr %745, align 8, !tbaa !50
  br label %751

750:                                              ; preds = %728
  br label %751

751:                                              ; preds = %750, %734
  br label %752

752:                                              ; preds = %751, %727
  %753 = load ptr, ptr %2, align 8, !tbaa !5
  %754 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %753, i32 0, i32 0
  %755 = load ptr, ptr %754, align 8, !tbaa !9
  %756 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %755, i32 0, i32 6
  %757 = load volatile i32, ptr %756, align 4, !tbaa !48
  %758 = zext i32 %757 to i64
  %759 = or i64 %758, 16
  %760 = trunc i64 %759 to i32
  store volatile i32 %760, ptr %756, align 4, !tbaa !48
  br label %761

761:                                              ; preds = %752, %662
  %762 = load ptr, ptr %2, align 8, !tbaa !5
  %763 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %762, i32 0, i32 0
  %764 = load ptr, ptr %763, align 8, !tbaa !9
  %765 = call i32 @USB_ReadInterrupts(ptr noundef %764)
  %766 = zext i32 %765 to i64
  %767 = and i64 %766, 8
  %768 = icmp eq i64 %767, 8
  br i1 %768, label %769, label %779

769:                                              ; preds = %761
  %770 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_SOFCallback(ptr noundef %770)
  %771 = load ptr, ptr %2, align 8, !tbaa !5
  %772 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %771, i32 0, i32 0
  %773 = load ptr, ptr %772, align 8, !tbaa !9
  %774 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %773, i32 0, i32 5
  %775 = load volatile i32, ptr %774, align 4, !tbaa !14
  %776 = zext i32 %775 to i64
  %777 = and i64 %776, 8
  %778 = trunc i64 %777 to i32
  store volatile i32 %778, ptr %774, align 4, !tbaa !14
  br label %779

779:                                              ; preds = %769, %761
  %780 = load ptr, ptr %2, align 8, !tbaa !5
  %781 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %780, i32 0, i32 0
  %782 = load ptr, ptr %781, align 8, !tbaa !9
  %783 = call i32 @USB_ReadInterrupts(ptr noundef %782)
  %784 = zext i32 %783 to i64
  %785 = and i64 %784, 1048576
  %786 = icmp eq i64 %785, 1048576
  br i1 %786, label %787, label %799

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

799:                                              ; preds = %787, %779
  %800 = load ptr, ptr %2, align 8, !tbaa !5
  %801 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %800, i32 0, i32 0
  %802 = load ptr, ptr %801, align 8, !tbaa !9
  %803 = call i32 @USB_ReadInterrupts(ptr noundef %802)
  %804 = zext i32 %803 to i64
  %805 = and i64 %804, 2097152
  %806 = icmp eq i64 %805, 2097152
  br i1 %806, label %807, label %819

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

819:                                              ; preds = %807, %799
  %820 = load ptr, ptr %2, align 8, !tbaa !5
  %821 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %820, i32 0, i32 0
  %822 = load ptr, ptr %821, align 8, !tbaa !9
  %823 = call i32 @USB_ReadInterrupts(ptr noundef %822)
  %824 = zext i32 %823 to i64
  %825 = and i64 %824, 1073741824
  %826 = icmp eq i64 %825, 1073741824
  br i1 %826, label %827, label %837

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

837:                                              ; preds = %827, %819
  %838 = load ptr, ptr %2, align 8, !tbaa !5
  %839 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %838, i32 0, i32 0
  %840 = load ptr, ptr %839, align 8, !tbaa !9
  %841 = call i32 @USB_ReadInterrupts(ptr noundef %840)
  %842 = zext i32 %841 to i64
  %843 = and i64 %842, 4
  %844 = icmp eq i64 %843, 4
  br i1 %844, label %845, label %865

845:                                              ; preds = %837
  %846 = load ptr, ptr %2, align 8, !tbaa !5
  %847 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %846, i32 0, i32 0
  %848 = load ptr, ptr %847, align 8, !tbaa !9
  %849 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %848, i32 0, i32 1
  %850 = load volatile i32, ptr %849, align 4, !tbaa !51
  store i32 %850, ptr %10, align 4, !tbaa !13
  %851 = load i32, ptr %10, align 4, !tbaa !13
  %852 = zext i32 %851 to i64
  %853 = and i64 %852, 4
  %854 = icmp eq i64 %853, 4
  br i1 %854, label %855, label %857

855:                                              ; preds = %845
  %856 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_PCD_DisconnectCallback(ptr noundef %856)
  br label %857

857:                                              ; preds = %855, %845
  %858 = load i32, ptr %10, align 4, !tbaa !13
  %859 = load ptr, ptr %2, align 8, !tbaa !5
  %860 = getelementptr inbounds %struct.PCD_HandleTypeDef, ptr %859, i32 0, i32 0
  %861 = load ptr, ptr %860, align 8, !tbaa !9
  %862 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %861, i32 0, i32 1
  %863 = load volatile i32, ptr %862, align 4, !tbaa !51
  %864 = or i32 %863, %858
  store volatile i32 %864, ptr %862, align 4, !tbaa !51
  br label %865

865:                                              ; preds = %857, %837
  br label %866

866:                                              ; preds = %865, %1
  store i32 0, ptr %12, align 4
  br label %867

867:                                              ; preds = %866, %29
  call void @llvm.lifetime.end.p0(i64 8, 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 4, 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
  %868 = load i32, ptr %12, align 4
  switch i32 %868, label %870 [
    i32 0, label %869
    i32 1, label %869
  ]

869:                                              ; preds = %867, %867
  ret void

870:                                              ; preds = %867
  unreachable
}

declare i32 @USB_GetMode(ptr noundef) #2

declare i32 @USB_ReadInterrupts(ptr noundef) #2

declare i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef) #2

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

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

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

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

declare i32 @USB_ReadDevAllInEpInterrupt(ptr noundef) #2

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

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

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

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

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

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

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

declare i32 @USB_ActivateSetup(ptr noundef) #2

declare zeroext i8 @USB_GetDevSpeed(ptr noundef) #2

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

declare i32 @HAL_RCC_GetHCLKFreq() #2

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

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

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

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

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

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

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

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

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

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


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.USB_OTG_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i16, i32, ptr, i32, i32, i32 }

; Function Attrs: nounwind uwtable
define dso_local void @HAL_PCD_IRQHandler(ptr noundef %0) local_unnamed_addr #0 {
  %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 %415

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

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

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

18:                                               ; preds = %14, %10
  %19 = tail call i32 @USB_ReadInterrupts(ptr noundef %.pre) #2
  %20 = and i32 %19, 524288
  %.not175 = icmp eq i32 %20, 0
  br i1 %.not175, label %.loopexit207, label %21

21:                                               ; preds = %18
  %22 = load ptr, ptr %0, align 8, !tbaa !5
  %23 = tail call i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef %22) #2
  %.not176208 = icmp eq i32 %23, 0
  br i1 %.not176208, label %.loopexit207, label %.lr.ph

.lr.ph:                                           ; preds = %21
  %24 = and i64 %3, 4294967295
  %25 = add nuw nsw i64 %24, 2816
  %26 = getelementptr inbounds i8, ptr %0, i64 20
  %27 = getelementptr inbounds i8, ptr %0, i64 1356
  br label %28

28:                                               ; preds = %.lr.ph, %78
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %78 ]
  %.0170210 = phi i32 [ %23, %.lr.ph ], [ %79, %78 ]
  %29 = and i32 %.0170210, 1
  %.not201 = icmp eq i32 %29, 0
  br i1 %.not201, label %78, label %30

30:                                               ; preds = %28
  %31 = load ptr, ptr %0, align 8, !tbaa !5
  %32 = trunc nuw nsw i64 %indvars.iv to i32
  %33 = trunc i64 %indvars.iv to i8
  %34 = tail call i32 @USB_ReadDevOutEPInterrupt(ptr noundef %31, i8 noundef zeroext %33) #2
  %35 = zext i32 %34 to i64
  %36 = and i64 %35, 1
  %.not202 = icmp eq i64 %36, 0
  br i1 %.not202, label %43, label %37

37:                                               ; preds = %30
  %38 = shl nuw nsw i64 %indvars.iv, 5
  %39 = add nuw nsw i64 %25, %38
  %40 = inttoptr i64 %39 to ptr
  %41 = getelementptr inbounds i8, ptr %40, i64 8
  store volatile i32 1, ptr %41, align 4, !tbaa !14
  %42 = tail call i32 @PCD_EP_OutXfrComplete_int(ptr noundef nonnull %0, i32 noundef %32)
  br label %43

43:                                               ; preds = %37, %30
  %44 = and i64 %35, 8
  %.not203 = icmp eq i64 %44, 0
  br i1 %.not203, label %51, label %45

45:                                               ; preds = %43
  %46 = tail call i32 @PCD_EP_OutSetupPacket_int(ptr noundef nonnull %0, i32 noundef %32)
  %47 = shl nuw nsw i64 %indvars.iv, 5
  %48 = add nuw nsw i64 %25, %47
  %49 = inttoptr i64 %48 to ptr
  %50 = getelementptr inbounds i8, ptr %49, i64 8
  store volatile i32 8, ptr %50, align 4, !tbaa !14
  br label %51

51:                                               ; preds = %45, %43
  %52 = and i64 %35, 16
  %.not204 = icmp eq i64 %52, 0
  br i1 %.not204, label %58, label %53

53:                                               ; preds = %51
  %54 = shl nuw nsw i64 %indvars.iv, 5
  %55 = add nuw nsw i64 %25, %54
  %56 = inttoptr i64 %55 to ptr
  %57 = getelementptr inbounds i8, ptr %56, i64 8
  store volatile i32 16, ptr %57, align 4, !tbaa !14
  br label %58

58:                                               ; preds = %53, %51
  %59 = and i64 %35, 32
  %.not205 = icmp eq i64 %59, 0
  br i1 %.not205, label %71, label %60

60:                                               ; preds = %58
  %61 = load i32, ptr %26, align 4, !tbaa !16
  %62 = icmp eq i32 %61, 1
  br i1 %62, label %63, label %66

63:                                               ; preds = %60
  %64 = load ptr, ptr %0, align 8, !tbaa !5
  %65 = tail call i32 @USB_EP0_OutStart(ptr noundef %64, i8 noundef zeroext 1, ptr noundef nonnull %27) #2
  br label %66

66:                                               ; preds = %63, %60
  %67 = shl nuw nsw i64 %indvars.iv, 5
  %68 = add nuw nsw i64 %25, %67
  %69 = inttoptr i64 %68 to ptr
  %70 = getelementptr inbounds i8, ptr %69, i64 8
  store volatile i32 32, ptr %70, align 4, !tbaa !14
  br label %71

71:                                               ; preds = %66, %58
  %72 = and i64 %35, 8192
  %.not206 = icmp eq i64 %72, 0
  br i1 %.not206, label %78, label %73

73:                                               ; preds = %71
  %74 = shl nuw nsw i64 %indvars.iv, 5
  %75 = add nuw nsw i64 %25, %74
  %76 = inttoptr i64 %75 to ptr
  %77 = getelementptr inbounds i8, ptr %76, i64 8
  store volatile i32 8192, ptr %77, align 4, !tbaa !14
  br label %78

78:                                               ; preds = %71, %73, %28
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %79 = lshr i32 %.0170210, 1
  %.not176 = icmp ult i32 %.0170210, 2
  br i1 %.not176, label %.loopexit207.loopexit, label %28, !llvm.loop !17

.loopexit207.loopexit:                            ; preds = %78
  %80 = trunc nuw nsw i64 %indvars.iv.next to i32
  br label %.loopexit207

.loopexit207:                                     ; preds = %.loopexit207.loopexit, %21, %18
  %.1172 = phi i32 [ 0, %18 ], [ 0, %21 ], [ %80, %.loopexit207.loopexit ]
  %81 = load ptr, ptr %0, align 8, !tbaa !5
  %82 = tail call i32 @USB_ReadInterrupts(ptr noundef %81) #2
  %83 = and i32 %82, 262144
  %.not177 = icmp eq i32 %83, 0
  br i1 %.not177, label %.loopexit, label %84

84:                                               ; preds = %.loopexit207
  %85 = load ptr, ptr %0, align 8, !tbaa !5
  %86 = tail call i32 @USB_ReadDevAllInEpInterrupt(ptr noundef %85) #2
  %.not178211 = icmp eq i32 %86, 0
  br i1 %.not178211, label %.loopexit, label %.lr.ph214

.lr.ph214:                                        ; preds = %84
  %87 = and i64 %3, 4294967295
  %88 = add nuw nsw i64 %87, 2048
  %89 = inttoptr i64 %88 to ptr
  %90 = getelementptr inbounds i8, ptr %89, i64 52
  %91 = add nuw nsw i64 %87, 2304
  %92 = getelementptr inbounds i8, ptr %0, i64 20
  %93 = getelementptr inbounds i8, ptr %0, i64 64
  %94 = getelementptr inbounds i8, ptr %0, i64 1356
  %95 = getelementptr inbounds i8, ptr %0, i64 92
  br label %96

96:                                               ; preds = %.lr.ph214, %167
  %indvars.iv221 = phi i64 [ 0, %.lr.ph214 ], [ %indvars.iv.next222, %167 ]
  %.1213 = phi i32 [ %86, %.lr.ph214 ], [ %168, %167 ]
  %97 = and i32 %.1213, 1
  %.not194 = icmp eq i32 %97, 0
  br i1 %.not194, label %167, label %98

98:                                               ; preds = %96
  %99 = load ptr, ptr %0, align 8, !tbaa !5
  %100 = trunc nuw nsw i64 %indvars.iv221 to i32
  %101 = trunc i64 %indvars.iv221 to i8
  %102 = tail call i32 @USB_ReadDevInEPInterrupt(ptr noundef %99, i8 noundef zeroext %101) #2
  %103 = zext i32 %102 to i64
  %104 = and i64 %103, 1
  %.not195 = icmp eq i64 %104, 0
  br i1 %.not195, label %135, label %105

105:                                              ; preds = %98
  %106 = and i32 %100, 15
  %107 = shl nuw nsw i32 1, %106
  %108 = xor i32 %107, -1
  %109 = load volatile i32, ptr %90, align 4, !tbaa !19
  %110 = and i32 %109, %108
  store volatile i32 %110, ptr %90, align 4, !tbaa !19
  %111 = shl nuw nsw i64 %indvars.iv221, 5
  %112 = add nuw nsw i64 %91, %111
  %113 = inttoptr i64 %112 to ptr
  %114 = getelementptr inbounds i8, ptr %113, i64 8
  store volatile i32 1, ptr %114, align 4, !tbaa !21
  %115 = load i32, ptr %92, align 4, !tbaa !16
  %116 = icmp eq i32 %115, 1
  br i1 %116, label %117, label %125

117:                                              ; preds = %105
  %118 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %93, i64 0, i64 %indvars.iv221
  %119 = getelementptr inbounds i8, ptr %118, i64 8
  %120 = load i32, ptr %119, align 8, !tbaa !23
  %121 = getelementptr inbounds i8, ptr %118, i64 16
  %122 = load ptr, ptr %121, align 8, !tbaa !26
  %123 = zext i32 %120 to i64
  %124 = getelementptr inbounds i8, ptr %122, i64 %123
  store ptr %124, ptr %121, align 8, !tbaa !26
  br label %125

125:                                              ; preds = %117, %105
  tail call void @HAL_PCD_DataInStageCallback(ptr noundef nonnull %0, i8 noundef zeroext %101)
  %126 = load i32, ptr %92, align 4, !tbaa !16
  %127 = icmp eq i32 %126, 1
  %128 = icmp eq i64 %indvars.iv221, 0
  %or.cond = select i1 %127, i1 %128, i1 false
  br i1 %or.cond, label %129, label %135

129:                                              ; preds = %125
  %130 = load i32, ptr %95, align 4, !tbaa !27
  %131 = icmp eq i32 %130, 0
  br i1 %131, label %132, label %135

132:                                              ; preds = %129
  %133 = load ptr, ptr %0, align 8, !tbaa !5
  %134 = tail call i32 @USB_EP0_OutStart(ptr noundef %133, i8 noundef zeroext 1, ptr noundef nonnull %94) #2
  br label %135

135:                                              ; preds = %125, %132, %129, %98
  %136 = and i64 %103, 8
  %.not196 = icmp eq i64 %136, 0
  br i1 %.not196, label %142, label %137

137:                                              ; preds = %135
  %138 = shl nuw nsw i64 %indvars.iv221, 5
  %139 = add nuw nsw i64 %91, %138
  %140 = inttoptr i64 %139 to ptr
  %141 = getelementptr inbounds i8, ptr %140, i64 8
  store volatile i32 8, ptr %141, align 4, !tbaa !21
  br label %142

142:                                              ; preds = %137, %135
  %143 = and i64 %103, 16
  %.not197 = icmp eq i64 %143, 0
  br i1 %.not197, label %149, label %144

144:                                              ; preds = %142
  %145 = shl nuw nsw i64 %indvars.iv221, 5
  %146 = add nuw nsw i64 %91, %145
  %147 = inttoptr i64 %146 to ptr
  %148 = getelementptr inbounds i8, ptr %147, i64 8
  store volatile i32 16, ptr %148, align 4, !tbaa !21
  br label %149

149:                                              ; preds = %144, %142
  %150 = and i64 %103, 64
  %.not198 = icmp eq i64 %150, 0
  br i1 %.not198, label %156, label %151

151:                                              ; preds = %149
  %152 = shl nuw nsw i64 %indvars.iv221, 5
  %153 = add nuw nsw i64 %91, %152
  %154 = inttoptr i64 %153 to ptr
  %155 = getelementptr inbounds i8, ptr %154, i64 8
  store volatile i32 64, ptr %155, align 4, !tbaa !21
  br label %156

156:                                              ; preds = %151, %149
  %157 = and i64 %103, 2
  %.not199 = icmp eq i64 %157, 0
  br i1 %.not199, label %163, label %158

158:                                              ; preds = %156
  %159 = shl nuw nsw i64 %indvars.iv221, 5
  %160 = add nuw nsw i64 %91, %159
  %161 = inttoptr i64 %160 to ptr
  %162 = getelementptr inbounds i8, ptr %161, i64 8
  store volatile i32 2, ptr %162, align 4, !tbaa !21
  br label %163

163:                                              ; preds = %158, %156
  %164 = and i64 %103, 128
  %.not200 = icmp eq i64 %164, 0
  br i1 %.not200, label %167, label %165

165:                                              ; preds = %163
  %166 = tail call i32 @PCD_WriteEmptyTxFifo(ptr noundef nonnull %0, i32 noundef %100)
  br label %167

167:                                              ; preds = %163, %165, %96
  %indvars.iv.next222 = add nuw nsw i64 %indvars.iv221, 1
  %168 = lshr i32 %.1213, 1
  %.not178 = icmp ult i32 %.1213, 2
  br i1 %.not178, label %.loopexit.loopexit, label %96, !llvm.loop !28

.loopexit.loopexit:                               ; preds = %167
  %169 = trunc nuw nsw i64 %indvars.iv.next222 to i32
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit, %84, %.loopexit207
  %.3 = phi i32 [ %.1172, %.loopexit207 ], [ 0, %84 ], [ %169, %.loopexit.loopexit ]
  %170 = load ptr, ptr %0, align 8, !tbaa !5
  %171 = tail call i32 @USB_ReadInterrupts(ptr noundef %170) #2
  %.not179 = icmp sgt i32 %171, -1
  br i1 %.not179, label %.loopexit._crit_edge, label %172

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

172:                                              ; preds = %.loopexit
  %173 = and i64 %3, 4294967295
  %174 = add nuw nsw i64 %173, 2048
  %175 = inttoptr i64 %174 to ptr
  %176 = getelementptr inbounds i8, ptr %175, i64 4
  %177 = load volatile i32, ptr %176, align 4, !tbaa !29
  %178 = and i32 %177, -2
  store volatile i32 %178, ptr %176, align 4, !tbaa !29
  %179 = getelementptr inbounds i8, ptr %0, i64 1404
  %180 = load i32, ptr %179, align 4, !tbaa !30
  %181 = icmp eq i32 %180, 1
  br i1 %181, label %182, label %183

182:                                              ; preds = %172
  store i32 0, ptr %179, align 4, !tbaa !30
  tail call void @HAL_PCDEx_LPM_Callback(ptr noundef nonnull %0, i32 noundef 0) #2
  br label %184

183:                                              ; preds = %172
  tail call void @HAL_PCD_ResumeCallback(ptr noundef nonnull %0)
  br label %184

184:                                              ; preds = %183, %182
  %185 = load ptr, ptr %0, align 8, !tbaa !5
  %186 = getelementptr inbounds i8, ptr %185, i64 20
  %187 = load volatile i32, ptr %186, align 4, !tbaa !12
  %188 = and i32 %187, -2147483648
  store volatile i32 %188, ptr %186, align 4, !tbaa !12
  br label %189

189:                                              ; preds = %.loopexit._crit_edge, %184
  %190 = phi ptr [ %.pre227, %.loopexit._crit_edge ], [ %185, %184 ]
  %191 = tail call i32 @USB_ReadInterrupts(ptr noundef %190) #2
  %192 = and i32 %191, 2048
  %.not180 = icmp eq i32 %192, 0
  br i1 %.not180, label %._crit_edge228, label %193

._crit_edge228:                                   ; preds = %189
  %.pre229 = load ptr, ptr %0, align 8, !tbaa !5
  br label %206

193:                                              ; preds = %189
  %194 = and i64 %3, 4294967295
  %195 = add nuw nsw i64 %194, 2048
  %196 = inttoptr i64 %195 to ptr
  %197 = getelementptr inbounds i8, ptr %196, i64 8
  %198 = load volatile i32, ptr %197, align 4, !tbaa !31
  %199 = and i32 %198, 1
  %.not181 = icmp eq i32 %199, 0
  br i1 %.not181, label %201, label %200

200:                                              ; preds = %193
  tail call void @HAL_PCD_SuspendCallback(ptr noundef nonnull %0)
  br label %201

201:                                              ; preds = %200, %193
  %202 = load ptr, ptr %0, align 8, !tbaa !5
  %203 = getelementptr inbounds i8, ptr %202, i64 20
  %204 = load volatile i32, ptr %203, align 4, !tbaa !12
  %205 = and i32 %204, 2048
  store volatile i32 %205, ptr %203, align 4, !tbaa !12
  br label %206

206:                                              ; preds = %._crit_edge228, %201
  %207 = phi ptr [ %.pre229, %._crit_edge228 ], [ %202, %201 ]
  %208 = tail call i32 @USB_ReadInterrupts(ptr noundef %207) #2
  %209 = and i32 %208, 134217728
  %.not182 = icmp eq i32 %209, 0
  br i1 %.not182, label %225, label %210

210:                                              ; preds = %206
  %211 = load ptr, ptr %0, align 8, !tbaa !5
  %212 = getelementptr inbounds i8, ptr %211, i64 20
  %213 = load volatile i32, ptr %212, align 4, !tbaa !12
  %214 = and i32 %213, 134217728
  store volatile i32 %214, ptr %212, align 4, !tbaa !12
  %215 = getelementptr inbounds i8, ptr %0, i64 1404
  %216 = load i32, ptr %215, align 4, !tbaa !30
  %217 = icmp eq i32 %216, 0
  br i1 %217, label %218, label %224

218:                                              ; preds = %210
  store i32 1, ptr %215, align 4, !tbaa !30
  %219 = getelementptr inbounds i8, ptr %211, i64 84
  %220 = load volatile i32, ptr %219, align 4, !tbaa !32
  %221 = lshr i32 %220, 2
  %222 = and i32 %221, 15
  %223 = getelementptr inbounds i8, ptr %0, i64 1408
  store i32 %222, ptr %223, align 8, !tbaa !33
  tail call void @HAL_PCDEx_LPM_Callback(ptr noundef nonnull %0, i32 noundef 1) #2
  br label %225

224:                                              ; preds = %210
  tail call void @HAL_PCD_SuspendCallback(ptr noundef nonnull %0)
  br label %225

225:                                              ; preds = %218, %224, %206
  %226 = load ptr, ptr %0, align 8, !tbaa !5
  %227 = tail call i32 @USB_ReadInterrupts(ptr noundef %226) #2
  %228 = and i32 %227, 4096
  %.not183 = icmp eq i32 %228, 0
  br i1 %.not183, label %._crit_edge230, label %229

._crit_edge230:                                   ; preds = %225
  %.pre231 = load ptr, ptr %0, align 8, !tbaa !5
  br label %300

229:                                              ; preds = %225
  %230 = and i64 %3, 4294967295
  %231 = add nuw nsw i64 %230, 2048
  %232 = inttoptr i64 %231 to ptr
  %233 = getelementptr inbounds i8, ptr %232, i64 4
  %234 = load volatile i32, ptr %233, align 4, !tbaa !29
  %235 = and i32 %234, -2
  store volatile i32 %235, ptr %233, align 4, !tbaa !29
  %236 = load ptr, ptr %0, align 8, !tbaa !5
  %237 = tail call i32 @USB_FlushTxFifo(ptr noundef %236, i32 noundef 16) #2
  %238 = getelementptr inbounds i8, ptr %0, i64 8
  %239 = load i32, ptr %238, align 8, !tbaa !34
  %.fr = freeze i32 %239
  %.not218 = icmp eq i32 %.fr, 0
  br i1 %.not218, label %._crit_edge, label %.lr.ph217

.lr.ph217:                                        ; preds = %229
  %240 = add nuw nsw i64 %230, 2304
  %241 = add nuw nsw i64 %230, 2816
  %wide.trip.count = zext i32 %.fr to i64
  %xtraiter = and i64 %wide.trip.count, 1
  %242 = icmp eq i32 %.fr, 1
  br i1 %242, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph217.new

.lr.ph217.new:                                    ; preds = %.lr.ph217
  %unroll_iter = and i64 %wide.trip.count, 4294967294
  br label %243

243:                                              ; preds = %243, %.lr.ph217.new
  %indvars.iv224 = phi i64 [ 0, %.lr.ph217.new ], [ %indvars.iv.next225.1, %243 ]
  %niter = phi i64 [ 0, %.lr.ph217.new ], [ %niter.next.1, %243 ]
  %244 = shl nuw nsw i64 %indvars.iv224, 5
  %245 = add nuw nsw i64 %240, %244
  %246 = inttoptr i64 %245 to ptr
  %247 = getelementptr inbounds i8, ptr %246, i64 8
  store volatile i32 64383, ptr %247, align 4, !tbaa !21
  %248 = load volatile i32, ptr %246, align 4, !tbaa !35
  %249 = and i32 %248, -2097153
  store volatile i32 %249, ptr %246, align 4, !tbaa !35
  %250 = add nuw nsw i64 %241, %244
  %251 = inttoptr i64 %250 to ptr
  %252 = getelementptr inbounds i8, ptr %251, i64 8
  store volatile i32 64383, ptr %252, align 4, !tbaa !14
  %253 = load volatile i32, ptr %251, align 4, !tbaa !36
  %254 = and i32 %253, -2097153
  store volatile i32 %254, ptr %251, align 4, !tbaa !36
  %indvars.iv.next225 = shl i64 %indvars.iv224, 5
  %255 = or disjoint i64 %indvars.iv.next225, 32
  %256 = add nuw nsw i64 %240, %255
  %257 = inttoptr i64 %256 to ptr
  %258 = getelementptr inbounds i8, ptr %257, i64 8
  store volatile i32 64383, ptr %258, align 4, !tbaa !21
  %259 = load volatile i32, ptr %257, align 4, !tbaa !35
  %260 = and i32 %259, -2097153
  store volatile i32 %260, ptr %257, align 4, !tbaa !35
  %261 = add nuw nsw i64 %241, %255
  %262 = inttoptr i64 %261 to ptr
  %263 = getelementptr inbounds i8, ptr %262, i64 8
  store volatile i32 64383, ptr %263, align 4, !tbaa !14
  %264 = load volatile i32, ptr %262, align 4, !tbaa !36
  %265 = and i32 %264, -2097153
  store volatile i32 %265, ptr %262, align 4, !tbaa !36
  %indvars.iv.next225.1 = add nuw nsw i64 %indvars.iv224, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa.loopexit, label %243, !llvm.loop !37

._crit_edge.loopexit.unr-lcssa.loopexit:          ; preds = %243
  %266 = shl nuw nsw i64 %indvars.iv.next225.1, 5
  br label %._crit_edge.loopexit.unr-lcssa

._crit_edge.loopexit.unr-lcssa:                   ; preds = %._crit_edge.loopexit.unr-lcssa.loopexit, %.lr.ph217
  %indvars.iv224.unr = phi i64 [ 0, %.lr.ph217 ], [ %266, %._crit_edge.loopexit.unr-lcssa.loopexit ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %._crit_edge.loopexit.epilog-lcssa

._crit_edge.loopexit.epilog-lcssa:                ; preds = %._crit_edge.loopexit.unr-lcssa
  %267 = add nuw nsw i64 %240, %indvars.iv224.unr
  %268 = inttoptr i64 %267 to ptr
  %269 = getelementptr inbounds i8, ptr %268, i64 8
  store volatile i32 64383, ptr %269, align 4, !tbaa !21
  %270 = load volatile i32, ptr %268, align 4, !tbaa !35
  %271 = and i32 %270, -2097153
  store volatile i32 %271, ptr %268, align 4, !tbaa !35
  %272 = add nuw nsw i64 %241, %indvars.iv224.unr
  %273 = inttoptr i64 %272 to ptr
  %274 = getelementptr inbounds i8, ptr %273, i64 8
  store volatile i32 64383, ptr %274, align 4, !tbaa !14
  %275 = load volatile i32, ptr %273, align 4, !tbaa !36
  %276 = and i32 %275, -2097153
  store volatile i32 %276, ptr %273, align 4, !tbaa !36
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit.epilog-lcssa, %._crit_edge.loopexit.unr-lcssa, %229
  %277 = getelementptr inbounds i8, ptr %232, i64 28
  %278 = load volatile i32, ptr %277, align 4, !tbaa !38
  %279 = or i32 %278, 65537
  store volatile i32 %279, ptr %277, align 4, !tbaa !38
  %280 = getelementptr inbounds i8, ptr %0, i64 52
  %281 = load i32, ptr %280, align 4, !tbaa !39
  %.not184 = icmp eq i32 %281, 0
  %. = select i1 %.not184, i64 20, i64 132
  %.250 = select i1 %.not184, i32 8235, i32 11
  %.251 = select i1 %.not184, i64 16, i64 68
  %282 = getelementptr inbounds i8, ptr %232, i64 %.
  %283 = load volatile i32, ptr %282, align 4, !tbaa !40
  %284 = or i32 %283, %.250
  store volatile i32 %284, ptr %282, align 4, !tbaa !40
  %285 = getelementptr inbounds i8, ptr %232, i64 %.251
  %286 = load volatile i32, ptr %285, align 4, !tbaa !40
  %287 = or i32 %286, 11
  store volatile i32 %287, ptr %285, align 4, !tbaa !40
  %288 = load volatile i32, ptr %232, align 4, !tbaa !41
  %289 = and i32 %288, -2033
  store volatile i32 %289, ptr %232, align 4, !tbaa !41
  %290 = load ptr, ptr %0, align 8, !tbaa !5
  %291 = getelementptr inbounds i8, ptr %0, i64 20
  %292 = load i32, ptr %291, align 4, !tbaa !16
  %293 = trunc i32 %292 to i8
  %294 = getelementptr inbounds i8, ptr %0, i64 1356
  %295 = tail call i32 @USB_EP0_OutStart(ptr noundef %290, i8 noundef zeroext %293, ptr noundef nonnull %294) #2
  %296 = load ptr, ptr %0, align 8, !tbaa !5
  %297 = getelementptr inbounds i8, ptr %296, i64 20
  %298 = load volatile i32, ptr %297, align 4, !tbaa !12
  %299 = and i32 %298, 4096
  store volatile i32 %299, ptr %297, align 4, !tbaa !12
  br label %300

300:                                              ; preds = %._crit_edge230, %._crit_edge
  %301 = phi ptr [ %.pre231, %._crit_edge230 ], [ %296, %._crit_edge ]
  %302 = tail call i32 @USB_ReadInterrupts(ptr noundef %301) #2
  %303 = and i32 %302, 8192
  %.not185 = icmp eq i32 %303, 0
  %.pre232 = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not185, label %319, label %304

304:                                              ; preds = %300
  %305 = tail call i32 @USB_ActivateSetup(ptr noundef %.pre232) #2
  %306 = load ptr, ptr %0, align 8, !tbaa !5
  %307 = tail call zeroext i8 @USB_GetDevSpeed(ptr noundef %306) #2
  %308 = zext i8 %307 to i32
  %309 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 %308, ptr %309, align 8, !tbaa !42
  %310 = load ptr, ptr %0, align 8, !tbaa !5
  %311 = tail call i32 @HAL_RCC_GetHCLKFreq() #2
  %312 = load i32, ptr %309, align 8, !tbaa !42
  %313 = trunc i32 %312 to i8
  %314 = tail call i32 @USB_SetTurnaroundTime(ptr noundef %310, i32 noundef %311, i8 noundef zeroext %313) #2
  tail call void @HAL_PCD_ResetCallback(ptr noundef nonnull %0)
  %315 = load ptr, ptr %0, align 8, !tbaa !5
  %316 = getelementptr inbounds i8, ptr %315, i64 20
  %317 = load volatile i32, ptr %316, align 4, !tbaa !12
  %318 = and i32 %317, 8192
  store volatile i32 %318, ptr %316, align 4, !tbaa !12
  br label %319

319:                                              ; preds = %304, %300
  %320 = phi ptr [ %315, %304 ], [ %.pre232, %300 ]
  %321 = tail call i32 @USB_ReadInterrupts(ptr noundef %320) #2
  %322 = and i32 %321, 16
  %.not186 = icmp eq i32 %322, 0
  %.pre233 = load ptr, ptr %0, align 8, !tbaa !5
  br i1 %.not186, label %362, label %323

323:                                              ; preds = %319
  %324 = getelementptr inbounds i8, ptr %.pre233, i64 24
  %325 = load volatile i32, ptr %324, align 4, !tbaa !43
  %326 = and i32 %325, -17
  store volatile i32 %326, ptr %324, align 4, !tbaa !43
  %327 = getelementptr inbounds i8, ptr %2, i64 32
  %328 = load volatile i32, ptr %327, align 4, !tbaa !44
  %329 = getelementptr inbounds i8, ptr %0, i64 704
  %330 = zext i32 %328 to i64
  %331 = and i64 %330, 15
  %332 = getelementptr inbounds [16 x %struct.USB_OTG_EPTypeDef], ptr %329, i64 0, i64 %331
  %333 = lshr i64 %330, 17
  %334 = and i64 %333, 15
  switch i64 %334, label %357 [
    i64 2, label %335
    i64 6, label %349
  ]

335:                                              ; preds = %323
  %336 = and i64 %330, 32752
  %.not187 = icmp eq i64 %336, 0
  br i1 %.not187, label %357, label %337

337:                                              ; preds = %335
  %338 = getelementptr inbounds i8, ptr %332, i64 16
  %339 = load ptr, ptr %338, align 8, !tbaa !26
  %340 = lshr exact i64 %336, 4
  %341 = trunc nuw nsw i64 %340 to i16
  %342 = tail call ptr @USB_ReadPacket(ptr noundef nonnull %2, ptr noundef %339, i16 noundef zeroext %341) #2
  %343 = load ptr, ptr %338, align 8, !tbaa !26
  %344 = getelementptr inbounds i8, ptr %343, i64 %340
  store ptr %344, ptr %338, align 8, !tbaa !26
  %345 = getelementptr inbounds i8, ptr %332, i64 32
  %346 = load i32, ptr %345, align 8, !tbaa !45
  %347 = trunc nuw nsw i64 %340 to i32
  %348 = add i32 %346, %347
  store i32 %348, ptr %345, align 8, !tbaa !45
  br label %357

349:                                              ; preds = %323
  %350 = getelementptr inbounds i8, ptr %0, i64 1356
  %351 = tail call ptr @USB_ReadPacket(ptr noundef nonnull %2, ptr noundef nonnull %350, i16 noundef zeroext 8) #2
  %352 = lshr i32 %328, 4
  %353 = and i32 %352, 2047
  %354 = getelementptr inbounds i8, ptr %332, i64 32
  %355 = load i32, ptr %354, align 8, !tbaa !45
  %356 = add i32 %355, %353
  store i32 %356, ptr %354, align 8, !tbaa !45
  br label %357

357:                                              ; preds = %323, %349, %335, %337
  %358 = load ptr, ptr %0, align 8, !tbaa !5
  %359 = getelementptr inbounds i8, ptr %358, i64 24
  %360 = load volatile i32, ptr %359, align 4, !tbaa !43
  %361 = or i32 %360, 16
  store volatile i32 %361, ptr %359, align 4, !tbaa !43
  br label %362

362:                                              ; preds = %357, %319
  %363 = phi ptr [ %358, %357 ], [ %.pre233, %319 ]
  %364 = tail call i32 @USB_ReadInterrupts(ptr noundef %363) #2
  %365 = and i32 %364, 8
  %.not188 = icmp eq i32 %365, 0
  br i1 %.not188, label %._crit_edge234, label %366

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

366:                                              ; preds = %362
  tail call void @HAL_PCD_SOFCallback(ptr noundef nonnull %0)
  %367 = load ptr, ptr %0, align 8, !tbaa !5
  %368 = getelementptr inbounds i8, ptr %367, i64 20
  %369 = load volatile i32, ptr %368, align 4, !tbaa !12
  %370 = and i32 %369, 8
  store volatile i32 %370, ptr %368, align 4, !tbaa !12
  br label %371

371:                                              ; preds = %._crit_edge234, %366
  %372 = phi ptr [ %.pre235, %._crit_edge234 ], [ %367, %366 ]
  %373 = tail call i32 @USB_ReadInterrupts(ptr noundef %372) #2
  %374 = and i32 %373, 1048576
  %.not189 = icmp eq i32 %374, 0
  br i1 %.not189, label %._crit_edge236, label %375

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

375:                                              ; preds = %371
  %376 = trunc i32 %.3 to i8
  tail call void @HAL_PCD_ISOINIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext %376)
  %377 = load ptr, ptr %0, align 8, !tbaa !5
  %378 = getelementptr inbounds i8, ptr %377, i64 20
  %379 = load volatile i32, ptr %378, align 4, !tbaa !12
  %380 = and i32 %379, 1048576
  store volatile i32 %380, ptr %378, align 4, !tbaa !12
  br label %381

381:                                              ; preds = %._crit_edge236, %375
  %382 = phi ptr [ %.pre237, %._crit_edge236 ], [ %377, %375 ]
  %383 = tail call i32 @USB_ReadInterrupts(ptr noundef %382) #2
  %384 = and i32 %383, 2097152
  %.not190 = icmp eq i32 %384, 0
  br i1 %.not190, label %._crit_edge238, label %385

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

385:                                              ; preds = %381
  %386 = trunc i32 %.3 to i8
  tail call void @HAL_PCD_ISOOUTIncompleteCallback(ptr noundef nonnull %0, i8 noundef zeroext %386)
  %387 = load ptr, ptr %0, align 8, !tbaa !5
  %388 = getelementptr inbounds i8, ptr %387, i64 20
  %389 = load volatile i32, ptr %388, align 4, !tbaa !12
  %390 = and i32 %389, 2097152
  store volatile i32 %390, ptr %388, align 4, !tbaa !12
  br label %391

391:                                              ; preds = %._crit_edge238, %385
  %392 = phi ptr [ %.pre239, %._crit_edge238 ], [ %387, %385 ]
  %393 = tail call i32 @USB_ReadInterrupts(ptr noundef %392) #2
  %394 = and i32 %393, 1073741824
  %.not191 = icmp eq i32 %394, 0
  br i1 %.not191, label %._crit_edge240, label %395

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

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

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

404:                                              ; preds = %400
  %405 = load ptr, ptr %0, align 8, !tbaa !5
  %406 = getelementptr inbounds i8, ptr %405, i64 4
  %407 = load volatile i32, ptr %406, align 4, !tbaa !46
  %408 = and i32 %407, 4
  %.not193 = icmp eq i32 %408, 0
  br i1 %.not193, label %410, label %409

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

410:                                              ; preds = %409, %404
  %411 = phi ptr [ %.pre242, %409 ], [ %405, %404 ]
  %412 = getelementptr inbounds i8, ptr %411, i64 4
  %413 = load volatile i32, ptr %412, align 4, !tbaa !46
  %414 = or i32 %413, %407
  store volatile i32 %414, ptr %412, align 4, !tbaa !46
  br label %415

415:                                              ; preds = %1, %410, %400, %6
  ret void
}

declare i32 @USB_GetMode(ptr noundef) local_unnamed_addr #1

declare i32 @USB_ReadInterrupts(ptr noundef) local_unnamed_addr #1

declare i32 @USB_ReadDevAllOutEpInterrupt(ptr noundef) local_unnamed_addr #1

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

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

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

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

declare i32 @USB_ReadDevAllInEpInterrupt(ptr noundef) local_unnamed_addr #1

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

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

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

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

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

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

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

declare i32 @USB_ActivateSetup(ptr noundef) local_unnamed_addr #1

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

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

declare i32 @HAL_RCC_GetHCLKFreq() local_unnamed_addr #1

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

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

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

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

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

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

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

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

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

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


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