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

; 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 }

; 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_GetTick() #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @HAL_SPI_Receive(ptr noundef %0, ptr noundef %1, i16 noundef zeroext %2, i32 noundef %3) #2 {
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i16, align 2
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store i16 %2, ptr %8, align 2, !tbaa !9
  store i32 %3, ptr %9, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  store i32 0, ptr %11, align 4, !tbaa !11
  %13 = load ptr, ptr %6, align 8, !tbaa !5
  %14 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %13, i32 0, i32 1
  %15 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %14, i32 0, i32 0
  %16 = load i32, ptr %15, align 8, !tbaa !13
  %17 = zext i32 %16 to i64
  %18 = icmp eq i64 %17, 4194304
  br i1 %18, label %19, label %35

19:                                               ; preds = %4
  %20 = load ptr, ptr %6, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %20, i32 0, i32 1
  %22 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %21, i32 0, i32 1
  %23 = load i32, ptr %22, align 4, !tbaa !16
  %24 = zext i32 %23 to i64
  %25 = icmp eq i64 %24, 0
  br i1 %25, label %26, label %35

26:                                               ; preds = %19
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %27, i32 0, i32 14
  store volatile i32 4, ptr %28, align 4, !tbaa !17
  %29 = load ptr, ptr %6, align 8, !tbaa !5
  %30 = load ptr, ptr %7, align 8, !tbaa !5
  %31 = load ptr, ptr %7, align 8, !tbaa !5
  %32 = load i16, ptr %8, align 2, !tbaa !9
  %33 = load i32, ptr %9, align 4, !tbaa !11
  %34 = call i32 @HAL_SPI_TransmitReceive(ptr noundef %29, ptr noundef %30, ptr noundef %31, i16 noundef zeroext %32, i32 noundef %33)
  store i32 %34, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

35:                                               ; preds = %19, %4
  br label %36

36:                                               ; preds = %35
  %37 = load ptr, ptr %6, align 8, !tbaa !5
  %38 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %37, i32 0, i32 13
  %39 = load i32, ptr %38, align 8, !tbaa !18
  %40 = icmp eq i32 %39, 1
  br i1 %40, label %41, label %42

41:                                               ; preds = %36
  store i32 2, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

42:                                               ; preds = %36
  %43 = load ptr, ptr %6, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %43, i32 0, i32 13
  store i32 1, ptr %44, align 8, !tbaa !18
  br label %45

45:                                               ; preds = %42
  br label %46

46:                                               ; preds = %45
  br label %47

47:                                               ; preds = %46
  %48 = call i32 @HAL_GetTick()
  store i32 %48, ptr %10, align 4, !tbaa !11
  %49 = load ptr, ptr %6, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %49, i32 0, i32 14
  %51 = load volatile i32, ptr %50, align 4, !tbaa !17
  %52 = icmp ne i32 %51, 1
  br i1 %52, label %53, label %60

53:                                               ; preds = %47
  store i32 2, ptr %11, align 4, !tbaa !11
  br label %54

54:                                               ; preds = %53
  %55 = load ptr, ptr %6, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %55, i32 0, i32 13
  store i32 0, ptr %56, align 8, !tbaa !18
  br label %57

57:                                               ; preds = %54
  br label %58

58:                                               ; preds = %57
  %59 = load i32, ptr %11, align 4, !tbaa !11
  store i32 %59, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

60:                                               ; preds = %47
  %61 = load ptr, ptr %7, align 8, !tbaa !5
  %62 = icmp eq ptr %61, null
  br i1 %62, label %67, label %63

63:                                               ; preds = %60
  %64 = load i16, ptr %8, align 2, !tbaa !9
  %65 = zext i16 %64 to i64
  %66 = icmp eq i64 %65, 0
  br i1 %66, label %67, label %74

67:                                               ; preds = %63, %60
  store i32 1, ptr %11, align 4, !tbaa !11
  br label %68

68:                                               ; preds = %67
  %69 = load ptr, ptr %6, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %69, i32 0, i32 13
  store i32 0, ptr %70, align 8, !tbaa !18
  br label %71

71:                                               ; preds = %68
  br label %72

72:                                               ; preds = %71
  %73 = load i32, ptr %11, align 4, !tbaa !11
  store i32 %73, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

74:                                               ; preds = %63
  %75 = load ptr, ptr %6, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %75, i32 0, i32 14
  store volatile i32 4, ptr %76, align 4, !tbaa !17
  %77 = load ptr, ptr %6, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %77, i32 0, i32 15
  store volatile i32 0, ptr %78, align 8, !tbaa !19
  %79 = load ptr, ptr %7, align 8, !tbaa !5
  %80 = load ptr, ptr %6, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %80, i32 0, i32 5
  store ptr %79, ptr %81, align 8, !tbaa !20
  %82 = load i16, ptr %8, align 2, !tbaa !9
  %83 = load ptr, ptr %6, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %83, i32 0, i32 6
  store i16 %82, ptr %84, align 8, !tbaa !21
  %85 = load i16, ptr %8, align 2, !tbaa !9
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %86, i32 0, i32 7
  store volatile i16 %85, ptr %87, align 2, !tbaa !22
  %88 = load ptr, ptr %6, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %88, i32 0, i32 2
  store ptr null, ptr %89, align 8, !tbaa !23
  %90 = load ptr, ptr %6, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %90, i32 0, i32 3
  store i16 0, ptr %91, align 8, !tbaa !24
  %92 = load ptr, ptr %6, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %92, i32 0, i32 4
  store volatile i16 0, ptr %93, align 2, !tbaa !25
  %94 = load ptr, ptr %6, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %94, i32 0, i32 9
  store ptr null, ptr %95, align 8, !tbaa !26
  %96 = load ptr, ptr %6, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %96, i32 0, i32 10
  store ptr null, ptr %97, align 8, !tbaa !27
  %98 = load ptr, ptr %6, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %98, i32 0, i32 1
  %100 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %99, i32 0, i32 1
  %101 = load i32, ptr %100, align 4, !tbaa !16
  %102 = zext i32 %101 to i64
  %103 = icmp eq i64 %102, 393216
  br i1 %103, label %104, label %113

104:                                              ; preds = %74
  %105 = load ptr, ptr %6, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %105, i32 0, i32 0
  %107 = load ptr, ptr %106, align 8, !tbaa !28
  %108 = getelementptr inbounds %struct.SPI_TypeDef, ptr %107, i32 0, i32 0
  %109 = load volatile i32, ptr %108, align 4, !tbaa !29
  %110 = zext i32 %109 to i64
  %111 = and i64 %110, -2049
  %112 = trunc i64 %111 to i32
  store volatile i32 %112, ptr %108, align 4, !tbaa !29
  br label %113

113:                                              ; preds = %104, %74
  %114 = load ptr, ptr %6, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %114, i32 0, i32 0
  %116 = load ptr, ptr %115, align 8, !tbaa !28
  %117 = getelementptr inbounds %struct.SPI_TypeDef, ptr %116, i32 0, i32 1
  %118 = load volatile i32, ptr %117, align 4, !tbaa !31
  %119 = zext i32 %118 to i64
  %120 = and i64 %119, -65536
  %121 = load i16, ptr %8, align 2, !tbaa !9
  %122 = zext i16 %121 to i64
  %123 = or i64 %120, %122
  %124 = trunc i64 %123 to i32
  %125 = load ptr, ptr %6, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %125, i32 0, i32 0
  %127 = load ptr, ptr %126, align 8, !tbaa !28
  %128 = getelementptr inbounds %struct.SPI_TypeDef, ptr %127, i32 0, i32 1
  store volatile i32 %124, ptr %128, align 4, !tbaa !31
  %129 = load ptr, ptr %6, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %129, i32 0, i32 0
  %131 = load ptr, ptr %130, align 8, !tbaa !28
  %132 = getelementptr inbounds %struct.SPI_TypeDef, ptr %131, i32 0, i32 0
  %133 = load volatile i32, ptr %132, align 4, !tbaa !29
  %134 = zext i32 %133 to i64
  %135 = or i64 %134, 1
  %136 = trunc i64 %135 to i32
  store volatile i32 %136, ptr %132, align 4, !tbaa !29
  %137 = load ptr, ptr %6, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %137, i32 0, i32 1
  %139 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %138, i32 0, i32 0
  %140 = load i32, ptr %139, align 8, !tbaa !13
  %141 = zext i32 %140 to i64
  %142 = icmp eq i64 %141, 4194304
  br i1 %142, label %143, label %152

143:                                              ; preds = %113
  %144 = load ptr, ptr %6, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %144, i32 0, i32 0
  %146 = load ptr, ptr %145, align 8, !tbaa !28
  %147 = getelementptr inbounds %struct.SPI_TypeDef, ptr %146, i32 0, i32 0
  %148 = load volatile i32, ptr %147, align 4, !tbaa !29
  %149 = zext i32 %148 to i64
  %150 = or i64 %149, 512
  %151 = trunc i64 %150 to i32
  store volatile i32 %151, ptr %147, align 4, !tbaa !29
  br label %152

152:                                              ; preds = %143, %113
  %153 = load ptr, ptr %6, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %153, i32 0, i32 1
  %155 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %154, i32 0, i32 2
  %156 = load i32, ptr %155, align 8, !tbaa !32
  %157 = zext i32 %156 to i64
  %158 = icmp ugt i64 %157, 15
  br i1 %158, label %159, label %222

159:                                              ; preds = %152
  br label %160

160:                                              ; preds = %220, %159
  %161 = load ptr, ptr %6, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %161, i32 0, i32 7
  %163 = load volatile i16, ptr %162, align 2, !tbaa !22
  %164 = zext i16 %163 to i64
  %165 = icmp ugt i64 %164, 0
  br i1 %165, label %166, label %221

166:                                              ; preds = %160
  %167 = load ptr, ptr %6, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %167, i32 0, i32 0
  %169 = load ptr, ptr %168, align 8, !tbaa !28
  %170 = getelementptr inbounds %struct.SPI_TypeDef, ptr %169, i32 0, i32 5
  %171 = load volatile i32, ptr %170, align 4, !tbaa !33
  %172 = zext i32 %171 to i64
  %173 = and i64 %172, 32776
  %174 = icmp ne i64 %173, 0
  br i1 %174, label %175, label %192

175:                                              ; preds = %166
  %176 = load ptr, ptr %6, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %176, i32 0, i32 0
  %178 = load ptr, ptr %177, align 8, !tbaa !28
  %179 = getelementptr inbounds %struct.SPI_TypeDef, ptr %178, i32 0, i32 10
  %180 = load volatile i32, ptr %179, align 4, !tbaa !11
  %181 = load ptr, ptr %6, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %181, i32 0, i32 5
  %183 = load ptr, ptr %182, align 8, !tbaa !20
  store i32 %180, ptr %183, align 4, !tbaa !11
  %184 = load ptr, ptr %6, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %184, i32 0, i32 5
  %186 = load ptr, ptr %185, align 8, !tbaa !20
  %187 = getelementptr inbounds i8, ptr %186, i64 4
  store ptr %187, ptr %185, align 8, !tbaa !20
  %188 = load ptr, ptr %6, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %188, i32 0, i32 7
  %190 = load volatile i16, ptr %189, align 2, !tbaa !22
  %191 = add i16 %190, -1
  store volatile i16 %191, ptr %189, align 2, !tbaa !22
  br label %220

192:                                              ; preds = %166
  %193 = call i32 @HAL_GetTick()
  %194 = load i32, ptr %10, align 4, !tbaa !11
  %195 = sub i32 %193, %194
  %196 = load i32, ptr %9, align 4, !tbaa !11
  %197 = icmp uge i32 %195, %196
  br i1 %197, label %198, label %201

198:                                              ; preds = %192
  %199 = load i32, ptr %9, align 4, !tbaa !11
  %200 = icmp ne i32 %199, -1
  br i1 %200, label %204, label %201

201:                                              ; preds = %198, %192
  %202 = load i32, ptr %9, align 4, !tbaa !11
  %203 = icmp eq i32 %202, 0
  br i1 %203, label %204, label %219

204:                                              ; preds = %201, %198
  %205 = load ptr, ptr %6, align 8, !tbaa !5
  call void @SPI_CloseTransfer(ptr noundef %205)
  br label %206

206:                                              ; preds = %204
  %207 = load ptr, ptr %6, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %207, i32 0, i32 13
  store i32 0, ptr %208, align 8, !tbaa !18
  br label %209

209:                                              ; preds = %206
  br label %210

210:                                              ; preds = %209
  %211 = load ptr, ptr %6, align 8, !tbaa !5
  %212 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %211, i32 0, i32 15
  %213 = load volatile i32, ptr %212, align 8, !tbaa !19
  %214 = zext i32 %213 to i64
  %215 = or i64 %214, 256
  %216 = trunc i64 %215 to i32
  store volatile i32 %216, ptr %212, align 8, !tbaa !19
  %217 = load ptr, ptr %6, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %217, i32 0, i32 14
  store volatile i32 1, ptr %218, align 4, !tbaa !17
  store i32 1, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

219:                                              ; preds = %201
  br label %220

220:                                              ; preds = %219, %175
  br label %160, !llvm.loop !34

221:                                              ; preds = %160
  br label %443

222:                                              ; preds = %152
  %223 = load ptr, ptr %6, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %223, i32 0, i32 1
  %225 = getelementptr inbounds %struct.SPI_InitTypeDef, ptr %224, i32 0, i32 2
  %226 = load i32, ptr %225, align 8, !tbaa !32
  %227 = zext i32 %226 to i64
  %228 = icmp ugt i64 %227, 7
  br i1 %228, label %229, label %321

229:                                              ; preds = %222
  br label %230

230:                                              ; preds = %319, %229
  %231 = load ptr, ptr %6, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %231, i32 0, i32 7
  %233 = load volatile i16, ptr %232, align 2, !tbaa !22
  %234 = zext i16 %233 to i64
  %235 = icmp ugt i64 %234, 0
  br i1 %235, label %236, label %320

236:                                              ; preds = %230
  %237 = load ptr, ptr %6, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %237, i32 0, i32 0
  %239 = load ptr, ptr %238, align 8, !tbaa !28
  %240 = getelementptr inbounds %struct.SPI_TypeDef, ptr %239, i32 0, i32 5
  %241 = load volatile i32, ptr %240, align 4, !tbaa !33
  %242 = zext i32 %241 to i64
  %243 = and i64 %242, 57344
  %244 = icmp ne i64 %243, 0
  br i1 %244, label %245, label %291

245:                                              ; preds = %236
  %246 = load ptr, ptr %6, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %246, i32 0, i32 0
  %248 = load ptr, ptr %247, align 8, !tbaa !28
  %249 = getelementptr inbounds %struct.SPI_TypeDef, ptr %248, i32 0, i32 5
  %250 = load volatile i32, ptr %249, align 4, !tbaa !33
  %251 = zext i32 %250 to i64
  %252 = and i64 %251, 32768
  %253 = icmp ne i64 %252, 0
  br i1 %253, label %254, label %273

254:                                              ; preds = %245
  %255 = load ptr, ptr %6, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %255, i32 0, i32 0
  %257 = load ptr, ptr %256, align 8, !tbaa !28
  %258 = getelementptr inbounds %struct.SPI_TypeDef, ptr %257, i32 0, i32 10
  %259 = load volatile i32, ptr %258, align 4, !tbaa !11
  %260 = load ptr, ptr %6, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %260, i32 0, i32 5
  %262 = load ptr, ptr %261, align 8, !tbaa !20
  store i32 %259, ptr %262, align 4, !tbaa !11
  %263 = load ptr, ptr %6, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %263, i32 0, i32 5
  %265 = load ptr, ptr %264, align 8, !tbaa !20
  %266 = getelementptr inbounds i8, ptr %265, i64 4
  store ptr %266, ptr %264, align 8, !tbaa !20
  %267 = load ptr, ptr %6, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %267, i32 0, i32 7
  %269 = load volatile i16, ptr %268, align 2, !tbaa !22
  %270 = zext i16 %269 to i32
  %271 = sub nsw i32 %270, 2
  %272 = trunc i32 %271 to i16
  store volatile i16 %272, ptr %268, align 2, !tbaa !22
  br label %290

273:                                              ; preds = %245
  %274 = load ptr, ptr %6, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %274, i32 0, i32 0
  %276 = load ptr, ptr %275, align 8, !tbaa !28
  %277 = getelementptr inbounds %struct.SPI_TypeDef, ptr %276, i32 0, i32 10
  %278 = load volatile i16, ptr %277, align 4, !tbaa !9
  %279 = load ptr, ptr %6, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %279, i32 0, i32 5
  %281 = load ptr, ptr %280, align 8, !tbaa !20
  store i16 %278, ptr %281, align 2, !tbaa !9
  %282 = load ptr, ptr %6, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %282, i32 0, i32 5
  %284 = load ptr, ptr %283, align 8, !tbaa !20
  %285 = getelementptr inbounds i8, ptr %284, i64 2
  store ptr %285, ptr %283, align 8, !tbaa !20
  %286 = load ptr, ptr %6, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %286, i32 0, i32 7
  %288 = load volatile i16, ptr %287, align 2, !tbaa !22
  %289 = add i16 %288, -1
  store volatile i16 %289, ptr %287, align 2, !tbaa !22
  br label %290

290:                                              ; preds = %273, %254
  br label %319

291:                                              ; preds = %236
  %292 = call i32 @HAL_GetTick()
  %293 = load i32, ptr %10, align 4, !tbaa !11
  %294 = sub i32 %292, %293
  %295 = load i32, ptr %9, align 4, !tbaa !11
  %296 = icmp uge i32 %294, %295
  br i1 %296, label %297, label %300

297:                                              ; preds = %291
  %298 = load i32, ptr %9, align 4, !tbaa !11
  %299 = icmp ne i32 %298, -1
  br i1 %299, label %303, label %300

300:                                              ; preds = %297, %291
  %301 = load i32, ptr %9, align 4, !tbaa !11
  %302 = icmp eq i32 %301, 0
  br i1 %302, label %303, label %318

303:                                              ; preds = %300, %297
  %304 = load ptr, ptr %6, align 8, !tbaa !5
  call void @SPI_CloseTransfer(ptr noundef %304)
  br label %305

305:                                              ; preds = %303
  %306 = load ptr, ptr %6, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %306, i32 0, i32 13
  store i32 0, ptr %307, align 8, !tbaa !18
  br label %308

308:                                              ; preds = %305
  br label %309

309:                                              ; preds = %308
  %310 = load ptr, ptr %6, align 8, !tbaa !5
  %311 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %310, i32 0, i32 15
  %312 = load volatile i32, ptr %311, align 8, !tbaa !19
  %313 = zext i32 %312 to i64
  %314 = or i64 %313, 256
  %315 = trunc i64 %314 to i32
  store volatile i32 %315, ptr %311, align 8, !tbaa !19
  %316 = load ptr, ptr %6, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %316, i32 0, i32 14
  store volatile i32 1, ptr %317, align 4, !tbaa !17
  store i32 1, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

318:                                              ; preds = %300
  br label %319

319:                                              ; preds = %318, %290
  br label %230, !llvm.loop !36

320:                                              ; preds = %230
  br label %442

321:                                              ; preds = %222
  br label %322

322:                                              ; preds = %440, %321
  %323 = load ptr, ptr %6, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %323, i32 0, i32 7
  %325 = load volatile i16, ptr %324, align 2, !tbaa !22
  %326 = zext i16 %325 to i64
  %327 = icmp ugt i64 %326, 0
  br i1 %327, label %328, label %441

328:                                              ; preds = %322
  %329 = load ptr, ptr %6, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %329, i32 0, i32 0
  %331 = load ptr, ptr %330, align 8, !tbaa !28
  %332 = getelementptr inbounds %struct.SPI_TypeDef, ptr %331, i32 0, i32 5
  %333 = load volatile i32, ptr %332, align 4, !tbaa !33
  %334 = zext i32 %333 to i64
  %335 = and i64 %334, 57344
  %336 = icmp ne i64 %335, 0
  br i1 %336, label %337, label %412

337:                                              ; preds = %328
  %338 = load ptr, ptr %6, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %338, i32 0, i32 0
  %340 = load ptr, ptr %339, align 8, !tbaa !28
  %341 = getelementptr inbounds %struct.SPI_TypeDef, ptr %340, i32 0, i32 5
  %342 = load volatile i32, ptr %341, align 4, !tbaa !33
  %343 = zext i32 %342 to i64
  %344 = and i64 %343, 32768
  %345 = icmp ne i64 %344, 0
  br i1 %345, label %346, label %365

346:                                              ; preds = %337
  %347 = load ptr, ptr %6, align 8, !tbaa !5
  %348 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %347, i32 0, i32 0
  %349 = load ptr, ptr %348, align 8, !tbaa !28
  %350 = getelementptr inbounds %struct.SPI_TypeDef, ptr %349, i32 0, i32 10
  %351 = load volatile i32, ptr %350, align 4, !tbaa !11
  %352 = load ptr, ptr %6, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %352, i32 0, i32 5
  %354 = load ptr, ptr %353, align 8, !tbaa !20
  store i32 %351, ptr %354, align 4, !tbaa !11
  %355 = load ptr, ptr %6, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %355, i32 0, i32 5
  %357 = load ptr, ptr %356, align 8, !tbaa !20
  %358 = getelementptr inbounds i8, ptr %357, i64 4
  store ptr %358, ptr %356, align 8, !tbaa !20
  %359 = load ptr, ptr %6, align 8, !tbaa !5
  %360 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %359, i32 0, i32 7
  %361 = load volatile i16, ptr %360, align 2, !tbaa !22
  %362 = zext i16 %361 to i32
  %363 = sub nsw i32 %362, 4
  %364 = trunc i32 %363 to i16
  store volatile i16 %364, ptr %360, align 2, !tbaa !22
  br label %411

365:                                              ; preds = %337
  %366 = load ptr, ptr %6, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %366, i32 0, i32 0
  %368 = load ptr, ptr %367, align 8, !tbaa !28
  %369 = getelementptr inbounds %struct.SPI_TypeDef, ptr %368, i32 0, i32 5
  %370 = load volatile i32, ptr %369, align 4, !tbaa !33
  %371 = zext i32 %370 to i64
  %372 = and i64 %371, 24576
  %373 = icmp ugt i64 %372, 8192
  br i1 %373, label %374, label %393

374:                                              ; preds = %365
  %375 = load ptr, ptr %6, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %375, i32 0, i32 0
  %377 = load ptr, ptr %376, align 8, !tbaa !28
  %378 = getelementptr inbounds %struct.SPI_TypeDef, ptr %377, i32 0, i32 10
  %379 = load volatile i16, ptr %378, align 4, !tbaa !9
  %380 = load ptr, ptr %6, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %380, i32 0, i32 5
  %382 = load ptr, ptr %381, align 8, !tbaa !20
  store i16 %379, ptr %382, align 2, !tbaa !9
  %383 = load ptr, ptr %6, align 8, !tbaa !5
  %384 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %383, i32 0, i32 5
  %385 = load ptr, ptr %384, align 8, !tbaa !20
  %386 = getelementptr inbounds i8, ptr %385, i64 2
  store ptr %386, ptr %384, align 8, !tbaa !20
  %387 = load ptr, ptr %6, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %387, i32 0, i32 7
  %389 = load volatile i16, ptr %388, align 2, !tbaa !22
  %390 = zext i16 %389 to i32
  %391 = sub nsw i32 %390, 2
  %392 = trunc i32 %391 to i16
  store volatile i16 %392, ptr %388, align 2, !tbaa !22
  br label %410

393:                                              ; preds = %365
  %394 = load ptr, ptr %6, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %394, i32 0, i32 0
  %396 = load ptr, ptr %395, align 8, !tbaa !28
  %397 = getelementptr inbounds %struct.SPI_TypeDef, ptr %396, i32 0, i32 10
  %398 = load volatile i8, ptr %397, align 4, !tbaa !37
  %399 = load ptr, ptr %6, align 8, !tbaa !5
  %400 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %399, i32 0, i32 5
  %401 = load ptr, ptr %400, align 8, !tbaa !20
  store i8 %398, ptr %401, align 1, !tbaa !37
  %402 = load ptr, ptr %6, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %402, i32 0, i32 5
  %404 = load ptr, ptr %403, align 8, !tbaa !20
  %405 = getelementptr inbounds i8, ptr %404, i64 1
  store ptr %405, ptr %403, align 8, !tbaa !20
  %406 = load ptr, ptr %6, align 8, !tbaa !5
  %407 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %406, i32 0, i32 7
  %408 = load volatile i16, ptr %407, align 2, !tbaa !22
  %409 = add i16 %408, -1
  store volatile i16 %409, ptr %407, align 2, !tbaa !22
  br label %410

410:                                              ; preds = %393, %374
  br label %411

411:                                              ; preds = %410, %346
  br label %440

412:                                              ; preds = %328
  %413 = call i32 @HAL_GetTick()
  %414 = load i32, ptr %10, align 4, !tbaa !11
  %415 = sub i32 %413, %414
  %416 = load i32, ptr %9, align 4, !tbaa !11
  %417 = icmp uge i32 %415, %416
  br i1 %417, label %418, label %421

418:                                              ; preds = %412
  %419 = load i32, ptr %9, align 4, !tbaa !11
  %420 = icmp ne i32 %419, -1
  br i1 %420, label %424, label %421

421:                                              ; preds = %418, %412
  %422 = load i32, ptr %9, align 4, !tbaa !11
  %423 = icmp eq i32 %422, 0
  br i1 %423, label %424, label %439

424:                                              ; preds = %421, %418
  %425 = load ptr, ptr %6, align 8, !tbaa !5
  call void @SPI_CloseTransfer(ptr noundef %425)
  br label %426

426:                                              ; preds = %424
  %427 = load ptr, ptr %6, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %427, i32 0, i32 13
  store i32 0, ptr %428, align 8, !tbaa !18
  br label %429

429:                                              ; preds = %426
  br label %430

430:                                              ; preds = %429
  %431 = load ptr, ptr %6, align 8, !tbaa !5
  %432 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %431, i32 0, i32 15
  %433 = load volatile i32, ptr %432, align 8, !tbaa !19
  %434 = zext i32 %433 to i64
  %435 = or i64 %434, 256
  %436 = trunc i64 %435 to i32
  store volatile i32 %436, ptr %432, align 8, !tbaa !19
  %437 = load ptr, ptr %6, align 8, !tbaa !5
  %438 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %437, i32 0, i32 14
  store volatile i32 1, ptr %438, align 4, !tbaa !17
  store i32 1, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

439:                                              ; preds = %421
  br label %440

440:                                              ; preds = %439, %411
  br label %322, !llvm.loop !38

441:                                              ; preds = %322
  br label %442

442:                                              ; preds = %441, %320
  br label %443

443:                                              ; preds = %442, %221
  %444 = load ptr, ptr %6, align 8, !tbaa !5
  call void @SPI_CloseTransfer(ptr noundef %444)
  br label %445

445:                                              ; preds = %443
  %446 = load ptr, ptr %6, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %446, i32 0, i32 13
  store i32 0, ptr %447, align 8, !tbaa !18
  br label %448

448:                                              ; preds = %445
  br label %449

449:                                              ; preds = %448
  %450 = load ptr, ptr %6, align 8, !tbaa !5
  %451 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %450, i32 0, i32 14
  store volatile i32 1, ptr %451, align 4, !tbaa !17
  %452 = load ptr, ptr %6, align 8, !tbaa !5
  %453 = getelementptr inbounds %struct.__SPI_HandleTypeDef, ptr %452, i32 0, i32 15
  %454 = load volatile i32, ptr %453, align 8, !tbaa !19
  %455 = zext i32 %454 to i64
  %456 = icmp ne i64 %455, 0
  br i1 %456, label %457, label %458

457:                                              ; preds = %449
  store i32 1, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

458:                                              ; preds = %449
  %459 = load i32, ptr %11, align 4, !tbaa !11
  store i32 %459, ptr %5, align 4
  store i32 1, ptr %12, align 4
  br label %460

460:                                              ; preds = %458, %457, %430, %309, %210, %72, %58, %41, %26
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  %461 = load i32, ptr %5, align 4
  ret i32 %461
}

; Function Attrs: nounwind uwtable
declare dso_local i32 @HAL_SPI_TransmitReceive(ptr noundef, ptr noundef, ptr noundef, i16 noundef zeroext, i32 noundef) #2

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, !10, i64 0}
!10 = !{!"short", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !12, i64 8}
!14 = !{!"__SPI_HandleTypeDef", !6, i64 0, !15, i64 8, !6, i64 96, !10, i64 104, !10, i64 106, !6, i64 112, !10, i64 120, !10, 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}
!15 = !{!"", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !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}
!16 = !{!14, !12, i64 12}
!17 = !{!14, !12, i64 164}
!18 = !{!14, !12, i64 160}
!19 = !{!14, !12, i64 168}
!20 = !{!14, !6, i64 112}
!21 = !{!14, !10, i64 120}
!22 = !{!14, !10, i64 122}
!23 = !{!14, !6, i64 96}
!24 = !{!14, !10, i64 104}
!25 = !{!14, !10, i64 106}
!26 = !{!14, !6, i64 128}
!27 = !{!14, !6, i64 136}
!28 = !{!14, !6, i64 0}
!29 = !{!30, !12, i64 0}
!30 = !{!"", !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}
!31 = !{!30, !12, i64 4}
!32 = !{!14, !12, i64 16}
!33 = !{!30, !12, i64 20}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}
!36 = distinct !{!36, !35}
!37 = !{!7, !7, i64 0}
!38 = distinct !{!38, !35}


; 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_GetTick() local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local i32 @HAL_SPI_Receive(ptr noundef %0, ptr noundef %1, i16 noundef zeroext %2, i32 noundef %3) local_unnamed_addr #1 {
  %5 = getelementptr inbounds i8, ptr %0, i64 8
  %6 = load i32, ptr %5, align 8, !tbaa !5
  %7 = icmp eq i32 %6, 4194304
  br i1 %7, label %8, label %15

8:                                                ; preds = %4
  %9 = getelementptr inbounds i8, ptr %0, i64 12
  %10 = load i32, ptr %9, align 4, !tbaa !13
  %11 = icmp eq i32 %10, 0
  br i1 %11, label %12, label %15

12:                                               ; preds = %8
  %13 = getelementptr inbounds i8, ptr %0, i64 164
  store volatile i32 4, ptr %13, align 4, !tbaa !14
  %14 = tail call i32 @HAL_SPI_TransmitReceive(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %1, i16 noundef zeroext %2, i32 noundef %3)
  br label %200

15:                                               ; preds = %4, %8
  %16 = getelementptr inbounds i8, ptr %0, i64 160
  %17 = load i32, ptr %16, align 8, !tbaa !15
  %18 = icmp eq i32 %17, 1
  br i1 %18, label %200, label %19

19:                                               ; preds = %15
  store i32 1, ptr %16, align 8, !tbaa !15
  %20 = tail call i32 @HAL_GetTick() #3
  %21 = getelementptr inbounds i8, ptr %0, i64 164
  %22 = load volatile i32, ptr %21, align 4, !tbaa !14
  %.not = icmp eq i32 %22, 1
  br i1 %.not, label %24, label %23

23:                                               ; preds = %19
  store i32 0, ptr %16, align 8, !tbaa !15
  br label %200

24:                                               ; preds = %19
  %25 = icmp eq ptr %1, null
  %26 = icmp eq i16 %2, 0
  %or.cond = or i1 %25, %26
  br i1 %or.cond, label %27, label %28

27:                                               ; preds = %24
  store i32 0, ptr %16, align 8, !tbaa !15
  br label %200

28:                                               ; preds = %24
  store volatile i32 4, ptr %21, align 4, !tbaa !14
  %29 = getelementptr inbounds i8, ptr %0, i64 168
  store volatile i32 0, ptr %29, align 8, !tbaa !16
  %30 = getelementptr inbounds i8, ptr %0, i64 112
  store ptr %1, ptr %30, align 8, !tbaa !17
  %31 = getelementptr inbounds i8, ptr %0, i64 120
  store i16 %2, ptr %31, align 8, !tbaa !18
  %32 = getelementptr inbounds i8, ptr %0, i64 122
  store volatile i16 %2, ptr %32, align 2, !tbaa !19
  %33 = getelementptr inbounds i8, ptr %0, i64 96
  store ptr null, ptr %33, align 8, !tbaa !20
  %34 = getelementptr inbounds i8, ptr %0, i64 104
  store i16 0, ptr %34, align 8, !tbaa !21
  %35 = getelementptr inbounds i8, ptr %0, i64 106
  store volatile i16 0, ptr %35, align 2, !tbaa !22
  %36 = getelementptr inbounds i8, ptr %0, i64 128
  %37 = getelementptr inbounds i8, ptr %0, i64 12
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %36, i8 0, i64 16, i1 false)
  %38 = load i32, ptr %37, align 4, !tbaa !13
  %39 = icmp eq i32 %38, 393216
  %.pre = load ptr, ptr %0, align 8, !tbaa !23
  br i1 %39, label %40, label %43

40:                                               ; preds = %28
  %41 = load volatile i32, ptr %.pre, align 4, !tbaa !24
  %42 = and i32 %41, -2049
  store volatile i32 %42, ptr %.pre, align 4, !tbaa !24
  br label %43

43:                                               ; preds = %40, %28
  %44 = getelementptr inbounds i8, ptr %.pre, i64 4
  %45 = load volatile i32, ptr %44, align 4, !tbaa !26
  %46 = and i32 %45, -65536
  %47 = zext i16 %2 to i32
  %48 = or disjoint i32 %46, %47
  store volatile i32 %48, ptr %44, align 4, !tbaa !26
  %49 = load volatile i32, ptr %.pre, align 4, !tbaa !24
  %50 = or i32 %49, 1
  store volatile i32 %50, ptr %.pre, align 4, !tbaa !24
  %51 = load i32, ptr %5, align 8, !tbaa !5
  %52 = icmp eq i32 %51, 4194304
  br i1 %52, label %53, label %56

53:                                               ; preds = %43
  %54 = load volatile i32, ptr %.pre, align 4, !tbaa !24
  %55 = or i32 %54, 512
  store volatile i32 %55, ptr %.pre, align 4, !tbaa !24
  br label %56

56:                                               ; preds = %53, %43
  %57 = getelementptr inbounds i8, ptr %0, i64 16
  %58 = load i32, ptr %57, align 8, !tbaa !27
  %59 = icmp ugt i32 %58, 15
  br i1 %59, label %.preheader, label %95

.preheader:                                       ; preds = %56
  %60 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not125135 = icmp eq i16 %60, 0
  br i1 %.not125135, label %.loopexit, label %.lr.ph136

.lr.ph136:                                        ; preds = %.preheader
  %.not139 = icmp eq i32 %3, -1
  br i1 %.not139, label %.lr.ph136.split.us, label %.lr.ph136.split

.lr.ph136.split.us:                               ; preds = %.lr.ph136, %74
  %61 = load ptr, ptr %0, align 8, !tbaa !23
  %62 = getelementptr inbounds i8, ptr %61, i64 20
  %63 = load volatile i32, ptr %62, align 4, !tbaa !28
  %64 = and i32 %63, 32776
  %.not127.us = icmp eq i32 %64, 0
  br i1 %.not127.us, label %72, label %65

65:                                               ; preds = %.lr.ph136.split.us
  %66 = getelementptr inbounds i8, ptr %61, i64 48
  %67 = load volatile i32, ptr %66, align 4, !tbaa !29
  %68 = load ptr, ptr %30, align 8, !tbaa !17
  store i32 %67, ptr %68, align 4, !tbaa !29
  %69 = getelementptr inbounds i8, ptr %68, i64 4
  store ptr %69, ptr %30, align 8, !tbaa !17
  %70 = load volatile i16, ptr %32, align 2, !tbaa !19
  %71 = add i16 %70, -1
  store volatile i16 %71, ptr %32, align 2, !tbaa !19
  br label %74

72:                                               ; preds = %.lr.ph136.split.us
  %73 = tail call i32 @HAL_GetTick() #3
  br label %74

74:                                               ; preds = %72, %65
  %75 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not125.us = icmp eq i16 %75, 0
  br i1 %.not125.us, label %.loopexit, label %.lr.ph136.split.us, !llvm.loop !30

.lr.ph136.split:                                  ; preds = %.lr.ph136, %93
  %76 = load ptr, ptr %0, align 8, !tbaa !23
  %77 = getelementptr inbounds i8, ptr %76, i64 20
  %78 = load volatile i32, ptr %77, align 4, !tbaa !28
  %79 = and i32 %78, 32776
  %.not127 = icmp eq i32 %79, 0
  br i1 %.not127, label %87, label %80

80:                                               ; preds = %.lr.ph136.split
  %81 = getelementptr inbounds i8, ptr %76, i64 48
  %82 = load volatile i32, ptr %81, align 4, !tbaa !29
  %83 = load ptr, ptr %30, align 8, !tbaa !17
  store i32 %82, ptr %83, align 4, !tbaa !29
  %84 = getelementptr inbounds i8, ptr %83, i64 4
  store ptr %84, ptr %30, align 8, !tbaa !17
  %85 = load volatile i16, ptr %32, align 2, !tbaa !19
  %86 = add i16 %85, -1
  store volatile i16 %86, ptr %32, align 2, !tbaa !19
  br label %93

87:                                               ; preds = %.lr.ph136.split
  %88 = tail call i32 @HAL_GetTick() #3
  %89 = sub i32 %88, %20
  %.not140 = icmp ult i32 %89, %3
  br i1 %.not140, label %93, label %90

90:                                               ; preds = %87
  tail call void @SPI_CloseTransfer(ptr noundef nonnull %0)
  store i32 0, ptr %16, align 8, !tbaa !15
  %91 = load volatile i32, ptr %29, align 8, !tbaa !16
  %92 = or i32 %91, 256
  store volatile i32 %92, ptr %29, align 8, !tbaa !16
  store volatile i32 1, ptr %21, align 4, !tbaa !14
  br label %200

93:                                               ; preds = %87, %80
  %94 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not125 = icmp eq i16 %94, 0
  br i1 %.not125, label %.loopexit, label %.lr.ph136.split, !llvm.loop !30

95:                                               ; preds = %56
  %96 = icmp ugt i32 %58, 7
  %97 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not122133 = icmp eq i16 %97, 0
  br i1 %96, label %.preheader128, label %.preheader130

.preheader130:                                    ; preds = %95
  br i1 %.not122133, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader130
  %.not137 = icmp eq i32 %3, -1
  br i1 %.not137, label %.lr.ph.split.us, label %.lr.ph.split

.lr.ph.split.us:                                  ; preds = %.lr.ph, %132
  %98 = load ptr, ptr %0, align 8, !tbaa !23
  %99 = getelementptr inbounds i8, ptr %98, i64 20
  %100 = load volatile i32, ptr %99, align 4, !tbaa !28
  %101 = and i32 %100, 57344
  %.not120.us = icmp eq i32 %101, 0
  br i1 %.not120.us, label %130, label %102

102:                                              ; preds = %.lr.ph.split.us
  %103 = load volatile i32, ptr %99, align 4, !tbaa !28
  %104 = and i32 %103, 32768
  %.not121.us = icmp eq i32 %104, 0
  br i1 %.not121.us, label %112, label %105

105:                                              ; preds = %102
  %106 = getelementptr inbounds i8, ptr %98, i64 48
  %107 = load volatile i32, ptr %106, align 4, !tbaa !29
  %108 = load ptr, ptr %30, align 8, !tbaa !17
  store i32 %107, ptr %108, align 4, !tbaa !29
  %109 = getelementptr inbounds i8, ptr %108, i64 4
  store ptr %109, ptr %30, align 8, !tbaa !17
  %110 = load volatile i16, ptr %32, align 2, !tbaa !19
  %111 = add i16 %110, -4
  store volatile i16 %111, ptr %32, align 2, !tbaa !19
  br label %132

112:                                              ; preds = %102
  %113 = load volatile i32, ptr %99, align 4, !tbaa !28
  %114 = and i32 %113, 24576
  %115 = icmp ugt i32 %114, 8192
  %116 = getelementptr inbounds i8, ptr %98, i64 48
  br i1 %115, label %124, label %117

117:                                              ; preds = %112
  %118 = load volatile i8, ptr %116, align 4, !tbaa !32
  %119 = load ptr, ptr %30, align 8, !tbaa !17
  store i8 %118, ptr %119, align 1, !tbaa !32
  %120 = load ptr, ptr %30, align 8, !tbaa !17
  %121 = getelementptr inbounds i8, ptr %120, i64 1
  store ptr %121, ptr %30, align 8, !tbaa !17
  %122 = load volatile i16, ptr %32, align 2, !tbaa !19
  %123 = add i16 %122, -1
  store volatile i16 %123, ptr %32, align 2, !tbaa !19
  br label %132

124:                                              ; preds = %112
  %125 = load volatile i16, ptr %116, align 4, !tbaa !33
  %126 = load ptr, ptr %30, align 8, !tbaa !17
  store i16 %125, ptr %126, align 2, !tbaa !33
  %127 = getelementptr inbounds i8, ptr %126, i64 2
  store ptr %127, ptr %30, align 8, !tbaa !17
  %128 = load volatile i16, ptr %32, align 2, !tbaa !19
  %129 = add i16 %128, -2
  store volatile i16 %129, ptr %32, align 2, !tbaa !19
  br label %132

130:                                              ; preds = %.lr.ph.split.us
  %131 = tail call i32 @HAL_GetTick() #3
  br label %132

132:                                              ; preds = %130, %124, %117, %105
  %133 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not119.us = icmp eq i16 %133, 0
  br i1 %.not119.us, label %.loopexit, label %.lr.ph.split.us, !llvm.loop !34

.preheader128:                                    ; preds = %95
  br i1 %.not122133, label %.loopexit, label %.lr.ph134

.lr.ph134:                                        ; preds = %.preheader128
  %134 = icmp ne i32 %3, -1
  br label %135

135:                                              ; preds = %.lr.ph134, %161
  %136 = load ptr, ptr %0, align 8, !tbaa !23
  %137 = getelementptr inbounds i8, ptr %136, i64 20
  %138 = load volatile i32, ptr %137, align 4, !tbaa !28
  %139 = and i32 %138, 57344
  %.not123 = icmp eq i32 %139, 0
  br i1 %.not123, label %152, label %140

140:                                              ; preds = %135
  %141 = load volatile i32, ptr %137, align 4, !tbaa !28
  %142 = and i32 %141, 32768
  %.not124 = icmp eq i32 %142, 0
  %143 = getelementptr inbounds i8, ptr %136, i64 48
  br i1 %.not124, label %148, label %144

144:                                              ; preds = %140
  %145 = load volatile i32, ptr %143, align 4, !tbaa !29
  %146 = load ptr, ptr %30, align 8, !tbaa !17
  store i32 %145, ptr %146, align 4, !tbaa !29
  %147 = getelementptr inbounds i8, ptr %146, i64 4
  br label %.sink.split

148:                                              ; preds = %140
  %149 = load volatile i16, ptr %143, align 4, !tbaa !33
  %150 = load ptr, ptr %30, align 8, !tbaa !17
  store i16 %149, ptr %150, align 2, !tbaa !33
  %151 = getelementptr inbounds i8, ptr %150, i64 2
  br label %.sink.split

152:                                              ; preds = %135
  %153 = tail call i32 @HAL_GetTick() #3
  %154 = sub i32 %153, %20
  %155 = icmp uge i32 %154, %3
  %or.cond8 = and i1 %134, %155
  br i1 %or.cond8, label %156, label %161

156:                                              ; preds = %152
  tail call void @SPI_CloseTransfer(ptr noundef nonnull %0)
  store i32 0, ptr %16, align 8, !tbaa !15
  %157 = load volatile i32, ptr %29, align 8, !tbaa !16
  %158 = or i32 %157, 256
  store volatile i32 %158, ptr %29, align 8, !tbaa !16
  store volatile i32 1, ptr %21, align 4, !tbaa !14
  br label %200

.sink.split:                                      ; preds = %148, %144
  %.sink = phi ptr [ %147, %144 ], [ %151, %148 ]
  %.sink150 = phi i16 [ -2, %144 ], [ -1, %148 ]
  store ptr %.sink, ptr %30, align 8, !tbaa !17
  %159 = load volatile i16, ptr %32, align 2, !tbaa !19
  %160 = add i16 %159, %.sink150
  store volatile i16 %160, ptr %32, align 2, !tbaa !19
  br label %161

161:                                              ; preds = %.sink.split, %152
  %162 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not122 = icmp eq i16 %162, 0
  br i1 %.not122, label %.loopexit, label %135, !llvm.loop !35

.lr.ph.split:                                     ; preds = %.lr.ph, %197
  %163 = load ptr, ptr %0, align 8, !tbaa !23
  %164 = getelementptr inbounds i8, ptr %163, i64 20
  %165 = load volatile i32, ptr %164, align 4, !tbaa !28
  %166 = and i32 %165, 57344
  %.not120 = icmp eq i32 %166, 0
  br i1 %.not120, label %189, label %167

167:                                              ; preds = %.lr.ph.split
  %168 = load volatile i32, ptr %164, align 4, !tbaa !28
  %169 = and i32 %168, 32768
  %.not121 = icmp eq i32 %169, 0
  br i1 %.not121, label %175, label %170

170:                                              ; preds = %167
  %171 = getelementptr inbounds i8, ptr %163, i64 48
  %172 = load volatile i32, ptr %171, align 4, !tbaa !29
  %173 = load ptr, ptr %30, align 8, !tbaa !17
  store i32 %172, ptr %173, align 4, !tbaa !29
  %174 = getelementptr inbounds i8, ptr %173, i64 4
  br label %.sink.split151

175:                                              ; preds = %167
  %176 = load volatile i32, ptr %164, align 4, !tbaa !28
  %177 = and i32 %176, 24576
  %178 = icmp ugt i32 %177, 8192
  %179 = getelementptr inbounds i8, ptr %163, i64 48
  br i1 %178, label %180, label %184

180:                                              ; preds = %175
  %181 = load volatile i16, ptr %179, align 4, !tbaa !33
  %182 = load ptr, ptr %30, align 8, !tbaa !17
  store i16 %181, ptr %182, align 2, !tbaa !33
  %183 = getelementptr inbounds i8, ptr %182, i64 2
  br label %.sink.split151

184:                                              ; preds = %175
  %185 = load volatile i8, ptr %179, align 4, !tbaa !32
  %186 = load ptr, ptr %30, align 8, !tbaa !17
  store i8 %185, ptr %186, align 1, !tbaa !32
  %187 = load ptr, ptr %30, align 8, !tbaa !17
  %188 = getelementptr inbounds i8, ptr %187, i64 1
  br label %.sink.split151

189:                                              ; preds = %.lr.ph.split
  %190 = tail call i32 @HAL_GetTick() #3
  %191 = sub i32 %190, %20
  %.not138 = icmp ult i32 %191, %3
  br i1 %.not138, label %197, label %192

192:                                              ; preds = %189
  tail call void @SPI_CloseTransfer(ptr noundef nonnull %0)
  store i32 0, ptr %16, align 8, !tbaa !15
  %193 = load volatile i32, ptr %29, align 8, !tbaa !16
  %194 = or i32 %193, 256
  store volatile i32 %194, ptr %29, align 8, !tbaa !16
  store volatile i32 1, ptr %21, align 4, !tbaa !14
  br label %200

.sink.split151:                                   ; preds = %180, %184, %170
  %.sink155 = phi ptr [ %174, %170 ], [ %188, %184 ], [ %183, %180 ]
  %.sink154 = phi i16 [ -4, %170 ], [ -1, %184 ], [ -2, %180 ]
  store ptr %.sink155, ptr %30, align 8, !tbaa !17
  %195 = load volatile i16, ptr %32, align 2, !tbaa !19
  %196 = add i16 %195, %.sink154
  store volatile i16 %196, ptr %32, align 2, !tbaa !19
  br label %197

197:                                              ; preds = %.sink.split151, %189
  %198 = load volatile i16, ptr %32, align 2, !tbaa !19
  %.not119 = icmp eq i16 %198, 0
  br i1 %.not119, label %.loopexit, label %.lr.ph.split, !llvm.loop !34

.loopexit:                                        ; preds = %197, %132, %161, %93, %74, %.preheader130, %.preheader128, %.preheader
  tail call void @SPI_CloseTransfer(ptr noundef nonnull %0)
  store i32 0, ptr %16, align 8, !tbaa !15
  store volatile i32 1, ptr %21, align 4, !tbaa !14
  %199 = load volatile i32, ptr %29, align 8, !tbaa !16
  %.not126 = icmp ne i32 %199, 0
  %. = zext i1 %.not126 to i32
  br label %200

200:                                              ; preds = %.loopexit, %15, %192, %156, %90, %27, %23, %12
  %.0 = phi i32 [ %14, %12 ], [ 2, %23 ], [ 1, %27 ], [ 1, %90 ], [ 1, %156 ], [ 1, %192 ], [ 2, %15 ], [ %., %.loopexit ]
  ret i32 %.0
}

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2

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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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, !11, i64 8}
!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 = !{!6, !11, i64 12}
!14 = !{!6, !11, i64 164}
!15 = !{!6, !11, i64 160}
!16 = !{!6, !11, i64 168}
!17 = !{!6, !7, i64 112}
!18 = !{!6, !12, i64 120}
!19 = !{!6, !12, i64 122}
!20 = !{!6, !7, i64 96}
!21 = !{!6, !12, i64 104}
!22 = !{!6, !12, i64 106}
!23 = !{!6, !7, i64 0}
!24 = !{!25, !11, i64 0}
!25 = !{!"", !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}
!26 = !{!25, !11, i64 4}
!27 = !{!6, !11, i64 16}
!28 = !{!25, !11, i64 20}
!29 = !{!11, !11, i64 0}
!30 = distinct !{!30, !31}
!31 = !{!"llvm.loop.mustprogress"}
!32 = !{!8, !8, i64 0}
!33 = !{!12, !12, i64 0}
!34 = distinct !{!34, !31}
!35 = distinct !{!35, !31}


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