; 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.__SMARTCARD_HandleTypeDef = type { ptr, %struct.SMARTCARD_InitTypeDef, %struct.SMARTCARD_AdvFeatureInitTypeDef, ptr, i16, i16, ptr, i16, i16, i16, i16, i32, ptr, ptr, ptr, ptr, i32, i32, i32, i32 }
%struct.SMARTCARD_InitTypeDef = type { i32, i32, i32, i16, i16, i16, i16, i16, i16, i8, i8, i16, i32, i32, i8, i8, i32 }
%struct.SMARTCARD_AdvFeatureInitTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i16 }
%struct.USART_TypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.__DMA_HandleTypeDef = type { ptr, %struct.DMA_InitTypeDef, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i32, ptr, ptr, i32 }
%struct.DMA_InitTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

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

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

declare i32 @HAL_DMA_Abort_IT(ptr noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @HAL_SMARTCARD_IRQHandler(ptr noundef %0) #2 {
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %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
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #3
  %9 = load ptr, ptr %2, align 8, !tbaa !5
  %10 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %9, i32 0, i32 0
  %11 = load ptr, ptr %10, align 8, !tbaa !9
  %12 = getelementptr inbounds %struct.USART_TypeDef, ptr %11, i32 0, i32 7
  %13 = load volatile i32, ptr %12, align 4, !tbaa !15
  store i32 %13, ptr %3, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #3
  %14 = load ptr, ptr %2, align 8, !tbaa !5
  %15 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %14, i32 0, i32 0
  %16 = load ptr, ptr %15, align 8, !tbaa !9
  %17 = getelementptr inbounds %struct.USART_TypeDef, ptr %16, i32 0, i32 0
  %18 = load volatile i32, ptr %17, align 4, !tbaa !18
  store i32 %18, ptr %4, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #3
  %19 = load ptr, ptr %2, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %19, i32 0, i32 0
  %21 = load ptr, ptr %20, align 8, !tbaa !9
  %22 = getelementptr inbounds %struct.USART_TypeDef, ptr %21, i32 0, i32 2
  %23 = load volatile i32, ptr %22, align 4, !tbaa !19
  store i32 %23, ptr %5, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  %24 = load i32, ptr %3, align 4, !tbaa !17
  %25 = and i32 %24, 2063
  store i32 %25, ptr %6, align 4, !tbaa !17
  %26 = load i32, ptr %6, align 4, !tbaa !17
  %27 = icmp eq i32 %26, 0
  br i1 %27, label %28, label %55

28:                                               ; preds = %1
  %29 = load i32, ptr %3, align 4, !tbaa !17
  %30 = zext i32 %29 to i64
  %31 = and i64 %30, 32
  %32 = icmp ne i64 %31, 0
  br i1 %32, label %33, label %54

33:                                               ; preds = %28
  %34 = load i32, ptr %4, align 4, !tbaa !17
  %35 = zext i32 %34 to i64
  %36 = and i64 %35, 32
  %37 = icmp ne i64 %36, 0
  br i1 %37, label %43, label %38

38:                                               ; preds = %33
  %39 = load i32, ptr %5, align 4, !tbaa !17
  %40 = zext i32 %39 to i64
  %41 = and i64 %40, 268435456
  %42 = icmp ne i64 %41, 0
  br i1 %42, label %43, label %54

43:                                               ; preds = %38, %33
  %44 = load ptr, ptr %2, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %44, i32 0, i32 12
  %46 = load ptr, ptr %45, align 8, !tbaa !20
  %47 = icmp ne ptr %46, null
  br i1 %47, label %48, label %53

48:                                               ; preds = %43
  %49 = load ptr, ptr %2, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %49, i32 0, i32 12
  %51 = load ptr, ptr %50, align 8, !tbaa !20
  %52 = load ptr, ptr %2, align 8, !tbaa !5
  call void %51(ptr noundef %52)
  br label %53

53:                                               ; preds = %48, %43
  store i32 1, ptr %8, align 4
  br label %494

54:                                               ; preds = %38, %28
  br label %55

55:                                               ; preds = %54, %1
  %56 = load i32, ptr %6, align 4, !tbaa !17
  %57 = icmp ne i32 %56, 0
  br i1 %57, label %58, label %344

58:                                               ; preds = %55
  %59 = load i32, ptr %5, align 4, !tbaa !17
  %60 = zext i32 %59 to i64
  %61 = and i64 %60, 268435457
  %62 = icmp ne i64 %61, 0
  br i1 %62, label %68, label %63

63:                                               ; preds = %58
  %64 = load i32, ptr %4, align 4, !tbaa !17
  %65 = zext i32 %64 to i64
  %66 = and i64 %65, 288
  %67 = icmp ne i64 %66, 0
  br i1 %67, label %68, label %344

68:                                               ; preds = %63, %58
  %69 = load i32, ptr %3, align 4, !tbaa !17
  %70 = zext i32 %69 to i64
  %71 = and i64 %70, 1
  %72 = icmp ne i64 %71, 0
  br i1 %72, label %73, label %89

73:                                               ; preds = %68
  %74 = load i32, ptr %4, align 4, !tbaa !17
  %75 = zext i32 %74 to i64
  %76 = and i64 %75, 256
  %77 = icmp ne i64 %76, 0
  br i1 %77, label %78, label %89

78:                                               ; preds = %73
  %79 = load ptr, ptr %2, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %79, i32 0, i32 0
  %81 = load ptr, ptr %80, align 8, !tbaa !9
  %82 = getelementptr inbounds %struct.USART_TypeDef, ptr %81, i32 0, i32 8
  %83 = load volatile i32, ptr %82, align 4, !tbaa !21
  %84 = or i32 %83, 1
  store volatile i32 %84, ptr %82, align 4, !tbaa !21
  %85 = load ptr, ptr %2, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %85, i32 0, i32 19
  %87 = load volatile i32, ptr %86, align 4, !tbaa !22
  %88 = or i32 %87, 1
  store volatile i32 %88, ptr %86, align 4, !tbaa !22
  br label %89

89:                                               ; preds = %78, %73, %68
  %90 = load i32, ptr %3, align 4, !tbaa !17
  %91 = zext i32 %90 to i64
  %92 = and i64 %91, 2
  %93 = icmp ne i64 %92, 0
  br i1 %93, label %94, label %110

94:                                               ; preds = %89
  %95 = load i32, ptr %5, align 4, !tbaa !17
  %96 = zext i32 %95 to i64
  %97 = and i64 %96, 1
  %98 = icmp ne i64 %97, 0
  br i1 %98, label %99, label %110

99:                                               ; preds = %94
  %100 = load ptr, ptr %2, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %100, i32 0, i32 0
  %102 = load ptr, ptr %101, align 8, !tbaa !9
  %103 = getelementptr inbounds %struct.USART_TypeDef, ptr %102, i32 0, i32 8
  %104 = load volatile i32, ptr %103, align 4, !tbaa !21
  %105 = or i32 %104, 2
  store volatile i32 %105, ptr %103, align 4, !tbaa !21
  %106 = load ptr, ptr %2, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %106, i32 0, i32 19
  %108 = load volatile i32, ptr %107, align 4, !tbaa !22
  %109 = or i32 %108, 4
  store volatile i32 %109, ptr %107, align 4, !tbaa !22
  br label %110

110:                                              ; preds = %99, %94, %89
  %111 = load i32, ptr %3, align 4, !tbaa !17
  %112 = zext i32 %111 to i64
  %113 = and i64 %112, 4
  %114 = icmp ne i64 %113, 0
  br i1 %114, label %115, label %131

115:                                              ; preds = %110
  %116 = load i32, ptr %5, align 4, !tbaa !17
  %117 = zext i32 %116 to i64
  %118 = and i64 %117, 1
  %119 = icmp ne i64 %118, 0
  br i1 %119, label %120, label %131

120:                                              ; preds = %115
  %121 = load ptr, ptr %2, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %121, i32 0, i32 0
  %123 = load ptr, ptr %122, align 8, !tbaa !9
  %124 = getelementptr inbounds %struct.USART_TypeDef, ptr %123, i32 0, i32 8
  %125 = load volatile i32, ptr %124, align 4, !tbaa !21
  %126 = or i32 %125, 4
  store volatile i32 %126, ptr %124, align 4, !tbaa !21
  %127 = load ptr, ptr %2, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %127, i32 0, i32 19
  %129 = load volatile i32, ptr %128, align 4, !tbaa !22
  %130 = or i32 %129, 2
  store volatile i32 %130, ptr %128, align 4, !tbaa !22
  br label %131

131:                                              ; preds = %120, %115, %110
  %132 = load i32, ptr %3, align 4, !tbaa !17
  %133 = zext i32 %132 to i64
  %134 = and i64 %133, 8
  %135 = icmp ne i64 %134, 0
  br i1 %135, label %136, label %162

136:                                              ; preds = %131
  %137 = load i32, ptr %4, align 4, !tbaa !17
  %138 = zext i32 %137 to i64
  %139 = and i64 %138, 32
  %140 = icmp ne i64 %139, 0
  br i1 %140, label %151, label %141

141:                                              ; preds = %136
  %142 = load i32, ptr %5, align 4, !tbaa !17
  %143 = zext i32 %142 to i64
  %144 = and i64 %143, 268435456
  %145 = icmp ne i64 %144, 0
  br i1 %145, label %151, label %146

146:                                              ; preds = %141
  %147 = load i32, ptr %5, align 4, !tbaa !17
  %148 = zext i32 %147 to i64
  %149 = and i64 %148, 1
  %150 = icmp ne i64 %149, 0
  br i1 %150, label %151, label %162

151:                                              ; preds = %146, %141, %136
  %152 = load ptr, ptr %2, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %152, i32 0, i32 0
  %154 = load ptr, ptr %153, align 8, !tbaa !9
  %155 = getelementptr inbounds %struct.USART_TypeDef, ptr %154, i32 0, i32 8
  %156 = load volatile i32, ptr %155, align 4, !tbaa !21
  %157 = or i32 %156, 8
  store volatile i32 %157, ptr %155, align 4, !tbaa !21
  %158 = load ptr, ptr %2, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %158, i32 0, i32 19
  %160 = load volatile i32, ptr %159, align 4, !tbaa !22
  %161 = or i32 %160, 8
  store volatile i32 %161, ptr %159, align 4, !tbaa !22
  br label %162

162:                                              ; preds = %151, %146, %131
  %163 = load i32, ptr %3, align 4, !tbaa !17
  %164 = zext i32 %163 to i64
  %165 = and i64 %164, 2048
  %166 = icmp ne i64 %165, 0
  br i1 %166, label %167, label %183

167:                                              ; preds = %162
  %168 = load i32, ptr %4, align 4, !tbaa !17
  %169 = zext i32 %168 to i64
  %170 = and i64 %169, 67108864
  %171 = icmp ne i64 %170, 0
  br i1 %171, label %172, label %183

172:                                              ; preds = %167
  %173 = load ptr, ptr %2, align 8, !tbaa !5
  %174 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %173, i32 0, i32 0
  %175 = load ptr, ptr %174, align 8, !tbaa !9
  %176 = getelementptr inbounds %struct.USART_TypeDef, ptr %175, i32 0, i32 8
  %177 = load volatile i32, ptr %176, align 4, !tbaa !21
  %178 = or i32 %177, 2048
  store volatile i32 %178, ptr %176, align 4, !tbaa !21
  %179 = load ptr, ptr %2, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %179, i32 0, i32 19
  %181 = load volatile i32, ptr %180, align 4, !tbaa !22
  %182 = or i32 %181, 32
  store volatile i32 %182, ptr %180, align 4, !tbaa !22
  br label %183

183:                                              ; preds = %172, %167, %162
  %184 = load ptr, ptr %2, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %184, i32 0, i32 19
  %186 = load volatile i32, ptr %185, align 4, !tbaa !22
  %187 = icmp ne i32 %186, 0
  br i1 %187, label %188, label %343

188:                                              ; preds = %183
  %189 = load i32, ptr %3, align 4, !tbaa !17
  %190 = zext i32 %189 to i64
  %191 = and i64 %190, 32
  %192 = icmp ne i64 %191, 0
  br i1 %192, label %193, label %214

193:                                              ; preds = %188
  %194 = load i32, ptr %4, align 4, !tbaa !17
  %195 = zext i32 %194 to i64
  %196 = and i64 %195, 32
  %197 = icmp ne i64 %196, 0
  br i1 %197, label %203, label %198

198:                                              ; preds = %193
  %199 = load i32, ptr %5, align 4, !tbaa !17
  %200 = zext i32 %199 to i64
  %201 = and i64 %200, 268435456
  %202 = icmp ne i64 %201, 0
  br i1 %202, label %203, label %214

203:                                              ; preds = %198, %193
  %204 = load ptr, ptr %2, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %204, i32 0, i32 12
  %206 = load ptr, ptr %205, align 8, !tbaa !20
  %207 = icmp ne ptr %206, null
  br i1 %207, label %208, label %213

208:                                              ; preds = %203
  %209 = load ptr, ptr %2, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %209, i32 0, i32 12
  %211 = load ptr, ptr %210, align 8, !tbaa !20
  %212 = load ptr, ptr %2, align 8, !tbaa !5
  call void %211(ptr noundef %212)
  br label %213

213:                                              ; preds = %208, %203
  br label %214

214:                                              ; preds = %213, %198, %188
  %215 = load ptr, ptr %2, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %215, i32 0, i32 19
  %217 = load volatile i32, ptr %216, align 4, !tbaa !22
  store i32 %217, ptr %7, align 4, !tbaa !17
  %218 = load ptr, ptr %2, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %218, i32 0, i32 0
  %220 = load ptr, ptr %219, align 8, !tbaa !9
  %221 = getelementptr inbounds %struct.USART_TypeDef, ptr %220, i32 0, i32 2
  %222 = load volatile i32, ptr %221, align 4, !tbaa !19
  %223 = zext i32 %222 to i64
  %224 = and i64 %223, 64
  %225 = icmp eq i64 %224, 64
  br i1 %225, label %230, label %226

226:                                              ; preds = %214
  %227 = load i32, ptr %7, align 4, !tbaa !17
  %228 = and i32 %227, 40
  %229 = icmp ne i32 %228, 0
  br i1 %229, label %230, label %279

230:                                              ; preds = %226, %214
  %231 = load ptr, ptr %2, align 8, !tbaa !5
  call void @SMARTCARD_EndRxTransfer(ptr noundef %231)
  %232 = load ptr, ptr %2, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %232, i32 0, i32 0
  %234 = load ptr, ptr %233, align 8, !tbaa !9
  %235 = getelementptr inbounds %struct.USART_TypeDef, ptr %234, i32 0, i32 2
  %236 = load volatile i32, ptr %235, align 4, !tbaa !19
  %237 = zext i32 %236 to i64
  %238 = and i64 %237, 64
  %239 = icmp eq i64 %238, 64
  br i1 %239, label %240, label %276

240:                                              ; preds = %230
  %241 = load ptr, ptr %2, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %241, i32 0, i32 0
  %243 = load ptr, ptr %242, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.USART_TypeDef, ptr %243, i32 0, i32 2
  %245 = load volatile i32, ptr %244, align 4, !tbaa !19
  %246 = zext i32 %245 to i64
  %247 = and i64 %246, -65
  %248 = trunc i64 %247 to i32
  store volatile i32 %248, ptr %244, align 4, !tbaa !19
  %249 = load ptr, ptr %2, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %249, i32 0, i32 15
  %251 = load ptr, ptr %250, align 8, !tbaa !23
  %252 = icmp ne ptr %251, null
  br i1 %252, label %253, label %273

253:                                              ; preds = %240
  %254 = load ptr, ptr %2, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %254, i32 0, i32 15
  %256 = load ptr, ptr %255, align 8, !tbaa !23
  %257 = getelementptr inbounds %struct.__DMA_HandleTypeDef, ptr %256, i32 0, i32 10
  store ptr @SMARTCARD_DMAAbortOnError, ptr %257, align 8, !tbaa !24
  %258 = load ptr, ptr %2, align 8, !tbaa !5
  %259 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %258, i32 0, i32 15
  %260 = load ptr, ptr %259, align 8, !tbaa !23
  %261 = call i32 @HAL_DMA_Abort_IT(ptr noundef %260)
  %262 = icmp ne i32 %261, 0
  br i1 %262, label %263, label %272

263:                                              ; preds = %253
  %264 = load ptr, ptr %2, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %264, i32 0, i32 15
  %266 = load ptr, ptr %265, align 8, !tbaa !23
  %267 = getelementptr inbounds %struct.__DMA_HandleTypeDef, ptr %266, i32 0, i32 10
  %268 = load ptr, ptr %267, align 8, !tbaa !24
  %269 = load ptr, ptr %2, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %269, i32 0, i32 15
  %271 = load ptr, ptr %270, align 8, !tbaa !23
  call void %268(ptr noundef %271)
  br label %272

272:                                              ; preds = %263, %253
  br label %275

273:                                              ; preds = %240
  %274 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARD_ErrorCallback(ptr noundef %274)
  br label %275

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

276:                                              ; preds = %230
  %277 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARD_ErrorCallback(ptr noundef %277)
  br label %278

278:                                              ; preds = %276, %275
  br label %342

279:                                              ; preds = %226
  %280 = load ptr, ptr %2, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %280, i32 0, i32 17
  %282 = load volatile i32, ptr %281, align 4, !tbaa !26
  %283 = icmp eq i32 %282, 33
  br i1 %283, label %284, label %337

284:                                              ; preds = %279
  %285 = load i32, ptr %7, align 4, !tbaa !17
  %286 = and i32 %285, 4
  %287 = icmp ne i32 %286, 0
  br i1 %287, label %288, label %337

288:                                              ; preds = %284
  %289 = load ptr, ptr %2, align 8, !tbaa !5
  call void @SMARTCARD_EndTxTransfer(ptr noundef %289)
  %290 = load ptr, ptr %2, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %290, i32 0, i32 0
  %292 = load ptr, ptr %291, align 8, !tbaa !9
  %293 = getelementptr inbounds %struct.USART_TypeDef, ptr %292, i32 0, i32 2
  %294 = load volatile i32, ptr %293, align 4, !tbaa !19
  %295 = zext i32 %294 to i64
  %296 = and i64 %295, 128
  %297 = icmp eq i64 %296, 128
  br i1 %297, label %298, label %334

298:                                              ; preds = %288
  %299 = load ptr, ptr %2, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %299, i32 0, i32 0
  %301 = load ptr, ptr %300, align 8, !tbaa !9
  %302 = getelementptr inbounds %struct.USART_TypeDef, ptr %301, i32 0, i32 2
  %303 = load volatile i32, ptr %302, align 4, !tbaa !19
  %304 = zext i32 %303 to i64
  %305 = and i64 %304, -129
  %306 = trunc i64 %305 to i32
  store volatile i32 %306, ptr %302, align 4, !tbaa !19
  %307 = load ptr, ptr %2, align 8, !tbaa !5
  %308 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %307, i32 0, i32 14
  %309 = load ptr, ptr %308, align 8, !tbaa !27
  %310 = icmp ne ptr %309, null
  br i1 %310, label %311, label %331

311:                                              ; preds = %298
  %312 = load ptr, ptr %2, align 8, !tbaa !5
  %313 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %312, i32 0, i32 14
  %314 = load ptr, ptr %313, align 8, !tbaa !27
  %315 = getelementptr inbounds %struct.__DMA_HandleTypeDef, ptr %314, i32 0, i32 10
  store ptr @SMARTCARD_DMAAbortOnError, ptr %315, align 8, !tbaa !24
  %316 = load ptr, ptr %2, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %316, i32 0, i32 14
  %318 = load ptr, ptr %317, align 8, !tbaa !27
  %319 = call i32 @HAL_DMA_Abort_IT(ptr noundef %318)
  %320 = icmp ne i32 %319, 0
  br i1 %320, label %321, label %330

321:                                              ; preds = %311
  %322 = load ptr, ptr %2, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %322, i32 0, i32 14
  %324 = load ptr, ptr %323, align 8, !tbaa !27
  %325 = getelementptr inbounds %struct.__DMA_HandleTypeDef, ptr %324, i32 0, i32 10
  %326 = load ptr, ptr %325, align 8, !tbaa !24
  %327 = load ptr, ptr %2, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %327, i32 0, i32 14
  %329 = load ptr, ptr %328, align 8, !tbaa !27
  call void %326(ptr noundef %329)
  br label %330

330:                                              ; preds = %321, %311
  br label %333

331:                                              ; preds = %298
  %332 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARD_ErrorCallback(ptr noundef %332)
  br label %333

333:                                              ; preds = %331, %330
  br label %336

334:                                              ; preds = %288
  %335 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARD_ErrorCallback(ptr noundef %335)
  br label %336

336:                                              ; preds = %334, %333
  br label %341

337:                                              ; preds = %284, %279
  %338 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARD_ErrorCallback(ptr noundef %338)
  %339 = load ptr, ptr %2, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %339, i32 0, i32 19
  store volatile i32 0, ptr %340, align 4, !tbaa !22
  br label %341

341:                                              ; preds = %337, %336
  br label %342

342:                                              ; preds = %341, %278
  br label %343

343:                                              ; preds = %342, %183
  store i32 1, ptr %8, align 4
  br label %494

344:                                              ; preds = %63, %55
  %345 = load i32, ptr %3, align 4, !tbaa !17
  %346 = zext i32 %345 to i64
  %347 = and i64 %346, 4096
  %348 = icmp ne i64 %347, 0
  br i1 %348, label %349, label %369

349:                                              ; preds = %344
  %350 = load i32, ptr %4, align 4, !tbaa !17
  %351 = zext i32 %350 to i64
  %352 = and i64 %351, 134217728
  %353 = icmp ne i64 %352, 0
  br i1 %353, label %354, label %369

354:                                              ; preds = %349
  %355 = load ptr, ptr %2, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %355, i32 0, i32 18
  store volatile i32 32, ptr %356, align 8, !tbaa !28
  br label %357

357:                                              ; preds = %354
  %358 = load ptr, ptr %2, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %358, i32 0, i32 16
  store i32 0, ptr %359, align 8, !tbaa !29
  br label %360

360:                                              ; preds = %357
  br label %361

361:                                              ; preds = %360
  %362 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARD_RxCpltCallback(ptr noundef %362)
  %363 = load ptr, ptr %2, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %363, i32 0, i32 0
  %365 = load ptr, ptr %364, align 8, !tbaa !9
  %366 = getelementptr inbounds %struct.USART_TypeDef, ptr %365, i32 0, i32 8
  %367 = load volatile i32, ptr %366, align 4, !tbaa !21
  %368 = or i32 %367, 4096
  store volatile i32 %368, ptr %366, align 4, !tbaa !21
  store i32 1, ptr %8, align 4
  br label %494

369:                                              ; preds = %349, %344
  %370 = load i32, ptr %3, align 4, !tbaa !17
  %371 = zext i32 %370 to i64
  %372 = and i64 %371, 128
  %373 = icmp ne i64 %372, 0
  br i1 %373, label %374, label %395

374:                                              ; preds = %369
  %375 = load i32, ptr %4, align 4, !tbaa !17
  %376 = zext i32 %375 to i64
  %377 = and i64 %376, 128
  %378 = icmp ne i64 %377, 0
  br i1 %378, label %384, label %379

379:                                              ; preds = %374
  %380 = load i32, ptr %5, align 4, !tbaa !17
  %381 = zext i32 %380 to i64
  %382 = and i64 %381, 8388608
  %383 = icmp ne i64 %382, 0
  br i1 %383, label %384, label %395

384:                                              ; preds = %379, %374
  %385 = load ptr, ptr %2, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %385, i32 0, i32 13
  %387 = load ptr, ptr %386, align 8, !tbaa !30
  %388 = icmp ne ptr %387, null
  br i1 %388, label %389, label %394

389:                                              ; preds = %384
  %390 = load ptr, ptr %2, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %390, i32 0, i32 13
  %392 = load ptr, ptr %391, align 8, !tbaa !30
  %393 = load ptr, ptr %2, align 8, !tbaa !5
  call void %392(ptr noundef %393)
  br label %394

394:                                              ; preds = %389, %384
  store i32 1, ptr %8, align 4
  br label %494

395:                                              ; preds = %379, %369
  %396 = load ptr, ptr %2, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %396, i32 0, i32 0
  %398 = load ptr, ptr %397, align 8, !tbaa !9
  %399 = getelementptr inbounds %struct.USART_TypeDef, ptr %398, i32 0, i32 7
  %400 = load volatile i32, ptr %399, align 4, !tbaa !15
  %401 = load ptr, ptr %2, align 8, !tbaa !5
  %402 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %401, i32 0, i32 2
  %403 = getelementptr inbounds %struct.SMARTCARD_AdvFeatureInitTypeDef, ptr %402, i32 0, i32 8
  %404 = load i16, ptr %403, align 4, !tbaa !31
  %405 = zext i16 %404 to i32
  %406 = and i32 %405, 7936
  %407 = lshr i32 %406, 8
  %408 = shl i32 1, %407
  %409 = and i32 %400, %408
  %410 = icmp ne i32 %409, 0
  %411 = zext i1 %410 to i64
  %412 = select i1 %410, i32 1, i32 0
  %413 = icmp ne i32 %412, 0
  br i1 %413, label %414, label %469

414:                                              ; preds = %395
  %415 = load ptr, ptr %2, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %415, i32 0, i32 2
  %417 = getelementptr inbounds %struct.SMARTCARD_AdvFeatureInitTypeDef, ptr %416, i32 0, i32 8
  %418 = load i16, ptr %417, align 4, !tbaa !31
  %419 = zext i16 %418 to i32
  %420 = and i32 %419, 224
  %421 = lshr i32 %420, 5
  %422 = icmp eq i32 %421, 1
  br i1 %422, label %423, label %429

423:                                              ; preds = %414
  %424 = load ptr, ptr %2, align 8, !tbaa !5
  %425 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %424, i32 0, i32 0
  %426 = load ptr, ptr %425, align 8, !tbaa !9
  %427 = getelementptr inbounds %struct.USART_TypeDef, ptr %426, i32 0, i32 0
  %428 = load volatile i32, ptr %427, align 4, !tbaa !18
  br label %452

429:                                              ; preds = %414
  %430 = load ptr, ptr %2, align 8, !tbaa !5
  %431 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %430, i32 0, i32 2
  %432 = getelementptr inbounds %struct.SMARTCARD_AdvFeatureInitTypeDef, ptr %431, i32 0, i32 8
  %433 = load i16, ptr %432, align 4, !tbaa !31
  %434 = zext i16 %433 to i32
  %435 = and i32 %434, 224
  %436 = lshr i32 %435, 5
  %437 = icmp eq i32 %436, 2
  br i1 %437, label %438, label %444

438:                                              ; preds = %429
  %439 = load ptr, ptr %2, align 8, !tbaa !5
  %440 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %439, i32 0, i32 0
  %441 = load ptr, ptr %440, align 8, !tbaa !9
  %442 = getelementptr inbounds %struct.USART_TypeDef, ptr %441, i32 0, i32 1
  %443 = load volatile i32, ptr %442, align 4, !tbaa !32
  br label %450

444:                                              ; preds = %429
  %445 = load ptr, ptr %2, align 8, !tbaa !5
  %446 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %445, i32 0, i32 0
  %447 = load ptr, ptr %446, align 8, !tbaa !9
  %448 = getelementptr inbounds %struct.USART_TypeDef, ptr %447, i32 0, i32 2
  %449 = load volatile i32, ptr %448, align 4, !tbaa !19
  br label %450

450:                                              ; preds = %444, %438
  %451 = phi i32 [ %443, %438 ], [ %449, %444 ]
  br label %452

452:                                              ; preds = %450, %423
  %453 = phi i32 [ %428, %423 ], [ %451, %450 ]
  %454 = load ptr, ptr %2, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.__SMARTCARD_HandleTypeDef, ptr %454, i32 0, i32 2
  %456 = getelementptr inbounds %struct.SMARTCARD_AdvFeatureInitTypeDef, ptr %455, i32 0, i32 8
  %457 = load i16, ptr %456, align 4, !tbaa !31
  %458 = zext i16 %457 to i32
  %459 = and i32 %458, 31
  %460 = shl i32 1, %459
  %461 = and i32 %453, %460
  %462 = icmp ne i32 %461, 0
  %463 = zext i1 %462 to i64
  %464 = select i1 %462, i32 1, i32 0
  %465 = icmp ne i32 %464, 0
  br i1 %465, label %466, label %468

466:                                              ; preds = %452
  %467 = load ptr, ptr %2, align 8, !tbaa !5
  call void @SMARTCARD_EndTransmit_IT(ptr noundef %467)
  store i32 1, ptr %8, align 4
  br label %494

468:                                              ; preds = %452
  br label %469

469:                                              ; preds = %468, %395
  %470 = load i32, ptr %3, align 4, !tbaa !17
  %471 = zext i32 %470 to i64
  %472 = and i64 %471, 8388608
  %473 = icmp ne i64 %472, 0
  br i1 %473, label %474, label %481

474:                                              ; preds = %469
  %475 = load i32, ptr %4, align 4, !tbaa !17
  %476 = zext i32 %475 to i64
  %477 = and i64 %476, 1073741824
  %478 = icmp ne i64 %477, 0
  br i1 %478, label %479, label %481

479:                                              ; preds = %474
  %480 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARDEx_TxFifoEmptyCallback(ptr noundef %480)
  store i32 1, ptr %8, align 4
  br label %494

481:                                              ; preds = %474, %469
  %482 = load i32, ptr %3, align 4, !tbaa !17
  %483 = zext i32 %482 to i64
  %484 = and i64 %483, 16777216
  %485 = icmp ne i64 %484, 0
  br i1 %485, label %486, label %493

486:                                              ; preds = %481
  %487 = load i32, ptr %4, align 4, !tbaa !17
  %488 = zext i32 %487 to i64
  %489 = and i64 %488, 2147483648
  %490 = icmp ne i64 %489, 0
  br i1 %490, label %491, label %493

491:                                              ; preds = %486
  %492 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SMARTCARDEx_RxFifoFullCallback(ptr noundef %492)
  store i32 1, ptr %8, align 4
  br label %494

493:                                              ; preds = %486, %481
  store i32 0, ptr %8, align 4
  br label %494

494:                                              ; preds = %493, %491, %479, %466, %394, %361, %343, %53
  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 4, ptr %3) #3
  %495 = load i32, ptr %8, align 4
  switch i32 %495, label %497 [
    i32 0, label %496
    i32 1, label %496
  ]

496:                                              ; preds = %494, %494
  ret void

497:                                              ; preds = %494
  unreachable
}

; Function Attrs: nounwind uwtable
declare hidden void @SMARTCARD_EndRxTransfer(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden void @SMARTCARD_DMAAbortOnError(ptr noundef) #2

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

; Function Attrs: nounwind uwtable
declare hidden void @SMARTCARD_EndTxTransfer(ptr noundef) #2

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

; Function Attrs: nounwind uwtable
declare hidden void @SMARTCARD_EndTransmit_IT(ptr noundef) #2

declare void @HAL_SMARTCARDEx_TxFifoEmptyCallback(ptr noundef) #1

declare void @HAL_SMARTCARDEx_RxFifoFullCallback(ptr noundef) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 0}
!10 = !{!"__SMARTCARD_HandleTypeDef", !6, i64 0, !11, i64 8, !14, i64 52, !6, i64 88, !13, i64 96, !13, i64 98, !6, i64 104, !13, i64 112, !13, i64 114, !13, i64 116, !13, i64 118, !12, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !12, i64 160, !12, i64 164, !12, i64 168, !12, i64 172}
!11 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !13, i64 12, !13, i64 14, !13, i64 16, !13, i64 18, !13, i64 20, !13, i64 22, !7, i64 24, !7, i64 25, !13, i64 26, !12, i64 28, !12, i64 32, !7, i64 36, !7, i64 37, !12, i64 40}
!12 = !{!"int", !7, i64 0}
!13 = !{!"short", !7, i64 0}
!14 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !13, i64 32}
!15 = !{!16, !12, i64 28}
!16 = !{!"", !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}
!17 = !{!12, !12, i64 0}
!18 = !{!16, !12, i64 0}
!19 = !{!16, !12, i64 8}
!20 = !{!10, !6, i64 128}
!21 = !{!16, !12, i64 32}
!22 = !{!10, !12, i64 172}
!23 = !{!10, !6, i64 152}
!24 = !{!25, !6, i64 112}
!25 = !{!"__DMA_HandleTypeDef", !6, i64 0, !16, i64 8, !12, i64 56, !12, i64 60, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !12, i64 120, !12, i64 124, !12, i64 128, !6, i64 136, !6, i64 144, !12, i64 152, !6, i64 160, !6, i64 168, !12, i64 176}
!26 = !{!10, !12, i64 164}
!27 = !{!10, !6, i64 144}
!28 = !{!10, !12, i64 168}
!29 = !{!10, !12, i64 160}
!30 = !{!10, !6, i64 136}
!31 = !{!10, !13, i64 84}
!32 = !{!16, !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"

declare i32 @HAL_DMA_Abort_IT(ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local void @HAL_SMARTCARD_IRQHandler(ptr noundef %0) local_unnamed_addr #1 {
  %2 = load ptr, ptr %0, align 8, !tbaa !5
  %3 = getelementptr inbounds i8, ptr %2, i64 28
  %4 = load volatile i32, ptr %3, align 4, !tbaa !14
  %5 = load volatile i32, ptr %2, align 4, !tbaa !16
  %6 = getelementptr inbounds i8, ptr %2, i64 8
  %7 = load volatile i32, ptr %6, align 4, !tbaa !17
  %8 = and i32 %4, 2095
  %or.cond.not = icmp eq i32 %8, 32
  br i1 %or.cond.not, label %9, label %16

9:                                                ; preds = %1
  %10 = and i32 %5, 32
  %.not101 = icmp eq i32 %10, 0
  %11 = and i32 %7, 268435456
  %.not102 = icmp eq i32 %11, 0
  %or.cond145 = select i1 %.not101, i1 %.not102, i1 false
  br i1 %or.cond145, label %.thread, label %12

12:                                               ; preds = %9
  %13 = getelementptr inbounds i8, ptr %0, i64 128
  %14 = load ptr, ptr %13, align 8, !tbaa !18
  %.not144 = icmp eq ptr %14, null
  br i1 %.not144, label %184, label %15

15:                                               ; preds = %12
  tail call void %14(ptr noundef nonnull %0) #2
  br label %184

16:                                               ; preds = %1
  %17 = and i32 %4, 2063
  %.not103 = icmp eq i32 %17, 0
  br i1 %.not103, label %.thread, label %18

18:                                               ; preds = %16
  %19 = zext i32 %7 to i64
  %20 = and i64 %19, 268435457
  %.not104 = icmp eq i64 %20, 0
  %21 = and i32 %5, 288
  %.not105 = icmp eq i32 %21, 0
  %or.cond146 = select i1 %.not104, i1 %.not105, i1 false
  br i1 %or.cond146, label %.thread, label %22

22:                                               ; preds = %18
  %23 = zext i32 %4 to i64
  %24 = and i64 %23, 1
  %.not118 = icmp eq i64 %24, 0
  %25 = and i32 %5, 256
  %.not119 = icmp eq i32 %25, 0
  %or.cond147 = select i1 %.not118, i1 true, i1 %.not119
  br i1 %or.cond147, label %33, label %26

26:                                               ; preds = %22
  %27 = getelementptr inbounds i8, ptr %2, i64 32
  %28 = load volatile i32, ptr %27, align 4, !tbaa !19
  %29 = or i32 %28, 1
  store volatile i32 %29, ptr %27, align 4, !tbaa !19
  %30 = getelementptr inbounds i8, ptr %0, i64 172
  %31 = load volatile i32, ptr %30, align 4, !tbaa !20
  %32 = or i32 %31, 1
  store volatile i32 %32, ptr %30, align 4, !tbaa !20
  br label %33

33:                                               ; preds = %26, %22
  %34 = and i64 %23, 2
  %.not120 = icmp eq i64 %34, 0
  %35 = and i64 %19, 1
  %.not121 = icmp eq i64 %35, 0
  %or.cond148 = or i1 %.not120, %.not121
  br i1 %or.cond148, label %43, label %36

36:                                               ; preds = %33
  %37 = getelementptr inbounds i8, ptr %2, i64 32
  %38 = load volatile i32, ptr %37, align 4, !tbaa !19
  %39 = or i32 %38, 2
  store volatile i32 %39, ptr %37, align 4, !tbaa !19
  %40 = getelementptr inbounds i8, ptr %0, i64 172
  %41 = load volatile i32, ptr %40, align 4, !tbaa !20
  %42 = or i32 %41, 4
  store volatile i32 %42, ptr %40, align 4, !tbaa !20
  br label %43

43:                                               ; preds = %36, %33
  %44 = and i64 %23, 4
  %.not122 = icmp eq i64 %44, 0
  %or.cond149 = or i1 %.not122, %.not121
  br i1 %or.cond149, label %52, label %45

45:                                               ; preds = %43
  %46 = getelementptr inbounds i8, ptr %2, i64 32
  %47 = load volatile i32, ptr %46, align 4, !tbaa !19
  %48 = or i32 %47, 4
  store volatile i32 %48, ptr %46, align 4, !tbaa !19
  %49 = getelementptr inbounds i8, ptr %0, i64 172
  %50 = load volatile i32, ptr %49, align 4, !tbaa !20
  %51 = or i32 %50, 2
  store volatile i32 %51, ptr %49, align 4, !tbaa !20
  br label %52

52:                                               ; preds = %45, %43
  %53 = and i64 %23, 8
  %.not124 = icmp eq i64 %53, 0
  br i1 %.not124, label %63, label %54

54:                                               ; preds = %52
  %55 = and i32 %5, 32
  %.not125 = icmp eq i32 %55, 0
  %or.cond151 = and i1 %.not125, %.not104
  br i1 %or.cond151, label %63, label %56

56:                                               ; preds = %54
  %57 = getelementptr inbounds i8, ptr %2, i64 32
  %58 = load volatile i32, ptr %57, align 4, !tbaa !19
  %59 = or i32 %58, 8
  store volatile i32 %59, ptr %57, align 4, !tbaa !19
  %60 = getelementptr inbounds i8, ptr %0, i64 172
  %61 = load volatile i32, ptr %60, align 4, !tbaa !20
  %62 = or i32 %61, 8
  store volatile i32 %62, ptr %60, align 4, !tbaa !20
  br label %63

63:                                               ; preds = %54, %56, %52
  %64 = and i64 %23, 2048
  %.not128 = icmp eq i64 %64, 0
  %65 = and i32 %5, 67108864
  %.not129 = icmp eq i32 %65, 0
  %or.cond152 = select i1 %.not128, i1 true, i1 %.not129
  br i1 %or.cond152, label %73, label %66

66:                                               ; preds = %63
  %67 = getelementptr inbounds i8, ptr %2, i64 32
  %68 = load volatile i32, ptr %67, align 4, !tbaa !19
  %69 = or i32 %68, 2048
  store volatile i32 %69, ptr %67, align 4, !tbaa !19
  %70 = getelementptr inbounds i8, ptr %0, i64 172
  %71 = load volatile i32, ptr %70, align 4, !tbaa !20
  %72 = or i32 %71, 32
  store volatile i32 %72, ptr %70, align 4, !tbaa !20
  br label %73

73:                                               ; preds = %66, %63
  %74 = getelementptr inbounds i8, ptr %0, i64 172
  %75 = load volatile i32, ptr %74, align 4, !tbaa !20
  %.not130 = icmp eq i32 %75, 0
  br i1 %.not130, label %184, label %76

76:                                               ; preds = %73
  %77 = and i64 %23, 32
  %.not131 = icmp eq i64 %77, 0
  br i1 %.not131, label %85, label %78

78:                                               ; preds = %76
  %79 = and i32 %5, 32
  %.not132 = icmp eq i32 %79, 0
  %80 = and i64 %19, 268435456
  %.not133 = icmp eq i64 %80, 0
  %or.cond153 = and i1 %.not132, %.not133
  br i1 %or.cond153, label %85, label %81

81:                                               ; preds = %78
  %82 = getelementptr inbounds i8, ptr %0, i64 128
  %83 = load ptr, ptr %82, align 8, !tbaa !18
  %.not134 = icmp eq ptr %83, null
  br i1 %.not134, label %85, label %84

84:                                               ; preds = %81
  tail call void %83(ptr noundef nonnull %0) #2
  %.pre = load ptr, ptr %0, align 8, !tbaa !5
  br label %85

85:                                               ; preds = %78, %81, %84, %76
  %86 = phi ptr [ %2, %78 ], [ %2, %81 ], [ %.pre, %84 ], [ %2, %76 ]
  %87 = load volatile i32, ptr %74, align 4, !tbaa !20
  %88 = getelementptr inbounds i8, ptr %86, i64 8
  %89 = load volatile i32, ptr %88, align 4, !tbaa !17
  %90 = and i32 %89, 64
  %.not135 = icmp eq i32 %90, 0
  %91 = and i32 %87, 40
  %.not136 = icmp eq i32 %91, 0
  %or.cond154 = select i1 %.not135, i1 %.not136, i1 false
  br i1 %or.cond154, label %111, label %92

92:                                               ; preds = %85
  tail call void @SMARTCARD_EndRxTransfer(ptr noundef nonnull %0)
  %93 = load ptr, ptr %0, align 8, !tbaa !5
  %94 = getelementptr inbounds i8, ptr %93, i64 8
  %95 = load volatile i32, ptr %94, align 4, !tbaa !17
  %96 = and i32 %95, 64
  %.not141 = icmp eq i32 %96, 0
  br i1 %.not141, label %110, label %97

97:                                               ; preds = %92
  %98 = load volatile i32, ptr %94, align 4, !tbaa !17
  %99 = and i32 %98, -65
  store volatile i32 %99, ptr %94, align 4, !tbaa !17
  %100 = getelementptr inbounds i8, ptr %0, i64 152
  %101 = load ptr, ptr %100, align 8, !tbaa !21
  %.not142 = icmp eq ptr %101, null
  br i1 %.not142, label %109, label %102

102:                                              ; preds = %97
  %103 = getelementptr inbounds i8, ptr %101, i64 112
  store ptr @SMARTCARD_DMAAbortOnError, ptr %103, align 8, !tbaa !22
  %104 = tail call i32 @HAL_DMA_Abort_IT(ptr noundef nonnull %101) #2
  %.not143 = icmp eq i32 %104, 0
  br i1 %.not143, label %184, label %105

105:                                              ; preds = %102
  %106 = load ptr, ptr %100, align 8, !tbaa !21
  %107 = getelementptr inbounds i8, ptr %106, i64 112
  %108 = load ptr, ptr %107, align 8, !tbaa !22
  tail call void %108(ptr noundef %106) #2
  br label %184

109:                                              ; preds = %97
  tail call void @HAL_SMARTCARD_ErrorCallback(ptr noundef nonnull %0)
  br label %184

110:                                              ; preds = %92
  tail call void @HAL_SMARTCARD_ErrorCallback(ptr noundef nonnull %0)
  br label %184

111:                                              ; preds = %85
  %112 = getelementptr inbounds i8, ptr %0, i64 164
  %113 = load volatile i32, ptr %112, align 4, !tbaa !24
  %114 = icmp ne i32 %113, 33
  %115 = and i32 %87, 4
  %.not137 = icmp eq i32 %115, 0
  %or.cond155 = select i1 %114, i1 true, i1 %.not137
  br i1 %or.cond155, label %135, label %116

116:                                              ; preds = %111
  tail call void @SMARTCARD_EndTxTransfer(ptr noundef nonnull %0)
  %117 = load ptr, ptr %0, align 8, !tbaa !5
  %118 = getelementptr inbounds i8, ptr %117, i64 8
  %119 = load volatile i32, ptr %118, align 4, !tbaa !17
  %120 = and i32 %119, 128
  %.not138 = icmp eq i32 %120, 0
  br i1 %.not138, label %134, label %121

121:                                              ; preds = %116
  %122 = load volatile i32, ptr %118, align 4, !tbaa !17
  %123 = and i32 %122, -129
  store volatile i32 %123, ptr %118, align 4, !tbaa !17
  %124 = getelementptr inbounds i8, ptr %0, i64 144
  %125 = load ptr, ptr %124, align 8, !tbaa !25
  %.not139 = icmp eq ptr %125, null
  br i1 %.not139, label %133, label %126

126:                                              ; preds = %121
  %127 = getelementptr inbounds i8, ptr %125, i64 112
  store ptr @SMARTCARD_DMAAbortOnError, ptr %127, align 8, !tbaa !22
  %128 = tail call i32 @HAL_DMA_Abort_IT(ptr noundef nonnull %125) #2
  %.not140 = icmp eq i32 %128, 0
  br i1 %.not140, label %184, label %129

129:                                              ; preds = %126
  %130 = load ptr, ptr %124, align 8, !tbaa !25
  %131 = getelementptr inbounds i8, ptr %130, i64 112
  %132 = load ptr, ptr %131, align 8, !tbaa !22
  tail call void %132(ptr noundef %130) #2
  br label %184

133:                                              ; preds = %121
  tail call void @HAL_SMARTCARD_ErrorCallback(ptr noundef nonnull %0)
  br label %184

134:                                              ; preds = %116
  tail call void @HAL_SMARTCARD_ErrorCallback(ptr noundef nonnull %0)
  br label %184

135:                                              ; preds = %111
  tail call void @HAL_SMARTCARD_ErrorCallback(ptr noundef nonnull %0)
  store volatile i32 0, ptr %74, align 4, !tbaa !20
  br label %184

.thread:                                          ; preds = %9, %18, %16
  %136 = zext i32 %4 to i64
  %137 = and i64 %136, 4096
  %.not106 = icmp eq i64 %137, 0
  %138 = and i32 %5, 134217728
  %.not107 = icmp eq i32 %138, 0
  %or.cond156 = select i1 %.not106, i1 true, i1 %.not107
  br i1 %or.cond156, label %146, label %139

139:                                              ; preds = %.thread
  %140 = getelementptr inbounds i8, ptr %0, i64 168
  store volatile i32 32, ptr %140, align 8, !tbaa !26
  %141 = getelementptr inbounds i8, ptr %0, i64 160
  store i32 0, ptr %141, align 8, !tbaa !27
  tail call void @HAL_SMARTCARD_RxCpltCallback(ptr noundef nonnull %0)
  %142 = load ptr, ptr %0, align 8, !tbaa !5
  %143 = getelementptr inbounds i8, ptr %142, i64 32
  %144 = load volatile i32, ptr %143, align 4, !tbaa !19
  %145 = or i32 %144, 4096
  store volatile i32 %145, ptr %143, align 4, !tbaa !19
  br label %184

146:                                              ; preds = %.thread
  %147 = and i64 %136, 128
  %.not108 = icmp eq i64 %147, 0
  br i1 %.not108, label %155, label %148

148:                                              ; preds = %146
  %149 = and i32 %5, 128
  %.not109 = icmp eq i32 %149, 0
  %150 = and i32 %7, 8388608
  %.not110 = icmp eq i32 %150, 0
  %or.cond157 = select i1 %.not109, i1 %.not110, i1 false
  br i1 %or.cond157, label %155, label %151

151:                                              ; preds = %148
  %152 = getelementptr inbounds i8, ptr %0, i64 136
  %153 = load ptr, ptr %152, align 8, !tbaa !28
  %.not117 = icmp eq ptr %153, null
  br i1 %.not117, label %184, label %154

154:                                              ; preds = %151
  tail call void %153(ptr noundef nonnull %0) #2
  br label %184

155:                                              ; preds = %148, %146
  %156 = load volatile i32, ptr %3, align 4, !tbaa !14
  %157 = getelementptr inbounds i8, ptr %0, i64 84
  %158 = load i16, ptr %157, align 4, !tbaa !29
  %159 = zext i16 %158 to i32
  %160 = lshr i32 %159, 8
  %161 = and i32 %160, 31
  %162 = shl nuw i32 1, %161
  %163 = and i32 %162, %156
  %.not111 = icmp eq i32 %163, 0
  br i1 %.not111, label %177, label %164

164:                                              ; preds = %155
  %165 = lshr i32 %159, 5
  %166 = and i32 %165, 7
  switch i32 %166, label %169 [
    i32 1, label %170
    i32 2, label %167
  ]

167:                                              ; preds = %164
  %168 = getelementptr inbounds i8, ptr %2, i64 4
  br label %170

169:                                              ; preds = %164
  br label %170

170:                                              ; preds = %164, %167, %169
  %.in = phi ptr [ %168, %167 ], [ %6, %169 ], [ %2, %164 ]
  %171 = load volatile i32, ptr %.in, align 4, !tbaa !30
  %172 = and i16 %158, 31
  %173 = zext nneg i16 %172 to i32
  %174 = shl nuw i32 1, %173
  %175 = and i32 %171, %174
  %.not112 = icmp eq i32 %175, 0
  br i1 %.not112, label %177, label %176

176:                                              ; preds = %170
  tail call void @SMARTCARD_EndTransmit_IT(ptr noundef nonnull %0)
  br label %184

177:                                              ; preds = %170, %155
  %178 = and i64 %136, 8388608
  %.not113 = icmp eq i64 %178, 0
  %179 = and i32 %5, 1073741824
  %.not114 = icmp eq i32 %179, 0
  %or.cond158 = select i1 %.not113, i1 true, i1 %.not114
  br i1 %or.cond158, label %181, label %180

180:                                              ; preds = %177
  tail call void @HAL_SMARTCARDEx_TxFifoEmptyCallback(ptr noundef nonnull %0) #2
  br label %184

181:                                              ; preds = %177
  %182 = and i64 %136, 16777216
  %.not115 = icmp eq i64 %182, 0
  %.not116 = icmp sgt i32 %5, -1
  %or.cond159 = select i1 %.not115, i1 true, i1 %.not116
  br i1 %or.cond159, label %184, label %183

183:                                              ; preds = %181
  tail call void @HAL_SMARTCARDEx_RxFifoFullCallback(ptr noundef nonnull %0) #2
  br label %184

184:                                              ; preds = %181, %151, %154, %73, %135, %133, %129, %126, %134, %110, %102, %105, %109, %12, %15, %183, %180, %176, %139
  ret void
}

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

; Function Attrs: nounwind uwtable
declare hidden void @SMARTCARD_DMAAbortOnError(ptr noundef) #1

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

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

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

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

declare void @HAL_SMARTCARDEx_TxFifoEmptyCallback(ptr noundef) local_unnamed_addr #0

declare void @HAL_SMARTCARDEx_RxFifoFullCallback(ptr noundef) local_unnamed_addr #0

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"__SMARTCARD_HandleTypeDef", !7, i64 0, !10, i64 8, !13, i64 52, !7, i64 88, !12, i64 96, !12, i64 98, !7, i64 104, !12, i64 112, !12, i64 114, !12, i64 116, !12, i64 118, !11, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !11, i64 160, !11, i64 164, !11, i64 168, !11, i64 172}
!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, !12, i64 12, !12, i64 14, !12, i64 16, !12, i64 18, !12, i64 20, !12, i64 22, !8, i64 24, !8, i64 25, !12, i64 26, !11, i64 28, !11, i64 32, !8, i64 36, !8, i64 37, !11, i64 40}
!11 = !{!"int", !8, i64 0}
!12 = !{!"short", !8, i64 0}
!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, !12, i64 32}
!14 = !{!15, !11, i64 28}
!15 = !{!"", !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}
!16 = !{!15, !11, i64 0}
!17 = !{!15, !11, i64 8}
!18 = !{!6, !7, i64 128}
!19 = !{!15, !11, i64 32}
!20 = !{!6, !11, i64 172}
!21 = !{!6, !7, i64 152}
!22 = !{!23, !7, i64 112}
!23 = !{!"__DMA_HandleTypeDef", !7, i64 0, !15, i64 8, !11, i64 56, !11, i64 60, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !11, i64 120, !11, i64 124, !11, i64 128, !7, i64 136, !7, i64 144, !11, i64 152, !7, i64 160, !7, i64 168, !11, i64 176}
!24 = !{!6, !11, i64 164}
!25 = !{!6, !7, i64 144}
!26 = !{!6, !11, i64 168}
!27 = !{!6, !11, i64 160}
!28 = !{!6, !7, i64 136}
!29 = !{!6, !12, i64 84}
!30 = !{!11, !11, i64 0}


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