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

; 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.USB_OTG_HostChannelTypeDef = type { i32, i32, i32, i32, i32, i32, [2 x i32] }
%struct.USB_OTG_GlobalTypeDef = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [2 x i32], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [39 x i32], i32, [15 x i32] }
%struct.USB_OTG_HostTypeDef = type { 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 @USB_HC_Halt(ptr noundef %0, i8 noundef zeroext %1) #1 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca i8, align 1
  %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
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i8 %1, ptr %5, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #2
  %12 = load ptr, ptr %4, align 8, !tbaa !5
  %13 = ptrtoint ptr %12 to i32
  store i32 %13, ptr %6, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #2
  %14 = load i8, ptr %5, align 1, !tbaa !9
  %15 = zext i8 %14 to i32
  store i32 %15, ptr %7, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #2
  store volatile i32 0, ptr %8, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #2
  %16 = load i32, ptr %6, align 4, !tbaa !10
  %17 = zext i32 %16 to i64
  %18 = add i64 %17, 1280
  %19 = load i32, ptr %7, align 4, !tbaa !10
  %20 = zext i32 %19 to i64
  %21 = mul i64 %20, 32
  %22 = add i64 %18, %21
  %23 = inttoptr i64 %22 to ptr
  %24 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %23, i32 0, i32 0
  %25 = load volatile i32, ptr %24, align 4, !tbaa !12
  %26 = zext i32 %25 to i64
  %27 = and i64 %26, 786432
  %28 = lshr i64 %27, 18
  %29 = trunc i64 %28 to i32
  store i32 %29, ptr %9, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #2
  %30 = load i32, ptr %6, align 4, !tbaa !10
  %31 = zext i32 %30 to i64
  %32 = add i64 %31, 1280
  %33 = load i32, ptr %7, align 4, !tbaa !10
  %34 = zext i32 %33 to i64
  %35 = mul i64 %34, 32
  %36 = add i64 %32, %35
  %37 = inttoptr i64 %36 to ptr
  %38 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %37, i32 0, i32 0
  %39 = load volatile i32, ptr %38, align 4, !tbaa !12
  %40 = zext i32 %39 to i64
  %41 = and i64 %40, 2147483648
  %42 = lshr i64 %41, 31
  %43 = trunc i64 %42 to i32
  store i32 %43, ptr %10, align 4, !tbaa !10
  %44 = load ptr, ptr %4, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %44, i32 0, i32 2
  %46 = load volatile i32, ptr %45, align 4, !tbaa !14
  %47 = zext i32 %46 to i64
  %48 = and i64 %47, 32
  %49 = icmp eq i64 %48, 32
  br i1 %49, label %50, label %54

50:                                               ; preds = %2
  %51 = load i32, ptr %10, align 4, !tbaa !10
  %52 = icmp eq i32 %51, 0
  br i1 %52, label %53, label %54

53:                                               ; preds = %50
  store i32 0, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %238

54:                                               ; preds = %50, %2
  %55 = load i32, ptr %9, align 4, !tbaa !10
  %56 = icmp eq i32 %55, 0
  br i1 %56, label %60, label %57

57:                                               ; preds = %54
  %58 = load i32, ptr %9, align 4, !tbaa !10
  %59 = icmp eq i32 %58, 2
  br i1 %59, label %60, label %151

60:                                               ; preds = %57, %54
  %61 = load i32, ptr %6, align 4, !tbaa !10
  %62 = zext i32 %61 to i64
  %63 = add i64 %62, 1280
  %64 = load i32, ptr %7, align 4, !tbaa !10
  %65 = zext i32 %64 to i64
  %66 = mul i64 %65, 32
  %67 = add i64 %63, %66
  %68 = inttoptr i64 %67 to ptr
  %69 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %68, i32 0, i32 0
  %70 = load volatile i32, ptr %69, align 4, !tbaa !12
  %71 = zext i32 %70 to i64
  %72 = or i64 %71, 1073741824
  %73 = trunc i64 %72 to i32
  store volatile i32 %73, ptr %69, align 4, !tbaa !12
  %74 = load ptr, ptr %4, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %74, i32 0, i32 2
  %76 = load volatile i32, ptr %75, align 4, !tbaa !14
  %77 = zext i32 %76 to i64
  %78 = and i64 %77, 32
  %79 = icmp eq i64 %78, 0
  br i1 %79, label %80, label %150

80:                                               ; preds = %60
  %81 = load ptr, ptr %4, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.USB_OTG_GlobalTypeDef, ptr %81, i32 0, i32 11
  %83 = load volatile i32, ptr %82, align 4, !tbaa !16
  %84 = and i32 %83, 16711680
  %85 = icmp eq i32 %84, 0
  br i1 %85, label %86, label %135

86:                                               ; preds = %80
  %87 = load i32, ptr %6, align 4, !tbaa !10
  %88 = zext i32 %87 to i64
  %89 = add i64 %88, 1280
  %90 = load i32, ptr %7, align 4, !tbaa !10
  %91 = zext i32 %90 to i64
  %92 = mul i64 %91, 32
  %93 = add i64 %89, %92
  %94 = inttoptr i64 %93 to ptr
  %95 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %94, i32 0, i32 0
  %96 = load volatile i32, ptr %95, align 4, !tbaa !12
  %97 = zext i32 %96 to i64
  %98 = and i64 %97, -2147483649
  %99 = trunc i64 %98 to i32
  store volatile i32 %99, ptr %95, align 4, !tbaa !12
  %100 = load i32, ptr %6, align 4, !tbaa !10
  %101 = zext i32 %100 to i64
  %102 = add i64 %101, 1280
  %103 = load i32, ptr %7, align 4, !tbaa !10
  %104 = zext i32 %103 to i64
  %105 = mul i64 %104, 32
  %106 = add i64 %102, %105
  %107 = inttoptr i64 %106 to ptr
  %108 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %107, i32 0, i32 0
  %109 = load volatile i32, ptr %108, align 4, !tbaa !12
  %110 = zext i32 %109 to i64
  %111 = or i64 %110, 2147483648
  %112 = trunc i64 %111 to i32
  store volatile i32 %112, ptr %108, align 4, !tbaa !12
  br label %113

113:                                              ; preds = %120, %86
  %114 = load volatile i32, ptr %8, align 4, !tbaa !10
  %115 = add i32 %114, 1
  store volatile i32 %115, ptr %8, align 4, !tbaa !10
  %116 = load volatile i32, ptr %8, align 4, !tbaa !10
  %117 = icmp ugt i32 %116, 1000
  br i1 %117, label %118, label %119

118:                                              ; preds = %113
  br label %134

119:                                              ; preds = %113
  br label %120

120:                                              ; preds = %119
  %121 = load i32, ptr %6, align 4, !tbaa !10
  %122 = zext i32 %121 to i64
  %123 = add i64 %122, 1280
  %124 = load i32, ptr %7, align 4, !tbaa !10
  %125 = zext i32 %124 to i64
  %126 = mul i64 %125, 32
  %127 = add i64 %123, %126
  %128 = inttoptr i64 %127 to ptr
  %129 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %128, i32 0, i32 0
  %130 = load volatile i32, ptr %129, align 4, !tbaa !12
  %131 = zext i32 %130 to i64
  %132 = and i64 %131, 2147483648
  %133 = icmp eq i64 %132, 2147483648
  br i1 %133, label %113, label %134, !llvm.loop !17

134:                                              ; preds = %120, %118
  br label %149

135:                                              ; preds = %80
  %136 = load i32, ptr %6, align 4, !tbaa !10
  %137 = zext i32 %136 to i64
  %138 = add i64 %137, 1280
  %139 = load i32, ptr %7, align 4, !tbaa !10
  %140 = zext i32 %139 to i64
  %141 = mul i64 %140, 32
  %142 = add i64 %138, %141
  %143 = inttoptr i64 %142 to ptr
  %144 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %143, i32 0, i32 0
  %145 = load volatile i32, ptr %144, align 4, !tbaa !12
  %146 = zext i32 %145 to i64
  %147 = or i64 %146, 2147483648
  %148 = trunc i64 %147 to i32
  store volatile i32 %148, ptr %144, align 4, !tbaa !12
  br label %149

149:                                              ; preds = %135, %134
  br label %150

150:                                              ; preds = %149, %60
  br label %237

151:                                              ; preds = %57
  %152 = load i32, ptr %6, align 4, !tbaa !10
  %153 = zext i32 %152 to i64
  %154 = add i64 %153, 1280
  %155 = load i32, ptr %7, align 4, !tbaa !10
  %156 = zext i32 %155 to i64
  %157 = mul i64 %156, 32
  %158 = add i64 %154, %157
  %159 = inttoptr i64 %158 to ptr
  %160 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %159, i32 0, i32 0
  %161 = load volatile i32, ptr %160, align 4, !tbaa !12
  %162 = zext i32 %161 to i64
  %163 = or i64 %162, 1073741824
  %164 = trunc i64 %163 to i32
  store volatile i32 %164, ptr %160, align 4, !tbaa !12
  %165 = load i32, ptr %6, align 4, !tbaa !10
  %166 = zext i32 %165 to i64
  %167 = add i64 %166, 1024
  %168 = inttoptr i64 %167 to ptr
  %169 = getelementptr inbounds %struct.USB_OTG_HostTypeDef, ptr %168, i32 0, i32 4
  %170 = load volatile i32, ptr %169, align 4, !tbaa !19
  %171 = and i32 %170, 16711680
  %172 = icmp eq i32 %171, 0
  br i1 %172, label %173, label %222

173:                                              ; preds = %151
  %174 = load i32, ptr %6, align 4, !tbaa !10
  %175 = zext i32 %174 to i64
  %176 = add i64 %175, 1280
  %177 = load i32, ptr %7, align 4, !tbaa !10
  %178 = zext i32 %177 to i64
  %179 = mul i64 %178, 32
  %180 = add i64 %176, %179
  %181 = inttoptr i64 %180 to ptr
  %182 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %181, i32 0, i32 0
  %183 = load volatile i32, ptr %182, align 4, !tbaa !12
  %184 = zext i32 %183 to i64
  %185 = and i64 %184, -2147483649
  %186 = trunc i64 %185 to i32
  store volatile i32 %186, ptr %182, align 4, !tbaa !12
  %187 = load i32, ptr %6, align 4, !tbaa !10
  %188 = zext i32 %187 to i64
  %189 = add i64 %188, 1280
  %190 = load i32, ptr %7, align 4, !tbaa !10
  %191 = zext i32 %190 to i64
  %192 = mul i64 %191, 32
  %193 = add i64 %189, %192
  %194 = inttoptr i64 %193 to ptr
  %195 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %194, i32 0, i32 0
  %196 = load volatile i32, ptr %195, align 4, !tbaa !12
  %197 = zext i32 %196 to i64
  %198 = or i64 %197, 2147483648
  %199 = trunc i64 %198 to i32
  store volatile i32 %199, ptr %195, align 4, !tbaa !12
  br label %200

200:                                              ; preds = %207, %173
  %201 = load volatile i32, ptr %8, align 4, !tbaa !10
  %202 = add i32 %201, 1
  store volatile i32 %202, ptr %8, align 4, !tbaa !10
  %203 = load volatile i32, ptr %8, align 4, !tbaa !10
  %204 = icmp ugt i32 %203, 1000
  br i1 %204, label %205, label %206

205:                                              ; preds = %200
  br label %221

206:                                              ; preds = %200
  br label %207

207:                                              ; preds = %206
  %208 = load i32, ptr %6, align 4, !tbaa !10
  %209 = zext i32 %208 to i64
  %210 = add i64 %209, 1280
  %211 = load i32, ptr %7, align 4, !tbaa !10
  %212 = zext i32 %211 to i64
  %213 = mul i64 %212, 32
  %214 = add i64 %210, %213
  %215 = inttoptr i64 %214 to ptr
  %216 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %215, i32 0, i32 0
  %217 = load volatile i32, ptr %216, align 4, !tbaa !12
  %218 = zext i32 %217 to i64
  %219 = and i64 %218, 2147483648
  %220 = icmp eq i64 %219, 2147483648
  br i1 %220, label %200, label %221, !llvm.loop !21

221:                                              ; preds = %207, %205
  br label %236

222:                                              ; preds = %151
  %223 = load i32, ptr %6, align 4, !tbaa !10
  %224 = zext i32 %223 to i64
  %225 = add i64 %224, 1280
  %226 = load i32, ptr %7, align 4, !tbaa !10
  %227 = zext i32 %226 to i64
  %228 = mul i64 %227, 32
  %229 = add i64 %225, %228
  %230 = inttoptr i64 %229 to ptr
  %231 = getelementptr inbounds %struct.USB_OTG_HostChannelTypeDef, ptr %230, i32 0, i32 0
  %232 = load volatile i32, ptr %231, align 4, !tbaa !12
  %233 = zext i32 %232 to i64
  %234 = or i64 %233, 2147483648
  %235 = trunc i64 %234 to i32
  store volatile i32 %235, ptr %231, align 4, !tbaa !12
  br label %236

236:                                              ; preds = %222, %221
  br label %237

237:                                              ; preds = %236, %150
  store i32 0, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %238

238:                                              ; preds = %237, %53
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #2
  %239 = load i32, ptr %3, align 4
  ret i32 %239
}

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 = { 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 = !{!7, !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !11, i64 0}
!13 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !7, i64 24}
!14 = !{!15, !11, i64 8}
!15 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !7, i64 48, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !11, i64 72, !11, i64 76, !11, i64 80, !11, i64 84, !11, i64 88, !11, i64 92, !11, i64 96, !7, i64 100, !11, i64 256, !7, i64 260}
!16 = !{!15, !11, i64 44}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!20, !11, i64 16}
!20 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24}
!21 = distinct !{!21, !18}


; 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: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

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

; Function Attrs: nofree norecurse nounwind uwtable
define dso_local noundef i32 @USB_HC_Halt(ptr noundef %0, i8 noundef zeroext %1) local_unnamed_addr #1 {
  %3 = alloca i32, align 4
  %4 = ptrtoint ptr %0 to i64
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3)
  store volatile i32 0, ptr %3, align 4, !tbaa !5
  %5 = and i64 %4, 4294967295
  %6 = add nuw nsw i64 %5, 1280
  %7 = zext i8 %1 to i64
  %8 = shl nuw nsw i64 %7, 5
  %9 = add nuw nsw i64 %6, %8
  %10 = inttoptr i64 %9 to ptr
  %11 = load volatile i32, ptr %10, align 4, !tbaa !9
  %12 = load volatile i32, ptr %10, align 4, !tbaa !9
  %13 = getelementptr inbounds i8, ptr %0, i64 8
  %14 = load volatile i32, ptr %13, align 4, !tbaa !11
  %15 = and i32 %14, 32
  %16 = icmp ne i32 %15, 0
  %17 = icmp sgt i32 %12, -1
  %or.cond = select i1 %16, i1 %17, i1 false
  br i1 %or.cond, label %.loopexit, label %18

18:                                               ; preds = %2
  %19 = and i32 %11, 262144
  %or.cond3 = icmp eq i32 %19, 0
  %20 = load volatile i32, ptr %10, align 4, !tbaa !9
  %21 = or i32 %20, 1073741824
  store volatile i32 %21, ptr %10, align 4, !tbaa !9
  br i1 %or.cond3, label %22, label %41

22:                                               ; preds = %18
  %23 = load volatile i32, ptr %13, align 4, !tbaa !11
  %24 = and i32 %23, 32
  %25 = icmp eq i32 %24, 0
  br i1 %25, label %26, label %.loopexit

26:                                               ; preds = %22
  %27 = getelementptr inbounds i8, ptr %0, i64 44
  %28 = load volatile i32, ptr %27, align 4, !tbaa !13
  %29 = and i32 %28, 16711680
  %30 = icmp eq i32 %29, 0
  %31 = load volatile i32, ptr %10, align 4, !tbaa !9
  br i1 %30, label %32, label %.loopexit.sink.split

32:                                               ; preds = %26
  %33 = and i32 %31, 2147483647
  store volatile i32 %33, ptr %10, align 4, !tbaa !9
  %34 = load volatile i32, ptr %10, align 4, !tbaa !9
  %35 = or i32 %34, -2147483648
  store volatile i32 %35, ptr %10, align 4, !tbaa !9
  br label %36

36:                                               ; preds = %39, %32
  %.0..0..0..0. = load volatile i32, ptr %3, align 4, !tbaa !5
  %37 = add i32 %.0..0..0..0., 1
  store volatile i32 %37, ptr %3, align 4, !tbaa !5
  %.0..0..0..0.6 = load volatile i32, ptr %3, align 4, !tbaa !5
  %38 = icmp ugt i32 %.0..0..0..0.6, 1000
  br i1 %38, label %.loopexit, label %39

39:                                               ; preds = %36
  %40 = load volatile i32, ptr %10, align 4, !tbaa !9
  %.not40 = icmp sgt i32 %40, -1
  br i1 %.not40, label %.loopexit, label %36, !llvm.loop !14

41:                                               ; preds = %18
  %42 = add nuw nsw i64 %5, 1024
  %43 = inttoptr i64 %42 to ptr
  %44 = getelementptr inbounds i8, ptr %43, i64 16
  %45 = load volatile i32, ptr %44, align 4, !tbaa !16
  %46 = and i32 %45, 16711680
  %47 = icmp eq i32 %46, 0
  %48 = load volatile i32, ptr %10, align 4, !tbaa !9
  br i1 %47, label %49, label %.loopexit.sink.split

49:                                               ; preds = %41
  %50 = and i32 %48, 2147483647
  store volatile i32 %50, ptr %10, align 4, !tbaa !9
  %51 = load volatile i32, ptr %10, align 4, !tbaa !9
  %52 = or i32 %51, -2147483648
  store volatile i32 %52, ptr %10, align 4, !tbaa !9
  br label %53

53:                                               ; preds = %56, %49
  %.0..0..0..0.7 = load volatile i32, ptr %3, align 4, !tbaa !5
  %54 = add i32 %.0..0..0..0.7, 1
  store volatile i32 %54, ptr %3, align 4, !tbaa !5
  %.0..0..0..0.8 = load volatile i32, ptr %3, align 4, !tbaa !5
  %55 = icmp ugt i32 %.0..0..0..0.8, 1000
  br i1 %55, label %.loopexit, label %56

56:                                               ; preds = %53
  %57 = load volatile i32, ptr %10, align 4, !tbaa !9
  %.not = icmp sgt i32 %57, -1
  br i1 %.not, label %.loopexit, label %53, !llvm.loop !18

.loopexit.sink.split:                             ; preds = %41, %26
  %.sink44 = phi i32 [ %31, %26 ], [ %48, %41 ]
  %58 = or i32 %.sink44, -2147483648
  store volatile i32 %58, ptr %10, align 4, !tbaa !9
  br label %.loopexit

.loopexit:                                        ; preds = %56, %53, %36, %39, %.loopexit.sink.split, %22, %2
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3)
  ret i32 0
}

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nofree norecurse 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" }

!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 0}
!10 = !{!"", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !7, i64 24}
!11 = !{!12, !6, i64 8}
!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, !7, i64 48, !6, i64 56, !6, i64 60, !6, i64 64, !6, i64 68, !6, i64 72, !6, i64 76, !6, i64 80, !6, i64 84, !6, i64 88, !6, i64 92, !6, i64 96, !7, i64 100, !6, i64 256, !7, i64 260}
!13 = !{!12, !6, i64 44}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = !{!17, !6, i64 16}
!17 = !{!"", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24}
!18 = distinct !{!18, !15}


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