; LLVM IR from reazon-research/OpenArm :: control/canfd_control/Drivers/STM32H7xx_HAL_Driver/Src (stm32h7xx_ll_usb)

; 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.USB_EPTypeDef = type { i8, i8, i8, i8, i8, i8, i32, ptr, i32, i32, i8, i16, i32, i32 }
%struct.USB_OTG_INEndpointTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.USB_OTG_DeviceTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [15 x i32], i32 }
%struct.USB_OTG_OUTEndpointTypeDef = type { i32, i32, i32, i32, i32, i32, [2 x 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 i32 @USB_EPStartXfer(ptr noundef %0, ptr noundef %1, i8 noundef zeroext %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i8, align 1
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i16, align 2
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store i8 %2, ptr %6, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #2
  %10 = load ptr, ptr %4, align 8, !tbaa !5
  %11 = ptrtoint ptr %10 to i32
  store i32 %11, ptr %7, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #2
  %12 = load ptr, ptr %5, align 8, !tbaa !5
  %13 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %12, i32 0, i32 0
  %14 = load i8, ptr %13, align 8, !tbaa !12
  %15 = zext i8 %14 to i32
  store i32 %15, ptr %8, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 2, ptr %9) #2
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %16, i32 0, i32 1
  %18 = load i8, ptr %17, align 1, !tbaa !15
  %19 = zext i8 %18 to i32
  %20 = icmp eq i32 %19, 1
  br i1 %20, label %21, label %379

21:                                               ; preds = %3
  %22 = load ptr, ptr %5, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %22, i32 0, i32 8
  %24 = load i32, ptr %23, align 8, !tbaa !16
  %25 = icmp eq i32 %24, 0
  br i1 %25, label %26, label %66

26:                                               ; preds = %21
  %27 = load i32, ptr %7, align 4, !tbaa !10
  %28 = zext i32 %27 to i64
  %29 = add i64 %28, 2304
  %30 = load i32, ptr %8, align 4, !tbaa !10
  %31 = zext i32 %30 to i64
  %32 = mul i64 %31, 32
  %33 = add i64 %29, %32
  %34 = inttoptr i64 %33 to ptr
  %35 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %34, i32 0, i32 4
  %36 = load volatile i32, ptr %35, align 4, !tbaa !17
  %37 = zext i32 %36 to i64
  %38 = and i64 %37, -536346625
  %39 = trunc i64 %38 to i32
  store volatile i32 %39, ptr %35, align 4, !tbaa !17
  %40 = load i32, ptr %7, align 4, !tbaa !10
  %41 = zext i32 %40 to i64
  %42 = add i64 %41, 2304
  %43 = load i32, ptr %8, align 4, !tbaa !10
  %44 = zext i32 %43 to i64
  %45 = mul i64 %44, 32
  %46 = add i64 %42, %45
  %47 = inttoptr i64 %46 to ptr
  %48 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %47, i32 0, i32 4
  %49 = load volatile i32, ptr %48, align 4, !tbaa !17
  %50 = zext i32 %49 to i64
  %51 = or i64 %50, 524288
  %52 = trunc i64 %51 to i32
  store volatile i32 %52, ptr %48, align 4, !tbaa !17
  %53 = load i32, ptr %7, align 4, !tbaa !10
  %54 = zext i32 %53 to i64
  %55 = add i64 %54, 2304
  %56 = load i32, ptr %8, align 4, !tbaa !10
  %57 = zext i32 %56 to i64
  %58 = mul i64 %57, 32
  %59 = add i64 %55, %58
  %60 = inttoptr i64 %59 to ptr
  %61 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %60, i32 0, i32 4
  %62 = load volatile i32, ptr %61, align 4, !tbaa !17
  %63 = zext i32 %62 to i64
  %64 = and i64 %63, -524288
  %65 = trunc i64 %64 to i32
  store volatile i32 %65, ptr %61, align 4, !tbaa !17
  br label %204

66:                                               ; preds = %21
  %67 = load i32, ptr %7, align 4, !tbaa !10
  %68 = zext i32 %67 to i64
  %69 = add i64 %68, 2304
  %70 = load i32, ptr %8, align 4, !tbaa !10
  %71 = zext i32 %70 to i64
  %72 = mul i64 %71, 32
  %73 = add i64 %69, %72
  %74 = inttoptr i64 %73 to ptr
  %75 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %74, i32 0, i32 4
  %76 = load volatile i32, ptr %75, align 4, !tbaa !17
  %77 = zext i32 %76 to i64
  %78 = and i64 %77, -524288
  %79 = trunc i64 %78 to i32
  store volatile i32 %79, ptr %75, align 4, !tbaa !17
  %80 = load i32, ptr %7, align 4, !tbaa !10
  %81 = zext i32 %80 to i64
  %82 = add i64 %81, 2304
  %83 = load i32, ptr %8, align 4, !tbaa !10
  %84 = zext i32 %83 to i64
  %85 = mul i64 %84, 32
  %86 = add i64 %82, %85
  %87 = inttoptr i64 %86 to ptr
  %88 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %87, i32 0, i32 4
  %89 = load volatile i32, ptr %88, align 4, !tbaa !17
  %90 = zext i32 %89 to i64
  %91 = and i64 %90, -536346625
  %92 = trunc i64 %91 to i32
  store volatile i32 %92, ptr %88, align 4, !tbaa !17
  %93 = load i32, ptr %8, align 4, !tbaa !10
  %94 = icmp eq i32 %93, 0
  br i1 %94, label %95, label %123

95:                                               ; preds = %66
  %96 = load ptr, ptr %5, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %96, i32 0, i32 8
  %98 = load i32, ptr %97, align 8, !tbaa !16
  %99 = load ptr, ptr %5, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %99, i32 0, i32 6
  %101 = load i32, ptr %100, align 8, !tbaa !19
  %102 = icmp ugt i32 %98, %101
  br i1 %102, label %103, label %109

103:                                              ; preds = %95
  %104 = load ptr, ptr %5, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %104, i32 0, i32 6
  %106 = load i32, ptr %105, align 8, !tbaa !19
  %107 = load ptr, ptr %5, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %107, i32 0, i32 8
  store i32 %106, ptr %108, align 8, !tbaa !16
  br label %109

109:                                              ; preds = %103, %95
  %110 = load i32, ptr %7, align 4, !tbaa !10
  %111 = zext i32 %110 to i64
  %112 = add i64 %111, 2304
  %113 = load i32, ptr %8, align 4, !tbaa !10
  %114 = zext i32 %113 to i64
  %115 = mul i64 %114, 32
  %116 = add i64 %112, %115
  %117 = inttoptr i64 %116 to ptr
  %118 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %117, i32 0, i32 4
  %119 = load volatile i32, ptr %118, align 4, !tbaa !17
  %120 = zext i32 %119 to i64
  %121 = or i64 %120, 524288
  %122 = trunc i64 %121 to i32
  store volatile i32 %122, ptr %118, align 4, !tbaa !17
  br label %152

123:                                              ; preds = %66
  %124 = load ptr, ptr %5, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %124, i32 0, i32 8
  %126 = load i32, ptr %125, align 8, !tbaa !16
  %127 = load ptr, ptr %5, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %127, i32 0, i32 6
  %129 = load i32, ptr %128, align 8, !tbaa !19
  %130 = add i32 %126, %129
  %131 = sub i32 %130, 1
  %132 = load ptr, ptr %5, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %132, i32 0, i32 6
  %134 = load i32, ptr %133, align 8, !tbaa !19
  %135 = udiv i32 %131, %134
  %136 = shl i32 %135, 19
  %137 = zext i32 %136 to i64
  %138 = and i64 536346624, %137
  %139 = load i32, ptr %7, align 4, !tbaa !10
  %140 = zext i32 %139 to i64
  %141 = add i64 %140, 2304
  %142 = load i32, ptr %8, align 4, !tbaa !10
  %143 = zext i32 %142 to i64
  %144 = mul i64 %143, 32
  %145 = add i64 %141, %144
  %146 = inttoptr i64 %145 to ptr
  %147 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %146, i32 0, i32 4
  %148 = load volatile i32, ptr %147, align 4, !tbaa !17
  %149 = zext i32 %148 to i64
  %150 = or i64 %149, %138
  %151 = trunc i64 %150 to i32
  store volatile i32 %151, ptr %147, align 4, !tbaa !17
  br label %152

152:                                              ; preds = %123, %109
  %153 = load ptr, ptr %5, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %153, i32 0, i32 8
  %155 = load i32, ptr %154, align 8, !tbaa !16
  %156 = zext i32 %155 to i64
  %157 = and i64 524287, %156
  %158 = load i32, ptr %7, align 4, !tbaa !10
  %159 = zext i32 %158 to i64
  %160 = add i64 %159, 2304
  %161 = load i32, ptr %8, align 4, !tbaa !10
  %162 = zext i32 %161 to i64
  %163 = mul i64 %162, 32
  %164 = add i64 %160, %163
  %165 = inttoptr i64 %164 to ptr
  %166 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %165, i32 0, i32 4
  %167 = load volatile i32, ptr %166, align 4, !tbaa !17
  %168 = zext i32 %167 to i64
  %169 = or i64 %168, %157
  %170 = trunc i64 %169 to i32
  store volatile i32 %170, ptr %166, align 4, !tbaa !17
  %171 = load ptr, ptr %5, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %171, i32 0, i32 4
  %173 = load i8, ptr %172, align 4, !tbaa !20
  %174 = zext i8 %173 to i32
  %175 = icmp eq i32 %174, 1
  br i1 %175, label %176, label %203

176:                                              ; preds = %152
  %177 = load i32, ptr %7, align 4, !tbaa !10
  %178 = zext i32 %177 to i64
  %179 = add i64 %178, 2304
  %180 = load i32, ptr %8, align 4, !tbaa !10
  %181 = zext i32 %180 to i64
  %182 = mul i64 %181, 32
  %183 = add i64 %179, %182
  %184 = inttoptr i64 %183 to ptr
  %185 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %184, i32 0, i32 4
  %186 = load volatile i32, ptr %185, align 4, !tbaa !17
  %187 = zext i32 %186 to i64
  %188 = and i64 %187, -1610612737
  %189 = trunc i64 %188 to i32
  store volatile i32 %189, ptr %185, align 4, !tbaa !17
  %190 = load i32, ptr %7, align 4, !tbaa !10
  %191 = zext i32 %190 to i64
  %192 = add i64 %191, 2304
  %193 = load i32, ptr %8, align 4, !tbaa !10
  %194 = zext i32 %193 to i64
  %195 = mul i64 %194, 32
  %196 = add i64 %192, %195
  %197 = inttoptr i64 %196 to ptr
  %198 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %197, i32 0, i32 4
  %199 = load volatile i32, ptr %198, align 4, !tbaa !17
  %200 = zext i32 %199 to i64
  %201 = or i64 %200, 536870912
  %202 = trunc i64 %201 to i32
  store volatile i32 %202, ptr %198, align 4, !tbaa !17
  br label %203

203:                                              ; preds = %176, %152
  br label %204

204:                                              ; preds = %203, %26
  %205 = load i8, ptr %6, align 1, !tbaa !9
  %206 = zext i8 %205 to i32
  %207 = icmp eq i32 %206, 1
  br i1 %207, label %208, label %284

208:                                              ; preds = %204
  %209 = load ptr, ptr %5, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %209, i32 0, i32 12
  %211 = load i32, ptr %210, align 4, !tbaa !21
  %212 = icmp ne i32 %211, 0
  br i1 %212, label %213, label %226

213:                                              ; preds = %208
  %214 = load ptr, ptr %5, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %214, i32 0, i32 12
  %216 = load i32, ptr %215, align 4, !tbaa !21
  %217 = load i32, ptr %7, align 4, !tbaa !10
  %218 = zext i32 %217 to i64
  %219 = add i64 %218, 2304
  %220 = load i32, ptr %8, align 4, !tbaa !10
  %221 = zext i32 %220 to i64
  %222 = mul i64 %221, 32
  %223 = add i64 %219, %222
  %224 = inttoptr i64 %223 to ptr
  %225 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %224, i32 0, i32 5
  store volatile i32 %216, ptr %225, align 4, !tbaa !22
  br label %226

226:                                              ; preds = %213, %208
  %227 = load ptr, ptr %5, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %227, i32 0, i32 4
  %229 = load i8, ptr %228, align 4, !tbaa !20
  %230 = zext i8 %229 to i32
  %231 = icmp eq i32 %230, 1
  br i1 %231, label %232, label %270

232:                                              ; preds = %226
  %233 = load i32, ptr %7, align 4, !tbaa !10
  %234 = zext i32 %233 to i64
  %235 = add i64 %234, 2048
  %236 = inttoptr i64 %235 to ptr
  %237 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %236, i32 0, i32 2
  %238 = load volatile i32, ptr %237, align 4, !tbaa !23
  %239 = and i32 %238, 256
  %240 = icmp eq i32 %239, 0
  br i1 %240, label %241, label %255

241:                                              ; preds = %232
  %242 = load i32, ptr %7, align 4, !tbaa !10
  %243 = zext i32 %242 to i64
  %244 = add i64 %243, 2304
  %245 = load i32, ptr %8, align 4, !tbaa !10
  %246 = zext i32 %245 to i64
  %247 = mul i64 %246, 32
  %248 = add i64 %244, %247
  %249 = inttoptr i64 %248 to ptr
  %250 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %249, i32 0, i32 0
  %251 = load volatile i32, ptr %250, align 4, !tbaa !25
  %252 = zext i32 %251 to i64
  %253 = or i64 %252, 536870912
  %254 = trunc i64 %253 to i32
  store volatile i32 %254, ptr %250, align 4, !tbaa !25
  br label %269

255:                                              ; preds = %232
  %256 = load i32, ptr %7, align 4, !tbaa !10
  %257 = zext i32 %256 to i64
  %258 = add i64 %257, 2304
  %259 = load i32, ptr %8, align 4, !tbaa !10
  %260 = zext i32 %259 to i64
  %261 = mul i64 %260, 32
  %262 = add i64 %258, %261
  %263 = inttoptr i64 %262 to ptr
  %264 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %263, i32 0, i32 0
  %265 = load volatile i32, ptr %264, align 4, !tbaa !25
  %266 = zext i32 %265 to i64
  %267 = or i64 %266, 268435456
  %268 = trunc i64 %267 to i32
  store volatile i32 %268, ptr %264, align 4, !tbaa !25
  br label %269

269:                                              ; preds = %255, %241
  br label %270

270:                                              ; preds = %269, %226
  %271 = load i32, ptr %7, align 4, !tbaa !10
  %272 = zext i32 %271 to i64
  %273 = add i64 %272, 2304
  %274 = load i32, ptr %8, align 4, !tbaa !10
  %275 = zext i32 %274 to i64
  %276 = mul i64 %275, 32
  %277 = add i64 %273, %276
  %278 = inttoptr i64 %277 to ptr
  %279 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %278, i32 0, i32 0
  %280 = load volatile i32, ptr %279, align 4, !tbaa !25
  %281 = zext i32 %280 to i64
  %282 = or i64 %281, 2214592512
  %283 = trunc i64 %282 to i32
  store volatile i32 %283, ptr %279, align 4, !tbaa !25
  br label %378

284:                                              ; preds = %204
  %285 = load i32, ptr %7, align 4, !tbaa !10
  %286 = zext i32 %285 to i64
  %287 = add i64 %286, 2304
  %288 = load i32, ptr %8, align 4, !tbaa !10
  %289 = zext i32 %288 to i64
  %290 = mul i64 %289, 32
  %291 = add i64 %287, %290
  %292 = inttoptr i64 %291 to ptr
  %293 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %292, i32 0, i32 0
  %294 = load volatile i32, ptr %293, align 4, !tbaa !25
  %295 = zext i32 %294 to i64
  %296 = or i64 %295, 2214592512
  %297 = trunc i64 %296 to i32
  store volatile i32 %297, ptr %293, align 4, !tbaa !25
  %298 = load ptr, ptr %5, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %298, i32 0, i32 4
  %300 = load i8, ptr %299, align 4, !tbaa !20
  %301 = zext i8 %300 to i32
  %302 = icmp ne i32 %301, 1
  br i1 %302, label %303, label %326

303:                                              ; preds = %284
  %304 = load ptr, ptr %5, align 8, !tbaa !5
  %305 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %304, i32 0, i32 8
  %306 = load i32, ptr %305, align 8, !tbaa !16
  %307 = icmp ugt i32 %306, 0
  br i1 %307, label %308, label %325

308:                                              ; preds = %303
  %309 = load ptr, ptr %5, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %309, i32 0, i32 0
  %311 = load i8, ptr %310, align 8, !tbaa !12
  %312 = zext i8 %311 to i32
  %313 = and i32 %312, 15
  %314 = zext i32 %313 to i64
  %315 = shl i64 1, %314
  %316 = load i32, ptr %7, align 4, !tbaa !10
  %317 = zext i32 %316 to i64
  %318 = add i64 %317, 2048
  %319 = inttoptr i64 %318 to ptr
  %320 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %319, i32 0, i32 13
  %321 = load volatile i32, ptr %320, align 4, !tbaa !26
  %322 = zext i32 %321 to i64
  %323 = or i64 %322, %315
  %324 = trunc i64 %323 to i32
  store volatile i32 %324, ptr %320, align 4, !tbaa !26
  br label %325

325:                                              ; preds = %308, %303
  br label %377

326:                                              ; preds = %284
  %327 = load i32, ptr %7, align 4, !tbaa !10
  %328 = zext i32 %327 to i64
  %329 = add i64 %328, 2048
  %330 = inttoptr i64 %329 to ptr
  %331 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %330, i32 0, i32 2
  %332 = load volatile i32, ptr %331, align 4, !tbaa !23
  %333 = and i32 %332, 256
  %334 = icmp eq i32 %333, 0
  br i1 %334, label %335, label %349

335:                                              ; preds = %326
  %336 = load i32, ptr %7, align 4, !tbaa !10
  %337 = zext i32 %336 to i64
  %338 = add i64 %337, 2304
  %339 = load i32, ptr %8, align 4, !tbaa !10
  %340 = zext i32 %339 to i64
  %341 = mul i64 %340, 32
  %342 = add i64 %338, %341
  %343 = inttoptr i64 %342 to ptr
  %344 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %343, i32 0, i32 0
  %345 = load volatile i32, ptr %344, align 4, !tbaa !25
  %346 = zext i32 %345 to i64
  %347 = or i64 %346, 536870912
  %348 = trunc i64 %347 to i32
  store volatile i32 %348, ptr %344, align 4, !tbaa !25
  br label %363

349:                                              ; preds = %326
  %350 = load i32, ptr %7, align 4, !tbaa !10
  %351 = zext i32 %350 to i64
  %352 = add i64 %351, 2304
  %353 = load i32, ptr %8, align 4, !tbaa !10
  %354 = zext i32 %353 to i64
  %355 = mul i64 %354, 32
  %356 = add i64 %352, %355
  %357 = inttoptr i64 %356 to ptr
  %358 = getelementptr inbounds %struct.USB_OTG_INEndpointTypeDef, ptr %357, i32 0, i32 0
  %359 = load volatile i32, ptr %358, align 4, !tbaa !25
  %360 = zext i32 %359 to i64
  %361 = or i64 %360, 268435456
  %362 = trunc i64 %361 to i32
  store volatile i32 %362, ptr %358, align 4, !tbaa !25
  br label %363

363:                                              ; preds = %349, %335
  %364 = load ptr, ptr %4, align 8, !tbaa !5
  %365 = load ptr, ptr %5, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %365, i32 0, i32 7
  %367 = load ptr, ptr %366, align 8, !tbaa !27
  %368 = load ptr, ptr %5, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %368, i32 0, i32 0
  %370 = load i8, ptr %369, align 8, !tbaa !12
  %371 = load ptr, ptr %5, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %371, i32 0, i32 8
  %373 = load i32, ptr %372, align 8, !tbaa !16
  %374 = trunc i32 %373 to i16
  %375 = load i8, ptr %6, align 1, !tbaa !9
  %376 = call i32 @USB_WritePacket(ptr noundef %364, ptr noundef %367, i8 noundef zeroext %370, i16 noundef zeroext %374, i8 noundef zeroext %375)
  br label %377

377:                                              ; preds = %363, %325
  br label %378

378:                                              ; preds = %377, %270
  br label %635

379:                                              ; preds = %3
  %380 = load i32, ptr %7, align 4, !tbaa !10
  %381 = zext i32 %380 to i64
  %382 = add i64 %381, 2816
  %383 = load i32, ptr %8, align 4, !tbaa !10
  %384 = zext i32 %383 to i64
  %385 = mul i64 %384, 32
  %386 = add i64 %382, %385
  %387 = inttoptr i64 %386 to ptr
  %388 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %387, i32 0, i32 4
  %389 = load volatile i32, ptr %388, align 4, !tbaa !28
  %390 = zext i32 %389 to i64
  %391 = and i64 %390, -524288
  %392 = trunc i64 %391 to i32
  store volatile i32 %392, ptr %388, align 4, !tbaa !28
  %393 = load i32, ptr %7, align 4, !tbaa !10
  %394 = zext i32 %393 to i64
  %395 = add i64 %394, 2816
  %396 = load i32, ptr %8, align 4, !tbaa !10
  %397 = zext i32 %396 to i64
  %398 = mul i64 %397, 32
  %399 = add i64 %395, %398
  %400 = inttoptr i64 %399 to ptr
  %401 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %400, i32 0, i32 4
  %402 = load volatile i32, ptr %401, align 4, !tbaa !28
  %403 = zext i32 %402 to i64
  %404 = and i64 %403, -536346625
  %405 = trunc i64 %404 to i32
  store volatile i32 %405, ptr %401, align 4, !tbaa !28
  %406 = load i32, ptr %8, align 4, !tbaa !10
  %407 = icmp eq i32 %406, 0
  br i1 %407, label %408, label %456

408:                                              ; preds = %379
  %409 = load ptr, ptr %5, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %409, i32 0, i32 8
  %411 = load i32, ptr %410, align 8, !tbaa !16
  %412 = icmp ugt i32 %411, 0
  br i1 %412, label %413, label %419

413:                                              ; preds = %408
  %414 = load ptr, ptr %5, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %414, i32 0, i32 6
  %416 = load i32, ptr %415, align 8, !tbaa !19
  %417 = load ptr, ptr %5, align 8, !tbaa !5
  %418 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %417, i32 0, i32 8
  store i32 %416, ptr %418, align 8, !tbaa !16
  br label %419

419:                                              ; preds = %413, %408
  %420 = load ptr, ptr %5, align 8, !tbaa !5
  %421 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %420, i32 0, i32 6
  %422 = load i32, ptr %421, align 8, !tbaa !19
  %423 = load ptr, ptr %5, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %423, i32 0, i32 13
  store i32 %422, ptr %424, align 8, !tbaa !30
  %425 = load ptr, ptr %5, align 8, !tbaa !5
  %426 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %425, i32 0, i32 13
  %427 = load i32, ptr %426, align 8, !tbaa !30
  %428 = zext i32 %427 to i64
  %429 = and i64 524287, %428
  %430 = load i32, ptr %7, align 4, !tbaa !10
  %431 = zext i32 %430 to i64
  %432 = add i64 %431, 2816
  %433 = load i32, ptr %8, align 4, !tbaa !10
  %434 = zext i32 %433 to i64
  %435 = mul i64 %434, 32
  %436 = add i64 %432, %435
  %437 = inttoptr i64 %436 to ptr
  %438 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %437, i32 0, i32 4
  %439 = load volatile i32, ptr %438, align 4, !tbaa !28
  %440 = zext i32 %439 to i64
  %441 = or i64 %440, %429
  %442 = trunc i64 %441 to i32
  store volatile i32 %442, ptr %438, align 4, !tbaa !28
  %443 = load i32, ptr %7, align 4, !tbaa !10
  %444 = zext i32 %443 to i64
  %445 = add i64 %444, 2816
  %446 = load i32, ptr %8, align 4, !tbaa !10
  %447 = zext i32 %446 to i64
  %448 = mul i64 %447, 32
  %449 = add i64 %445, %448
  %450 = inttoptr i64 %449 to ptr
  %451 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %450, i32 0, i32 4
  %452 = load volatile i32, ptr %451, align 4, !tbaa !28
  %453 = zext i32 %452 to i64
  %454 = or i64 %453, 524288
  %455 = trunc i64 %454 to i32
  store volatile i32 %455, ptr %451, align 4, !tbaa !28
  br label %552

456:                                              ; preds = %379
  %457 = load ptr, ptr %5, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %457, i32 0, i32 8
  %459 = load i32, ptr %458, align 8, !tbaa !16
  %460 = icmp eq i32 %459, 0
  br i1 %460, label %461, label %493

461:                                              ; preds = %456
  %462 = load ptr, ptr %5, align 8, !tbaa !5
  %463 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %462, i32 0, i32 6
  %464 = load i32, ptr %463, align 8, !tbaa !19
  %465 = zext i32 %464 to i64
  %466 = and i64 524287, %465
  %467 = load i32, ptr %7, align 4, !tbaa !10
  %468 = zext i32 %467 to i64
  %469 = add i64 %468, 2816
  %470 = load i32, ptr %8, align 4, !tbaa !10
  %471 = zext i32 %470 to i64
  %472 = mul i64 %471, 32
  %473 = add i64 %469, %472
  %474 = inttoptr i64 %473 to ptr
  %475 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %474, i32 0, i32 4
  %476 = load volatile i32, ptr %475, align 4, !tbaa !28
  %477 = zext i32 %476 to i64
  %478 = or i64 %477, %466
  %479 = trunc i64 %478 to i32
  store volatile i32 %479, ptr %475, align 4, !tbaa !28
  %480 = load i32, ptr %7, align 4, !tbaa !10
  %481 = zext i32 %480 to i64
  %482 = add i64 %481, 2816
  %483 = load i32, ptr %8, align 4, !tbaa !10
  %484 = zext i32 %483 to i64
  %485 = mul i64 %484, 32
  %486 = add i64 %482, %485
  %487 = inttoptr i64 %486 to ptr
  %488 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %487, i32 0, i32 4
  %489 = load volatile i32, ptr %488, align 4, !tbaa !28
  %490 = zext i32 %489 to i64
  %491 = or i64 %490, 524288
  %492 = trunc i64 %491 to i32
  store volatile i32 %492, ptr %488, align 4, !tbaa !28
  br label %551

493:                                              ; preds = %456
  %494 = load ptr, ptr %5, align 8, !tbaa !5
  %495 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %494, i32 0, i32 8
  %496 = load i32, ptr %495, align 8, !tbaa !16
  %497 = load ptr, ptr %5, align 8, !tbaa !5
  %498 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %497, i32 0, i32 6
  %499 = load i32, ptr %498, align 8, !tbaa !19
  %500 = add i32 %496, %499
  %501 = sub i32 %500, 1
  %502 = load ptr, ptr %5, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %502, i32 0, i32 6
  %504 = load i32, ptr %503, align 8, !tbaa !19
  %505 = udiv i32 %501, %504
  %506 = trunc i32 %505 to i16
  store i16 %506, ptr %9, align 2, !tbaa !31
  %507 = load ptr, ptr %5, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %507, i32 0, i32 6
  %509 = load i32, ptr %508, align 8, !tbaa !19
  %510 = load i16, ptr %9, align 2, !tbaa !31
  %511 = zext i16 %510 to i32
  %512 = mul i32 %509, %511
  %513 = load ptr, ptr %5, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %513, i32 0, i32 13
  store i32 %512, ptr %514, align 8, !tbaa !30
  %515 = load i16, ptr %9, align 2, !tbaa !31
  %516 = zext i16 %515 to i32
  %517 = shl i32 %516, 19
  %518 = zext i32 %517 to i64
  %519 = and i64 536346624, %518
  %520 = load i32, ptr %7, align 4, !tbaa !10
  %521 = zext i32 %520 to i64
  %522 = add i64 %521, 2816
  %523 = load i32, ptr %8, align 4, !tbaa !10
  %524 = zext i32 %523 to i64
  %525 = mul i64 %524, 32
  %526 = add i64 %522, %525
  %527 = inttoptr i64 %526 to ptr
  %528 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %527, i32 0, i32 4
  %529 = load volatile i32, ptr %528, align 4, !tbaa !28
  %530 = zext i32 %529 to i64
  %531 = or i64 %530, %519
  %532 = trunc i64 %531 to i32
  store volatile i32 %532, ptr %528, align 4, !tbaa !28
  %533 = load ptr, ptr %5, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %533, i32 0, i32 13
  %535 = load i32, ptr %534, align 8, !tbaa !30
  %536 = zext i32 %535 to i64
  %537 = and i64 524287, %536
  %538 = load i32, ptr %7, align 4, !tbaa !10
  %539 = zext i32 %538 to i64
  %540 = add i64 %539, 2816
  %541 = load i32, ptr %8, align 4, !tbaa !10
  %542 = zext i32 %541 to i64
  %543 = mul i64 %542, 32
  %544 = add i64 %540, %543
  %545 = inttoptr i64 %544 to ptr
  %546 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %545, i32 0, i32 4
  %547 = load volatile i32, ptr %546, align 4, !tbaa !28
  %548 = zext i32 %547 to i64
  %549 = or i64 %548, %537
  %550 = trunc i64 %549 to i32
  store volatile i32 %550, ptr %546, align 4, !tbaa !28
  br label %551

551:                                              ; preds = %493, %461
  br label %552

552:                                              ; preds = %551, %419
  %553 = load i8, ptr %6, align 1, !tbaa !9
  %554 = zext i8 %553 to i32
  %555 = icmp eq i32 %554, 1
  br i1 %555, label %556, label %577

556:                                              ; preds = %552
  %557 = load ptr, ptr %5, align 8, !tbaa !5
  %558 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %557, i32 0, i32 7
  %559 = load ptr, ptr %558, align 8, !tbaa !27
  %560 = ptrtoint ptr %559 to i32
  %561 = icmp ne i32 %560, 0
  br i1 %561, label %562, label %576

562:                                              ; preds = %556
  %563 = load ptr, ptr %5, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %563, i32 0, i32 7
  %565 = load ptr, ptr %564, align 8, !tbaa !27
  %566 = ptrtoint ptr %565 to i32
  %567 = load i32, ptr %7, align 4, !tbaa !10
  %568 = zext i32 %567 to i64
  %569 = add i64 %568, 2816
  %570 = load i32, ptr %8, align 4, !tbaa !10
  %571 = zext i32 %570 to i64
  %572 = mul i64 %571, 32
  %573 = add i64 %569, %572
  %574 = inttoptr i64 %573 to ptr
  %575 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %574, i32 0, i32 5
  store volatile i32 %566, ptr %575, align 4, !tbaa !32
  br label %576

576:                                              ; preds = %562, %556
  br label %577

577:                                              ; preds = %576, %552
  %578 = load ptr, ptr %5, align 8, !tbaa !5
  %579 = getelementptr inbounds %struct.USB_EPTypeDef, ptr %578, i32 0, i32 4
  %580 = load i8, ptr %579, align 4, !tbaa !20
  %581 = zext i8 %580 to i32
  %582 = icmp eq i32 %581, 1
  br i1 %582, label %583, label %621

583:                                              ; preds = %577
  %584 = load i32, ptr %7, align 4, !tbaa !10
  %585 = zext i32 %584 to i64
  %586 = add i64 %585, 2048
  %587 = inttoptr i64 %586 to ptr
  %588 = getelementptr inbounds %struct.USB_OTG_DeviceTypeDef, ptr %587, i32 0, i32 2
  %589 = load volatile i32, ptr %588, align 4, !tbaa !23
  %590 = and i32 %589, 256
  %591 = icmp eq i32 %590, 0
  br i1 %591, label %592, label %606

592:                                              ; preds = %583
  %593 = load i32, ptr %7, align 4, !tbaa !10
  %594 = zext i32 %593 to i64
  %595 = add i64 %594, 2816
  %596 = load i32, ptr %8, align 4, !tbaa !10
  %597 = zext i32 %596 to i64
  %598 = mul i64 %597, 32
  %599 = add i64 %595, %598
  %600 = inttoptr i64 %599 to ptr
  %601 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %600, i32 0, i32 0
  %602 = load volatile i32, ptr %601, align 4, !tbaa !33
  %603 = zext i32 %602 to i64
  %604 = or i64 %603, 536870912
  %605 = trunc i64 %604 to i32
  store volatile i32 %605, ptr %601, align 4, !tbaa !33
  br label %620

606:                                              ; preds = %583
  %607 = load i32, ptr %7, align 4, !tbaa !10
  %608 = zext i32 %607 to i64
  %609 = add i64 %608, 2816
  %610 = load i32, ptr %8, align 4, !tbaa !10
  %611 = zext i32 %610 to i64
  %612 = mul i64 %611, 32
  %613 = add i64 %609, %612
  %614 = inttoptr i64 %613 to ptr
  %615 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %614, i32 0, i32 0
  %616 = load volatile i32, ptr %615, align 4, !tbaa !33
  %617 = zext i32 %616 to i64
  %618 = or i64 %617, 268435456
  %619 = trunc i64 %618 to i32
  store volatile i32 %619, ptr %615, align 4, !tbaa !33
  br label %620

620:                                              ; preds = %606, %592
  br label %621

621:                                              ; preds = %620, %577
  %622 = load i32, ptr %7, align 4, !tbaa !10
  %623 = zext i32 %622 to i64
  %624 = add i64 %623, 2816
  %625 = load i32, ptr %8, align 4, !tbaa !10
  %626 = zext i32 %625 to i64
  %627 = mul i64 %626, 32
  %628 = add i64 %624, %627
  %629 = inttoptr i64 %628 to ptr
  %630 = getelementptr inbounds %struct.USB_OTG_OUTEndpointTypeDef, ptr %629, i32 0, i32 0
  %631 = load volatile i32, ptr %630, align 4, !tbaa !33
  %632 = zext i32 %631 to i64
  %633 = or i64 %632, 2214592512
  %634 = trunc i64 %633 to i32
  store volatile i32 %634, ptr %630, align 4, !tbaa !33
  br label %635

635:                                              ; preds = %621, %378
  call void @llvm.lifetime.end.p0(i64 2, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #2
  ret i32 0
}

; Function Attrs: nounwind uwtable
declare dso_local i32 @USB_WritePacket(ptr noundef, ptr noundef, i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !7, i64 0}
!13 = !{!"", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3, !7, i64 4, !7, i64 5, !11, i64 8, !6, i64 16, !11, i64 24, !11, i64 28, !7, i64 32, !14, i64 34, !11, i64 36, !11, i64 40}
!14 = !{!"short", !7, i64 0}
!15 = !{!13, !7, i64 1}
!16 = !{!13, !11, i64 24}
!17 = !{!18, !11, i64 16}
!18 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28}
!19 = !{!13, !11, i64 8}
!20 = !{!13, !7, i64 4}
!21 = !{!13, !11, i64 36}
!22 = !{!18, !11, i64 20}
!23 = !{!24, !11, i64 8}
!24 = !{!"", !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, !7, i64 72, !11, i64 132}
!25 = !{!18, !11, i64 0}
!26 = !{!24, !11, i64 52}
!27 = !{!13, !6, i64 16}
!28 = !{!29, !11, i64 16}
!29 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !7, i64 24}
!30 = !{!13, !11, i64 40}
!31 = !{!14, !14, i64 0}
!32 = !{!29, !11, i64 20}
!33 = !{!29, !11, i64 0}


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

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @USB_EPStartXfer(ptr noundef %0, ptr nocapture noundef %1, i8 noundef zeroext %2) local_unnamed_addr #0 {
  %4 = ptrtoint ptr %0 to i64
  %5 = load i8, ptr %1, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %1, i64 1
  %7 = load i8, ptr %6, align 1, !tbaa !12
  %8 = icmp eq i8 %7, 1
  br i1 %8, label %9, label %135

9:                                                ; preds = %3
  %10 = getelementptr inbounds i8, ptr %1, i64 24
  %11 = load i32, ptr %10, align 8, !tbaa !13
  %12 = icmp eq i32 %11, 0
  %13 = and i64 %4, 4294967295
  %14 = add nuw nsw i64 %13, 2304
  %15 = zext i8 %5 to i64
  %16 = shl nuw nsw i64 %15, 5
  %17 = add nuw nsw i64 %14, %16
  %18 = inttoptr i64 %17 to ptr
  %19 = getelementptr inbounds i8, ptr %18, i64 16
  %20 = load volatile i32, ptr %19, align 4, !tbaa !14
  br i1 %12, label %21, label %27

21:                                               ; preds = %9
  %22 = and i32 %20, -536346625
  store volatile i32 %22, ptr %19, align 4, !tbaa !14
  %23 = load volatile i32, ptr %19, align 4, !tbaa !14
  %24 = or i32 %23, 524288
  store volatile i32 %24, ptr %19, align 4, !tbaa !14
  %25 = load volatile i32, ptr %19, align 4, !tbaa !14
  %26 = and i32 %25, -524288
  br label %.sink.split

27:                                               ; preds = %9
  %28 = and i32 %20, -524288
  store volatile i32 %28, ptr %19, align 4, !tbaa !14
  %29 = load volatile i32, ptr %19, align 4, !tbaa !14
  %30 = and i32 %29, -536346625
  store volatile i32 %30, ptr %19, align 4, !tbaa !14
  %31 = icmp eq i8 %5, 0
  %32 = getelementptr inbounds i8, ptr %1, i64 8
  %33 = load i32, ptr %32, align 8, !tbaa !16
  br i1 %31, label %34, label %41

34:                                               ; preds = %27
  %35 = icmp ugt i32 %11, %33
  br i1 %35, label %36, label %37

36:                                               ; preds = %34
  store i32 %33, ptr %10, align 8, !tbaa !13
  br label %37

37:                                               ; preds = %36, %34
  %38 = phi i32 [ %33, %36 ], [ %11, %34 ]
  %39 = load volatile i32, ptr %19, align 4, !tbaa !14
  %40 = or i32 %39, 524288
  br label %49

41:                                               ; preds = %27
  %42 = add i32 %11, -1
  %43 = add i32 %42, %33
  %44 = udiv i32 %43, %33
  %45 = shl i32 %44, 19
  %46 = and i32 %45, 536346624
  %47 = load volatile i32, ptr %19, align 4, !tbaa !14
  %48 = or i32 %46, %47
  br label %49

49:                                               ; preds = %41, %37
  %.sink = phi i32 [ %48, %41 ], [ %40, %37 ]
  %50 = phi i32 [ %11, %41 ], [ %38, %37 ]
  store volatile i32 %.sink, ptr %19, align 4, !tbaa !14
  %51 = and i32 %50, 524287
  %52 = load volatile i32, ptr %19, align 4, !tbaa !14
  %53 = or i32 %52, %51
  store volatile i32 %53, ptr %19, align 4, !tbaa !14
  %54 = getelementptr inbounds i8, ptr %1, i64 4
  %55 = load i8, ptr %54, align 4, !tbaa !17
  %56 = icmp eq i8 %55, 1
  br i1 %56, label %57, label %62

57:                                               ; preds = %49
  %58 = load volatile i32, ptr %19, align 4, !tbaa !14
  %59 = and i32 %58, -1610612737
  store volatile i32 %59, ptr %19, align 4, !tbaa !14
  %60 = load volatile i32, ptr %19, align 4, !tbaa !14
  %61 = or i32 %60, 536870912
  br label %.sink.split

.sink.split:                                      ; preds = %21, %57
  %.sink127 = phi i32 [ %61, %57 ], [ %26, %21 ]
  %.ph = phi i32 [ %50, %57 ], [ 0, %21 ]
  store volatile i32 %.sink127, ptr %19, align 4, !tbaa !14
  br label %62

62:                                               ; preds = %.sink.split, %49
  %63 = phi i32 [ %50, %49 ], [ %.ph, %.sink.split ]
  %64 = icmp eq i8 %2, 1
  br i1 %64, label %65, label %101

65:                                               ; preds = %62
  %66 = getelementptr inbounds i8, ptr %1, i64 36
  %67 = load i32, ptr %66, align 4, !tbaa !18
  %.not114 = icmp eq i32 %67, 0
  br i1 %.not114, label %76, label %68

68:                                               ; preds = %65
  %69 = and i64 %4, 4294967295
  %70 = add nuw nsw i64 %69, 2304
  %71 = zext i8 %5 to i64
  %72 = shl nuw nsw i64 %71, 5
  %73 = add nuw nsw i64 %70, %72
  %74 = inttoptr i64 %73 to ptr
  %75 = getelementptr inbounds i8, ptr %74, i64 20
  store volatile i32 %67, ptr %75, align 4, !tbaa !19
  br label %76

76:                                               ; preds = %68, %65
  %77 = getelementptr inbounds i8, ptr %1, i64 4
  %78 = load i8, ptr %77, align 4, !tbaa !17
  %79 = icmp eq i8 %78, 1
  %80 = and i64 %4, 4294967295
  br i1 %79, label %81, label %._crit_edge115

._crit_edge115:                                   ; preds = %76
  %.pre117 = add nuw nsw i64 %80, 2304
  %.pre119 = zext i8 %5 to i64
  %.pre121 = shl nuw nsw i64 %.pre119, 5
  %.pre123 = add nuw nsw i64 %.pre117, %.pre121
  %.pre125 = inttoptr i64 %.pre123 to ptr
  br label %98

81:                                               ; preds = %76
  %82 = add nuw nsw i64 %80, 2048
  %83 = inttoptr i64 %82 to ptr
  %84 = getelementptr inbounds i8, ptr %83, i64 8
  %85 = load volatile i32, ptr %84, align 4, !tbaa !20
  %86 = and i32 %85, 256
  %87 = icmp eq i32 %86, 0
  %88 = add nuw nsw i64 %80, 2304
  %89 = zext i8 %5 to i64
  %90 = shl nuw nsw i64 %89, 5
  %91 = add nuw nsw i64 %88, %90
  %92 = inttoptr i64 %91 to ptr
  %93 = load volatile i32, ptr %92, align 4, !tbaa !22
  br i1 %87, label %94, label %96

94:                                               ; preds = %81
  %95 = or i32 %93, 536870912
  store volatile i32 %95, ptr %92, align 4, !tbaa !22
  br label %98

96:                                               ; preds = %81
  %97 = or i32 %93, 268435456
  store volatile i32 %97, ptr %92, align 4, !tbaa !22
  br label %98

98:                                               ; preds = %._crit_edge115, %94, %96
  %.pre-phi126 = phi ptr [ %.pre125, %._crit_edge115 ], [ %92, %94 ], [ %92, %96 ]
  %99 = load volatile i32, ptr %.pre-phi126, align 4, !tbaa !22
  %100 = or i32 %99, -2080374784
  store volatile i32 %100, ptr %.pre-phi126, align 4, !tbaa !22
  br label %199

101:                                              ; preds = %62
  %102 = and i64 %4, 4294967295
  %103 = add nuw nsw i64 %102, 2304
  %104 = zext i8 %5 to i64
  %105 = shl nuw nsw i64 %104, 5
  %106 = add nuw nsw i64 %103, %105
  %107 = inttoptr i64 %106 to ptr
  %108 = load volatile i32, ptr %107, align 4, !tbaa !22
  %109 = or i32 %108, -2080374784
  store volatile i32 %109, ptr %107, align 4, !tbaa !22
  %110 = getelementptr inbounds i8, ptr %1, i64 4
  %111 = load i8, ptr %110, align 4, !tbaa !17
  %.not112 = icmp eq i8 %111, 1
  br i1 %.not112, label %122, label %112

112:                                              ; preds = %101
  %.not113 = icmp eq i32 %63, 0
  br i1 %.not113, label %199, label %113

113:                                              ; preds = %112
  %114 = and i8 %5, 15
  %115 = zext nneg i8 %114 to i32
  %116 = shl nuw nsw i32 1, %115
  %117 = add nuw nsw i64 %102, 2048
  %118 = inttoptr i64 %117 to ptr
  %119 = getelementptr inbounds i8, ptr %118, i64 52
  %120 = load volatile i32, ptr %119, align 4, !tbaa !23
  %121 = or i32 %120, %116
  store volatile i32 %121, ptr %119, align 4, !tbaa !23
  br label %199

122:                                              ; preds = %101
  %123 = add nuw nsw i64 %102, 2048
  %124 = inttoptr i64 %123 to ptr
  %125 = getelementptr inbounds i8, ptr %124, i64 8
  %126 = load volatile i32, ptr %125, align 4, !tbaa !20
  %127 = and i32 %126, 256
  %128 = icmp eq i32 %127, 0
  %129 = load volatile i32, ptr %107, align 4, !tbaa !22
  %. = select i1 %128, i32 536870912, i32 268435456
  %130 = or i32 %129, %.
  store volatile i32 %130, ptr %107, align 4, !tbaa !22
  %131 = getelementptr inbounds i8, ptr %1, i64 16
  %132 = load ptr, ptr %131, align 8, !tbaa !24
  %133 = trunc i32 %63 to i16
  %134 = tail call i32 @USB_WritePacket(ptr noundef %0, ptr noundef %132, i8 noundef zeroext %5, i16 noundef zeroext %133, i8 noundef zeroext %2)
  br label %199

135:                                              ; preds = %3
  %136 = and i64 %4, 4294967295
  %137 = add nuw nsw i64 %136, 2816
  %138 = zext i8 %5 to i64
  %139 = shl nuw nsw i64 %138, 5
  %140 = add nuw nsw i64 %137, %139
  %141 = inttoptr i64 %140 to ptr
  %142 = getelementptr inbounds i8, ptr %141, i64 16
  %143 = load volatile i32, ptr %142, align 4, !tbaa !25
  %144 = and i32 %143, -524288
  store volatile i32 %144, ptr %142, align 4, !tbaa !25
  %145 = load volatile i32, ptr %142, align 4, !tbaa !25
  %146 = and i32 %145, -536346625
  store volatile i32 %146, ptr %142, align 4, !tbaa !25
  %147 = icmp eq i8 %5, 0
  %148 = getelementptr inbounds i8, ptr %1, i64 24
  %149 = load i32, ptr %148, align 8, !tbaa !13
  %.not = icmp eq i32 %149, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %1, i64 8
  %.pre = load i32, ptr %.phi.trans.insert, align 8, !tbaa !16
  br i1 %147, label %150, label %156

150:                                              ; preds = %135
  br i1 %.not, label %._crit_edge, label %151

151:                                              ; preds = %150
  store i32 %.pre, ptr %148, align 8, !tbaa !13
  br label %._crit_edge

._crit_edge:                                      ; preds = %150, %151
  %152 = getelementptr inbounds i8, ptr %1, i64 40
  store i32 %.pre, ptr %152, align 8, !tbaa !27
  %153 = and i32 %.pre, 524287
  %154 = load volatile i32, ptr %142, align 4, !tbaa !25
  %155 = or i32 %154, %153
  store volatile i32 %155, ptr %142, align 4, !tbaa !25
  br label %173

156:                                              ; preds = %135
  br i1 %.not, label %157, label %161

157:                                              ; preds = %156
  %158 = and i32 %.pre, 524287
  %159 = load volatile i32, ptr %142, align 4, !tbaa !25
  %160 = or i32 %159, %158
  store volatile i32 %160, ptr %142, align 4, !tbaa !25
  br label %173

161:                                              ; preds = %156
  %162 = add i32 %149, -1
  %163 = add i32 %162, %.pre
  %164 = udiv i32 %163, %.pre
  %165 = and i32 %164, 65535
  %166 = mul i32 %165, %.pre
  %167 = getelementptr inbounds i8, ptr %1, i64 40
  store i32 %166, ptr %167, align 8, !tbaa !27
  %168 = shl i32 %164, 19
  %169 = and i32 %168, 536346624
  %170 = load volatile i32, ptr %142, align 4, !tbaa !25
  %171 = or i32 %170, %169
  store volatile i32 %171, ptr %142, align 4, !tbaa !25
  %172 = and i32 %166, 524287
  br label %173

173:                                              ; preds = %157, %161, %._crit_edge
  %.sink132 = phi i32 [ 524288, %157 ], [ %172, %161 ], [ 524288, %._crit_edge ]
  %174 = load volatile i32, ptr %142, align 4, !tbaa !25
  %175 = or i32 %174, %.sink132
  store volatile i32 %175, ptr %142, align 4, !tbaa !25
  %176 = icmp eq i8 %2, 1
  br i1 %176, label %177, label %184

177:                                              ; preds = %173
  %178 = getelementptr inbounds i8, ptr %1, i64 16
  %179 = load ptr, ptr %178, align 8, !tbaa !24
  %180 = ptrtoint ptr %179 to i64
  %181 = trunc i64 %180 to i32
  %.not111 = icmp eq i32 %181, 0
  br i1 %.not111, label %184, label %182

182:                                              ; preds = %177
  %183 = getelementptr inbounds i8, ptr %141, i64 20
  store volatile i32 %181, ptr %183, align 4, !tbaa !28
  br label %184

184:                                              ; preds = %177, %182, %173
  %185 = getelementptr inbounds i8, ptr %1, i64 4
  %186 = load i8, ptr %185, align 4, !tbaa !17
  %187 = icmp eq i8 %186, 1
  br i1 %187, label %.sink.split133, label %196

.sink.split133:                                   ; preds = %184
  %188 = add nuw nsw i64 %136, 2048
  %189 = inttoptr i64 %188 to ptr
  %190 = getelementptr inbounds i8, ptr %189, i64 8
  %191 = load volatile i32, ptr %190, align 4, !tbaa !20
  %192 = and i32 %191, 256
  %193 = icmp eq i32 %192, 0
  %194 = load volatile i32, ptr %141, align 4, !tbaa !29
  %.136 = select i1 %193, i32 536870912, i32 268435456
  %195 = or i32 %194, %.136
  store volatile i32 %195, ptr %141, align 4, !tbaa !29
  br label %196

196:                                              ; preds = %.sink.split133, %184
  %197 = load volatile i32, ptr %141, align 4, !tbaa !29
  %198 = or i32 %197, -2080374784
  store volatile i32 %198, ptr %141, align 4, !tbaa !29
  br label %199

199:                                              ; preds = %98, %112, %113, %122, %196
  ret i32 0
}

; Function Attrs: nounwind uwtable
declare dso_local i32 @USB_WritePacket(ptr noundef, ptr noundef, i8 noundef zeroext, i16 noundef zeroext, i8 noundef zeroext) 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" }

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


; Effective O3 passes: BDCEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass