; LLVM IR from ctlst-tech/catpilot :: bsp/mcu/core/stm32/h753/hal/src (stm32h7xx_hal_adc)

; 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.ADC_HandleTypeDef = type { ptr, %struct.ADC_InitTypeDef, ptr, i32, i32, i32, %struct.ADC_InjectionConfigTypeDef }
%struct.ADC_InitTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, %struct.ADC_OversamplingTypeDef }
%struct.ADC_OversamplingTypeDef = type { i32, i32, i32, i32 }
%struct.ADC_InjectionConfigTypeDef = type { i32, i32 }
%struct.ADC_ChannelConfTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32 }
%struct.ADC_TypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [4 x i32], i32, i32, i32, i32, [4 x i32], i32, i32, i32, i32, [4 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

@SystemCoreClock = external global i32, align 4

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_REG_IsConversionOngoing(ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_IsEnabled(ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_INJ_IsConversionOngoing(ptr noundef) #1

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

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

18:                                               ; preds = %2
  br label %20

19:                                               ; preds = %2
  br label %20

20:                                               ; preds = %19, %18
  %21 = load ptr, ptr %5, align 8, !tbaa !5
  %22 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %21, i32 0, i32 3
  %23 = load i32, ptr %22, align 4, !tbaa !16
  %24 = zext i32 %23 to i64
  %25 = icmp ne i64 %24, 1207894016
  br i1 %25, label %26, label %27

26:                                               ; preds = %20
  br label %46

27:                                               ; preds = %20
  %28 = load ptr, ptr %4, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %28, i32 0, i32 0
  %30 = load ptr, ptr %29, align 8, !tbaa !18
  %31 = icmp eq ptr %30, inttoptr (i64 1073881088 to ptr)
  br i1 %31, label %32, label %33

32:                                               ; preds = %27
  br label %33

33:                                               ; preds = %32, %27
  %34 = load ptr, ptr %4, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %34, i32 0, i32 0
  %36 = load ptr, ptr %35, align 8, !tbaa !18
  %37 = icmp eq ptr %36, inttoptr (i64 1073881344 to ptr)
  br i1 %37, label %38, label %39

38:                                               ; preds = %33
  br label %39

39:                                               ; preds = %38, %33
  %40 = load ptr, ptr %4, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %40, i32 0, i32 0
  %42 = load ptr, ptr %41, align 8, !tbaa !18
  %43 = icmp eq ptr %42, inttoptr (i64 1476550656 to ptr)
  br i1 %43, label %44, label %45

44:                                               ; preds = %39
  br label %45

45:                                               ; preds = %44, %39
  br label %46

46:                                               ; preds = %45, %26
  br label %47

47:                                               ; preds = %46
  %48 = load ptr, ptr %4, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %48, i32 0, i32 3
  %50 = load i32, ptr %49, align 8, !tbaa !19
  %51 = icmp eq i32 %50, 1
  br i1 %51, label %52, label %53

52:                                               ; preds = %47
  store i32 2, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %757

53:                                               ; preds = %47
  %54 = load ptr, ptr %4, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %54, i32 0, i32 3
  store i32 1, ptr %55, align 8, !tbaa !19
  br label %56

56:                                               ; preds = %53
  br label %57

57:                                               ; preds = %56
  br label %58

58:                                               ; preds = %57
  %59 = load ptr, ptr %4, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %59, i32 0, i32 0
  %61 = load ptr, ptr %60, align 8, !tbaa !18
  %62 = call i32 @LL_ADC_REG_IsConversionOngoing(ptr noundef %61)
  %63 = zext i32 %62 to i64
  %64 = icmp eq i64 %63, 0
  br i1 %64, label %65, label %743

65:                                               ; preds = %58
  %66 = load ptr, ptr %5, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %66, i32 0, i32 0
  %68 = load i32, ptr %67, align 4, !tbaa !20
  %69 = zext i32 %68 to i64
  %70 = and i64 %69, 1048575
  %71 = icmp eq i64 %70, 0
  br i1 %71, label %72, label %79

72:                                               ; preds = %65
  %73 = load ptr, ptr %5, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %73, i32 0, i32 0
  %75 = load i32, ptr %74, align 4, !tbaa !20
  %76 = zext i32 %75 to i64
  %77 = and i64 %76, 2080374784
  %78 = lshr i64 %77, 26
  br label %88

79:                                               ; preds = %65
  %80 = load ptr, ptr %5, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %80, i32 0, i32 0
  %82 = load i32, ptr %81, align 4, !tbaa !20
  %83 = call i32 @__RBIT(i32 noundef %82)
  %84 = call i32 @llvm.ctlz.i32(i32 %83, i1 true)
  %85 = trunc i32 %84 to i8
  %86 = zext i8 %85 to i32
  %87 = zext i32 %86 to i64
  br label %88

88:                                               ; preds = %79, %72
  %89 = phi i64 [ %78, %72 ], [ %87, %79 ]
  %90 = and i64 %89, 31
  %91 = shl i64 1, %90
  %92 = load ptr, ptr %4, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %92, i32 0, i32 0
  %94 = load ptr, ptr %93, align 8, !tbaa !18
  %95 = getelementptr inbounds %struct.ADC_TypeDef, ptr %94, i32 0, i32 7
  %96 = load volatile i32, ptr %95, align 4, !tbaa !21
  %97 = zext i32 %96 to i64
  %98 = or i64 %97, %91
  %99 = trunc i64 %98 to i32
  store volatile i32 %99, ptr %95, align 4, !tbaa !21
  %100 = load ptr, ptr %4, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %100, i32 0, i32 0
  %102 = load ptr, ptr %101, align 8, !tbaa !18
  %103 = load ptr, ptr %5, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %103, i32 0, i32 1
  %105 = load i32, ptr %104, align 4, !tbaa !23
  %106 = load ptr, ptr %5, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %106, i32 0, i32 0
  %108 = load i32, ptr %107, align 4, !tbaa !20
  call void @LL_ADC_REG_SetSequencerRanks(ptr noundef %102, i32 noundef %105, i32 noundef %108)
  %109 = load ptr, ptr %4, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %109, i32 0, i32 0
  %111 = load ptr, ptr %110, align 8, !tbaa !18
  %112 = call i32 @LL_ADC_REG_IsConversionOngoing(ptr noundef %111)
  store i32 %112, ptr %10, align 4, !tbaa !9
  %113 = load ptr, ptr %4, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !18
  %116 = call i32 @LL_ADC_INJ_IsConversionOngoing(ptr noundef %115)
  store i32 %116, ptr %11, align 4, !tbaa !9
  %117 = load i32, ptr %10, align 4, !tbaa !9
  %118 = zext i32 %117 to i64
  %119 = icmp eq i64 %118, 0
  br i1 %119, label %120, label %332

120:                                              ; preds = %88
  %121 = load i32, ptr %11, align 4, !tbaa !9
  %122 = zext i32 %121 to i64
  %123 = icmp eq i64 %122, 0
  br i1 %123, label %124, label %332

124:                                              ; preds = %120
  %125 = load ptr, ptr %4, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %125, i32 0, i32 0
  %127 = load ptr, ptr %126, align 8, !tbaa !18
  %128 = load ptr, ptr %5, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %128, i32 0, i32 0
  %130 = load i32, ptr %129, align 4, !tbaa !20
  %131 = load ptr, ptr %5, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %131, i32 0, i32 2
  %133 = load i32, ptr %132, align 4, !tbaa !24
  call void @LL_ADC_SetChannelSamplingTime(ptr noundef %127, i32 noundef %130, i32 noundef %133)
  %134 = load volatile i32, ptr inttoptr (i64 1543507968 to ptr), align 4, !tbaa !25
  %135 = zext i32 %134 to i64
  %136 = and i64 %135, 4026531840
  %137 = icmp eq i64 %136, 268435456
  br i1 %137, label %138, label %153

138:                                              ; preds = %124
  %139 = load ptr, ptr %5, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %139, i32 0, i32 5
  %141 = load i32, ptr %140, align 4, !tbaa !27
  %142 = load ptr, ptr %4, align 8, !tbaa !5
  %143 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %142, i32 0, i32 0
  %144 = load ptr, ptr %143, align 8, !tbaa !18
  %145 = getelementptr inbounds %struct.ADC_TypeDef, ptr %144, i32 0, i32 3
  %146 = load volatile i32, ptr %145, align 4, !tbaa !28
  %147 = zext i32 %146 to i64
  %148 = and i64 %147, 28
  %149 = lshr i64 %148, 2
  %150 = mul i64 %149, 2
  %151 = trunc i64 %150 to i32
  %152 = shl i32 %141, %151
  br label %194

153:                                              ; preds = %124
  %154 = load ptr, ptr %4, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %154, i32 0, i32 0
  %156 = load ptr, ptr %155, align 8, !tbaa !18
  %157 = getelementptr inbounds %struct.ADC_TypeDef, ptr %156, i32 0, i32 3
  %158 = load volatile i32, ptr %157, align 4, !tbaa !28
  %159 = zext i32 %158 to i64
  %160 = and i64 %159, 16
  %161 = icmp eq i64 %160, 0
  br i1 %161, label %162, label %177

162:                                              ; preds = %153
  %163 = load ptr, ptr %5, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %163, i32 0, i32 5
  %165 = load i32, ptr %164, align 4, !tbaa !27
  %166 = load ptr, ptr %4, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %166, i32 0, i32 0
  %168 = load ptr, ptr %167, align 8, !tbaa !18
  %169 = getelementptr inbounds %struct.ADC_TypeDef, ptr %168, i32 0, i32 3
  %170 = load volatile i32, ptr %169, align 4, !tbaa !28
  %171 = zext i32 %170 to i64
  %172 = and i64 %171, 28
  %173 = lshr i64 %172, 2
  %174 = mul i64 %173, 2
  %175 = trunc i64 %174 to i32
  %176 = shl i32 %165, %175
  br label %192

177:                                              ; preds = %153
  %178 = load ptr, ptr %5, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %178, i32 0, i32 5
  %180 = load i32, ptr %179, align 4, !tbaa !27
  %181 = load ptr, ptr %4, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %181, i32 0, i32 0
  %183 = load ptr, ptr %182, align 8, !tbaa !18
  %184 = getelementptr inbounds %struct.ADC_TypeDef, ptr %183, i32 0, i32 3
  %185 = load volatile i32, ptr %184, align 4, !tbaa !28
  %186 = zext i32 %185 to i64
  %187 = and i64 %186, 16
  %188 = lshr i64 %187, 2
  %189 = mul i64 %188, 2
  %190 = trunc i64 %189 to i32
  %191 = shl i32 %180, %190
  br label %192

192:                                              ; preds = %177, %162
  %193 = phi i32 [ %176, %162 ], [ %191, %177 ]
  br label %194

194:                                              ; preds = %192, %138
  %195 = phi i32 [ %152, %138 ], [ %193, %192 ]
  store i32 %195, ptr %7, align 4, !tbaa !9
  %196 = load ptr, ptr %5, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %196, i32 0, i32 4
  %198 = load i32, ptr %197, align 4, !tbaa !29
  %199 = zext i32 %198 to i64
  %200 = icmp ne i64 %199, 4
  br i1 %200, label %201, label %238

201:                                              ; preds = %194
  %202 = load ptr, ptr %4, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %202, i32 0, i32 0
  %204 = load ptr, ptr %203, align 8, !tbaa !18
  %205 = load ptr, ptr %5, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %205, i32 0, i32 4
  %207 = load i32, ptr %206, align 4, !tbaa !29
  %208 = load ptr, ptr %5, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %208, i32 0, i32 0
  %210 = load i32, ptr %209, align 4, !tbaa !20
  %211 = load i32, ptr %7, align 4, !tbaa !9
  call void @LL_ADC_SetOffset(ptr noundef %204, i32 noundef %207, i32 noundef %210, i32 noundef %211)
  %212 = load ptr, ptr %4, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %212, i32 0, i32 0
  %214 = load ptr, ptr %213, align 8, !tbaa !18
  %215 = load ptr, ptr %5, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %215, i32 0, i32 4
  %217 = load i32, ptr %216, align 4, !tbaa !29
  %218 = load ptr, ptr %5, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %218, i32 0, i32 7
  %220 = load i32, ptr %219, align 4, !tbaa !30
  %221 = icmp eq i32 %220, 1
  %222 = zext i1 %221 to i64
  %223 = select i1 %221, i64 2147483648, i64 0
  %224 = trunc i64 %223 to i32
  call void @LL_ADC_SetOffsetSignedSaturation(ptr noundef %214, i32 noundef %217, i32 noundef %224)
  %225 = load ptr, ptr %4, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %225, i32 0, i32 0
  %227 = load ptr, ptr %226, align 8, !tbaa !18
  %228 = load ptr, ptr %5, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %228, i32 0, i32 4
  %230 = load i32, ptr %229, align 4, !tbaa !29
  %231 = load ptr, ptr %5, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %231, i32 0, i32 6
  %233 = load i32, ptr %232, align 4, !tbaa !31
  %234 = icmp eq i32 %233, 1
  %235 = zext i1 %234 to i64
  %236 = select i1 %234, i64 2048, i64 0
  %237 = trunc i64 %236 to i32
  call void @LL_ADC_SetDataRightShift(ptr noundef %227, i32 noundef %230, i32 noundef %237)
  br label %331

238:                                              ; preds = %194
  %239 = load ptr, ptr %4, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %239, i32 0, i32 0
  %241 = load ptr, ptr %240, align 8, !tbaa !18
  %242 = getelementptr inbounds %struct.ADC_TypeDef, ptr %241, i32 0, i32 21
  %243 = load volatile i32, ptr %242, align 4, !tbaa !32
  %244 = zext i32 %243 to i64
  %245 = and i64 %244, 2080374784
  %246 = load ptr, ptr %5, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %246, i32 0, i32 0
  %248 = load i32, ptr %247, align 4, !tbaa !20
  %249 = shl i32 %248, 26
  %250 = zext i32 %249 to i64
  %251 = icmp eq i64 %245, %250
  br i1 %251, label %252, label %261

252:                                              ; preds = %238
  %253 = load ptr, ptr %4, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %253, i32 0, i32 0
  %255 = load ptr, ptr %254, align 8, !tbaa !18
  %256 = getelementptr inbounds %struct.ADC_TypeDef, ptr %255, i32 0, i32 21
  %257 = load volatile i32, ptr %256, align 4, !tbaa !32
  %258 = zext i32 %257 to i64
  %259 = and i64 %258, -2147483649
  %260 = trunc i64 %259 to i32
  store volatile i32 %260, ptr %256, align 4, !tbaa !32
  br label %261

261:                                              ; preds = %252, %238
  %262 = load ptr, ptr %4, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %262, i32 0, i32 0
  %264 = load ptr, ptr %263, align 8, !tbaa !18
  %265 = getelementptr inbounds %struct.ADC_TypeDef, ptr %264, i32 0, i32 22
  %266 = load volatile i32, ptr %265, align 4, !tbaa !33
  %267 = zext i32 %266 to i64
  %268 = and i64 %267, 2080374784
  %269 = load ptr, ptr %5, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %269, i32 0, i32 0
  %271 = load i32, ptr %270, align 4, !tbaa !20
  %272 = shl i32 %271, 26
  %273 = zext i32 %272 to i64
  %274 = icmp eq i64 %268, %273
  br i1 %274, label %275, label %284

275:                                              ; preds = %261
  %276 = load ptr, ptr %4, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %276, i32 0, i32 0
  %278 = load ptr, ptr %277, align 8, !tbaa !18
  %279 = getelementptr inbounds %struct.ADC_TypeDef, ptr %278, i32 0, i32 22
  %280 = load volatile i32, ptr %279, align 4, !tbaa !33
  %281 = zext i32 %280 to i64
  %282 = and i64 %281, -2147483649
  %283 = trunc i64 %282 to i32
  store volatile i32 %283, ptr %279, align 4, !tbaa !33
  br label %284

284:                                              ; preds = %275, %261
  %285 = load ptr, ptr %4, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %285, i32 0, i32 0
  %287 = load ptr, ptr %286, align 8, !tbaa !18
  %288 = getelementptr inbounds %struct.ADC_TypeDef, ptr %287, i32 0, i32 23
  %289 = load volatile i32, ptr %288, align 4, !tbaa !34
  %290 = zext i32 %289 to i64
  %291 = and i64 %290, 2080374784
  %292 = load ptr, ptr %5, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %292, i32 0, i32 0
  %294 = load i32, ptr %293, align 4, !tbaa !20
  %295 = shl i32 %294, 26
  %296 = zext i32 %295 to i64
  %297 = icmp eq i64 %291, %296
  br i1 %297, label %298, label %307

298:                                              ; preds = %284
  %299 = load ptr, ptr %4, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %299, i32 0, i32 0
  %301 = load ptr, ptr %300, align 8, !tbaa !18
  %302 = getelementptr inbounds %struct.ADC_TypeDef, ptr %301, i32 0, i32 23
  %303 = load volatile i32, ptr %302, align 4, !tbaa !34
  %304 = zext i32 %303 to i64
  %305 = and i64 %304, -2147483649
  %306 = trunc i64 %305 to i32
  store volatile i32 %306, ptr %302, align 4, !tbaa !34
  br label %307

307:                                              ; preds = %298, %284
  %308 = load ptr, ptr %4, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %308, i32 0, i32 0
  %310 = load ptr, ptr %309, align 8, !tbaa !18
  %311 = getelementptr inbounds %struct.ADC_TypeDef, ptr %310, i32 0, i32 24
  %312 = load volatile i32, ptr %311, align 4, !tbaa !35
  %313 = zext i32 %312 to i64
  %314 = and i64 %313, 2080374784
  %315 = load ptr, ptr %5, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %315, i32 0, i32 0
  %317 = load i32, ptr %316, align 4, !tbaa !20
  %318 = shl i32 %317, 26
  %319 = zext i32 %318 to i64
  %320 = icmp eq i64 %314, %319
  br i1 %320, label %321, label %330

321:                                              ; preds = %307
  %322 = load ptr, ptr %4, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %322, i32 0, i32 0
  %324 = load ptr, ptr %323, align 8, !tbaa !18
  %325 = getelementptr inbounds %struct.ADC_TypeDef, ptr %324, i32 0, i32 24
  %326 = load volatile i32, ptr %325, align 4, !tbaa !35
  %327 = zext i32 %326 to i64
  %328 = and i64 %327, -2147483649
  %329 = trunc i64 %328 to i32
  store volatile i32 %329, ptr %325, align 4, !tbaa !35
  br label %330

330:                                              ; preds = %321, %307
  br label %331

331:                                              ; preds = %330, %201
  br label %332

332:                                              ; preds = %331, %120, %88
  %333 = load ptr, ptr %4, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %333, i32 0, i32 0
  %335 = load ptr, ptr %334, align 8, !tbaa !18
  %336 = call i32 @LL_ADC_IsEnabled(ptr noundef %335)
  %337 = zext i32 %336 to i64
  %338 = icmp eq i64 %337, 0
  br i1 %338, label %339, label %742

339:                                              ; preds = %332
  %340 = load ptr, ptr %4, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %340, i32 0, i32 0
  %342 = load ptr, ptr %341, align 8, !tbaa !18
  %343 = load ptr, ptr %5, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %343, i32 0, i32 0
  %345 = load i32, ptr %344, align 4, !tbaa !20
  %346 = load ptr, ptr %5, align 8, !tbaa !5
  %347 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %346, i32 0, i32 3
  %348 = load i32, ptr %347, align 4, !tbaa !16
  call void @LL_ADC_SetChannelSingleDiff(ptr noundef %342, i32 noundef %345, i32 noundef %348)
  %349 = load ptr, ptr %5, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %349, i32 0, i32 3
  %351 = load i32, ptr %350, align 4, !tbaa !16
  %352 = zext i32 %351 to i64
  %353 = icmp eq i64 %352, 1207894016
  br i1 %353, label %354, label %564

354:                                              ; preds = %339
  %355 = load ptr, ptr %4, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %355, i32 0, i32 0
  %357 = load ptr, ptr %356, align 8, !tbaa !18
  %358 = load ptr, ptr %5, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %358, i32 0, i32 0
  %360 = load i32, ptr %359, align 4, !tbaa !20
  %361 = zext i32 %360 to i64
  %362 = and i64 %361, 1048575
  %363 = icmp eq i64 %362, 0
  br i1 %363, label %364, label %371

364:                                              ; preds = %354
  %365 = load ptr, ptr %5, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %365, i32 0, i32 0
  %367 = load i32, ptr %366, align 4, !tbaa !20
  %368 = zext i32 %367 to i64
  %369 = and i64 %368, 2080374784
  %370 = lshr i64 %369, 26
  br label %380

371:                                              ; preds = %354
  %372 = load ptr, ptr %5, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %372, i32 0, i32 0
  %374 = load i32, ptr %373, align 4, !tbaa !20
  %375 = call i32 @__RBIT(i32 noundef %374)
  %376 = call i32 @llvm.ctlz.i32(i32 %375, i1 true)
  %377 = trunc i32 %376 to i8
  %378 = zext i8 %377 to i32
  %379 = zext i32 %378 to i64
  br label %380

380:                                              ; preds = %371, %364
  %381 = phi i64 [ %370, %364 ], [ %379, %371 ]
  %382 = add i64 %381, 1
  %383 = and i64 %382, 31
  %384 = icmp ule i64 %383, 9
  br i1 %384, label %385, label %471

385:                                              ; preds = %380
  %386 = load ptr, ptr %5, align 8, !tbaa !5
  %387 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %386, i32 0, i32 0
  %388 = load i32, ptr %387, align 4, !tbaa !20
  %389 = zext i32 %388 to i64
  %390 = and i64 %389, 1048575
  %391 = icmp eq i64 %390, 0
  br i1 %391, label %392, label %399

392:                                              ; preds = %385
  %393 = load ptr, ptr %5, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %393, i32 0, i32 0
  %395 = load i32, ptr %394, align 4, !tbaa !20
  %396 = zext i32 %395 to i64
  %397 = and i64 %396, 2080374784
  %398 = lshr i64 %397, 26
  br label %408

399:                                              ; preds = %385
  %400 = load ptr, ptr %5, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %400, i32 0, i32 0
  %402 = load i32, ptr %401, align 4, !tbaa !20
  %403 = call i32 @__RBIT(i32 noundef %402)
  %404 = call i32 @llvm.ctlz.i32(i32 %403, i1 true)
  %405 = trunc i32 %404 to i8
  %406 = zext i8 %405 to i32
  %407 = zext i32 %406 to i64
  br label %408

408:                                              ; preds = %399, %392
  %409 = phi i64 [ %398, %392 ], [ %407, %399 ]
  %410 = add i64 %409, 1
  %411 = and i64 %410, 31
  %412 = shl i64 %411, 26
  %413 = load ptr, ptr %5, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %413, i32 0, i32 0
  %415 = load i32, ptr %414, align 4, !tbaa !20
  %416 = zext i32 %415 to i64
  %417 = and i64 %416, 1048575
  %418 = icmp eq i64 %417, 0
  br i1 %418, label %419, label %426

419:                                              ; preds = %408
  %420 = load ptr, ptr %5, align 8, !tbaa !5
  %421 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %420, i32 0, i32 0
  %422 = load i32, ptr %421, align 4, !tbaa !20
  %423 = zext i32 %422 to i64
  %424 = and i64 %423, 2080374784
  %425 = lshr i64 %424, 26
  br label %435

426:                                              ; preds = %408
  %427 = load ptr, ptr %5, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %427, i32 0, i32 0
  %429 = load i32, ptr %428, align 4, !tbaa !20
  %430 = call i32 @__RBIT(i32 noundef %429)
  %431 = call i32 @llvm.ctlz.i32(i32 %430, i1 true)
  %432 = trunc i32 %431 to i8
  %433 = zext i8 %432 to i32
  %434 = zext i32 %433 to i64
  br label %435

435:                                              ; preds = %426, %419
  %436 = phi i64 [ %425, %419 ], [ %434, %426 ]
  %437 = add i64 %436, 1
  %438 = and i64 %437, 31
  %439 = shl i64 1, %438
  %440 = or i64 %412, %439
  %441 = load ptr, ptr %5, align 8, !tbaa !5
  %442 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %441, i32 0, i32 0
  %443 = load i32, ptr %442, align 4, !tbaa !20
  %444 = zext i32 %443 to i64
  %445 = and i64 %444, 1048575
  %446 = icmp eq i64 %445, 0
  br i1 %446, label %447, label %454

447:                                              ; preds = %435
  %448 = load ptr, ptr %5, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %448, i32 0, i32 0
  %450 = load i32, ptr %449, align 4, !tbaa !20
  %451 = zext i32 %450 to i64
  %452 = and i64 %451, 2080374784
  %453 = lshr i64 %452, 26
  br label %463

454:                                              ; preds = %435
  %455 = load ptr, ptr %5, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %455, i32 0, i32 0
  %457 = load i32, ptr %456, align 4, !tbaa !20
  %458 = call i32 @__RBIT(i32 noundef %457)
  %459 = call i32 @llvm.ctlz.i32(i32 %458, i1 true)
  %460 = trunc i32 %459 to i8
  %461 = zext i8 %460 to i32
  %462 = zext i32 %461 to i64
  br label %463

463:                                              ; preds = %454, %447
  %464 = phi i64 [ %453, %447 ], [ %462, %454 ]
  %465 = add i64 %464, 1
  %466 = and i64 %465, 31
  %467 = mul i64 3, %466
  %468 = shl i64 %467, 20
  %469 = or i64 0, %468
  %470 = or i64 %440, %469
  br label %558

471:                                              ; preds = %380
  %472 = load ptr, ptr %5, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %472, i32 0, i32 0
  %474 = load i32, ptr %473, align 4, !tbaa !20
  %475 = zext i32 %474 to i64
  %476 = and i64 %475, 1048575
  %477 = icmp eq i64 %476, 0
  br i1 %477, label %478, label %485

478:                                              ; preds = %471
  %479 = load ptr, ptr %5, align 8, !tbaa !5
  %480 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %479, i32 0, i32 0
  %481 = load i32, ptr %480, align 4, !tbaa !20
  %482 = zext i32 %481 to i64
  %483 = and i64 %482, 2080374784
  %484 = lshr i64 %483, 26
  br label %494

485:                                              ; preds = %471
  %486 = load ptr, ptr %5, align 8, !tbaa !5
  %487 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %486, i32 0, i32 0
  %488 = load i32, ptr %487, align 4, !tbaa !20
  %489 = call i32 @__RBIT(i32 noundef %488)
  %490 = call i32 @llvm.ctlz.i32(i32 %489, i1 true)
  %491 = trunc i32 %490 to i8
  %492 = zext i8 %491 to i32
  %493 = zext i32 %492 to i64
  br label %494

494:                                              ; preds = %485, %478
  %495 = phi i64 [ %484, %478 ], [ %493, %485 ]
  %496 = add i64 %495, 1
  %497 = and i64 %496, 31
  %498 = shl i64 %497, 26
  %499 = load ptr, ptr %5, align 8, !tbaa !5
  %500 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %499, i32 0, i32 0
  %501 = load i32, ptr %500, align 4, !tbaa !20
  %502 = zext i32 %501 to i64
  %503 = and i64 %502, 1048575
  %504 = icmp eq i64 %503, 0
  br i1 %504, label %505, label %512

505:                                              ; preds = %494
  %506 = load ptr, ptr %5, align 8, !tbaa !5
  %507 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %506, i32 0, i32 0
  %508 = load i32, ptr %507, align 4, !tbaa !20
  %509 = zext i32 %508 to i64
  %510 = and i64 %509, 2080374784
  %511 = lshr i64 %510, 26
  br label %521

512:                                              ; preds = %494
  %513 = load ptr, ptr %5, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %513, i32 0, i32 0
  %515 = load i32, ptr %514, align 4, !tbaa !20
  %516 = call i32 @__RBIT(i32 noundef %515)
  %517 = call i32 @llvm.ctlz.i32(i32 %516, i1 true)
  %518 = trunc i32 %517 to i8
  %519 = zext i8 %518 to i32
  %520 = zext i32 %519 to i64
  br label %521

521:                                              ; preds = %512, %505
  %522 = phi i64 [ %511, %505 ], [ %520, %512 ]
  %523 = add i64 %522, 1
  %524 = and i64 %523, 31
  %525 = shl i64 1, %524
  %526 = or i64 %498, %525
  %527 = load ptr, ptr %5, align 8, !tbaa !5
  %528 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %527, i32 0, i32 0
  %529 = load i32, ptr %528, align 4, !tbaa !20
  %530 = zext i32 %529 to i64
  %531 = and i64 %530, 1048575
  %532 = icmp eq i64 %531, 0
  br i1 %532, label %533, label %540

533:                                              ; preds = %521
  %534 = load ptr, ptr %5, align 8, !tbaa !5
  %535 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %534, i32 0, i32 0
  %536 = load i32, ptr %535, align 4, !tbaa !20
  %537 = zext i32 %536 to i64
  %538 = and i64 %537, 2080374784
  %539 = lshr i64 %538, 26
  br label %549

540:                                              ; preds = %521
  %541 = load ptr, ptr %5, align 8, !tbaa !5
  %542 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %541, i32 0, i32 0
  %543 = load i32, ptr %542, align 4, !tbaa !20
  %544 = call i32 @__RBIT(i32 noundef %543)
  %545 = call i32 @llvm.ctlz.i32(i32 %544, i1 true)
  %546 = trunc i32 %545 to i8
  %547 = zext i8 %546 to i32
  %548 = zext i32 %547 to i64
  br label %549

549:                                              ; preds = %540, %533
  %550 = phi i64 [ %539, %533 ], [ %548, %540 ]
  %551 = add i64 %550, 1
  %552 = and i64 %551, 31
  %553 = sub i64 %552, 10
  %554 = mul i64 3, %553
  %555 = shl i64 %554, 20
  %556 = or i64 33554432, %555
  %557 = or i64 %526, %556
  br label %558

558:                                              ; preds = %549, %463
  %559 = phi i64 [ %470, %463 ], [ %557, %549 ]
  %560 = trunc i64 %559 to i32
  %561 = load ptr, ptr %5, align 8, !tbaa !5
  %562 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %561, i32 0, i32 2
  %563 = load i32, ptr %562, align 4, !tbaa !24
  call void @LL_ADC_SetChannelSamplingTime(ptr noundef %357, i32 noundef %560, i32 noundef %563)
  br label %564

564:                                              ; preds = %558, %339
  %565 = load ptr, ptr %5, align 8, !tbaa !5
  %566 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %565, i32 0, i32 0
  %567 = load i32, ptr %566, align 4, !tbaa !20
  %568 = zext i32 %567 to i64
  %569 = and i64 %568, 2147483648
  %570 = icmp ne i64 %569, 0
  br i1 %570, label %571, label %741

571:                                              ; preds = %564
  %572 = load ptr, ptr %4, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %572, i32 0, i32 0
  %574 = load ptr, ptr %573, align 8, !tbaa !18
  %575 = icmp eq ptr %574, inttoptr (i64 1073881088 to ptr)
  br i1 %575, label %581, label %576

576:                                              ; preds = %571
  %577 = load ptr, ptr %4, align 8, !tbaa !5
  %578 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %577, i32 0, i32 0
  %579 = load ptr, ptr %578, align 8, !tbaa !18
  %580 = icmp eq ptr %579, inttoptr (i64 1073881344 to ptr)
  br label %581

581:                                              ; preds = %576, %571
  %582 = phi i1 [ true, %571 ], [ %580, %576 ]
  %583 = zext i1 %582 to i64
  %584 = select i1 %582, ptr inttoptr (i64 1073881856 to ptr), ptr inttoptr (i64 1476551424 to ptr)
  %585 = call i32 @LL_ADC_GetCommonPathInternalCh(ptr noundef %584)
  store i32 %585, ptr %8, align 4, !tbaa !9
  %586 = load ptr, ptr %4, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %586, i32 0, i32 0
  %588 = load ptr, ptr %587, align 8, !tbaa !18
  %589 = icmp eq ptr %588, inttoptr (i64 1073881088 to ptr)
  br i1 %589, label %595, label %590

590:                                              ; preds = %581
  %591 = load ptr, ptr %4, align 8, !tbaa !5
  %592 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %591, i32 0, i32 0
  %593 = load ptr, ptr %592, align 8, !tbaa !18
  %594 = icmp eq ptr %593, inttoptr (i64 1073881344 to ptr)
  br label %595

595:                                              ; preds = %590, %581
  %596 = phi i1 [ true, %581 ], [ %594, %590 ]
  %597 = zext i1 %596 to i64
  %598 = select i1 %596, ptr inttoptr (i64 1073881856 to ptr), ptr inttoptr (i64 1476551424 to ptr)
  %599 = icmp eq ptr %598, inttoptr (i64 1073881856 to ptr)
  br i1 %599, label %600, label %604

600:                                              ; preds = %595
  %601 = call i32 @LL_ADC_IsEnabled(ptr noundef inttoptr (i64 1073881088 to ptr))
  %602 = call i32 @LL_ADC_IsEnabled(ptr noundef inttoptr (i64 1073881344 to ptr))
  %603 = or i32 %601, %602
  br label %606

604:                                              ; preds = %595
  %605 = call i32 @LL_ADC_IsEnabled(ptr noundef inttoptr (i64 1476550656 to ptr))
  br label %606

606:                                              ; preds = %604, %600
  %607 = phi i32 [ %603, %600 ], [ %605, %604 ]
  %608 = zext i32 %607 to i64
  %609 = icmp eq i64 %608, 0
  br i1 %609, label %610, label %733

610:                                              ; preds = %606
  %611 = load ptr, ptr %5, align 8, !tbaa !5
  %612 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %611, i32 0, i32 0
  %613 = load i32, ptr %612, align 4, !tbaa !20
  %614 = zext i32 %613 to i64
  %615 = icmp eq i64 %614, 3414425600
  br i1 %615, label %616, label %659

616:                                              ; preds = %610
  %617 = load i32, ptr %8, align 4, !tbaa !9
  %618 = zext i32 %617 to i64
  %619 = and i64 %618, 8388608
  %620 = icmp eq i64 %619, 0
  br i1 %620, label %621, label %659

621:                                              ; preds = %616
  %622 = load ptr, ptr %4, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %622, i32 0, i32 0
  %624 = load ptr, ptr %623, align 8, !tbaa !18
  %625 = icmp eq ptr %624, inttoptr (i64 1476550656 to ptr)
  br i1 %625, label %626, label %658

626:                                              ; preds = %621
  %627 = load ptr, ptr %4, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %627, i32 0, i32 0
  %629 = load ptr, ptr %628, align 8, !tbaa !18
  %630 = icmp eq ptr %629, inttoptr (i64 1073881088 to ptr)
  br i1 %630, label %636, label %631

631:                                              ; preds = %626
  %632 = load ptr, ptr %4, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %632, i32 0, i32 0
  %634 = load ptr, ptr %633, align 8, !tbaa !18
  %635 = icmp eq ptr %634, inttoptr (i64 1073881344 to ptr)
  br label %636

636:                                              ; preds = %631, %626
  %637 = phi i1 [ true, %626 ], [ %635, %631 ]
  %638 = zext i1 %637 to i64
  %639 = select i1 %637, ptr inttoptr (i64 1073881856 to ptr), ptr inttoptr (i64 1476551424 to ptr)
  %640 = load i32, ptr %8, align 4, !tbaa !9
  %641 = zext i32 %640 to i64
  %642 = or i64 8388608, %641
  %643 = trunc i64 %642 to i32
  call void @LL_ADC_SetCommonPathInternalCh(ptr noundef %639, i32 noundef %643)
  %644 = load i32, ptr @SystemCoreClock, align 4, !tbaa !9
  %645 = zext i32 %644 to i64
  %646 = udiv i64 %645, 200000
  %647 = add i64 %646, 1
  %648 = mul i64 2, %647
  %649 = trunc i64 %648 to i32
  store volatile i32 %649, ptr %9, align 4, !tbaa !9
  br label %650

650:                                              ; preds = %654, %636
  %651 = load volatile i32, ptr %9, align 4, !tbaa !9
  %652 = zext i32 %651 to i64
  %653 = icmp ne i64 %652, 0
  br i1 %653, label %654, label %657

654:                                              ; preds = %650
  %655 = load volatile i32, ptr %9, align 4, !tbaa !9
  %656 = add i32 %655, -1
  store volatile i32 %656, ptr %9, align 4, !tbaa !9
  br label %650, !llvm.loop !36

657:                                              ; preds = %650
  br label %658

658:                                              ; preds = %657, %621
  br label %732

659:                                              ; preds = %616, %610
  %660 = load ptr, ptr %5, align 8, !tbaa !5
  %661 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %660, i32 0, i32 0
  %662 = load i32, ptr %661, align 4, !tbaa !20
  %663 = zext i32 %662 to i64
  %664 = icmp eq i64 %663, 3344039936
  br i1 %664, label %665, label %694

665:                                              ; preds = %659
  %666 = load i32, ptr %8, align 4, !tbaa !9
  %667 = zext i32 %666 to i64
  %668 = and i64 %667, 16777216
  %669 = icmp eq i64 %668, 0
  br i1 %669, label %670, label %694

670:                                              ; preds = %665
  %671 = load ptr, ptr %4, align 8, !tbaa !5
  %672 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %671, i32 0, i32 0
  %673 = load ptr, ptr %672, align 8, !tbaa !18
  %674 = icmp eq ptr %673, inttoptr (i64 1476550656 to ptr)
  br i1 %674, label %675, label %693

675:                                              ; preds = %670
  %676 = load ptr, ptr %4, align 8, !tbaa !5
  %677 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %676, i32 0, i32 0
  %678 = load ptr, ptr %677, align 8, !tbaa !18
  %679 = icmp eq ptr %678, inttoptr (i64 1073881088 to ptr)
  br i1 %679, label %685, label %680

680:                                              ; preds = %675
  %681 = load ptr, ptr %4, align 8, !tbaa !5
  %682 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %681, i32 0, i32 0
  %683 = load ptr, ptr %682, align 8, !tbaa !18
  %684 = icmp eq ptr %683, inttoptr (i64 1073881344 to ptr)
  br label %685

685:                                              ; preds = %680, %675
  %686 = phi i1 [ true, %675 ], [ %684, %680 ]
  %687 = zext i1 %686 to i64
  %688 = select i1 %686, ptr inttoptr (i64 1073881856 to ptr), ptr inttoptr (i64 1476551424 to ptr)
  %689 = load i32, ptr %8, align 4, !tbaa !9
  %690 = zext i32 %689 to i64
  %691 = or i64 16777216, %690
  %692 = trunc i64 %691 to i32
  call void @LL_ADC_SetCommonPathInternalCh(ptr noundef %688, i32 noundef %692)
  br label %693

693:                                              ; preds = %685, %670
  br label %731

694:                                              ; preds = %665, %659
  %695 = load ptr, ptr %5, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.ADC_ChannelConfTypeDef, ptr %695, i32 0, i32 0
  %697 = load i32, ptr %696, align 4, !tbaa !20
  %698 = zext i32 %697 to i64
  %699 = icmp eq i64 %698, 3484942336
  br i1 %699, label %700, label %729

700:                                              ; preds = %694
  %701 = load i32, ptr %8, align 4, !tbaa !9
  %702 = zext i32 %701 to i64
  %703 = and i64 %702, 4194304
  %704 = icmp eq i64 %703, 0
  br i1 %704, label %705, label %729

705:                                              ; preds = %700
  %706 = load ptr, ptr %4, align 8, !tbaa !5
  %707 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %706, i32 0, i32 0
  %708 = load ptr, ptr %707, align 8, !tbaa !18
  %709 = icmp eq ptr %708, inttoptr (i64 1476550656 to ptr)
  br i1 %709, label %710, label %728

710:                                              ; preds = %705
  %711 = load ptr, ptr %4, align 8, !tbaa !5
  %712 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %711, i32 0, i32 0
  %713 = load ptr, ptr %712, align 8, !tbaa !18
  %714 = icmp eq ptr %713, inttoptr (i64 1073881088 to ptr)
  br i1 %714, label %720, label %715

715:                                              ; preds = %710
  %716 = load ptr, ptr %4, align 8, !tbaa !5
  %717 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %716, i32 0, i32 0
  %718 = load ptr, ptr %717, align 8, !tbaa !18
  %719 = icmp eq ptr %718, inttoptr (i64 1073881344 to ptr)
  br label %720

720:                                              ; preds = %715, %710
  %721 = phi i1 [ true, %710 ], [ %719, %715 ]
  %722 = zext i1 %721 to i64
  %723 = select i1 %721, ptr inttoptr (i64 1073881856 to ptr), ptr inttoptr (i64 1476551424 to ptr)
  %724 = load i32, ptr %8, align 4, !tbaa !9
  %725 = zext i32 %724 to i64
  %726 = or i64 4194304, %725
  %727 = trunc i64 %726 to i32
  call void @LL_ADC_SetCommonPathInternalCh(ptr noundef %723, i32 noundef %727)
  br label %728

728:                                              ; preds = %720, %705
  br label %730

729:                                              ; preds = %700, %694
  br label %730

730:                                              ; preds = %729, %728
  br label %731

731:                                              ; preds = %730, %693
  br label %732

732:                                              ; preds = %731, %658
  br label %740

733:                                              ; preds = %606
  %734 = load ptr, ptr %4, align 8, !tbaa !5
  %735 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %734, i32 0, i32 4
  %736 = load volatile i32, ptr %735, align 4, !tbaa !38
  %737 = zext i32 %736 to i64
  %738 = or i64 %737, 32
  %739 = trunc i64 %738 to i32
  store volatile i32 %739, ptr %735, align 4, !tbaa !38
  store i32 1, ptr %6, align 4, !tbaa !9
  br label %740

740:                                              ; preds = %733, %732
  br label %741

741:                                              ; preds = %740, %564
  br label %742

742:                                              ; preds = %741, %332
  br label %750

743:                                              ; preds = %58
  %744 = load ptr, ptr %4, align 8, !tbaa !5
  %745 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %744, i32 0, i32 4
  %746 = load volatile i32, ptr %745, align 4, !tbaa !38
  %747 = zext i32 %746 to i64
  %748 = or i64 %747, 32
  %749 = trunc i64 %748 to i32
  store volatile i32 %749, ptr %745, align 4, !tbaa !38
  store i32 1, ptr %6, align 4, !tbaa !9
  br label %750

750:                                              ; preds = %743, %742
  br label %751

751:                                              ; preds = %750
  %752 = load ptr, ptr %4, align 8, !tbaa !5
  %753 = getelementptr inbounds %struct.ADC_HandleTypeDef, ptr %752, i32 0, i32 3
  store i32 0, ptr %753, align 8, !tbaa !19
  br label %754

754:                                              ; preds = %751
  br label %755

755:                                              ; preds = %754
  %756 = load i32, ptr %6, align 4, !tbaa !9
  store i32 %756, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %757

757:                                              ; preds = %755, %52
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  %758 = load i32, ptr %3, align 4
  ret i32 %758
}

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @__RBIT(i32 noundef) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.ctlz.i32(i32, i1 immarg) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_REG_SetSequencerRanks(ptr noundef, i32 noundef, i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetChannelSamplingTime(ptr noundef, i32 noundef, i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetOffset(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetOffsetSignedSaturation(ptr noundef, i32 noundef, i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetDataRightShift(ptr noundef, i32 noundef, i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetChannelSingleDiff(ptr noundef, i32 noundef, i32 noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_GetCommonPathInternalCh(ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetCommonPathInternalCh(ptr noundef, i32 noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind 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 = { alwaysinline 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 #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 64}
!12 = !{!"", !6, i64 0, !13, i64 8, !6, i64 88, !10, i64 96, !10, i64 100, !10, i64 104, !15, i64 108}
!13 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !14, i64 60}
!14 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12}
!15 = !{!"", !10, i64 0, !10, i64 4}
!16 = !{!17, !10, i64 12}
!17 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28}
!18 = !{!12, !6, i64 0}
!19 = !{!12, !10, i64 96}
!20 = !{!17, !10, i64 0}
!21 = !{!22, !10, i64 28}
!22 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !7, i64 80, !10, i64 96, !10, i64 100, !10, i64 104, !10, i64 108, !7, i64 112, !10, i64 128, !10, i64 132, !10, i64 136, !10, i64 140, !7, i64 144, !10, i64 160, !10, i64 164, !10, i64 168, !10, i64 172, !10, i64 176, !10, i64 180, !10, i64 184, !10, i64 188, !10, i64 192, !10, i64 196, !10, i64 200}
!23 = !{!17, !10, i64 4}
!24 = !{!17, !10, i64 8}
!25 = !{!26, !10, i64 0}
!26 = !{!"", !10, i64 0, !10, i64 4, !7, i64 8, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84}
!27 = !{!17, !10, i64 20}
!28 = !{!22, !10, i64 12}
!29 = !{!17, !10, i64 16}
!30 = !{!17, !10, i64 28}
!31 = !{!17, !10, i64 24}
!32 = !{!22, !10, i64 96}
!33 = !{!22, !10, i64 100}
!34 = !{!22, !10, i64 104}
!35 = !{!22, !10, i64 108}
!36 = distinct !{!36, !37}
!37 = !{!"llvm.loop.mustprogress"}
!38 = !{!12, !10, i64 100}


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

@SystemCoreClock = external local_unnamed_addr global i32, align 4

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_REG_IsConversionOngoing(ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_IsEnabled(ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_INJ_IsConversionOngoing(ptr noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 3) i32 @HAL_ADC_ConfigChannel(ptr noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #2 {
  %3 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3)
  store volatile i32 0, ptr %3, align 4, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %1, i64 12
  %5 = getelementptr inbounds i8, ptr %0, i64 96
  %6 = load i32, ptr %5, align 8, !tbaa !9
  %7 = icmp eq i32 %6, 1
  br i1 %7, label %297, label %8

8:                                                ; preds = %2
  store i32 1, ptr %5, align 8, !tbaa !9
  %9 = load ptr, ptr %0, align 8, !tbaa !15
  %10 = tail call i32 @LL_ADC_REG_IsConversionOngoing(ptr noundef %9)
  %11 = icmp eq i32 %10, 0
  br i1 %11, label %12, label %293

12:                                               ; preds = %8
  %13 = load i32, ptr %1, align 4, !tbaa !16
  %14 = and i32 %13, 1048575
  %15 = icmp eq i32 %14, 0
  br i1 %15, label %16, label %19

16:                                               ; preds = %12
  %17 = lshr i32 %13, 26
  %18 = and i32 %17, 31
  br label %22

19:                                               ; preds = %12
  %20 = tail call i32 @__RBIT(i32 noundef %13)
  %21 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %20, i1 true)
  br label %22

22:                                               ; preds = %19, %16
  %23 = phi i32 [ %18, %16 ], [ %21, %19 ]
  %24 = shl nuw i32 1, %23
  %25 = load ptr, ptr %0, align 8, !tbaa !15
  %26 = getelementptr inbounds i8, ptr %25, i64 28
  %27 = load volatile i32, ptr %26, align 4, !tbaa !18
  %28 = or i32 %27, %24
  store volatile i32 %28, ptr %26, align 4, !tbaa !18
  %29 = getelementptr inbounds i8, ptr %1, i64 4
  %30 = load i32, ptr %29, align 4, !tbaa !20
  %31 = load i32, ptr %1, align 4, !tbaa !16
  tail call void @LL_ADC_REG_SetSequencerRanks(ptr noundef %25, i32 noundef %30, i32 noundef %31)
  %32 = load ptr, ptr %0, align 8, !tbaa !15
  %33 = tail call i32 @LL_ADC_REG_IsConversionOngoing(ptr noundef %32)
  %34 = load ptr, ptr %0, align 8, !tbaa !15
  %35 = tail call i32 @LL_ADC_INJ_IsConversionOngoing(ptr noundef %34)
  %36 = icmp eq i32 %33, 0
  %37 = icmp eq i32 %35, 0
  %or.cond = select i1 %36, i1 %37, i1 false
  %.pre127 = load ptr, ptr %0, align 8, !tbaa !15
  br i1 %or.cond, label %38, label %123

38:                                               ; preds = %22
  %39 = load i32, ptr %1, align 4, !tbaa !16
  %40 = getelementptr inbounds i8, ptr %1, i64 8
  %41 = load i32, ptr %40, align 4, !tbaa !21
  tail call void @LL_ADC_SetChannelSamplingTime(ptr noundef %.pre127, i32 noundef %39, i32 noundef %41)
  %42 = load volatile i32, ptr inttoptr (i64 1543507968 to ptr), align 4096, !tbaa !22
  %43 = and i32 %42, -268435456
  %44 = icmp eq i32 %43, 268435456
  br i1 %44, label %45, label %54

45:                                               ; preds = %38
  %46 = getelementptr inbounds i8, ptr %1, i64 20
  %47 = load i32, ptr %46, align 4, !tbaa !24
  %48 = load ptr, ptr %0, align 8, !tbaa !15
  %49 = getelementptr inbounds i8, ptr %48, i64 12
  %50 = load volatile i32, ptr %49, align 4, !tbaa !25
  %51 = lshr i32 %50, 1
  %52 = and i32 %51, 14
  %53 = shl i32 %47, %52
  br label %70

54:                                               ; preds = %38
  %55 = load ptr, ptr %0, align 8, !tbaa !15
  %56 = getelementptr inbounds i8, ptr %55, i64 12
  %57 = load volatile i32, ptr %56, align 4, !tbaa !25
  %58 = and i32 %57, 16
  %59 = icmp eq i32 %58, 0
  %60 = getelementptr inbounds i8, ptr %1, i64 20
  %61 = load i32, ptr %60, align 4, !tbaa !24
  %62 = load volatile i32, ptr %56, align 4, !tbaa !25
  %63 = lshr i32 %62, 1
  br i1 %59, label %64, label %67

64:                                               ; preds = %54
  %65 = and i32 %63, 14
  %66 = shl i32 %61, %65
  br label %70

67:                                               ; preds = %54
  %68 = and i32 %63, 8
  %69 = shl i32 %61, %68
  br label %70

70:                                               ; preds = %64, %67, %45
  %71 = phi ptr [ %48, %45 ], [ %55, %64 ], [ %55, %67 ]
  %72 = phi i32 [ %53, %45 ], [ %66, %64 ], [ %69, %67 ]
  %73 = getelementptr inbounds i8, ptr %1, i64 16
  %74 = load i32, ptr %73, align 4, !tbaa !26
  %.not116 = icmp eq i32 %74, 4
  br i1 %.not116, label %89, label %75

75:                                               ; preds = %70
  %76 = load i32, ptr %1, align 4, !tbaa !16
  tail call void @LL_ADC_SetOffset(ptr noundef nonnull %71, i32 noundef %74, i32 noundef %76, i32 noundef %72)
  %77 = load ptr, ptr %0, align 8, !tbaa !15
  %78 = load i32, ptr %73, align 4, !tbaa !26
  %79 = getelementptr inbounds i8, ptr %1, i64 28
  %80 = load i32, ptr %79, align 4, !tbaa !27
  %81 = icmp eq i32 %80, 1
  %82 = select i1 %81, i32 -2147483648, i32 0
  tail call void @LL_ADC_SetOffsetSignedSaturation(ptr noundef %77, i32 noundef %78, i32 noundef %82)
  %83 = load ptr, ptr %0, align 8, !tbaa !15
  %84 = load i32, ptr %73, align 4, !tbaa !26
  %85 = getelementptr inbounds i8, ptr %1, i64 24
  %86 = load i32, ptr %85, align 4, !tbaa !28
  %87 = icmp eq i32 %86, 1
  %88 = select i1 %87, i32 2048, i32 0
  tail call void @LL_ADC_SetDataRightShift(ptr noundef %83, i32 noundef %84, i32 noundef %88)
  %.pre = load ptr, ptr %0, align 8, !tbaa !15
  br label %123

89:                                               ; preds = %70
  %90 = getelementptr inbounds i8, ptr %71, i64 96
  %91 = load volatile i32, ptr %90, align 4, !tbaa !29
  %92 = and i32 %91, 2080374784
  %93 = load i32, ptr %1, align 4, !tbaa !16
  %94 = shl i32 %93, 26
  %95 = icmp eq i32 %92, %94
  br i1 %95, label %96, label %99

96:                                               ; preds = %89
  %97 = load volatile i32, ptr %90, align 4, !tbaa !29
  %98 = and i32 %97, 2147483647
  store volatile i32 %98, ptr %90, align 4, !tbaa !29
  br label %99

99:                                               ; preds = %96, %89
  %100 = getelementptr inbounds i8, ptr %71, i64 100
  %101 = load volatile i32, ptr %100, align 4, !tbaa !30
  %102 = and i32 %101, 2080374784
  %103 = icmp eq i32 %102, %94
  br i1 %103, label %104, label %107

104:                                              ; preds = %99
  %105 = load volatile i32, ptr %100, align 4, !tbaa !30
  %106 = and i32 %105, 2147483647
  store volatile i32 %106, ptr %100, align 4, !tbaa !30
  br label %107

107:                                              ; preds = %104, %99
  %108 = getelementptr inbounds i8, ptr %71, i64 104
  %109 = load volatile i32, ptr %108, align 4, !tbaa !31
  %110 = and i32 %109, 2080374784
  %111 = icmp eq i32 %110, %94
  br i1 %111, label %112, label %115

112:                                              ; preds = %107
  %113 = load volatile i32, ptr %108, align 4, !tbaa !31
  %114 = and i32 %113, 2147483647
  store volatile i32 %114, ptr %108, align 4, !tbaa !31
  br label %115

115:                                              ; preds = %112, %107
  %116 = getelementptr inbounds i8, ptr %71, i64 108
  %117 = load volatile i32, ptr %116, align 4, !tbaa !32
  %118 = and i32 %117, 2080374784
  %119 = icmp eq i32 %118, %94
  br i1 %119, label %120, label %123

120:                                              ; preds = %115
  %121 = load volatile i32, ptr %116, align 4, !tbaa !32
  %122 = and i32 %121, 2147483647
  store volatile i32 %122, ptr %116, align 4, !tbaa !32
  br label %123

123:                                              ; preds = %75, %120, %115, %22
  %124 = phi ptr [ %.pre, %75 ], [ %71, %120 ], [ %71, %115 ], [ %.pre127, %22 ]
  %125 = tail call i32 @LL_ADC_IsEnabled(ptr noundef %124)
  %126 = icmp eq i32 %125, 0
  br i1 %126, label %127, label %.loopexit

127:                                              ; preds = %123
  %128 = load ptr, ptr %0, align 8, !tbaa !15
  %129 = load i32, ptr %1, align 4, !tbaa !16
  %130 = load i32, ptr %4, align 4, !tbaa !33
  tail call void @LL_ADC_SetChannelSingleDiff(ptr noundef %128, i32 noundef %129, i32 noundef %130)
  %131 = load i32, ptr %4, align 4, !tbaa !33
  %132 = icmp eq i32 %131, 1207894016
  br i1 %132, label %133, label %239

133:                                              ; preds = %127
  %134 = load ptr, ptr %0, align 8, !tbaa !15
  %135 = load i32, ptr %1, align 4, !tbaa !16
  %136 = zext i32 %135 to i64
  %137 = and i64 %136, 1048575
  %138 = icmp eq i64 %137, 0
  br i1 %138, label %139, label %141

139:                                              ; preds = %133
  %140 = lshr i64 %136, 26
  br label %145

141:                                              ; preds = %133
  %142 = tail call i32 @__RBIT(i32 noundef %135)
  %143 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %142, i1 true)
  %144 = zext nneg i32 %143 to i64
  br label %145

145:                                              ; preds = %141, %139
  %146 = phi i64 [ %140, %139 ], [ %144, %141 ]
  %147 = add nuw nsw i64 %146, 1
  %148 = and i64 %147, 30
  %149 = icmp ult i64 %148, 10
  %150 = load i32, ptr %1, align 4, !tbaa !16
  %151 = and i32 %150, 1048575
  %152 = icmp eq i32 %151, 0
  br i1 %149, label %153, label %193

153:                                              ; preds = %145
  br i1 %152, label %154, label %157

154:                                              ; preds = %153
  %155 = lshr i32 %150, 26
  %156 = and i32 %155, 31
  br label %160

157:                                              ; preds = %153
  %158 = tail call i32 @__RBIT(i32 noundef %150)
  %159 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %158, i1 true)
  %.pre130 = load i32, ptr %1, align 4, !tbaa !16
  br label %160

160:                                              ; preds = %157, %154
  %161 = phi i32 [ %150, %154 ], [ %.pre130, %157 ]
  %162 = phi i32 [ %156, %154 ], [ %159, %157 ]
  %163 = shl nuw nsw i32 %162, 26
  %164 = add nuw i32 %163, 67108864
  %165 = and i32 %164, 2080374784
  %166 = and i32 %161, 1048575
  %167 = icmp eq i32 %166, 0
  br i1 %167, label %168, label %170

168:                                              ; preds = %160
  %169 = lshr i32 %161, 26
  br label %173

170:                                              ; preds = %160
  %171 = tail call i32 @__RBIT(i32 noundef %161)
  %172 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %171, i1 true)
  %.pre131 = load i32, ptr %1, align 4, !tbaa !16
  br label %173

173:                                              ; preds = %170, %168
  %174 = phi i32 [ %161, %168 ], [ %.pre131, %170 ]
  %175 = phi i32 [ %169, %168 ], [ %172, %170 ]
  %176 = add nuw nsw i32 %175, 1
  %177 = and i32 %176, 31
  %178 = shl nuw i32 1, %177
  %179 = or i32 %178, %165
  %180 = and i32 %174, 1048575
  %181 = icmp eq i32 %180, 0
  br i1 %181, label %182, label %184

182:                                              ; preds = %173
  %183 = lshr i32 %174, 26
  br label %187

184:                                              ; preds = %173
  %185 = tail call i32 @__RBIT(i32 noundef %174)
  %186 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %185, i1 true)
  br label %187

187:                                              ; preds = %184, %182
  %188 = phi i32 [ %183, %182 ], [ %186, %184 ]
  %189 = add nuw nsw i32 %188, 1
  %190 = and i32 %189, 31
  %191 = mul nuw nsw i32 %190, 3145728
  %192 = or i32 %179, %191
  br label %235

193:                                              ; preds = %145
  br i1 %152, label %194, label %197

194:                                              ; preds = %193
  %195 = lshr i32 %150, 26
  %196 = and i32 %195, 31
  br label %200

197:                                              ; preds = %193
  %198 = tail call i32 @__RBIT(i32 noundef %150)
  %199 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %198, i1 true)
  %.pre128 = load i32, ptr %1, align 4, !tbaa !16
  br label %200

200:                                              ; preds = %197, %194
  %201 = phi i32 [ %150, %194 ], [ %.pre128, %197 ]
  %202 = phi i32 [ %196, %194 ], [ %199, %197 ]
  %203 = shl nuw nsw i32 %202, 26
  %204 = add nuw i32 %203, 67108864
  %205 = and i32 %204, 2080374784
  %206 = and i32 %201, 1048575
  %207 = icmp eq i32 %206, 0
  br i1 %207, label %208, label %210

208:                                              ; preds = %200
  %209 = lshr i32 %201, 26
  br label %213

210:                                              ; preds = %200
  %211 = tail call i32 @__RBIT(i32 noundef %201)
  %212 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %211, i1 true)
  %.pre129 = load i32, ptr %1, align 4, !tbaa !16
  br label %213

213:                                              ; preds = %210, %208
  %214 = phi i32 [ %201, %208 ], [ %.pre129, %210 ]
  %215 = phi i32 [ %209, %208 ], [ %212, %210 ]
  %216 = add nuw nsw i32 %215, 1
  %217 = and i32 %216, 31
  %218 = shl nuw i32 1, %217
  %219 = and i32 %214, 1048575
  %220 = icmp eq i32 %219, 0
  br i1 %220, label %221, label %223

221:                                              ; preds = %213
  %222 = lshr i32 %214, 26
  br label %226

223:                                              ; preds = %213
  %224 = tail call i32 @__RBIT(i32 noundef %214)
  %225 = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 %224, i1 true)
  br label %226

226:                                              ; preds = %223, %221
  %227 = phi i32 [ %222, %221 ], [ %225, %223 ]
  %228 = add nuw nsw i32 %227, 1
  %229 = and i32 %228, 31
  %230 = mul nuw nsw i32 %229, 3145728
  %231 = add nsw i32 %230, -31457280
  %232 = or i32 %205, %218
  %233 = or i32 %232, %231
  %234 = or i32 %233, 33554432
  br label %235

235:                                              ; preds = %226, %187
  %236 = phi i32 [ %192, %187 ], [ %234, %226 ]
  %237 = getelementptr inbounds i8, ptr %1, i64 8
  %238 = load i32, ptr %237, align 4, !tbaa !21
  tail call void @LL_ADC_SetChannelSamplingTime(ptr noundef %134, i32 noundef %236, i32 noundef %238)
  br label %239

239:                                              ; preds = %235, %127
  %240 = load i32, ptr %1, align 4, !tbaa !16
  %.not117 = icmp sgt i32 %240, -1
  br i1 %.not117, label %.loopexit, label %241

241:                                              ; preds = %239
  %242 = load ptr, ptr %0, align 8, !tbaa !15
  %243 = icmp eq ptr %242, inttoptr (i64 1073881088 to ptr)
  %244 = icmp eq ptr %242, inttoptr (i64 1073881344 to ptr)
  %spec.select = or i1 %243, %244
  %245 = select i1 %spec.select, ptr inttoptr (i64 1073881856 to ptr), ptr inttoptr (i64 1476551424 to ptr)
  %246 = tail call i32 @LL_ADC_GetCommonPathInternalCh(ptr noundef nonnull %245)
  %247 = load ptr, ptr %0, align 8, !tbaa !15
  %magicptr = ptrtoint ptr %247 to i64
  switch i64 %magicptr, label %252 [
    i64 1073881344, label %248
    i64 1073881088, label %248
  ]

248:                                              ; preds = %241, %241
  %249 = tail call i32 @LL_ADC_IsEnabled(ptr noundef nonnull inttoptr (i64 1073881088 to ptr))
  %250 = tail call i32 @LL_ADC_IsEnabled(ptr noundef nonnull inttoptr (i64 1073881344 to ptr))
  %251 = or i32 %250, %249
  br label %254

252:                                              ; preds = %241
  %253 = tail call i32 @LL_ADC_IsEnabled(ptr noundef nonnull inttoptr (i64 1476550656 to ptr))
  br label %254

254:                                              ; preds = %252, %248
  %255 = phi i32 [ %251, %248 ], [ %253, %252 ]
  %256 = icmp eq i32 %255, 0
  br i1 %256, label %257, label %289

257:                                              ; preds = %254
  %258 = load i32, ptr %1, align 4, !tbaa !16
  %259 = icmp eq i32 %258, -880541696
  %260 = and i32 %246, 8388608
  %261 = icmp eq i32 %260, 0
  %or.cond120 = select i1 %259, i1 %261, i1 false
  br i1 %or.cond120, label %262, label %271

262:                                              ; preds = %257
  %263 = load ptr, ptr %0, align 8, !tbaa !15
  %264 = icmp eq ptr %263, inttoptr (i64 1476550656 to ptr)
  br i1 %264, label %265, label %.loopexit

265:                                              ; preds = %262
  %266 = or disjoint i32 %246, 8388608
  tail call void @LL_ADC_SetCommonPathInternalCh(ptr noundef nonnull inttoptr (i64 1476551424 to ptr), i32 noundef %266)
  %267 = load i32, ptr @SystemCoreClock, align 4, !tbaa !5
  %268 = udiv i32 %267, 200000
  %narrow = shl nuw nsw i32 %268, 1
  %269 = add nuw nsw i32 %narrow, 2
  store volatile i32 %269, ptr %3, align 4, !tbaa !5
  %.0..0..0..0.125 = load volatile i32, ptr %3, align 4, !tbaa !5
  %.not118126 = icmp eq i32 %.0..0..0..0.125, 0
  br i1 %.not118126, label %.loopexit, label %.lr.ph

.lr.ph:                                           ; preds = %265, %.lr.ph
  %.0..0..0..0.4 = load volatile i32, ptr %3, align 4, !tbaa !5
  %270 = add i32 %.0..0..0..0.4, -1
  store volatile i32 %270, ptr %3, align 4, !tbaa !5
  %.0..0..0..0. = load volatile i32, ptr %3, align 4, !tbaa !5
  %.not118 = icmp eq i32 %.0..0..0..0., 0
  br i1 %.not118, label %.loopexit, label %.lr.ph, !llvm.loop !34

271:                                              ; preds = %257
  %272 = icmp eq i32 %258, -950927360
  %273 = and i32 %246, 16777216
  %274 = icmp eq i32 %273, 0
  %or.cond122 = select i1 %272, i1 %274, i1 false
  br i1 %or.cond122, label %275, label %280

275:                                              ; preds = %271
  %276 = load ptr, ptr %0, align 8, !tbaa !15
  %277 = icmp eq ptr %276, inttoptr (i64 1476550656 to ptr)
  br i1 %277, label %278, label %.loopexit

278:                                              ; preds = %275
  %279 = or disjoint i32 %246, 16777216
  tail call void @LL_ADC_SetCommonPathInternalCh(ptr noundef nonnull inttoptr (i64 1476551424 to ptr), i32 noundef %279)
  br label %.loopexit

280:                                              ; preds = %271
  %281 = icmp eq i32 %258, -810024960
  %282 = and i32 %246, 4194304
  %283 = icmp eq i32 %282, 0
  %or.cond124 = select i1 %281, i1 %283, i1 false
  br i1 %or.cond124, label %284, label %.loopexit

284:                                              ; preds = %280
  %285 = load ptr, ptr %0, align 8, !tbaa !15
  %286 = icmp eq ptr %285, inttoptr (i64 1476550656 to ptr)
  br i1 %286, label %287, label %.loopexit

287:                                              ; preds = %284
  %288 = or disjoint i32 %246, 4194304
  tail call void @LL_ADC_SetCommonPathInternalCh(ptr noundef nonnull inttoptr (i64 1476551424 to ptr), i32 noundef %288)
  br label %.loopexit

289:                                              ; preds = %254
  %290 = getelementptr inbounds i8, ptr %0, i64 100
  %291 = load volatile i32, ptr %290, align 4, !tbaa !36
  %292 = or i32 %291, 32
  store volatile i32 %292, ptr %290, align 4, !tbaa !36
  br label %.loopexit

293:                                              ; preds = %8
  %294 = getelementptr inbounds i8, ptr %0, i64 100
  %295 = load volatile i32, ptr %294, align 4, !tbaa !36
  %296 = or i32 %295, 32
  store volatile i32 %296, ptr %294, align 4, !tbaa !36
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph, %265, %293, %239, %262, %287, %284, %280, %275, %278, %289, %123
  %.0110 = phi i32 [ 0, %262 ], [ 0, %278 ], [ 0, %275 ], [ 0, %287 ], [ 0, %284 ], [ 0, %280 ], [ 1, %289 ], [ 0, %239 ], [ 0, %123 ], [ 1, %293 ], [ 0, %265 ], [ 0, %.lr.ph ]
  store i32 0, ptr %5, align 8, !tbaa !9
  br label %297

297:                                              ; preds = %2, %.loopexit
  %.0 = phi i32 [ %.0110, %.loopexit ], [ 2, %2 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3)
  ret i32 %.0
}

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @__RBIT(i32 noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.ctlz.i32(i32, i1 immarg) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_REG_SetSequencerRanks(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetChannelSamplingTime(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetOffset(ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetOffsetSignedSaturation(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetDataRightShift(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetChannelSingleDiff(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @LL_ADC_GetCommonPathInternalCh(ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @LL_ADC_SetCommonPathInternalCh(ptr noundef, i32 noundef) local_unnamed_addr #1

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind 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 = { alwaysinline 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 #4 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }

!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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 96}
!10 = !{!"", !11, i64 0, !12, i64 8, !11, i64 88, !6, i64 96, !6, i64 100, !6, i64 104, !14, i64 108}
!11 = !{!"any pointer", !7, i64 0}
!12 = !{!"", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !6, i64 40, !6, i64 44, !6, i64 48, !6, i64 52, !6, i64 56, !13, i64 60}
!13 = !{!"", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12}
!14 = !{!"", !6, i64 0, !6, i64 4}
!15 = !{!10, !11, i64 0}
!16 = !{!17, !6, i64 0}
!17 = !{!"", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28}
!18 = !{!19, !6, i64 28}
!19 = !{!"", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !6, i64 28, !6, i64 32, !6, i64 36, !6, i64 40, !6, i64 44, !6, i64 48, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68, !6, i64 72, !6, i64 76, !7, i64 80, !6, i64 96, !6, i64 100, !6, i64 104, !6, i64 108, !7, i64 112, !6, i64 128, !6, i64 132, !6, i64 136, !6, i64 140, !7, i64 144, !6, i64 160, !6, i64 164, !6, i64 168, !6, i64 172, !6, i64 176, !6, i64 180, !6, i64 184, !6, i64 188, !6, i64 192, !6, i64 196, !6, i64 200}
!20 = !{!17, !6, i64 4}
!21 = !{!17, !6, i64 8}
!22 = !{!23, !6, i64 0}
!23 = !{!"", !6, i64 0, !6, i64 4, !7, i64 8, !6, i64 52, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68, !6, i64 72, !6, i64 76, !6, i64 80, !6, i64 84}
!24 = !{!17, !6, i64 20}
!25 = !{!19, !6, i64 12}
!26 = !{!17, !6, i64 16}
!27 = !{!17, !6, i64 28}
!28 = !{!17, !6, i64 24}
!29 = !{!19, !6, i64 96}
!30 = !{!19, !6, i64 100}
!31 = !{!19, !6, i64 104}
!32 = !{!19, !6, i64 108}
!33 = !{!17, !6, i64 12}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}
!36 = !{!10, !6, i64 100}


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