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

; 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.__SPI_HandleTypeDef = type { ptr, %struct.SPI_InitTypeDef, ptr, i16, i16, ptr, i16, i16, i32, ptr, ptr, ptr, ptr, i32, i32, i32 }
%struct.SPI_InitTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.SPI_TypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, [3 x i32], i32, [3 x 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

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

declare i32 @HAL_DMA_Abort_IT(ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local void @HAL_SPI_IRQHandler(ptr noundef %0) #1 {
  %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
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #3
  %11 = load ptr, ptr %2, align 8, !tbaa !5
  %12 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %11, i32 0, i32 0
  %13 = load ptr, ptr %12, align 8, !tbaa !9
  %14 = getelementptr inbounds %struct.SPI_TypeDef, ptr %13, i32 0, i32 4
  %15 = load volatile i32, ptr %14, align 4, !tbaa !14
  store i32 %15, ptr %3, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #3
  %16 = load ptr, ptr %2, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %16, i32 0, i32 0
  %18 = load ptr, ptr %17, align 8, !tbaa !9
  %19 = getelementptr inbounds %struct.SPI_TypeDef, ptr %18, i32 0, i32 5
  %20 = load volatile i32, ptr %19, align 4, !tbaa !17
  store i32 %20, ptr %4, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #3
  %21 = load i32, ptr %3, align 4, !tbaa !16
  %22 = load i32, ptr %4, align 4, !tbaa !16
  %23 = and i32 %21, %22
  store i32 %23, ptr %5, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  %24 = load ptr, ptr %2, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %24, i32 0, i32 0
  %26 = load ptr, ptr %25, align 8, !tbaa !9
  %27 = getelementptr inbounds %struct.SPI_TypeDef, ptr %26, i32 0, i32 2
  %28 = load volatile i32, ptr %27, align 4, !tbaa !18
  store i32 %28, ptr %6, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  store i32 0, ptr %7, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  %29 = load ptr, ptr %2, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %29, i32 0, i32 14
  %31 = load volatile i32, ptr %30, align 4, !tbaa !19
  store i32 %31, ptr %8, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #3
  %32 = load ptr, ptr %2, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %32, i32 0, i32 0
  %34 = load ptr, ptr %33, align 8, !tbaa !9
  %35 = getelementptr inbounds %struct.SPI_TypeDef, ptr %34, i32 0, i32 10
  store ptr %35, ptr %9, align 8, !tbaa !5
  %36 = load i32, ptr %4, align 4, !tbaa !16
  %37 = zext i32 %36 to i64
  %38 = and i64 %37, 2048
  %39 = icmp eq i64 %38, 2048
  br i1 %39, label %40, label %55

40:                                               ; preds = %1
  %41 = load i32, ptr %3, align 4, !tbaa !16
  %42 = zext i32 %41 to i64
  %43 = and i64 %42, 8
  %44 = icmp eq i64 %43, 8
  br i1 %44, label %45, label %55

45:                                               ; preds = %40
  %46 = load ptr, ptr %2, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %46, i32 0, i32 0
  %48 = load ptr, ptr %47, align 8, !tbaa !9
  %49 = getelementptr inbounds %struct.SPI_TypeDef, ptr %48, i32 0, i32 6
  %50 = load volatile i32, ptr %49, align 4, !tbaa !20
  %51 = zext i32 %50 to i64
  %52 = or i64 %51, 2048
  %53 = trunc i64 %52 to i32
  store volatile i32 %53, ptr %49, align 4, !tbaa !20
  %54 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SPI_SuspendCallback(ptr noundef %54)
  store i32 1, ptr %10, align 4
  br label %436

55:                                               ; preds = %40, %1
  %56 = load i32, ptr %5, align 4, !tbaa !16
  %57 = zext i32 %56 to i64
  %58 = and i64 %57, 64
  %59 = icmp eq i64 %58, 0
  br i1 %59, label %60, label %79

60:                                               ; preds = %55
  %61 = load i32, ptr %5, align 4, !tbaa !16
  %62 = zext i32 %61 to i64
  %63 = and i64 %62, 32
  %64 = icmp eq i64 %63, 0
  br i1 %64, label %65, label %79

65:                                               ; preds = %60
  %66 = load i32, ptr %5, align 4, !tbaa !16
  %67 = zext i32 %66 to i64
  %68 = and i64 %67, 4
  %69 = icmp eq i64 %68, 4
  br i1 %69, label %70, label %79

70:                                               ; preds = %65
  %71 = load ptr, ptr %2, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %71, i32 0, i32 10
  %73 = load ptr, ptr %72, align 8, !tbaa !21
  %74 = load ptr, ptr %2, align 8, !tbaa !5
  call void %73(ptr noundef %74)
  %75 = load ptr, ptr %2, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %75, i32 0, i32 9
  %77 = load ptr, ptr %76, align 8, !tbaa !22
  %78 = load ptr, ptr %2, align 8, !tbaa !5
  call void %77(ptr noundef %78)
  store i32 1, ptr %7, align 4, !tbaa !16
  br label %79

79:                                               ; preds = %70, %65, %60, %55
  %80 = load i32, ptr %5, align 4, !tbaa !16
  %81 = zext i32 %80 to i64
  %82 = and i64 %81, 64
  %83 = icmp eq i64 %82, 0
  br i1 %83, label %84, label %99

84:                                               ; preds = %79
  %85 = load i32, ptr %5, align 4, !tbaa !16
  %86 = zext i32 %85 to i64
  %87 = and i64 %86, 1
  %88 = icmp eq i64 %87, 1
  br i1 %88, label %89, label %99

89:                                               ; preds = %84
  %90 = load i32, ptr %5, align 4, !tbaa !16
  %91 = zext i32 %90 to i64
  %92 = and i64 %91, 4
  %93 = icmp eq i64 %92, 0
  br i1 %93, label %94, label %99

94:                                               ; preds = %89
  %95 = load ptr, ptr %2, align 8, !tbaa !5
  %96 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %95, i32 0, i32 9
  %97 = load ptr, ptr %96, align 8, !tbaa !22
  %98 = load ptr, ptr %2, align 8, !tbaa !5
  call void %97(ptr noundef %98)
  store i32 1, ptr %7, align 4, !tbaa !16
  br label %99

99:                                               ; preds = %94, %89, %84, %79
  %100 = load i32, ptr %5, align 4, !tbaa !16
  %101 = zext i32 %100 to i64
  %102 = and i64 %101, 32
  %103 = icmp eq i64 %102, 0
  br i1 %103, label %104, label %119

104:                                              ; preds = %99
  %105 = load i32, ptr %5, align 4, !tbaa !16
  %106 = zext i32 %105 to i64
  %107 = and i64 %106, 2
  %108 = icmp eq i64 %107, 2
  br i1 %108, label %109, label %119

109:                                              ; preds = %104
  %110 = load i32, ptr %5, align 4, !tbaa !16
  %111 = zext i32 %110 to i64
  %112 = and i64 %111, 4
  %113 = icmp eq i64 %112, 0
  br i1 %113, label %114, label %119

114:                                              ; preds = %109
  %115 = load ptr, ptr %2, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %115, i32 0, i32 10
  %117 = load ptr, ptr %116, align 8, !tbaa !21
  %118 = load ptr, ptr %2, align 8, !tbaa !5
  call void %117(ptr noundef %118)
  store i32 1, ptr %7, align 4, !tbaa !16
  br label %119

119:                                              ; preds = %114, %109, %104, %99
  %120 = load i32, ptr %7, align 4, !tbaa !16
  %121 = zext i32 %120 to i64
  %122 = icmp ne i64 %121, 0
  br i1 %122, label %123, label %124

123:                                              ; preds = %119
  store i32 1, ptr %10, align 4
  br label %436

124:                                              ; preds = %119
  %125 = load i32, ptr %5, align 4, !tbaa !16
  %126 = zext i32 %125 to i64
  %127 = and i64 %126, 8
  %128 = icmp eq i64 %127, 8
  br i1 %128, label %129, label %264

129:                                              ; preds = %124
  %130 = load ptr, ptr %2, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %130, i32 0, i32 0
  %132 = load ptr, ptr %131, align 8, !tbaa !9
  %133 = getelementptr inbounds %struct.SPI_TypeDef, ptr %132, i32 0, i32 6
  %134 = load volatile i32, ptr %133, align 4, !tbaa !20
  %135 = zext i32 %134 to i64
  %136 = or i64 %135, 8
  %137 = trunc i64 %136 to i32
  store volatile i32 %137, ptr %133, align 4, !tbaa !20
  %138 = load ptr, ptr %2, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %138, i32 0, i32 0
  %140 = load ptr, ptr %139, align 8, !tbaa !9
  %141 = getelementptr inbounds %struct.SPI_TypeDef, ptr %140, i32 0, i32 6
  %142 = load volatile i32, ptr %141, align 4, !tbaa !20
  %143 = zext i32 %142 to i64
  %144 = or i64 %143, 16
  %145 = trunc i64 %144 to i32
  store volatile i32 %145, ptr %141, align 4, !tbaa !20
  %146 = load ptr, ptr %2, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %146, i32 0, i32 0
  %148 = load ptr, ptr %147, align 8, !tbaa !9
  %149 = getelementptr inbounds %struct.SPI_TypeDef, ptr %148, i32 0, i32 6
  %150 = load volatile i32, ptr %149, align 4, !tbaa !20
  %151 = zext i32 %150 to i64
  %152 = or i64 %151, 2048
  %153 = trunc i64 %152 to i32
  store volatile i32 %153, ptr %149, align 4, !tbaa !20
  %154 = load ptr, ptr %2, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %154, i32 0, i32 0
  %156 = load ptr, ptr %155, align 8, !tbaa !9
  %157 = getelementptr inbounds %struct.SPI_TypeDef, ptr %156, i32 0, i32 4
  %158 = load volatile i32, ptr %157, align 4, !tbaa !14
  %159 = zext i32 %158 to i64
  %160 = and i64 %159, -9
  %161 = trunc i64 %160 to i32
  store volatile i32 %161, ptr %157, align 4, !tbaa !14
  %162 = load ptr, ptr %2, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %162, i32 0, i32 0
  %164 = load ptr, ptr %163, align 8, !tbaa !9
  %165 = getelementptr inbounds %struct.SPI_TypeDef, ptr %164, i32 0, i32 2
  %166 = load volatile i32, ptr %165, align 4, !tbaa !18
  %167 = zext i32 %166 to i64
  %168 = and i64 %167, 49152
  %169 = icmp eq i64 %168, 0
  br i1 %169, label %170, label %234

170:                                              ; preds = %129
  br label %171

171:                                              ; preds = %228, %170
  %172 = load ptr, ptr %2, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %172, i32 0, i32 7
  %174 = load volatile i16, ptr %173, align 2, !tbaa !23
  %175 = zext i16 %174 to i64
  %176 = icmp ne i64 %175, 0
  br i1 %176, label %177, label %233

177:                                              ; preds = %171
  %178 = load ptr, ptr %2, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %178, i32 0, i32 1
  %180 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %179, i32 0, i32 2
  %181 = load i32, ptr %180, align 8, !tbaa !24
  %182 = zext i32 %181 to i64
  %183 = icmp ugt i64 %182, 15
  br i1 %183, label %184, label %197

184:                                              ; preds = %177
  %185 = load ptr, ptr %2, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %185, i32 0, i32 0
  %187 = load ptr, ptr %186, align 8, !tbaa !9
  %188 = getelementptr inbounds %struct.SPI_TypeDef, ptr %187, i32 0, i32 10
  %189 = load volatile i32, ptr %188, align 4, !tbaa !16
  %190 = load ptr, ptr %2, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %190, i32 0, i32 5
  %192 = load ptr, ptr %191, align 8, !tbaa !25
  store i32 %189, ptr %192, align 4, !tbaa !16
  %193 = load ptr, ptr %2, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %193, i32 0, i32 5
  %195 = load ptr, ptr %194, align 8, !tbaa !25
  %196 = getelementptr inbounds i8, ptr %195, i64 4
  store ptr %196, ptr %194, align 8, !tbaa !25
  br label %228

197:                                              ; preds = %177
  %198 = load ptr, ptr %2, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %198, i32 0, i32 1
  %200 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %199, i32 0, i32 2
  %201 = load i32, ptr %200, align 8, !tbaa !24
  %202 = zext i32 %201 to i64
  %203 = icmp ugt i64 %202, 7
  br i1 %203, label %204, label %214

204:                                              ; preds = %197
  %205 = load ptr, ptr %9, align 8, !tbaa !5
  %206 = load volatile i16, ptr %205, align 2, !tbaa !26
  %207 = load ptr, ptr %2, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %207, i32 0, i32 5
  %209 = load ptr, ptr %208, align 8, !tbaa !25
  store i16 %206, ptr %209, align 2, !tbaa !26
  %210 = load ptr, ptr %2, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %210, i32 0, i32 5
  %212 = load ptr, ptr %211, align 8, !tbaa !25
  %213 = getelementptr inbounds i8, ptr %212, i64 2
  store ptr %213, ptr %211, align 8, !tbaa !25
  br label %227

214:                                              ; preds = %197
  %215 = load ptr, ptr %2, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %215, i32 0, i32 0
  %217 = load ptr, ptr %216, align 8, !tbaa !9
  %218 = getelementptr inbounds %struct.SPI_TypeDef, ptr %217, i32 0, i32 10
  %219 = load volatile i8, ptr %218, align 4, !tbaa !27
  %220 = load ptr, ptr %2, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %220, i32 0, i32 5
  %222 = load ptr, ptr %221, align 8, !tbaa !25
  store i8 %219, ptr %222, align 1, !tbaa !27
  %223 = load ptr, ptr %2, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %223, i32 0, i32 5
  %225 = load ptr, ptr %224, align 8, !tbaa !25
  %226 = getelementptr inbounds i8, ptr %225, i64 1
  store ptr %226, ptr %224, align 8, !tbaa !25
  br label %227

227:                                              ; preds = %214, %204
  br label %228

228:                                              ; preds = %227, %184
  %229 = load ptr, ptr %2, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %229, i32 0, i32 7
  %231 = load volatile i16, ptr %230, align 2, !tbaa !23
  %232 = add i16 %231, -1
  store volatile i16 %232, ptr %230, align 2, !tbaa !23
  br label %171, !llvm.loop !28

233:                                              ; preds = %171
  br label %234

234:                                              ; preds = %233, %129
  %235 = load ptr, ptr %2, align 8, !tbaa !5
  call void @SPI_CloseTransfer(ptr noundef %235)
  %236 = load ptr, ptr %2, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %236, i32 0, i32 14
  store volatile i32 1, ptr %237, align 4, !tbaa !19
  %238 = load ptr, ptr %2, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %238, i32 0, i32 15
  %240 = load volatile i32, ptr %239, align 8, !tbaa !30
  %241 = zext i32 %240 to i64
  %242 = icmp ne i64 %241, 0
  br i1 %242, label %243, label %245

243:                                              ; preds = %234
  %244 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SPI_ErrorCallback(ptr noundef %244)
  store i32 1, ptr %10, align 4
  br label %436

245:                                              ; preds = %234
  %246 = load i32, ptr %8, align 4, !tbaa !16
  %247 = icmp eq i32 %246, 5
  br i1 %247, label %248, label %250

248:                                              ; preds = %245
  %249 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SPI_TxRxCpltCallback(ptr noundef %249)
  br label %263

250:                                              ; preds = %245
  %251 = load i32, ptr %8, align 4, !tbaa !16
  %252 = icmp eq i32 %251, 4
  br i1 %252, label %253, label %255

253:                                              ; preds = %250
  %254 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SPI_RxCpltCallback(ptr noundef %254)
  br label %262

255:                                              ; preds = %250
  %256 = load i32, ptr %8, align 4, !tbaa !16
  %257 = icmp eq i32 %256, 3
  br i1 %257, label %258, label %260

258:                                              ; preds = %255
  %259 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SPI_TxCpltCallback(ptr noundef %259)
  br label %261

260:                                              ; preds = %255
  br label %261

261:                                              ; preds = %260, %258
  br label %262

262:                                              ; preds = %261, %253
  br label %263

263:                                              ; preds = %262, %248
  store i32 1, ptr %10, align 4
  br label %436

264:                                              ; preds = %124
  %265 = load i32, ptr %5, align 4, !tbaa !16
  %266 = zext i32 %265 to i64
  %267 = and i64 %266, 864
  %268 = icmp ne i64 %267, 0
  br i1 %268, label %269, label %435

269:                                              ; preds = %264
  %270 = load i32, ptr %5, align 4, !tbaa !16
  %271 = zext i32 %270 to i64
  %272 = and i64 %271, 64
  %273 = icmp ne i64 %272, 0
  br i1 %273, label %274, label %289

274:                                              ; preds = %269
  %275 = load ptr, ptr %2, align 8, !tbaa !5
  %276 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %275, i32 0, i32 15
  %277 = load volatile i32, ptr %276, align 8, !tbaa !30
  %278 = zext i32 %277 to i64
  %279 = or i64 %278, 4
  %280 = trunc i64 %279 to i32
  store volatile i32 %280, ptr %276, align 8, !tbaa !30
  %281 = load ptr, ptr %2, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %281, i32 0, i32 0
  %283 = load ptr, ptr %282, align 8, !tbaa !9
  %284 = getelementptr inbounds %struct.SPI_TypeDef, ptr %283, i32 0, i32 6
  %285 = load volatile i32, ptr %284, align 4, !tbaa !20
  %286 = zext i32 %285 to i64
  %287 = or i64 %286, 64
  %288 = trunc i64 %287 to i32
  store volatile i32 %288, ptr %284, align 4, !tbaa !20
  br label %289

289:                                              ; preds = %274, %269
  %290 = load i32, ptr %5, align 4, !tbaa !16
  %291 = zext i32 %290 to i64
  %292 = and i64 %291, 512
  %293 = icmp ne i64 %292, 0
  br i1 %293, label %294, label %307

294:                                              ; preds = %289
  %295 = load ptr, ptr %2, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %295, i32 0, i32 15
  %297 = load volatile i32, ptr %296, align 8, !tbaa !30
  %298 = zext i32 %297 to i64
  %299 = or i64 %298, 1
  %300 = trunc i64 %299 to i32
  store volatile i32 %300, ptr %296, align 8, !tbaa !30
  %301 = load ptr, ptr %2, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %301, i32 0, i32 0
  %303 = load ptr, ptr %302, align 8, !tbaa !9
  %304 = getelementptr inbounds %struct.SPI_TypeDef, ptr %303, i32 0, i32 6
  %305 = load volatile i32, ptr %304, align 4, !tbaa !20
  %306 = or i32 %305, 512
  store volatile i32 %306, ptr %304, align 4, !tbaa !20
  br label %307

307:                                              ; preds = %294, %289
  %308 = load i32, ptr %5, align 4, !tbaa !16
  %309 = zext i32 %308 to i64
  %310 = and i64 %309, 256
  %311 = icmp ne i64 %310, 0
  br i1 %311, label %312, label %327

312:                                              ; preds = %307
  %313 = load ptr, ptr %2, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %313, i32 0, i32 15
  %315 = load volatile i32, ptr %314, align 8, !tbaa !30
  %316 = zext i32 %315 to i64
  %317 = or i64 %316, 8
  %318 = trunc i64 %317 to i32
  store volatile i32 %318, ptr %314, align 8, !tbaa !30
  %319 = load ptr, ptr %2, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %319, i32 0, i32 0
  %321 = load ptr, ptr %320, align 8, !tbaa !9
  %322 = getelementptr inbounds %struct.SPI_TypeDef, ptr %321, i32 0, i32 6
  %323 = load volatile i32, ptr %322, align 4, !tbaa !20
  %324 = zext i32 %323 to i64
  %325 = or i64 %324, 256
  %326 = trunc i64 %325 to i32
  store volatile i32 %326, ptr %322, align 4, !tbaa !20
  br label %327

327:                                              ; preds = %312, %307
  %328 = load i32, ptr %5, align 4, !tbaa !16
  %329 = zext i32 %328 to i64
  %330 = and i64 %329, 32
  %331 = icmp ne i64 %330, 0
  br i1 %331, label %332, label %347

332:                                              ; preds = %327
  %333 = load ptr, ptr %2, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %333, i32 0, i32 15
  %335 = load volatile i32, ptr %334, align 8, !tbaa !30
  %336 = zext i32 %335 to i64
  %337 = or i64 %336, 128
  %338 = trunc i64 %337 to i32
  store volatile i32 %338, ptr %334, align 8, !tbaa !30
  %339 = load ptr, ptr %2, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %339, i32 0, i32 0
  %341 = load ptr, ptr %340, align 8, !tbaa !9
  %342 = getelementptr inbounds %struct.SPI_TypeDef, ptr %341, i32 0, i32 6
  %343 = load volatile i32, ptr %342, align 4, !tbaa !20
  %344 = zext i32 %343 to i64
  %345 = or i64 %344, 32
  %346 = trunc i64 %345 to i32
  store volatile i32 %346, ptr %342, align 4, !tbaa !20
  br label %347

347:                                              ; preds = %332, %327
  %348 = load ptr, ptr %2, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %348, i32 0, i32 15
  %350 = load volatile i32, ptr %349, align 8, !tbaa !30
  %351 = zext i32 %350 to i64
  %352 = icmp ne i64 %351, 0
  br i1 %352, label %353, label %434

353:                                              ; preds = %347
  %354 = load ptr, ptr %2, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %354, i32 0, i32 0
  %356 = load ptr, ptr %355, align 8, !tbaa !9
  %357 = getelementptr inbounds %struct.SPI_TypeDef, ptr %356, i32 0, i32 0
  %358 = load volatile i32, ptr %357, align 4, !tbaa !31
  %359 = zext i32 %358 to i64
  %360 = and i64 %359, -2
  %361 = trunc i64 %360 to i32
  store volatile i32 %361, ptr %357, align 4, !tbaa !31
  %362 = load ptr, ptr %2, align 8, !tbaa !5
  %363 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %362, i32 0, i32 0
  %364 = load ptr, ptr %363, align 8, !tbaa !9
  %365 = getelementptr inbounds %struct.SPI_TypeDef, ptr %364, i32 0, i32 4
  %366 = load volatile i32, ptr %365, align 4, !tbaa !14
  %367 = zext i32 %366 to i64
  %368 = and i64 %367, -876
  %369 = trunc i64 %368 to i32
  store volatile i32 %369, ptr %365, align 4, !tbaa !14
  %370 = load i32, ptr %6, align 4, !tbaa !16
  %371 = zext i32 %370 to i64
  %372 = and i64 %371, 49152
  %373 = icmp eq i64 %372, 49152
  br i1 %373, label %374, label %429

374:                                              ; preds = %353
  %375 = load ptr, ptr %2, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %375, i32 0, i32 0
  %377 = load ptr, ptr %376, align 8, !tbaa !9
  %378 = getelementptr inbounds %struct.SPI_TypeDef, ptr %377, i32 0, i32 2
  %379 = load volatile i32, ptr %378, align 4, !tbaa !18
  %380 = zext i32 %379 to i64
  %381 = and i64 %380, -49153
  %382 = trunc i64 %381 to i32
  store volatile i32 %382, ptr %378, align 4, !tbaa !18
  %383 = load ptr, ptr %2, align 8, !tbaa !5
  %384 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %383, i32 0, i32 12
  %385 = load ptr, ptr %384, align 8, !tbaa !32
  %386 = icmp ne ptr %385, null
  br i1 %386, label %387, label %405

387:                                              ; preds = %374
  %388 = load ptr, ptr %2, align 8, !tbaa !5
  %389 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %388, i32 0, i32 12
  %390 = load ptr, ptr %389, align 8, !tbaa !32
  %391 = getelementptr inbounds %struct.__DMA_HandleTypeDef, ptr %390, i32 0, i32 10
  store ptr @SPI_DMAAbortOnError, ptr %391, align 8, !tbaa !33
  %392 = load ptr, ptr %2, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %392, i32 0, i32 12
  %394 = load ptr, ptr %393, align 8, !tbaa !32
  %395 = call i32 @HAL_DMA_Abort_IT(ptr noundef %394)
  %396 = icmp ne i32 0, %395
  br i1 %396, label %397, label %404

397:                                              ; preds = %387
  %398 = load ptr, ptr %2, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %398, i32 0, i32 15
  %400 = load volatile i32, ptr %399, align 8, !tbaa !30
  %401 = zext i32 %400 to i64
  %402 = or i64 %401, 64
  %403 = trunc i64 %402 to i32
  store volatile i32 %403, ptr %399, align 8, !tbaa !30
  br label %404

404:                                              ; preds = %397, %387
  br label %405

405:                                              ; preds = %404, %374
  %406 = load ptr, ptr %2, align 8, !tbaa !5
  %407 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %406, i32 0, i32 11
  %408 = load ptr, ptr %407, align 8, !tbaa !36
  %409 = icmp ne ptr %408, null
  br i1 %409, label %410, label %428

410:                                              ; preds = %405
  %411 = load ptr, ptr %2, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %411, i32 0, i32 11
  %413 = load ptr, ptr %412, align 8, !tbaa !36
  %414 = getelementptr inbounds %struct.__DMA_HandleTypeDef, ptr %413, i32 0, i32 10
  store ptr @SPI_DMAAbortOnError, ptr %414, align 8, !tbaa !33
  %415 = load ptr, ptr %2, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %415, i32 0, i32 11
  %417 = load ptr, ptr %416, align 8, !tbaa !36
  %418 = call i32 @HAL_DMA_Abort_IT(ptr noundef %417)
  %419 = icmp ne i32 0, %418
  br i1 %419, label %420, label %427

420:                                              ; preds = %410
  %421 = load ptr, ptr %2, align 8, !tbaa !5
  %422 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %421, i32 0, i32 15
  %423 = load volatile i32, ptr %422, align 8, !tbaa !30
  %424 = zext i32 %423 to i64
  %425 = or i64 %424, 64
  %426 = trunc i64 %425 to i32
  store volatile i32 %426, ptr %422, align 8, !tbaa !30
  br label %427

427:                                              ; preds = %420, %410
  br label %428

428:                                              ; preds = %427, %405
  br label %433

429:                                              ; preds = %353
  %430 = load ptr, ptr %2, align 8, !tbaa !5
  %431 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %430, i32 0, i32 14
  store volatile i32 1, ptr %431, align 4, !tbaa !19
  %432 = load ptr, ptr %2, align 8, !tbaa !5
  call void @HAL_SPI_ErrorCallback(ptr noundef %432)
  br label %433

433:                                              ; preds = %429, %428
  br label %434

434:                                              ; preds = %433, %347
  store i32 1, ptr %10, align 4
  br label %436

435:                                              ; preds = %264
  store i32 0, ptr %10, align 4
  br label %436

436:                                              ; preds = %435, %434, %263, %243, %123, %45
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #3
  %437 = load i32, ptr %10, align 4
  switch i32 %437, label %439 [
    i32 0, label %438
    i32 1, label %438
  ]

438:                                              ; preds = %436, %436
  ret void

439:                                              ; preds = %436
  unreachable
}

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

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

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

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

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

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

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

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

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


; 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
declare hidden void @SPI_CloseTransfer(ptr noundef) local_unnamed_addr #0

declare i32 @HAL_DMA_Abort_IT(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local void @HAL_SPI_IRQHandler(ptr noundef %0) local_unnamed_addr #0 {
  %2 = load ptr, ptr %0, align 8, !tbaa !5
  %3 = getelementptr inbounds i8, ptr %2, i64 16
  %4 = load volatile i32, ptr %3, align 4, !tbaa !13
  %5 = getelementptr inbounds i8, ptr %2, i64 20
  %6 = load volatile i32, ptr %5, align 4, !tbaa !15
  %7 = getelementptr inbounds i8, ptr %2, i64 8
  %8 = load volatile i32, ptr %7, align 4, !tbaa !16
  %9 = getelementptr inbounds i8, ptr %0, i64 164
  %10 = load volatile i32, ptr %9, align 4, !tbaa !17
  %11 = getelementptr inbounds i8, ptr %2, i64 48
  %12 = and i32 %6, 2048
  %.not = icmp eq i32 %12, 0
  %13 = and i32 %4, 8
  %.not89 = icmp eq i32 %13, 0
  %or.cond = select i1 %.not, i1 true, i1 %.not89
  br i1 %or.cond, label %18, label %14

14:                                               ; preds = %1
  %15 = getelementptr inbounds i8, ptr %2, i64 24
  %16 = load volatile i32, ptr %15, align 4, !tbaa !18
  %17 = or i32 %16, 2048
  store volatile i32 %17, ptr %15, align 4, !tbaa !18
  tail call void @HAL_SPI_SuspendCallback(ptr noundef nonnull %0)
  br label %.thread129

18:                                               ; preds = %1
  %19 = and i32 %6, %4
  %20 = zext i32 %19 to i64
  %21 = and i64 %20, 64
  %.not133 = icmp eq i64 %21, 0
  %22 = and i64 %20, 32
  %23 = icmp eq i64 %22, 0
  %24 = and i64 %20, 100
  %or.cond109.not = icmp eq i64 %24, 4
  br i1 %or.cond109.not, label %.thread123, label %29

.thread123:                                       ; preds = %18
  %25 = getelementptr inbounds i8, ptr %0, i64 136
  %26 = load ptr, ptr %25, align 8, !tbaa !19
  tail call void %26(ptr noundef nonnull %0) #2
  %27 = getelementptr inbounds i8, ptr %0, i64 128
  %28 = load ptr, ptr %27, align 8, !tbaa !20
  tail call void %28(ptr noundef nonnull %0) #2
  br label %.thread129

29:                                               ; preds = %18
  %30 = and i64 %20, 69
  %or.cond113.not = icmp eq i64 %30, 1
  br i1 %or.cond113.not, label %31, label %.thread

31:                                               ; preds = %29
  %32 = getelementptr inbounds i8, ptr %0, i64 128
  %33 = load ptr, ptr %32, align 8, !tbaa !20
  tail call void %33(ptr noundef nonnull %0) #2
  %34 = and i64 %20, 34
  %or.cond116 = icmp eq i64 %34, 2
  br i1 %or.cond116, label %36, label %.thread129

.thread:                                          ; preds = %29
  %35 = and i64 %20, 38
  %or.cond116136 = icmp eq i64 %35, 2
  br i1 %or.cond116136, label %36, label %.thread137

36:                                               ; preds = %.thread, %31
  %37 = getelementptr inbounds i8, ptr %0, i64 136
  %38 = load ptr, ptr %37, align 8, !tbaa !19
  tail call void %38(ptr noundef nonnull %0) #2
  br label %.thread129

.thread137:                                       ; preds = %.thread
  %39 = and i64 %20, 8
  %.not94 = icmp eq i64 %39, 0
  br i1 %.not94, label %93, label %40

40:                                               ; preds = %.thread137
  %41 = load ptr, ptr %0, align 8, !tbaa !5
  %42 = getelementptr inbounds i8, ptr %41, i64 24
  %43 = load volatile i32, ptr %42, align 4, !tbaa !18
  %44 = or i32 %43, 8
  store volatile i32 %44, ptr %42, align 4, !tbaa !18
  %45 = load volatile i32, ptr %42, align 4, !tbaa !18
  %46 = or i32 %45, 16
  store volatile i32 %46, ptr %42, align 4, !tbaa !18
  %47 = load volatile i32, ptr %42, align 4, !tbaa !18
  %48 = or i32 %47, 2048
  store volatile i32 %48, ptr %42, align 4, !tbaa !18
  %49 = getelementptr inbounds i8, ptr %41, i64 16
  %50 = load volatile i32, ptr %49, align 4, !tbaa !13
  %51 = and i32 %50, -9
  store volatile i32 %51, ptr %49, align 4, !tbaa !13
  %52 = getelementptr inbounds i8, ptr %41, i64 8
  %53 = load volatile i32, ptr %52, align 4, !tbaa !16
  %54 = and i32 %53, 49152
  %55 = icmp eq i32 %54, 0
  br i1 %55, label %.preheader, label %.loopexit

.preheader:                                       ; preds = %40
  %56 = getelementptr inbounds i8, ptr %0, i64 122
  %57 = load volatile i16, ptr %56, align 2, !tbaa !21
  %.not105135 = icmp eq i16 %57, 0
  br i1 %.not105135, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader
  %58 = getelementptr inbounds i8, ptr %0, i64 16
  %59 = getelementptr inbounds i8, ptr %0, i64 112
  br label %60

60:                                               ; preds = %.lr.ph, %82
  %61 = load i32, ptr %58, align 8, !tbaa !22
  %62 = icmp ugt i32 %61, 15
  br i1 %62, label %63, label %69

63:                                               ; preds = %60
  %64 = load ptr, ptr %0, align 8, !tbaa !5
  %65 = getelementptr inbounds i8, ptr %64, i64 48
  %66 = load volatile i32, ptr %65, align 4, !tbaa !23
  %67 = load ptr, ptr %59, align 8, !tbaa !24
  store i32 %66, ptr %67, align 4, !tbaa !23
  %68 = getelementptr inbounds i8, ptr %67, i64 4
  br label %82

69:                                               ; preds = %60
  %70 = icmp ugt i32 %61, 7
  br i1 %70, label %71, label %75

71:                                               ; preds = %69
  %72 = load volatile i16, ptr %11, align 2, !tbaa !25
  %73 = load ptr, ptr %59, align 8, !tbaa !24
  store i16 %72, ptr %73, align 2, !tbaa !25
  %74 = getelementptr inbounds i8, ptr %73, i64 2
  br label %82

75:                                               ; preds = %69
  %76 = load ptr, ptr %0, align 8, !tbaa !5
  %77 = getelementptr inbounds i8, ptr %76, i64 48
  %78 = load volatile i8, ptr %77, align 4, !tbaa !26
  %79 = load ptr, ptr %59, align 8, !tbaa !24
  store i8 %78, ptr %79, align 1, !tbaa !26
  %80 = load ptr, ptr %59, align 8, !tbaa !24
  %81 = getelementptr inbounds i8, ptr %80, i64 1
  br label %82

82:                                               ; preds = %71, %75, %63
  %.sink = phi ptr [ %74, %71 ], [ %81, %75 ], [ %68, %63 ]
  store ptr %.sink, ptr %59, align 8, !tbaa !24
  %83 = load volatile i16, ptr %56, align 2, !tbaa !21
  %84 = add i16 %83, -1
  store volatile i16 %84, ptr %56, align 2, !tbaa !21
  %85 = load volatile i16, ptr %56, align 2, !tbaa !21
  %.not105 = icmp eq i16 %85, 0
  br i1 %.not105, label %.loopexit, label %60, !llvm.loop !27

.loopexit:                                        ; preds = %82, %.preheader, %40
  tail call void @SPI_CloseTransfer(ptr noundef nonnull %0)
  store volatile i32 1, ptr %9, align 4, !tbaa !17
  %86 = getelementptr inbounds i8, ptr %0, i64 168
  %87 = load volatile i32, ptr %86, align 8, !tbaa !29
  %.not106 = icmp eq i32 %87, 0
  br i1 %.not106, label %89, label %88

88:                                               ; preds = %.loopexit
  tail call void @HAL_SPI_ErrorCallback(ptr noundef nonnull %0)
  br label %.thread129

89:                                               ; preds = %.loopexit
  switch i32 %10, label %.thread129 [
    i32 5, label %90
    i32 4, label %91
    i32 3, label %92
  ]

90:                                               ; preds = %89
  tail call void @HAL_SPI_TxRxCpltCallback(ptr noundef nonnull %0)
  br label %.thread129

91:                                               ; preds = %89
  tail call void @HAL_SPI_RxCpltCallback(ptr noundef nonnull %0)
  br label %.thread129

92:                                               ; preds = %89
  tail call void @HAL_SPI_TxCpltCallback(ptr noundef nonnull %0)
  br label %.thread129

93:                                               ; preds = %.thread137
  %94 = and i64 %20, 864
  %.not95 = icmp eq i64 %94, 0
  br i1 %.not95, label %.thread129, label %95

95:                                               ; preds = %93
  br i1 %.not133, label %104, label %96

96:                                               ; preds = %95
  %97 = getelementptr inbounds i8, ptr %0, i64 168
  %98 = load volatile i32, ptr %97, align 8, !tbaa !29
  %99 = or i32 %98, 4
  store volatile i32 %99, ptr %97, align 8, !tbaa !29
  %100 = load ptr, ptr %0, align 8, !tbaa !5
  %101 = getelementptr inbounds i8, ptr %100, i64 24
  %102 = load volatile i32, ptr %101, align 4, !tbaa !18
  %103 = or i32 %102, 64
  store volatile i32 %103, ptr %101, align 4, !tbaa !18
  br label %104

104:                                              ; preds = %96, %95
  %105 = and i64 %20, 512
  %.not97 = icmp eq i64 %105, 0
  br i1 %.not97, label %114, label %106

106:                                              ; preds = %104
  %107 = getelementptr inbounds i8, ptr %0, i64 168
  %108 = load volatile i32, ptr %107, align 8, !tbaa !29
  %109 = or i32 %108, 1
  store volatile i32 %109, ptr %107, align 8, !tbaa !29
  %110 = load ptr, ptr %0, align 8, !tbaa !5
  %111 = getelementptr inbounds i8, ptr %110, i64 24
  %112 = load volatile i32, ptr %111, align 4, !tbaa !18
  %113 = or i32 %112, 512
  store volatile i32 %113, ptr %111, align 4, !tbaa !18
  br label %114

114:                                              ; preds = %106, %104
  %115 = and i64 %20, 256
  %.not98 = icmp eq i64 %115, 0
  br i1 %.not98, label %124, label %116

116:                                              ; preds = %114
  %117 = getelementptr inbounds i8, ptr %0, i64 168
  %118 = load volatile i32, ptr %117, align 8, !tbaa !29
  %119 = or i32 %118, 8
  store volatile i32 %119, ptr %117, align 8, !tbaa !29
  %120 = load ptr, ptr %0, align 8, !tbaa !5
  %121 = getelementptr inbounds i8, ptr %120, i64 24
  %122 = load volatile i32, ptr %121, align 4, !tbaa !18
  %123 = or i32 %122, 256
  store volatile i32 %123, ptr %121, align 4, !tbaa !18
  br label %124

124:                                              ; preds = %116, %114
  br i1 %23, label %133, label %125

125:                                              ; preds = %124
  %126 = getelementptr inbounds i8, ptr %0, i64 168
  %127 = load volatile i32, ptr %126, align 8, !tbaa !29
  %128 = or i32 %127, 128
  store volatile i32 %128, ptr %126, align 8, !tbaa !29
  %129 = load ptr, ptr %0, align 8, !tbaa !5
  %130 = getelementptr inbounds i8, ptr %129, i64 24
  %131 = load volatile i32, ptr %130, align 4, !tbaa !18
  %132 = or i32 %131, 32
  store volatile i32 %132, ptr %130, align 4, !tbaa !18
  br label %133

133:                                              ; preds = %125, %124
  %134 = getelementptr inbounds i8, ptr %0, i64 168
  %135 = load volatile i32, ptr %134, align 8, !tbaa !29
  %.not100 = icmp eq i32 %135, 0
  br i1 %.not100, label %.thread129, label %136

136:                                              ; preds = %133
  %137 = load ptr, ptr %0, align 8, !tbaa !5
  %138 = load volatile i32, ptr %137, align 4, !tbaa !30
  %139 = and i32 %138, -2
  store volatile i32 %139, ptr %137, align 4, !tbaa !30
  %140 = getelementptr inbounds i8, ptr %137, i64 16
  %141 = load volatile i32, ptr %140, align 4, !tbaa !13
  %142 = and i32 %141, -876
  store volatile i32 %142, ptr %140, align 4, !tbaa !13
  %143 = and i32 %8, 49152
  %144 = icmp eq i32 %143, 49152
  br i1 %144, label %145, label %166

145:                                              ; preds = %136
  %146 = getelementptr inbounds i8, ptr %137, i64 8
  %147 = load volatile i32, ptr %146, align 4, !tbaa !16
  %148 = and i32 %147, -49153
  store volatile i32 %148, ptr %146, align 4, !tbaa !16
  %149 = getelementptr inbounds i8, ptr %0, i64 152
  %150 = load ptr, ptr %149, align 8, !tbaa !31
  %.not101 = icmp eq ptr %150, null
  br i1 %.not101, label %157, label %151

151:                                              ; preds = %145
  %152 = getelementptr inbounds i8, ptr %150, i64 112
  store ptr @SPI_DMAAbortOnError, ptr %152, align 8, !tbaa !32
  %153 = tail call i32 @HAL_DMA_Abort_IT(ptr noundef nonnull %150) #2
  %.not102 = icmp eq i32 %153, 0
  br i1 %.not102, label %157, label %154

154:                                              ; preds = %151
  %155 = load volatile i32, ptr %134, align 8, !tbaa !29
  %156 = or i32 %155, 64
  store volatile i32 %156, ptr %134, align 8, !tbaa !29
  br label %157

157:                                              ; preds = %151, %154, %145
  %158 = getelementptr inbounds i8, ptr %0, i64 144
  %159 = load ptr, ptr %158, align 8, !tbaa !35
  %.not103 = icmp eq ptr %159, null
  br i1 %.not103, label %.thread129, label %160

160:                                              ; preds = %157
  %161 = getelementptr inbounds i8, ptr %159, i64 112
  store ptr @SPI_DMAAbortOnError, ptr %161, align 8, !tbaa !32
  %162 = tail call i32 @HAL_DMA_Abort_IT(ptr noundef nonnull %159) #2
  %.not104 = icmp eq i32 %162, 0
  br i1 %.not104, label %.thread129, label %163

163:                                              ; preds = %160
  %164 = load volatile i32, ptr %134, align 8, !tbaa !29
  %165 = or i32 %164, 64
  store volatile i32 %165, ptr %134, align 8, !tbaa !29
  br label %.thread129

166:                                              ; preds = %136
  store volatile i32 1, ptr %9, align 4, !tbaa !17
  tail call void @HAL_SPI_ErrorCallback(ptr noundef nonnull %0)
  br label %.thread129

.thread129:                                       ; preds = %31, %.thread123, %36, %93, %133, %157, %163, %160, %166, %90, %92, %91, %89, %88, %14
  ret void
}

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

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

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

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

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

; Function Attrs: nounwind uwtable
declare hidden void @SPI_DMAAbortOnError(ptr noundef) #0

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

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

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


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