; LLVM IR from Stephane-D/SGDK :: sample/snd/xgm-player/src (ym_state)

; 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.YM = type { [6 x %struct.YM_CH], i16 }
%struct.YM_CH = type { [4 x %struct.YM_SLOT], i16, i16, i16, i16 }
%struct.YM_SLOT = type { i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16 }

; 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 void @YM_updateEnv(ptr noundef %0) #1 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i16, align 2
  %6 = alloca i16, align 2
  %7 = alloca i16, align 2
  %8 = alloca i16, align 2
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %5) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %6) #2
  %9 = load ptr, ptr %2, align 8, !tbaa !5
  %10 = getelementptr inbounds %struct.YM, ptr %9, i32 0, i32 0
  %11 = getelementptr inbounds [6 x %struct.YM_CH], ptr %10, i64 0, i64 0
  store ptr %11, ptr %3, align 8, !tbaa !5
  store i16 6, ptr %5, align 2, !tbaa !9
  br label %12

12:                                               ; preds = %130, %1
  %13 = load i16, ptr %5, align 2, !tbaa !9
  %14 = add i16 %13, -1
  store i16 %14, ptr %5, align 2, !tbaa !9
  %15 = icmp ne i16 %13, 0
  br i1 %15, label %16, label %133

16:                                               ; preds = %12
  %17 = load ptr, ptr %3, align 8, !tbaa !5
  %18 = getelementptr inbounds %struct.YM_CH, ptr %17, i32 0, i32 0
  %19 = getelementptr inbounds [4 x %struct.YM_SLOT], ptr %18, i64 0, i64 0
  store ptr %19, ptr %4, align 8, !tbaa !5
  store i16 4, ptr %6, align 2, !tbaa !9
  br label %20

20:                                               ; preds = %124, %16
  %21 = load i16, ptr %6, align 2, !tbaa !9
  %22 = add i16 %21, -1
  store i16 %22, ptr %6, align 2, !tbaa !9
  %23 = icmp ne i16 %21, 0
  br i1 %23, label %24, label %130

24:                                               ; preds = %20
  call void @llvm.lifetime.start.p0(i64 2, ptr %7) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %8) #2
  %25 = load ptr, ptr %4, align 8, !tbaa !5
  %26 = getelementptr inbounds %struct.YM_SLOT, ptr %25, i32 0, i32 2
  %27 = load i16, ptr %26, align 2, !tbaa !11
  store i16 %27, ptr %8, align 2, !tbaa !9
  %28 = load ptr, ptr %4, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.YM_SLOT, ptr %28, i32 0, i32 1
  %30 = load i16, ptr %29, align 2, !tbaa !13
  %31 = zext i16 %30 to i32
  switch i32 %31, label %124 [
    i32 4, label %32
    i32 3, label %64
    i32 2, label %92
    i32 1, label %108
  ]

32:                                               ; preds = %24
  %33 = load ptr, ptr %4, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.YM_SLOT, ptr %33, i32 0, i32 4
  %35 = load i16, ptr %34, align 2, !tbaa !14
  %36 = sext i16 %35 to i32
  %37 = load i16, ptr %8, align 2, !tbaa !9
  %38 = sext i16 %37 to i32
  %39 = sub nsw i32 %38, %36
  %40 = trunc i32 %39 to i16
  store i16 %40, ptr %8, align 2, !tbaa !9
  %41 = load ptr, ptr %4, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.YM_SLOT, ptr %41, i32 0, i32 8
  %43 = load i16, ptr %42, align 2, !tbaa !15
  store i16 %43, ptr %7, align 2, !tbaa !9
  %44 = load i16, ptr %8, align 2, !tbaa !9
  %45 = sext i16 %44 to i32
  %46 = load i16, ptr %7, align 2, !tbaa !9
  %47 = sext i16 %46 to i32
  %48 = icmp sle i32 %45, %47
  br i1 %48, label %49, label %63

49:                                               ; preds = %32
  %50 = load i16, ptr %7, align 2, !tbaa !9
  store i16 %50, ptr %8, align 2, !tbaa !9
  %51 = load ptr, ptr %4, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.YM_SLOT, ptr %51, i32 0, i32 9
  %53 = load i16, ptr %52, align 2, !tbaa !16
  %54 = zext i16 %53 to i32
  %55 = load i16, ptr %7, align 2, !tbaa !9
  %56 = sext i16 %55 to i32
  %57 = icmp sle i32 %54, %56
  %58 = zext i1 %57 to i64
  %59 = select i1 %57, i32 2, i32 3
  %60 = trunc i32 %59 to i16
  %61 = load ptr, ptr %4, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.YM_SLOT, ptr %61, i32 0, i32 1
  store i16 %60, ptr %62, align 2, !tbaa !13
  br label %63

63:                                               ; preds = %49, %32
  br label %124

64:                                               ; preds = %24
  %65 = load ptr, ptr %4, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.YM_SLOT, ptr %65, i32 0, i32 5
  %67 = load i16, ptr %66, align 2, !tbaa !17
  %68 = sext i16 %67 to i32
  %69 = load i16, ptr %8, align 2, !tbaa !9
  %70 = sext i16 %69 to i32
  %71 = add nsw i32 %70, %68
  %72 = trunc i32 %71 to i16
  store i16 %72, ptr %8, align 2, !tbaa !9
  %73 = load i16, ptr %8, align 2, !tbaa !9
  %74 = sext i16 %73 to i32
  %75 = icmp sge i32 %74, 8128
  br i1 %75, label %76, label %79

76:                                               ; preds = %64
  store i16 8128, ptr %8, align 2, !tbaa !9
  %77 = load ptr, ptr %4, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.YM_SLOT, ptr %77, i32 0, i32 1
  store i16 0, ptr %78, align 2, !tbaa !13
  br label %91

79:                                               ; preds = %64
  %80 = load i16, ptr %8, align 2, !tbaa !9
  %81 = sext i16 %80 to i32
  %82 = load ptr, ptr %4, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.YM_SLOT, ptr %82, i32 0, i32 9
  %84 = load i16, ptr %83, align 2, !tbaa !16
  %85 = zext i16 %84 to i32
  %86 = icmp sge i32 %81, %85
  br i1 %86, label %87, label %90

87:                                               ; preds = %79
  %88 = load ptr, ptr %4, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.YM_SLOT, ptr %88, i32 0, i32 1
  store i16 2, ptr %89, align 2, !tbaa !13
  br label %90

90:                                               ; preds = %87, %79
  br label %91

91:                                               ; preds = %90, %76
  br label %124

92:                                               ; preds = %24
  %93 = load ptr, ptr %4, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.YM_SLOT, ptr %93, i32 0, i32 6
  %95 = load i16, ptr %94, align 2, !tbaa !18
  %96 = sext i16 %95 to i32
  %97 = load i16, ptr %8, align 2, !tbaa !9
  %98 = sext i16 %97 to i32
  %99 = add nsw i32 %98, %96
  %100 = trunc i32 %99 to i16
  store i16 %100, ptr %8, align 2, !tbaa !9
  %101 = load i16, ptr %8, align 2, !tbaa !9
  %102 = sext i16 %101 to i32
  %103 = icmp sge i32 %102, 8128
  br i1 %103, label %104, label %107

104:                                              ; preds = %92
  store i16 8128, ptr %8, align 2, !tbaa !9
  %105 = load ptr, ptr %4, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.YM_SLOT, ptr %105, i32 0, i32 1
  store i16 0, ptr %106, align 2, !tbaa !13
  br label %107

107:                                              ; preds = %104, %92
  br label %124

108:                                              ; preds = %24
  %109 = load ptr, ptr %4, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.YM_SLOT, ptr %109, i32 0, i32 7
  %111 = load i16, ptr %110, align 2, !tbaa !19
  %112 = sext i16 %111 to i32
  %113 = load i16, ptr %8, align 2, !tbaa !9
  %114 = sext i16 %113 to i32
  %115 = add nsw i32 %114, %112
  %116 = trunc i32 %115 to i16
  store i16 %116, ptr %8, align 2, !tbaa !9
  %117 = load i16, ptr %8, align 2, !tbaa !9
  %118 = sext i16 %117 to i32
  %119 = icmp sge i32 %118, 8128
  br i1 %119, label %120, label %123

120:                                              ; preds = %108
  store i16 8128, ptr %8, align 2, !tbaa !9
  %121 = load ptr, ptr %4, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.YM_SLOT, ptr %121, i32 0, i32 1
  store i16 0, ptr %122, align 2, !tbaa !13
  br label %123

123:                                              ; preds = %120, %108
  br label %124

124:                                              ; preds = %123, %107, %91, %63, %24
  %125 = load i16, ptr %8, align 2, !tbaa !9
  %126 = load ptr, ptr %4, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.YM_SLOT, ptr %126, i32 0, i32 2
  store i16 %125, ptr %127, align 2, !tbaa !11
  %128 = load ptr, ptr %4, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.YM_SLOT, ptr %128, i32 1
  store ptr %129, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 2, ptr %8) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %7) #2
  br label %20, !llvm.loop !20

130:                                              ; preds = %20
  %131 = load ptr, ptr %3, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.YM_CH, ptr %131, i32 1
  store ptr %132, ptr %3, align 8, !tbaa !5
  br label %12, !llvm.loop !22

133:                                              ; preds = %12
  call void @llvm.lifetime.end.p0(i64 2, ptr %6) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %5) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #2
  ret void
}

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 = !{!10, !10, i64 0}
!10 = !{!"short", !7, i64 0}
!11 = !{!12, !10, i64 4}
!12 = !{!"", !10, i64 0, !10, i64 2, !10, i64 4, !10, i64 6, !10, i64 8, !10, i64 10, !10, i64 12, !10, i64 14, !10, i64 16, !10, i64 18, !10, i64 20, !10, i64 22}
!13 = !{!12, !10, i64 2}
!14 = !{!12, !10, i64 8}
!15 = !{!12, !10, i64 16}
!16 = !{!12, !10, i64 18}
!17 = !{!12, !10, i64 10}
!18 = !{!12, !10, i64 12}
!19 = !{!12, !10, i64 14}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = distinct !{!22, !21}


; 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: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable
define dso_local void @YM_updateEnv(ptr nocapture noundef %0) local_unnamed_addr #0 {
  br label %.preheader

.preheader:                                       ; preds = %1, %150
  %2 = phi i16 [ 5, %1 ], [ %152, %150 ]
  %.03344 = phi ptr [ %0, %1 ], [ %151, %150 ]
  %3 = getelementptr inbounds i8, ptr %.03344, i64 4
  %4 = load i16, ptr %3, align 2, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %.03344, i64 2
  %6 = load i16, ptr %5, align 2, !tbaa !10
  switch i16 %6, label %39 [
    i16 4, label %7
    i16 3, label %19
    i16 2, label %29
    i16 1, label %34
  ]

7:                                                ; preds = %.preheader
  %8 = getelementptr inbounds i8, ptr %.03344, i64 8
  %9 = load i16, ptr %8, align 2, !tbaa !11
  %10 = sub i16 %4, %9
  %11 = getelementptr inbounds i8, ptr %.03344, i64 16
  %12 = load i16, ptr %11, align 2, !tbaa !12
  %.not41 = icmp sgt i16 %10, %12
  br i1 %.not41, label %39, label %13

13:                                               ; preds = %7
  %14 = sext i16 %12 to i32
  %15 = getelementptr inbounds i8, ptr %.03344, i64 18
  %16 = load i16, ptr %15, align 2, !tbaa !13
  %17 = zext i16 %16 to i32
  %.not42 = icmp sgt i32 %17, %14
  %18 = select i1 %.not42, i16 3, i16 2
  br label %.sink.split

19:                                               ; preds = %.preheader
  %20 = getelementptr inbounds i8, ptr %.03344, i64 10
  %21 = load i16, ptr %20, align 2, !tbaa !14
  %22 = add i16 %21, %4
  %23 = icmp sgt i16 %22, 8127
  br i1 %23, label %.sink.split, label %24

24:                                               ; preds = %19
  %25 = sext i16 %22 to i32
  %26 = getelementptr inbounds i8, ptr %.03344, i64 18
  %27 = load i16, ptr %26, align 2, !tbaa !13
  %28 = zext i16 %27 to i32
  %.not40 = icmp slt i32 %25, %28
  br i1 %.not40, label %39, label %.sink.split

29:                                               ; preds = %.preheader
  %30 = getelementptr inbounds i8, ptr %.03344, i64 12
  %31 = load i16, ptr %30, align 2, !tbaa !15
  %32 = add i16 %31, %4
  %33 = icmp sgt i16 %32, 8127
  br i1 %33, label %.sink.split, label %39

34:                                               ; preds = %.preheader
  %35 = getelementptr inbounds i8, ptr %.03344, i64 14
  %36 = load i16, ptr %35, align 2, !tbaa !16
  %37 = add i16 %36, %4
  %38 = icmp sgt i16 %37, 8127
  br i1 %38, label %.sink.split, label %39

.sink.split:                                      ; preds = %34, %29, %24, %19, %13
  %.sink = phi i16 [ %18, %13 ], [ 0, %19 ], [ 2, %24 ], [ 0, %29 ], [ 0, %34 ]
  %.0.ph = phi i16 [ %12, %13 ], [ 8128, %19 ], [ %22, %24 ], [ 8128, %29 ], [ 8128, %34 ]
  store i16 %.sink, ptr %5, align 2, !tbaa !10
  br label %39

39:                                               ; preds = %.sink.split, %34, %29, %24, %7, %.preheader
  %.0 = phi i16 [ %4, %.preheader ], [ %37, %34 ], [ %32, %29 ], [ %22, %24 ], [ %10, %7 ], [ %.0.ph, %.sink.split ]
  store i16 %.0, ptr %3, align 2, !tbaa !5
  %40 = getelementptr inbounds i8, ptr %.03344, i64 28
  %41 = load i16, ptr %40, align 2, !tbaa !5
  %42 = getelementptr inbounds i8, ptr %.03344, i64 26
  %43 = load i16, ptr %42, align 2, !tbaa !10
  switch i16 %43, label %76 [
    i16 4, label %64
    i16 3, label %54
    i16 2, label %49
    i16 1, label %44
  ]

44:                                               ; preds = %39
  %45 = getelementptr inbounds i8, ptr %.03344, i64 38
  %46 = load i16, ptr %45, align 2, !tbaa !16
  %47 = add i16 %46, %41
  %48 = icmp sgt i16 %47, 8127
  br i1 %48, label %.sink.split45, label %76

49:                                               ; preds = %39
  %50 = getelementptr inbounds i8, ptr %.03344, i64 36
  %51 = load i16, ptr %50, align 2, !tbaa !15
  %52 = add i16 %51, %41
  %53 = icmp sgt i16 %52, 8127
  br i1 %53, label %.sink.split45, label %76

54:                                               ; preds = %39
  %55 = getelementptr inbounds i8, ptr %.03344, i64 34
  %56 = load i16, ptr %55, align 2, !tbaa !14
  %57 = add i16 %56, %41
  %58 = icmp sgt i16 %57, 8127
  br i1 %58, label %.sink.split45, label %59

59:                                               ; preds = %54
  %60 = sext i16 %57 to i32
  %61 = getelementptr inbounds i8, ptr %.03344, i64 42
  %62 = load i16, ptr %61, align 2, !tbaa !13
  %63 = zext i16 %62 to i32
  %.not40.1 = icmp slt i32 %60, %63
  br i1 %.not40.1, label %76, label %.sink.split45

64:                                               ; preds = %39
  %65 = getelementptr inbounds i8, ptr %.03344, i64 32
  %66 = load i16, ptr %65, align 2, !tbaa !11
  %67 = sub i16 %41, %66
  %68 = getelementptr inbounds i8, ptr %.03344, i64 40
  %69 = load i16, ptr %68, align 2, !tbaa !12
  %.not41.1 = icmp sgt i16 %67, %69
  br i1 %.not41.1, label %76, label %70

70:                                               ; preds = %64
  %71 = sext i16 %69 to i32
  %72 = getelementptr inbounds i8, ptr %.03344, i64 42
  %73 = load i16, ptr %72, align 2, !tbaa !13
  %74 = zext i16 %73 to i32
  %.not42.1 = icmp sgt i32 %74, %71
  %75 = select i1 %.not42.1, i16 3, i16 2
  br label %.sink.split45

.sink.split45:                                    ; preds = %54, %59, %49, %44, %70
  %.sink46 = phi i16 [ %75, %70 ], [ 0, %44 ], [ 0, %49 ], [ 2, %59 ], [ 0, %54 ]
  %.0.1.ph = phi i16 [ %69, %70 ], [ 8128, %44 ], [ 8128, %49 ], [ %57, %59 ], [ 8128, %54 ]
  store i16 %.sink46, ptr %42, align 2, !tbaa !10
  br label %76

76:                                               ; preds = %.sink.split45, %64, %59, %49, %44, %39
  %.0.1 = phi i16 [ %41, %39 ], [ %47, %44 ], [ %52, %49 ], [ %57, %59 ], [ %67, %64 ], [ %.0.1.ph, %.sink.split45 ]
  store i16 %.0.1, ptr %40, align 2, !tbaa !5
  %77 = getelementptr inbounds i8, ptr %.03344, i64 52
  %78 = load i16, ptr %77, align 2, !tbaa !5
  %79 = getelementptr inbounds i8, ptr %.03344, i64 50
  %80 = load i16, ptr %79, align 2, !tbaa !10
  switch i16 %80, label %113 [
    i16 4, label %101
    i16 3, label %91
    i16 2, label %86
    i16 1, label %81
  ]

81:                                               ; preds = %76
  %82 = getelementptr inbounds i8, ptr %.03344, i64 62
  %83 = load i16, ptr %82, align 2, !tbaa !16
  %84 = add i16 %83, %78
  %85 = icmp sgt i16 %84, 8127
  br i1 %85, label %.sink.split47, label %113

86:                                               ; preds = %76
  %87 = getelementptr inbounds i8, ptr %.03344, i64 60
  %88 = load i16, ptr %87, align 2, !tbaa !15
  %89 = add i16 %88, %78
  %90 = icmp sgt i16 %89, 8127
  br i1 %90, label %.sink.split47, label %113

91:                                               ; preds = %76
  %92 = getelementptr inbounds i8, ptr %.03344, i64 58
  %93 = load i16, ptr %92, align 2, !tbaa !14
  %94 = add i16 %93, %78
  %95 = icmp sgt i16 %94, 8127
  br i1 %95, label %.sink.split47, label %96

96:                                               ; preds = %91
  %97 = sext i16 %94 to i32
  %98 = getelementptr inbounds i8, ptr %.03344, i64 66
  %99 = load i16, ptr %98, align 2, !tbaa !13
  %100 = zext i16 %99 to i32
  %.not40.2 = icmp slt i32 %97, %100
  br i1 %.not40.2, label %113, label %.sink.split47

101:                                              ; preds = %76
  %102 = getelementptr inbounds i8, ptr %.03344, i64 56
  %103 = load i16, ptr %102, align 2, !tbaa !11
  %104 = sub i16 %78, %103
  %105 = getelementptr inbounds i8, ptr %.03344, i64 64
  %106 = load i16, ptr %105, align 2, !tbaa !12
  %.not41.2 = icmp sgt i16 %104, %106
  br i1 %.not41.2, label %113, label %107

107:                                              ; preds = %101
  %108 = sext i16 %106 to i32
  %109 = getelementptr inbounds i8, ptr %.03344, i64 66
  %110 = load i16, ptr %109, align 2, !tbaa !13
  %111 = zext i16 %110 to i32
  %.not42.2 = icmp sgt i32 %111, %108
  %112 = select i1 %.not42.2, i16 3, i16 2
  br label %.sink.split47

.sink.split47:                                    ; preds = %91, %96, %86, %81, %107
  %.sink48 = phi i16 [ %112, %107 ], [ 0, %81 ], [ 0, %86 ], [ 2, %96 ], [ 0, %91 ]
  %.0.2.ph = phi i16 [ %106, %107 ], [ 8128, %81 ], [ 8128, %86 ], [ %94, %96 ], [ 8128, %91 ]
  store i16 %.sink48, ptr %79, align 2, !tbaa !10
  br label %113

113:                                              ; preds = %.sink.split47, %101, %96, %86, %81, %76
  %.0.2 = phi i16 [ %78, %76 ], [ %84, %81 ], [ %89, %86 ], [ %94, %96 ], [ %104, %101 ], [ %.0.2.ph, %.sink.split47 ]
  store i16 %.0.2, ptr %77, align 2, !tbaa !5
  %114 = getelementptr inbounds i8, ptr %.03344, i64 76
  %115 = load i16, ptr %114, align 2, !tbaa !5
  %116 = getelementptr inbounds i8, ptr %.03344, i64 74
  %117 = load i16, ptr %116, align 2, !tbaa !10
  switch i16 %117, label %150 [
    i16 4, label %138
    i16 3, label %128
    i16 2, label %123
    i16 1, label %118
  ]

118:                                              ; preds = %113
  %119 = getelementptr inbounds i8, ptr %.03344, i64 86
  %120 = load i16, ptr %119, align 2, !tbaa !16
  %121 = add i16 %120, %115
  %122 = icmp sgt i16 %121, 8127
  br i1 %122, label %.sink.split49, label %150

123:                                              ; preds = %113
  %124 = getelementptr inbounds i8, ptr %.03344, i64 84
  %125 = load i16, ptr %124, align 2, !tbaa !15
  %126 = add i16 %125, %115
  %127 = icmp sgt i16 %126, 8127
  br i1 %127, label %.sink.split49, label %150

128:                                              ; preds = %113
  %129 = getelementptr inbounds i8, ptr %.03344, i64 82
  %130 = load i16, ptr %129, align 2, !tbaa !14
  %131 = add i16 %130, %115
  %132 = icmp sgt i16 %131, 8127
  br i1 %132, label %.sink.split49, label %133

133:                                              ; preds = %128
  %134 = sext i16 %131 to i32
  %135 = getelementptr inbounds i8, ptr %.03344, i64 90
  %136 = load i16, ptr %135, align 2, !tbaa !13
  %137 = zext i16 %136 to i32
  %.not40.3 = icmp slt i32 %134, %137
  br i1 %.not40.3, label %150, label %.sink.split49

138:                                              ; preds = %113
  %139 = getelementptr inbounds i8, ptr %.03344, i64 80
  %140 = load i16, ptr %139, align 2, !tbaa !11
  %141 = sub i16 %115, %140
  %142 = getelementptr inbounds i8, ptr %.03344, i64 88
  %143 = load i16, ptr %142, align 2, !tbaa !12
  %.not41.3 = icmp sgt i16 %141, %143
  br i1 %.not41.3, label %150, label %144

144:                                              ; preds = %138
  %145 = sext i16 %143 to i32
  %146 = getelementptr inbounds i8, ptr %.03344, i64 90
  %147 = load i16, ptr %146, align 2, !tbaa !13
  %148 = zext i16 %147 to i32
  %.not42.3 = icmp sgt i32 %148, %145
  %149 = select i1 %.not42.3, i16 3, i16 2
  br label %.sink.split49

.sink.split49:                                    ; preds = %128, %133, %123, %118, %144
  %.sink50 = phi i16 [ %149, %144 ], [ 0, %118 ], [ 0, %123 ], [ 2, %133 ], [ 0, %128 ]
  %.0.3.ph = phi i16 [ %143, %144 ], [ 8128, %118 ], [ 8128, %123 ], [ %131, %133 ], [ 8128, %128 ]
  store i16 %.sink50, ptr %116, align 2, !tbaa !10
  br label %150

150:                                              ; preds = %.sink.split49, %138, %133, %123, %118, %113
  %.0.3 = phi i16 [ %115, %113 ], [ %121, %118 ], [ %126, %123 ], [ %131, %133 ], [ %141, %138 ], [ %.0.3.ph, %.sink.split49 ]
  store i16 %.0.3, ptr %114, align 2, !tbaa !5
  %151 = getelementptr inbounds i8, ptr %.03344, i64 104
  %152 = add nsw i16 %2, -1
  %.not = icmp eq i16 %2, 0
  br i1 %.not, label %153, label %.preheader, !llvm.loop !17

153:                                              ; preds = %150
  ret void
}

attributes #0 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) 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, !7, i64 4}
!6 = !{!"", !7, i64 0, !7, i64 2, !7, i64 4, !7, i64 6, !7, i64 8, !7, i64 10, !7, i64 12, !7, i64 14, !7, i64 16, !7, i64 18, !7, i64 20, !7, i64 22}
!7 = !{!"short", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!6, !7, i64 2}
!11 = !{!6, !7, i64 8}
!12 = !{!6, !7, i64 16}
!13 = !{!6, !7, i64 18}
!14 = !{!6, !7, i64 10}
!15 = !{!6, !7, i64 12}
!16 = !{!6, !7, i64 14}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}


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