; LLVM IR from lichen-community-systems/signaletic :: hosts/daisy/vendor/libDaisy/Middlewares/ST/STM32_USB_Device_Library/Core/Src (StdEPReq)

; 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_setup_req = type { i8, i8, i16, i16, i16 }
%struct._USBD_HandleTypeDef = type { i8, i32, i32, i32, i32, [15 x %struct.USBD_EndpointTypeDef], [15 x %struct.USBD_EndpointTypeDef], i32, i32, i8, i8, i8, i8, i8, i32, %struct.usb_setup_req, ptr, ptr, ptr, ptr, ptr }
%struct.USBD_EndpointTypeDef = type { i32, i32, i32, i32, i32 }
%struct._Device_cb = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }

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

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

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

declare i32 @USBD_CtlSendStatus(ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @USBD_StdEPReq(ptr noundef %0, ptr noundef %1) #1 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i8, align 1
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  store i32 0, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  %10 = load ptr, ptr %5, align 8, !tbaa !5
  %11 = getelementptr inbounds %struct.usb_setup_req, ptr %10, i32 0, i32 3
  %12 = load i16, ptr %11, align 2, !tbaa !11
  %13 = zext i16 %12 to i32
  %14 = and i32 %13, 255
  %15 = trunc i32 %14 to i8
  store i8 %15, ptr %6, align 1, !tbaa !14
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.usb_setup_req, ptr %16, i32 0, i32 0
  %18 = load i8, ptr %17, align 2, !tbaa !15
  %19 = zext i8 %18 to i32
  %20 = and i32 %19, 96
  switch i32 %20, label %292 [
    i32 32, label %21
    i32 64, label %21
    i32 0, label %30
  ]

21:                                               ; preds = %2, %2
  %22 = load ptr, ptr %4, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %22, i32 0, i32 17
  %24 = load ptr, ptr %23, align 8, !tbaa !16
  %25 = getelementptr inbounds %struct._Device_cb, ptr %24, i32 0, i32 2
  %26 = load ptr, ptr %25, align 8, !tbaa !18
  %27 = load ptr, ptr %4, align 8, !tbaa !5
  %28 = load ptr, ptr %5, align 8, !tbaa !5
  %29 = call zeroext i8 %26(ptr noundef %27, ptr noundef %28)
  br label %295

30:                                               ; preds = %2
  %31 = load ptr, ptr %5, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.usb_setup_req, ptr %31, i32 0, i32 0
  %33 = load i8, ptr %32, align 2, !tbaa !15
  %34 = zext i8 %33 to i32
  %35 = and i32 %34, 96
  %36 = icmp eq i32 %35, 32
  br i1 %36, label %37, label %48

37:                                               ; preds = %30
  %38 = load ptr, ptr %4, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %38, i32 0, i32 17
  %40 = load ptr, ptr %39, align 8, !tbaa !16
  %41 = getelementptr inbounds %struct._Device_cb, ptr %40, i32 0, i32 2
  %42 = load ptr, ptr %41, align 8, !tbaa !18
  %43 = load ptr, ptr %4, align 8, !tbaa !5
  %44 = load ptr, ptr %5, align 8, !tbaa !5
  %45 = call zeroext i8 %42(ptr noundef %43, ptr noundef %44)
  %46 = zext i8 %45 to i32
  store i32 %46, ptr %7, align 4, !tbaa !9
  %47 = load i32, ptr %7, align 4, !tbaa !9
  store i32 %47, ptr %3, align 4
  store i32 1, ptr %9, align 4
  br label %297

48:                                               ; preds = %30
  %49 = load ptr, ptr %5, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.usb_setup_req, ptr %49, i32 0, i32 1
  %51 = load i8, ptr %50, align 1, !tbaa !20
  %52 = zext i8 %51 to i32
  switch i32 %52, label %288 [
    i32 3, label %53
    i32 1, label %108
    i32 0, label %154
  ]

53:                                               ; preds = %48
  %54 = load ptr, ptr %4, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %54, i32 0, i32 9
  %56 = load i8, ptr %55, align 4, !tbaa !21
  %57 = zext i8 %56 to i32
  switch i32 %57, label %104 [
    i32 2, label %58
    i32 3, label %76
  ]

58:                                               ; preds = %53
  %59 = load i8, ptr %6, align 1, !tbaa !14
  %60 = zext i8 %59 to i32
  %61 = icmp ne i32 %60, 0
  br i1 %61, label %62, label %72

62:                                               ; preds = %58
  %63 = load i8, ptr %6, align 1, !tbaa !14
  %64 = zext i8 %63 to i32
  %65 = icmp ne i32 %64, 128
  br i1 %65, label %66, label %72

66:                                               ; preds = %62
  %67 = load ptr, ptr %4, align 8, !tbaa !5
  %68 = load i8, ptr %6, align 1, !tbaa !14
  %69 = call i32 @USBD_LL_StallEP(ptr noundef %67, i8 noundef zeroext %68)
  %70 = load ptr, ptr %4, align 8, !tbaa !5
  %71 = call i32 @USBD_LL_StallEP(ptr noundef %70, i8 noundef zeroext -128)
  br label %75

72:                                               ; preds = %62, %58
  %73 = load ptr, ptr %4, align 8, !tbaa !5
  %74 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %73, ptr noundef %74)
  br label %75

75:                                               ; preds = %72, %66
  br label %107

76:                                               ; preds = %53
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.usb_setup_req, ptr %77, i32 0, i32 2
  %79 = load i16, ptr %78, align 2, !tbaa !22
  %80 = zext i16 %79 to i32
  %81 = icmp eq i32 %80, 0
  br i1 %81, label %82, label %101

82:                                               ; preds = %76
  %83 = load i8, ptr %6, align 1, !tbaa !14
  %84 = zext i8 %83 to i32
  %85 = icmp ne i32 %84, 0
  br i1 %85, label %86, label %100

86:                                               ; preds = %82
  %87 = load i8, ptr %6, align 1, !tbaa !14
  %88 = zext i8 %87 to i32
  %89 = icmp ne i32 %88, 128
  br i1 %89, label %90, label %100

90:                                               ; preds = %86
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.usb_setup_req, ptr %91, i32 0, i32 4
  %93 = load i16, ptr %92, align 2, !tbaa !23
  %94 = zext i16 %93 to i32
  %95 = icmp eq i32 %94, 0
  br i1 %95, label %96, label %100

96:                                               ; preds = %90
  %97 = load ptr, ptr %4, align 8, !tbaa !5
  %98 = load i8, ptr %6, align 1, !tbaa !14
  %99 = call i32 @USBD_LL_StallEP(ptr noundef %97, i8 noundef zeroext %98)
  br label %100

100:                                              ; preds = %96, %90, %86, %82
  br label %101

101:                                              ; preds = %100, %76
  %102 = load ptr, ptr %4, align 8, !tbaa !5
  %103 = call i32 @USBD_CtlSendStatus(ptr noundef %102)
  br label %107

104:                                              ; preds = %53
  %105 = load ptr, ptr %4, align 8, !tbaa !5
  %106 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %105, ptr noundef %106)
  br label %107

107:                                              ; preds = %104, %101, %75
  br label %291

108:                                              ; preds = %48
  %109 = load ptr, ptr %4, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %109, i32 0, i32 9
  %111 = load i8, ptr %110, align 4, !tbaa !21
  %112 = zext i8 %111 to i32
  switch i32 %112, label %150 [
    i32 2, label %113
    i32 3, label %131
  ]

113:                                              ; preds = %108
  %114 = load i8, ptr %6, align 1, !tbaa !14
  %115 = zext i8 %114 to i32
  %116 = icmp ne i32 %115, 0
  br i1 %116, label %117, label %127

117:                                              ; preds = %113
  %118 = load i8, ptr %6, align 1, !tbaa !14
  %119 = zext i8 %118 to i32
  %120 = icmp ne i32 %119, 128
  br i1 %120, label %121, label %127

121:                                              ; preds = %117
  %122 = load ptr, ptr %4, align 8, !tbaa !5
  %123 = load i8, ptr %6, align 1, !tbaa !14
  %124 = call i32 @USBD_LL_StallEP(ptr noundef %122, i8 noundef zeroext %123)
  %125 = load ptr, ptr %4, align 8, !tbaa !5
  %126 = call i32 @USBD_LL_StallEP(ptr noundef %125, i8 noundef zeroext -128)
  br label %130

127:                                              ; preds = %117, %113
  %128 = load ptr, ptr %4, align 8, !tbaa !5
  %129 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %128, ptr noundef %129)
  br label %130

130:                                              ; preds = %127, %121
  br label %153

131:                                              ; preds = %108
  %132 = load ptr, ptr %5, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.usb_setup_req, ptr %132, i32 0, i32 2
  %134 = load i16, ptr %133, align 2, !tbaa !22
  %135 = zext i16 %134 to i32
  %136 = icmp eq i32 %135, 0
  br i1 %136, label %137, label %149

137:                                              ; preds = %131
  %138 = load i8, ptr %6, align 1, !tbaa !14
  %139 = zext i8 %138 to i32
  %140 = and i32 %139, 127
  %141 = icmp ne i32 %140, 0
  br i1 %141, label %142, label %146

142:                                              ; preds = %137
  %143 = load ptr, ptr %4, align 8, !tbaa !5
  %144 = load i8, ptr %6, align 1, !tbaa !14
  %145 = call i32 @USBD_LL_ClearStallEP(ptr noundef %143, i8 noundef zeroext %144)
  br label %146

146:                                              ; preds = %142, %137
  %147 = load ptr, ptr %4, align 8, !tbaa !5
  %148 = call i32 @USBD_CtlSendStatus(ptr noundef %147)
  br label %149

149:                                              ; preds = %146, %131
  br label %153

150:                                              ; preds = %108
  %151 = load ptr, ptr %4, align 8, !tbaa !5
  %152 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %151, ptr noundef %152)
  br label %153

153:                                              ; preds = %150, %149, %130
  br label %291

154:                                              ; preds = %48
  %155 = load ptr, ptr %4, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %155, i32 0, i32 9
  %157 = load i8, ptr %156, align 4, !tbaa !21
  %158 = zext i8 %157 to i32
  switch i32 %158, label %284 [
    i32 2, label %159
    i32 3, label %199
  ]

159:                                              ; preds = %154
  %160 = load i8, ptr %6, align 1, !tbaa !14
  %161 = zext i8 %160 to i32
  %162 = icmp ne i32 %161, 0
  br i1 %162, label %163, label %170

163:                                              ; preds = %159
  %164 = load i8, ptr %6, align 1, !tbaa !14
  %165 = zext i8 %164 to i32
  %166 = icmp ne i32 %165, 128
  br i1 %166, label %167, label %170

167:                                              ; preds = %163
  %168 = load ptr, ptr %4, align 8, !tbaa !5
  %169 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %168, ptr noundef %169)
  br label %287

170:                                              ; preds = %163, %159
  %171 = load i8, ptr %6, align 1, !tbaa !14
  %172 = zext i8 %171 to i32
  %173 = and i32 %172, 128
  %174 = icmp eq i32 %173, 128
  br i1 %174, label %175, label %183

175:                                              ; preds = %170
  %176 = load ptr, ptr %4, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %176, i32 0, i32 5
  %178 = load i8, ptr %6, align 1, !tbaa !14
  %179 = zext i8 %178 to i32
  %180 = and i32 %179, 127
  %181 = zext i32 %180 to i64
  %182 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %177, i64 0, i64 %181
  br label %191

183:                                              ; preds = %170
  %184 = load ptr, ptr %4, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %184, i32 0, i32 6
  %186 = load i8, ptr %6, align 1, !tbaa !14
  %187 = zext i8 %186 to i32
  %188 = and i32 %187, 127
  %189 = zext i32 %188 to i64
  %190 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %185, i64 0, i64 %189
  br label %191

191:                                              ; preds = %183, %175
  %192 = phi ptr [ %182, %175 ], [ %190, %183 ]
  store ptr %192, ptr %8, align 8, !tbaa !5
  %193 = load ptr, ptr %8, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %193, i32 0, i32 0
  store i32 0, ptr %194, align 4, !tbaa !24
  %195 = load ptr, ptr %4, align 8, !tbaa !5
  %196 = load ptr, ptr %8, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %196, i32 0, i32 0
  %198 = call i32 @USBD_CtlSendData(ptr noundef %195, ptr noundef %197, i16 noundef zeroext 2)
  br label %287

199:                                              ; preds = %154
  %200 = load i8, ptr %6, align 1, !tbaa !14
  %201 = zext i8 %200 to i32
  %202 = and i32 %201, 128
  %203 = icmp eq i32 %202, 128
  br i1 %203, label %204, label %219

204:                                              ; preds = %199
  %205 = load ptr, ptr %4, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %205, i32 0, i32 5
  %207 = load i8, ptr %6, align 1, !tbaa !14
  %208 = zext i8 %207 to i32
  %209 = and i32 %208, 15
  %210 = zext i32 %209 to i64
  %211 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %206, i64 0, i64 %210
  %212 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %211, i32 0, i32 1
  %213 = load i32, ptr %212, align 4, !tbaa !26
  %214 = icmp eq i32 %213, 0
  br i1 %214, label %215, label %218

215:                                              ; preds = %204
  %216 = load ptr, ptr %4, align 8, !tbaa !5
  %217 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %216, ptr noundef %217)
  br label %287

218:                                              ; preds = %204
  br label %234

219:                                              ; preds = %199
  %220 = load ptr, ptr %4, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %220, i32 0, i32 6
  %222 = load i8, ptr %6, align 1, !tbaa !14
  %223 = zext i8 %222 to i32
  %224 = and i32 %223, 15
  %225 = zext i32 %224 to i64
  %226 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %221, i64 0, i64 %225
  %227 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %226, i32 0, i32 1
  %228 = load i32, ptr %227, align 4, !tbaa !26
  %229 = icmp eq i32 %228, 0
  br i1 %229, label %230, label %233

230:                                              ; preds = %219
  %231 = load ptr, ptr %4, align 8, !tbaa !5
  %232 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %231, ptr noundef %232)
  br label %287

233:                                              ; preds = %219
  br label %234

234:                                              ; preds = %233, %218
  %235 = load i8, ptr %6, align 1, !tbaa !14
  %236 = zext i8 %235 to i32
  %237 = and i32 %236, 128
  %238 = icmp eq i32 %237, 128
  br i1 %238, label %239, label %247

239:                                              ; preds = %234
  %240 = load ptr, ptr %4, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %240, i32 0, i32 5
  %242 = load i8, ptr %6, align 1, !tbaa !14
  %243 = zext i8 %242 to i32
  %244 = and i32 %243, 127
  %245 = zext i32 %244 to i64
  %246 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %241, i64 0, i64 %245
  br label %255

247:                                              ; preds = %234
  %248 = load ptr, ptr %4, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct._USBD_HandleTypeDef, ptr %248, i32 0, i32 6
  %250 = load i8, ptr %6, align 1, !tbaa !14
  %251 = zext i8 %250 to i32
  %252 = and i32 %251, 127
  %253 = zext i32 %252 to i64
  %254 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %249, i64 0, i64 %253
  br label %255

255:                                              ; preds = %247, %239
  %256 = phi ptr [ %246, %239 ], [ %254, %247 ]
  store ptr %256, ptr %8, align 8, !tbaa !5
  %257 = load i8, ptr %6, align 1, !tbaa !14
  %258 = zext i8 %257 to i32
  %259 = icmp eq i32 %258, 0
  br i1 %259, label %264, label %260

260:                                              ; preds = %255
  %261 = load i8, ptr %6, align 1, !tbaa !14
  %262 = zext i8 %261 to i32
  %263 = icmp eq i32 %262, 128
  br i1 %263, label %264, label %267

264:                                              ; preds = %260, %255
  %265 = load ptr, ptr %8, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %265, i32 0, i32 0
  store i32 0, ptr %266, align 4, !tbaa !24
  br label %279

267:                                              ; preds = %260
  %268 = load ptr, ptr %4, align 8, !tbaa !5
  %269 = load i8, ptr %6, align 1, !tbaa !14
  %270 = call zeroext i8 @USBD_LL_IsStallEP(ptr noundef %268, i8 noundef zeroext %269)
  %271 = icmp ne i8 %270, 0
  br i1 %271, label %272, label %275

272:                                              ; preds = %267
  %273 = load ptr, ptr %8, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %273, i32 0, i32 0
  store i32 1, ptr %274, align 4, !tbaa !24
  br label %278

275:                                              ; preds = %267
  %276 = load ptr, ptr %8, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %276, i32 0, i32 0
  store i32 0, ptr %277, align 4, !tbaa !24
  br label %278

278:                                              ; preds = %275, %272
  br label %279

279:                                              ; preds = %278, %264
  %280 = load ptr, ptr %4, align 8, !tbaa !5
  %281 = load ptr, ptr %8, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.USBD_EndpointTypeDef, ptr %281, i32 0, i32 0
  %283 = call i32 @USBD_CtlSendData(ptr noundef %280, ptr noundef %282, i16 noundef zeroext 2)
  br label %287

284:                                              ; preds = %154
  %285 = load ptr, ptr %4, align 8, !tbaa !5
  %286 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %285, ptr noundef %286)
  br label %287

287:                                              ; preds = %284, %279, %230, %215, %191, %167
  br label %291

288:                                              ; preds = %48
  %289 = load ptr, ptr %4, align 8, !tbaa !5
  %290 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %289, ptr noundef %290)
  br label %291

291:                                              ; preds = %288, %287, %153, %107
  br label %295

292:                                              ; preds = %2
  %293 = load ptr, ptr %4, align 8, !tbaa !5
  %294 = load ptr, ptr %5, align 8, !tbaa !5
  call void @USBD_CtlError(ptr noundef %293, ptr noundef %294)
  br label %295

295:                                              ; preds = %292, %291, %21
  %296 = load i32, ptr %7, align 4, !tbaa !9
  store i32 %296, ptr %3, align 4
  store i32 1, ptr %9, align 4
  br label %297

297:                                              ; preds = %295, %37
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %6) #3
  %298 = load i32, ptr %3, align 4
  ret i32 %298
}

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

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

declare i32 @USBD_CtlSendData(ptr noundef, ptr noundef, i16 noundef zeroext) #2

declare zeroext i8 @USBD_LL_IsStallEP(ptr noundef, i8 noundef zeroext) #2

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, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !13, i64 4}
!12 = !{!"usb_setup_req", !7, i64 0, !7, i64 1, !13, i64 2, !13, i64 4, !13, i64 6}
!13 = !{!"short", !7, i64 0}
!14 = !{!7, !7, i64 0}
!15 = !{!12, !7, i64 0}
!16 = !{!17, !6, i64 656}
!17 = !{!"_USBD_HandleTypeDef", !7, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !7, i64 20, !7, i64 320, !10, i64 620, !10, i64 624, !7, i64 628, !7, i64 629, !7, i64 630, !7, i64 631, !7, i64 632, !10, i64 636, !12, i64 640, !6, i64 648, !6, i64 656, !6, i64 664, !6, i64 672, !6, i64 680}
!18 = !{!19, !6, i64 16}
!19 = !{!"_Device_cb", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112}
!20 = !{!12, !7, i64 1}
!21 = !{!17, !7, i64 628}
!22 = !{!12, !13, i64 2}
!23 = !{!12, !13, i64 6}
!24 = !{!25, !10, i64 0}
!25 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16}
!26 = !{!25, !10, 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.USBD_EndpointTypeDef = type { i32, i32, i32, i32, i32 }

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

declare i32 @USBD_CtlSendStatus(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 256) i32 @USBD_StdEPReq(ptr noundef %0, ptr noundef %1) local_unnamed_addr #0 {
  %3 = getelementptr inbounds i8, ptr %1, i64 4
  %4 = load i16, ptr %3, align 2, !tbaa !5
  %5 = trunc i16 %4 to i8
  %6 = load i8, ptr %1, align 2, !tbaa !10
  %7 = and i8 %6, 96
  %8 = lshr exact i8 %7, 5
  switch i8 %8, label %default.unreachable [
    i8 1, label %9
    i8 2, label %9
    i8 0, label %15
    i8 3, label %111
  ]

9:                                                ; preds = %2, %2
  %10 = getelementptr inbounds i8, ptr %0, i64 656
  %11 = load ptr, ptr %10, align 8, !tbaa !11
  %12 = getelementptr inbounds i8, ptr %11, i64 16
  %13 = load ptr, ptr %12, align 8, !tbaa !15
  %14 = tail call zeroext i8 %13(ptr noundef %0, ptr noundef nonnull %1) #2
  br label %112

15:                                               ; preds = %2
  %16 = icmp eq i8 %7, 32
  br i1 %16, label %17, label %24

17:                                               ; preds = %15
  %18 = getelementptr inbounds i8, ptr %0, i64 656
  %19 = load ptr, ptr %18, align 8, !tbaa !11
  %20 = getelementptr inbounds i8, ptr %19, i64 16
  %21 = load ptr, ptr %20, align 8, !tbaa !15
  %22 = tail call zeroext i8 %21(ptr noundef %0, ptr noundef nonnull %1) #2
  %23 = zext i8 %22 to i32
  br label %112

24:                                               ; preds = %15
  %25 = getelementptr inbounds i8, ptr %1, i64 1
  %26 = load i8, ptr %25, align 1, !tbaa !17
  switch i8 %26, label %110 [
    i8 3, label %27
    i8 1, label %50
    i8 0, label %70
  ]

27:                                               ; preds = %24
  %28 = getelementptr inbounds i8, ptr %0, i64 628
  %29 = load i8, ptr %28, align 4, !tbaa !18
  switch i8 %29, label %49 [
    i8 2, label %30
    i8 3, label %36
  ]

30:                                               ; preds = %27
  %31 = and i16 %4, 127
  %or.cond.not = icmp eq i16 %31, 0
  br i1 %or.cond.not, label %35, label %32

32:                                               ; preds = %30
  %33 = tail call i32 @USBD_LL_StallEP(ptr noundef nonnull %0, i8 noundef zeroext %5) #2
  %34 = tail call i32 @USBD_LL_StallEP(ptr noundef nonnull %0, i8 noundef zeroext -128) #2
  br label %112

35:                                               ; preds = %30
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

36:                                               ; preds = %27
  %37 = getelementptr inbounds i8, ptr %1, i64 2
  %38 = load i16, ptr %37, align 2, !tbaa !19
  %39 = icmp ne i16 %38, 0
  %40 = and i16 %4, 127
  %or.cond5.not = icmp eq i16 %40, 0
  %or.cond = select i1 %39, i1 true, i1 %or.cond5.not
  br i1 %or.cond, label %47, label %41

41:                                               ; preds = %36
  %42 = getelementptr inbounds i8, ptr %1, i64 6
  %43 = load i16, ptr %42, align 2, !tbaa !20
  %44 = icmp eq i16 %43, 0
  br i1 %44, label %45, label %47

45:                                               ; preds = %41
  %46 = tail call i32 @USBD_LL_StallEP(ptr noundef nonnull %0, i8 noundef zeroext %5) #2
  br label %47

47:                                               ; preds = %41, %45, %36
  %48 = tail call i32 @USBD_CtlSendStatus(ptr noundef nonnull %0) #2
  br label %112

49:                                               ; preds = %27
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

50:                                               ; preds = %24
  %51 = getelementptr inbounds i8, ptr %0, i64 628
  %52 = load i8, ptr %51, align 4, !tbaa !18
  switch i8 %52, label %69 [
    i8 2, label %53
    i8 3, label %59
  ]

53:                                               ; preds = %50
  %54 = and i16 %4, 127
  %or.cond8.not = icmp eq i16 %54, 0
  br i1 %or.cond8.not, label %58, label %55

55:                                               ; preds = %53
  %56 = tail call i32 @USBD_LL_StallEP(ptr noundef nonnull %0, i8 noundef zeroext %5) #2
  %57 = tail call i32 @USBD_LL_StallEP(ptr noundef nonnull %0, i8 noundef zeroext -128) #2
  br label %112

58:                                               ; preds = %53
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

59:                                               ; preds = %50
  %60 = getelementptr inbounds i8, ptr %1, i64 2
  %61 = load i16, ptr %60, align 2, !tbaa !19
  %62 = icmp eq i16 %61, 0
  br i1 %62, label %63, label %112

63:                                               ; preds = %59
  %64 = and i16 %4, 127
  %.not104 = icmp eq i16 %64, 0
  br i1 %.not104, label %67, label %65

65:                                               ; preds = %63
  %66 = tail call i32 @USBD_LL_ClearStallEP(ptr noundef nonnull %0, i8 noundef zeroext %5) #2
  br label %67

67:                                               ; preds = %65, %63
  %68 = tail call i32 @USBD_CtlSendStatus(ptr noundef nonnull %0) #2
  br label %112

69:                                               ; preds = %50
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

70:                                               ; preds = %24
  %71 = getelementptr inbounds i8, ptr %0, i64 628
  %72 = load i8, ptr %71, align 4, !tbaa !18
  switch i8 %72, label %109 [
    i8 2, label %73
    i8 3, label %79
  ]

73:                                               ; preds = %70
  %74 = and i16 %4, 127
  %or.cond11.not = icmp eq i16 %74, 0
  br i1 %or.cond11.not, label %76, label %75

75:                                               ; preds = %73
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

76:                                               ; preds = %73
  %.mask101 = and i16 %4, 128
  %.not102 = icmp eq i16 %.mask101, 0
  %.v = select i1 %.not102, i64 320, i64 20
  %77 = getelementptr inbounds i8, ptr %0, i64 %.v
  store i32 0, ptr %77, align 4, !tbaa !21
  %78 = tail call i32 @USBD_CtlSendData(ptr noundef nonnull %0, ptr noundef nonnull %77, i16 noundef zeroext 2) #2
  br label %112

79:                                               ; preds = %70
  %.mask = and i16 %4, 255
  %80 = zext nneg i16 %.mask to i32
  %.not = icmp ult i16 %.mask, 128
  %81 = and i32 %80, 15
  %82 = zext nneg i32 %81 to i64
  br i1 %.not, label %89, label %83

83:                                               ; preds = %79
  %84 = getelementptr inbounds i8, ptr %0, i64 20
  %85 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %84, i64 0, i64 %82, i32 1
  %86 = load i32, ptr %85, align 4, !tbaa !23
  %87 = icmp eq i32 %86, 0
  br i1 %87, label %88, label %95

88:                                               ; preds = %83
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

89:                                               ; preds = %79
  %90 = getelementptr inbounds i8, ptr %0, i64 320
  %91 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %90, i64 0, i64 %82, i32 1
  %92 = load i32, ptr %91, align 4, !tbaa !23
  %93 = icmp eq i32 %92, 0
  br i1 %93, label %94, label %95

94:                                               ; preds = %89
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

95:                                               ; preds = %89, %83
  %96 = getelementptr inbounds i8, ptr %0, i64 20
  %97 = and i32 %80, 127
  %98 = zext nneg i32 %97 to i64
  %99 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %96, i64 0, i64 %98
  %100 = getelementptr inbounds i8, ptr %0, i64 320
  %101 = zext nneg i16 %.mask to i64
  %102 = getelementptr inbounds [15 x %struct.USBD_EndpointTypeDef], ptr %100, i64 0, i64 %101
  %103 = select i1 %.not, ptr %102, ptr %99
  %104 = and i16 %4, 127
  %or.cond14 = icmp eq i16 %104, 0
  br i1 %or.cond14, label %107, label %105

105:                                              ; preds = %95
  %106 = tail call zeroext i8 @USBD_LL_IsStallEP(ptr noundef nonnull %0, i8 noundef zeroext %5) #2
  %.not100 = icmp ne i8 %106, 0
  %. = zext i1 %.not100 to i32
  br label %107

107:                                              ; preds = %105, %95
  %.sink = phi i32 [ 0, %95 ], [ %., %105 ]
  store i32 %.sink, ptr %103, align 4, !tbaa !21
  %108 = tail call i32 @USBD_CtlSendData(ptr noundef nonnull %0, ptr noundef nonnull %103, i16 noundef zeroext 2) #2
  br label %112

109:                                              ; preds = %70
  tail call void @USBD_CtlError(ptr noundef nonnull %0, ptr noundef nonnull %1)
  br label %112

110:                                              ; preds = %24
  tail call void @USBD_CtlError(ptr noundef %0, ptr noundef nonnull %1)
  br label %112

default.unreachable:                              ; preds = %2
  unreachable

111:                                              ; preds = %2
  tail call void @USBD_CtlError(ptr noundef %0, ptr noundef nonnull %1)
  br label %112

112:                                              ; preds = %9, %111, %75, %76, %88, %94, %107, %109, %69, %58, %55, %67, %59, %47, %49, %35, %32, %110, %17
  %.0 = phi i32 [ %23, %17 ], [ 0, %110 ], [ 0, %32 ], [ 0, %35 ], [ 0, %49 ], [ 0, %47 ], [ 0, %59 ], [ 0, %67 ], [ 0, %55 ], [ 0, %58 ], [ 0, %69 ], [ 0, %109 ], [ 0, %107 ], [ 0, %94 ], [ 0, %88 ], [ 0, %76 ], [ 0, %75 ], [ 0, %111 ], [ 0, %9 ]
  ret i32 %.0
}

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

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

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

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "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, !9, i64 4}
!6 = !{!"usb_setup_req", !7, i64 0, !7, i64 1, !9, i64 2, !9, i64 4, !9, i64 6}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"short", !7, i64 0}
!10 = !{!6, !7, i64 0}
!11 = !{!12, !14, i64 656}
!12 = !{!"_USBD_HandleTypeDef", !7, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !7, i64 20, !7, i64 320, !13, i64 620, !13, i64 624, !7, i64 628, !7, i64 629, !7, i64 630, !7, i64 631, !7, i64 632, !13, i64 636, !6, i64 640, !14, i64 648, !14, i64 656, !14, i64 664, !14, i64 672, !14, i64 680}
!13 = !{!"int", !7, i64 0}
!14 = !{!"any pointer", !7, i64 0}
!15 = !{!16, !14, i64 16}
!16 = !{!"_Device_cb", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !14, i64 32, !14, i64 40, !14, i64 48, !14, i64 56, !14, i64 64, !14, i64 72, !14, i64 80, !14, i64 88, !14, i64 96, !14, i64 104, !14, i64 112}
!17 = !{!6, !7, i64 1}
!18 = !{!12, !7, i64 628}
!19 = !{!6, !9, i64 2}
!20 = !{!6, !9, i64 6}
!21 = !{!22, !13, i64 0}
!22 = !{!"", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16}
!23 = !{!22, !13, i64 4}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass