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

; 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.DAC_ChannelConfTypeDef = type { i32, i32, i32, i32, i32, i32, %struct.DAC_SampleAndHoldConfTypeDef }
%struct.DAC_SampleAndHoldConfTypeDef = type { i32, i32, i32 }
%struct.DAC_HandleTypeDef = type { ptr, i32, i32, ptr, ptr, i32 }
%struct.DAC_TypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @HAL_DAC_ConfigChannel(ptr noundef %0, ptr noundef %1, i32 noundef %2) #1 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %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
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  store i32 0, ptr %10, align 4, !tbaa !9
  %12 = load ptr, ptr %6, align 8, !tbaa !5
  %13 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %12, i32 0, i32 4
  %14 = load i32, ptr %13, align 4, !tbaa !11
  %15 = icmp eq i32 %14, 1
  br i1 %15, label %16, label %17

16:                                               ; preds = %3
  br label %17

17:                                               ; preds = %16, %3
  %18 = load ptr, ptr %6, align 8, !tbaa !5
  %19 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %18, i32 0, i32 0
  %20 = load i32, ptr %19, align 4, !tbaa !14
  %21 = zext i32 %20 to i64
  %22 = icmp eq i64 %21, 4
  br i1 %22, label %23, label %24

23:                                               ; preds = %17
  br label %24

24:                                               ; preds = %23, %17
  br label %25

25:                                               ; preds = %24
  %26 = load ptr, ptr %5, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %26, i32 0, i32 2
  %28 = load i32, ptr %27, align 4, !tbaa !15
  %29 = icmp eq i32 %28, 1
  br i1 %29, label %30, label %31

30:                                               ; preds = %25
  store i32 2, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %304

31:                                               ; preds = %25
  %32 = load ptr, ptr %5, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %32, i32 0, i32 2
  store i32 1, ptr %33, align 4, !tbaa !15
  br label %34

34:                                               ; preds = %31
  br label %35

35:                                               ; preds = %34
  br label %36

36:                                               ; preds = %35
  %37 = load ptr, ptr %5, align 8, !tbaa !5
  %38 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %37, i32 0, i32 1
  store volatile i32 2, ptr %38, align 8, !tbaa !17
  %39 = load ptr, ptr %6, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %39, i32 0, i32 0
  %41 = load i32, ptr %40, align 4, !tbaa !14
  %42 = zext i32 %41 to i64
  %43 = icmp eq i64 %42, 4
  br i1 %43, label %44, label %169

44:                                               ; preds = %36
  %45 = load i32, ptr %7, align 4, !tbaa !9
  %46 = icmp eq i32 %45, 0
  br i1 %46, label %47, label %80

47:                                               ; preds = %44
  %48 = call i32 @HAL_GetTick()
  store i32 %48, ptr %10, align 4, !tbaa !9
  br label %49

49:                                               ; preds = %70, %47
  %50 = load ptr, ptr %5, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %50, i32 0, i32 0
  %52 = load ptr, ptr %51, align 8, !tbaa !18
  %53 = getelementptr inbounds %struct.DAC_TypeDef, ptr %52, i32 0, i32 13
  %54 = load volatile i32, ptr %53, align 4, !tbaa !19
  %55 = zext i32 %54 to i64
  %56 = and i64 %55, 536903680
  %57 = icmp ne i64 %56, 0
  br i1 %57, label %58, label %71

58:                                               ; preds = %49
  %59 = call i32 @HAL_GetTick()
  %60 = load i32, ptr %10, align 4, !tbaa !9
  %61 = sub i32 %59, %60
  %62 = icmp ugt i32 %61, 1
  br i1 %62, label %63, label %70

63:                                               ; preds = %58
  %64 = load ptr, ptr %5, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %64, i32 0, i32 5
  %66 = load volatile i32, ptr %65, align 8, !tbaa !21
  %67 = or i32 %66, 8
  store volatile i32 %67, ptr %65, align 8, !tbaa !21
  %68 = load ptr, ptr %5, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %68, i32 0, i32 1
  store volatile i32 3, ptr %69, align 8, !tbaa !17
  store i32 3, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %304

70:                                               ; preds = %58
  br label %49, !llvm.loop !22

71:                                               ; preds = %49
  call void @HAL_Delay(i32 noundef 1)
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %72, i32 0, i32 6
  %74 = getelementptr inbounds %struct.DAC_SampleAndHoldConfTypeDef, ptr %73, i32 0, i32 0
  %75 = load i32, ptr %74, align 4, !tbaa !24
  %76 = load ptr, ptr %5, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %76, i32 0, i32 0
  %78 = load ptr, ptr %77, align 8, !tbaa !18
  %79 = getelementptr inbounds %struct.DAC_TypeDef, ptr %78, i32 0, i32 16
  store volatile i32 %75, ptr %79, align 4, !tbaa !25
  br label %112

80:                                               ; preds = %44
  br label %81

81:                                               ; preds = %102, %80
  %82 = load ptr, ptr %5, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %82, i32 0, i32 0
  %84 = load ptr, ptr %83, align 8, !tbaa !18
  %85 = getelementptr inbounds %struct.DAC_TypeDef, ptr %84, i32 0, i32 13
  %86 = load volatile i32, ptr %85, align 4, !tbaa !19
  %87 = zext i32 %86 to i64
  %88 = and i64 %87, 2147483648
  %89 = icmp ne i64 %88, 0
  br i1 %89, label %90, label %103

90:                                               ; preds = %81
  %91 = call i32 @HAL_GetTick()
  %92 = load i32, ptr %10, align 4, !tbaa !9
  %93 = sub i32 %91, %92
  %94 = icmp ugt i32 %93, 1
  br i1 %94, label %95, label %102

95:                                               ; preds = %90
  %96 = load ptr, ptr %5, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %96, i32 0, i32 5
  %98 = load volatile i32, ptr %97, align 8, !tbaa !21
  %99 = or i32 %98, 8
  store volatile i32 %99, ptr %97, align 8, !tbaa !21
  %100 = load ptr, ptr %5, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %100, i32 0, i32 1
  store volatile i32 3, ptr %101, align 8, !tbaa !17
  store i32 3, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %304

102:                                              ; preds = %90
  br label %81, !llvm.loop !26

103:                                              ; preds = %81
  call void @HAL_Delay(i32 noundef 1)
  %104 = load ptr, ptr %6, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %104, i32 0, i32 6
  %106 = getelementptr inbounds %struct.DAC_SampleAndHoldConfTypeDef, ptr %105, i32 0, i32 0
  %107 = load i32, ptr %106, align 4, !tbaa !24
  %108 = load ptr, ptr %5, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %108, i32 0, i32 0
  %110 = load ptr, ptr %109, align 8, !tbaa !18
  %111 = getelementptr inbounds %struct.DAC_TypeDef, ptr %110, i32 0, i32 17
  store volatile i32 %107, ptr %111, align 4, !tbaa !27
  br label %112

112:                                              ; preds = %103, %71
  %113 = load ptr, ptr %5, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !18
  %116 = getelementptr inbounds %struct.DAC_TypeDef, ptr %115, i32 0, i32 18
  %117 = load volatile i32, ptr %116, align 4, !tbaa !28
  %118 = zext i32 %117 to i64
  %119 = load i32, ptr %7, align 4, !tbaa !9
  %120 = zext i32 %119 to i64
  %121 = and i64 %120, 16
  %122 = shl i64 1023, %121
  %123 = xor i64 %122, -1
  %124 = and i64 %118, %123
  %125 = load ptr, ptr %6, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %125, i32 0, i32 6
  %127 = getelementptr inbounds %struct.DAC_SampleAndHoldConfTypeDef, ptr %126, i32 0, i32 1
  %128 = load i32, ptr %127, align 4, !tbaa !29
  %129 = load i32, ptr %7, align 4, !tbaa !9
  %130 = zext i32 %129 to i64
  %131 = and i64 %130, 16
  %132 = trunc i64 %131 to i32
  %133 = shl i32 %128, %132
  %134 = zext i32 %133 to i64
  %135 = or i64 %124, %134
  %136 = trunc i64 %135 to i32
  %137 = load ptr, ptr %5, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %137, i32 0, i32 0
  %139 = load ptr, ptr %138, align 8, !tbaa !18
  %140 = getelementptr inbounds %struct.DAC_TypeDef, ptr %139, i32 0, i32 18
  store volatile i32 %136, ptr %140, align 4, !tbaa !28
  %141 = load ptr, ptr %5, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %141, i32 0, i32 0
  %143 = load ptr, ptr %142, align 8, !tbaa !18
  %144 = getelementptr inbounds %struct.DAC_TypeDef, ptr %143, i32 0, i32 19
  %145 = load volatile i32, ptr %144, align 4, !tbaa !30
  %146 = zext i32 %145 to i64
  %147 = load i32, ptr %7, align 4, !tbaa !9
  %148 = zext i32 %147 to i64
  %149 = and i64 %148, 16
  %150 = shl i64 255, %149
  %151 = xor i64 %150, -1
  %152 = and i64 %146, %151
  %153 = load ptr, ptr %6, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %153, i32 0, i32 6
  %155 = getelementptr inbounds %struct.DAC_SampleAndHoldConfTypeDef, ptr %154, i32 0, i32 2
  %156 = load i32, ptr %155, align 4, !tbaa !31
  %157 = load i32, ptr %7, align 4, !tbaa !9
  %158 = zext i32 %157 to i64
  %159 = and i64 %158, 16
  %160 = trunc i64 %159 to i32
  %161 = shl i32 %156, %160
  %162 = zext i32 %161 to i64
  %163 = or i64 %152, %162
  %164 = trunc i64 %163 to i32
  %165 = load ptr, ptr %5, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %165, i32 0, i32 0
  %167 = load ptr, ptr %166, align 8, !tbaa !18
  %168 = getelementptr inbounds %struct.DAC_TypeDef, ptr %167, i32 0, i32 19
  store volatile i32 %164, ptr %168, align 4, !tbaa !30
  br label %169

169:                                              ; preds = %112, %36
  %170 = load ptr, ptr %6, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %170, i32 0, i32 4
  %172 = load i32, ptr %171, align 4, !tbaa !11
  %173 = icmp eq i32 %172, 1
  br i1 %173, label %174, label %204

174:                                              ; preds = %169
  %175 = load ptr, ptr %5, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %175, i32 0, i32 0
  %177 = load ptr, ptr %176, align 8, !tbaa !18
  %178 = getelementptr inbounds %struct.DAC_TypeDef, ptr %177, i32 0, i32 14
  %179 = load volatile i32, ptr %178, align 4, !tbaa !32
  store i32 %179, ptr %8, align 4, !tbaa !9
  %180 = load i32, ptr %7, align 4, !tbaa !9
  %181 = zext i32 %180 to i64
  %182 = and i64 %181, 16
  %183 = trunc i64 %182 to i32
  %184 = shl i32 31, %183
  %185 = xor i32 %184, -1
  %186 = load i32, ptr %8, align 4, !tbaa !9
  %187 = and i32 %186, %185
  store i32 %187, ptr %8, align 4, !tbaa !9
  %188 = load ptr, ptr %6, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %188, i32 0, i32 5
  %190 = load i32, ptr %189, align 4, !tbaa !33
  store i32 %190, ptr %9, align 4, !tbaa !9
  %191 = load i32, ptr %9, align 4, !tbaa !9
  %192 = load i32, ptr %7, align 4, !tbaa !9
  %193 = zext i32 %192 to i64
  %194 = and i64 %193, 16
  %195 = trunc i64 %194 to i32
  %196 = shl i32 %191, %195
  %197 = load i32, ptr %8, align 4, !tbaa !9
  %198 = or i32 %197, %196
  store i32 %198, ptr %8, align 4, !tbaa !9
  %199 = load i32, ptr %8, align 4, !tbaa !9
  %200 = load ptr, ptr %5, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %200, i32 0, i32 0
  %202 = load ptr, ptr %201, align 8, !tbaa !18
  %203 = getelementptr inbounds %struct.DAC_TypeDef, ptr %202, i32 0, i32 14
  store volatile i32 %199, ptr %203, align 4, !tbaa !32
  br label %204

204:                                              ; preds = %174, %169
  %205 = load ptr, ptr %5, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %205, i32 0, i32 0
  %207 = load ptr, ptr %206, align 8, !tbaa !18
  %208 = getelementptr inbounds %struct.DAC_TypeDef, ptr %207, i32 0, i32 15
  %209 = load volatile i32, ptr %208, align 4, !tbaa !34
  store i32 %209, ptr %8, align 4, !tbaa !9
  %210 = load i32, ptr %7, align 4, !tbaa !9
  %211 = zext i32 %210 to i64
  %212 = and i64 %211, 16
  %213 = trunc i64 %212 to i32
  %214 = shl i32 7, %213
  %215 = xor i32 %214, -1
  %216 = load i32, ptr %8, align 4, !tbaa !9
  %217 = and i32 %216, %215
  store i32 %217, ptr %8, align 4, !tbaa !9
  %218 = load ptr, ptr %6, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %218, i32 0, i32 0
  %220 = load i32, ptr %219, align 4, !tbaa !14
  %221 = load ptr, ptr %6, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %221, i32 0, i32 2
  %223 = load i32, ptr %222, align 4, !tbaa !35
  %224 = or i32 %220, %223
  %225 = load ptr, ptr %6, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %225, i32 0, i32 3
  %227 = load i32, ptr %226, align 4, !tbaa !36
  %228 = or i32 %224, %227
  store i32 %228, ptr %9, align 4, !tbaa !9
  %229 = load i32, ptr %9, align 4, !tbaa !9
  %230 = load i32, ptr %7, align 4, !tbaa !9
  %231 = zext i32 %230 to i64
  %232 = and i64 %231, 16
  %233 = trunc i64 %232 to i32
  %234 = shl i32 %229, %233
  %235 = load i32, ptr %8, align 4, !tbaa !9
  %236 = or i32 %235, %234
  store i32 %236, ptr %8, align 4, !tbaa !9
  %237 = load i32, ptr %8, align 4, !tbaa !9
  %238 = load ptr, ptr %5, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %238, i32 0, i32 0
  %240 = load ptr, ptr %239, align 8, !tbaa !18
  %241 = getelementptr inbounds %struct.DAC_TypeDef, ptr %240, i32 0, i32 15
  store volatile i32 %237, ptr %241, align 4, !tbaa !34
  %242 = load i32, ptr %7, align 4, !tbaa !9
  %243 = zext i32 %242 to i64
  %244 = and i64 %243, 16
  %245 = shl i64 16384, %244
  %246 = xor i64 %245, -1
  %247 = load ptr, ptr %5, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %247, i32 0, i32 0
  %249 = load ptr, ptr %248, align 8, !tbaa !18
  %250 = getelementptr inbounds %struct.DAC_TypeDef, ptr %249, i32 0, i32 0
  %251 = load volatile i32, ptr %250, align 4, !tbaa !37
  %252 = zext i32 %251 to i64
  %253 = and i64 %252, %246
  %254 = trunc i64 %253 to i32
  store volatile i32 %254, ptr %250, align 4, !tbaa !37
  %255 = load ptr, ptr %5, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %255, i32 0, i32 0
  %257 = load ptr, ptr %256, align 8, !tbaa !18
  %258 = getelementptr inbounds %struct.DAC_TypeDef, ptr %257, i32 0, i32 0
  %259 = load volatile i32, ptr %258, align 4, !tbaa !37
  store i32 %259, ptr %8, align 4, !tbaa !9
  %260 = load i32, ptr %7, align 4, !tbaa !9
  %261 = zext i32 %260 to i64
  %262 = and i64 %261, 16
  %263 = trunc i64 %262 to i32
  %264 = shl i32 4094, %263
  %265 = xor i32 %264, -1
  %266 = load i32, ptr %8, align 4, !tbaa !9
  %267 = and i32 %266, %265
  store i32 %267, ptr %8, align 4, !tbaa !9
  %268 = load ptr, ptr %6, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.DAC_ChannelConfTypeDef, ptr %268, i32 0, i32 1
  %270 = load i32, ptr %269, align 4, !tbaa !38
  store i32 %270, ptr %9, align 4, !tbaa !9
  %271 = load i32, ptr %9, align 4, !tbaa !9
  %272 = load i32, ptr %7, align 4, !tbaa !9
  %273 = zext i32 %272 to i64
  %274 = and i64 %273, 16
  %275 = trunc i64 %274 to i32
  %276 = shl i32 %271, %275
  %277 = load i32, ptr %8, align 4, !tbaa !9
  %278 = or i32 %277, %276
  store i32 %278, ptr %8, align 4, !tbaa !9
  %279 = load i32, ptr %8, align 4, !tbaa !9
  %280 = load ptr, ptr %5, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %280, i32 0, i32 0
  %282 = load ptr, ptr %281, align 8, !tbaa !18
  %283 = getelementptr inbounds %struct.DAC_TypeDef, ptr %282, i32 0, i32 0
  store volatile i32 %279, ptr %283, align 4, !tbaa !37
  %284 = load i32, ptr %7, align 4, !tbaa !9
  %285 = zext i32 %284 to i64
  %286 = and i64 %285, 16
  %287 = shl i64 192, %286
  %288 = xor i64 %287, -1
  %289 = load ptr, ptr %5, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %289, i32 0, i32 0
  %291 = load ptr, ptr %290, align 8, !tbaa !18
  %292 = getelementptr inbounds %struct.DAC_TypeDef, ptr %291, i32 0, i32 0
  %293 = load volatile i32, ptr %292, align 4, !tbaa !37
  %294 = zext i32 %293 to i64
  %295 = and i64 %294, %288
  %296 = trunc i64 %295 to i32
  store volatile i32 %296, ptr %292, align 4, !tbaa !37
  %297 = load ptr, ptr %5, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %297, i32 0, i32 1
  store volatile i32 1, ptr %298, align 8, !tbaa !17
  br label %299

299:                                              ; preds = %204
  %300 = load ptr, ptr %5, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.DAC_HandleTypeDef, ptr %300, i32 0, i32 2
  store i32 0, ptr %301, align 4, !tbaa !15
  br label %302

302:                                              ; preds = %299
  br label %303

303:                                              ; preds = %302
  store i32 0, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %304

304:                                              ; preds = %303, %95, %63, %30
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  %305 = load i32, ptr %4, align 4
  ret i32 %305
}

declare i32 @HAL_GetTick() #2

declare void @HAL_Delay(i32 noundef) #2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 16}
!12 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !13, i64 24}
!13 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8}
!14 = !{!12, !10, i64 0}
!15 = !{!16, !10, i64 12}
!16 = !{!"", !6, i64 0, !10, i64 8, !10, i64 12, !6, i64 16, !6, i64 24, !10, i64 32}
!17 = !{!16, !10, i64 8}
!18 = !{!16, !6, i64 0}
!19 = !{!20, !10, i64 52}
!20 = !{!"", !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}
!21 = !{!16, !10, i64 32}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!12, !10, i64 24}
!25 = !{!20, !10, i64 64}
!26 = distinct !{!26, !23}
!27 = !{!20, !10, i64 68}
!28 = !{!20, !10, i64 72}
!29 = !{!12, !10, i64 28}
!30 = !{!20, !10, i64 76}
!31 = !{!12, !10, i64 32}
!32 = !{!20, !10, i64 56}
!33 = !{!12, !10, i64 20}
!34 = !{!20, !10, i64 60}
!35 = !{!12, !10, i64 8}
!36 = !{!12, !10, i64 12}
!37 = !{!20, !10, i64 0}
!38 = !{!12, !10, i64 4}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 4) i32 @HAL_DAC_ConfigChannel(ptr noundef %0, ptr nocapture noundef readonly %1, i32 noundef %2) local_unnamed_addr #0 {
  %4 = getelementptr inbounds i8, ptr %1, i64 16
  %5 = getelementptr inbounds i8, ptr %0, i64 12
  %6 = load i32, ptr %5, align 4, !tbaa !5
  %7 = icmp eq i32 %6, 1
  br i1 %7, label %107, label %8

8:                                                ; preds = %3
  store i32 1, ptr %5, align 4, !tbaa !5
  %9 = getelementptr inbounds i8, ptr %0, i64 8
  store volatile i32 2, ptr %9, align 8, !tbaa !11
  %10 = load i32, ptr %1, align 4, !tbaa !12
  %11 = icmp eq i32 %10, 4
  br i1 %11, label %12, label %._crit_edge

._crit_edge:                                      ; preds = %8
  %.pre.pre = load ptr, ptr %0, align 8, !tbaa !15
  br label %62

12:                                               ; preds = %8
  %13 = icmp eq i32 %2, 0
  br i1 %13, label %14, label %.preheader

14:                                               ; preds = %12
  %15 = tail call i32 @HAL_GetTick() #2
  br label %16

16:                                               ; preds = %21, %14
  %17 = load ptr, ptr %0, align 8, !tbaa !15
  %18 = getelementptr inbounds i8, ptr %17, i64 52
  %19 = load volatile i32, ptr %18, align 4, !tbaa !16
  %20 = and i32 %19, 536903680
  %.not65 = icmp eq i32 %20, 0
  br i1 %.not65, label %.loopexit, label %21

21:                                               ; preds = %16
  %22 = tail call i32 @HAL_GetTick() #2
  %23 = sub i32 %22, %15
  %24 = icmp ugt i32 %23, 1
  br i1 %24, label %25, label %16, !llvm.loop !18

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %0, i64 32
  %27 = load volatile i32, ptr %26, align 8, !tbaa !20
  %28 = or i32 %27, 8
  store volatile i32 %28, ptr %26, align 8, !tbaa !20
  store volatile i32 3, ptr %9, align 8, !tbaa !11
  br label %107

.preheader:                                       ; preds = %12, %32
  %29 = load ptr, ptr %0, align 8, !tbaa !15
  %30 = getelementptr inbounds i8, ptr %29, i64 52
  %31 = load volatile i32, ptr %30, align 4, !tbaa !16
  %.not = icmp sgt i32 %31, -1
  br i1 %.not, label %.loopexit, label %32

32:                                               ; preds = %.preheader
  %33 = tail call i32 @HAL_GetTick() #2
  %34 = icmp ugt i32 %33, 1
  br i1 %34, label %35, label %.preheader, !llvm.loop !21

35:                                               ; preds = %32
  %36 = getelementptr inbounds i8, ptr %0, i64 32
  %37 = load volatile i32, ptr %36, align 8, !tbaa !20
  %38 = or i32 %37, 8
  store volatile i32 %38, ptr %36, align 8, !tbaa !20
  store volatile i32 3, ptr %9, align 8, !tbaa !11
  br label %107

.loopexit:                                        ; preds = %.preheader, %16
  %.sink71 = phi i64 [ 64, %16 ], [ 68, %.preheader ]
  tail call void @HAL_Delay(i32 noundef 1) #2
  %39 = getelementptr inbounds i8, ptr %1, i64 24
  %40 = load i32, ptr %39, align 4, !tbaa !22
  %41 = load ptr, ptr %0, align 8, !tbaa !15
  %42 = getelementptr inbounds i8, ptr %41, i64 %.sink71
  store volatile i32 %40, ptr %42, align 4, !tbaa !23
  %43 = getelementptr inbounds i8, ptr %41, i64 72
  %44 = load volatile i32, ptr %43, align 4, !tbaa !24
  %45 = and i32 %2, 16
  %46 = shl nuw nsw i32 1023, %45
  %47 = xor i32 %46, -1
  %48 = and i32 %44, %47
  %49 = getelementptr inbounds i8, ptr %1, i64 28
  %50 = load i32, ptr %49, align 4, !tbaa !25
  %51 = shl i32 %50, %45
  %52 = or i32 %51, %48
  store volatile i32 %52, ptr %43, align 4, !tbaa !24
  %53 = getelementptr inbounds i8, ptr %41, i64 76
  %54 = load volatile i32, ptr %53, align 4, !tbaa !26
  %55 = shl nuw nsw i32 255, %45
  %56 = xor i32 %55, -1
  %57 = and i32 %54, %56
  %58 = getelementptr inbounds i8, ptr %1, i64 32
  %59 = load i32, ptr %58, align 4, !tbaa !27
  %60 = shl i32 %59, %45
  %61 = or i32 %60, %57
  store volatile i32 %61, ptr %53, align 4, !tbaa !26
  br label %62

62:                                               ; preds = %._crit_edge, %.loopexit
  %.pre = phi ptr [ %.pre.pre, %._crit_edge ], [ %41, %.loopexit ]
  %63 = load i32, ptr %4, align 4, !tbaa !28
  %64 = icmp eq i32 %63, 1
  br i1 %64, label %65, label %._crit_edge67

._crit_edge67:                                    ; preds = %62
  %.pre68 = and i32 %2, 16
  br label %76

65:                                               ; preds = %62
  %66 = getelementptr inbounds i8, ptr %.pre, i64 56
  %67 = load volatile i32, ptr %66, align 4, !tbaa !29
  %68 = and i32 %2, 16
  %69 = shl nuw nsw i32 31, %68
  %70 = xor i32 %69, -1
  %71 = and i32 %67, %70
  %72 = getelementptr inbounds i8, ptr %1, i64 20
  %73 = load i32, ptr %72, align 4, !tbaa !30
  %74 = shl i32 %73, %68
  %75 = or i32 %74, %71
  store volatile i32 %75, ptr %66, align 4, !tbaa !29
  br label %76

76:                                               ; preds = %._crit_edge67, %65
  %.pre-phi = phi i32 [ %.pre68, %._crit_edge67 ], [ %68, %65 ]
  %77 = getelementptr inbounds i8, ptr %.pre, i64 60
  %78 = load volatile i32, ptr %77, align 4, !tbaa !31
  %79 = shl nuw nsw i32 7, %.pre-phi
  %80 = xor i32 %79, -1
  %81 = and i32 %78, %80
  %82 = load i32, ptr %1, align 4, !tbaa !12
  %83 = getelementptr inbounds i8, ptr %1, i64 8
  %84 = load i32, ptr %83, align 4, !tbaa !32
  %85 = or i32 %84, %82
  %86 = getelementptr inbounds i8, ptr %1, i64 12
  %87 = load i32, ptr %86, align 4, !tbaa !33
  %88 = or i32 %85, %87
  %89 = shl i32 %88, %.pre-phi
  %90 = or i32 %89, %81
  store volatile i32 %90, ptr %77, align 4, !tbaa !31
  %91 = shl nuw nsw i32 16384, %.pre-phi
  %92 = xor i32 %91, -1
  %93 = load volatile i32, ptr %.pre, align 4, !tbaa !34
  %94 = and i32 %93, %92
  store volatile i32 %94, ptr %.pre, align 4, !tbaa !34
  %95 = load volatile i32, ptr %.pre, align 4, !tbaa !34
  %96 = shl nuw nsw i32 4094, %.pre-phi
  %97 = xor i32 %96, -1
  %98 = and i32 %95, %97
  %99 = getelementptr inbounds i8, ptr %1, i64 4
  %100 = load i32, ptr %99, align 4, !tbaa !35
  %101 = shl i32 %100, %.pre-phi
  %102 = or i32 %101, %98
  store volatile i32 %102, ptr %.pre, align 4, !tbaa !34
  %103 = shl nuw nsw i32 192, %.pre-phi
  %104 = xor i32 %103, -1
  %105 = load volatile i32, ptr %.pre, align 4, !tbaa !34
  %106 = and i32 %105, %104
  store volatile i32 %106, ptr %.pre, align 4, !tbaa !34
  store volatile i32 1, ptr %9, align 8, !tbaa !11
  store i32 0, ptr %5, align 4, !tbaa !5
  br label %107

107:                                              ; preds = %3, %76, %35, %25
  %.0 = phi i32 [ 3, %25 ], [ 0, %76 ], [ 3, %35 ], [ 2, %3 ]
  ret i32 %.0
}

declare i32 @HAL_GetTick() local_unnamed_addr #1

declare void @HAL_Delay(i32 noundef) local_unnamed_addr #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 12}
!6 = !{!"", !7, i64 0, !10, i64 8, !10, i64 12, !7, i64 16, !7, i64 24, !10, i64 32}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!6, !10, i64 8}
!12 = !{!13, !10, i64 0}
!13 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !14, i64 24}
!14 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8}
!15 = !{!6, !7, i64 0}
!16 = !{!17, !10, i64 52}
!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, !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}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!6, !10, i64 32}
!21 = distinct !{!21, !19}
!22 = !{!13, !10, i64 24}
!23 = !{!10, !10, i64 0}
!24 = !{!17, !10, i64 72}
!25 = !{!13, !10, i64 28}
!26 = !{!17, !10, i64 76}
!27 = !{!13, !10, i64 32}
!28 = !{!13, !10, i64 16}
!29 = !{!17, !10, i64 56}
!30 = !{!13, !10, i64 20}
!31 = !{!17, !10, i64 60}
!32 = !{!13, !10, i64 8}
!33 = !{!13, !10, i64 12}
!34 = !{!17, !10, i64 0}
!35 = !{!13, !10, i64 4}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass