; LLVM IR from thalium/icebox :: third_party/virtualbox/src/VBox/Devices/EFI/Firmware/MdePkg/Library (ReadPTLen)

; 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.SCRATCH_DATA = type { ptr, ptr, i32, i32, i16, i32, i32, i16, i32, i32, i16, [1019 x i16], [1019 x i16], [510 x i8], [31 x i8], [4096 x i16], [256 x i16], i8 }

@.str = external hidden unnamed_addr constant [162 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [22 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local void @FillBuf(ptr noundef, i16 noundef zeroext) #0

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local zeroext i16 @MakeTable(ptr noundef, i16 noundef zeroext, ptr noundef, i16 noundef zeroext, ptr noundef) #0

declare zeroext i8 @DebugAssertEnabled() #2

declare void @DebugAssert(ptr noundef, i64 noundef, ptr noundef) #2

declare ptr @SetMem16(ptr noundef, i64 noundef, i16 noundef zeroext) #2

; Function Attrs: nounwind uwtable
define dso_local zeroext i16 @ReadPTLen(ptr noundef %0, i16 noundef zeroext %1, i16 noundef zeroext %2, i16 noundef zeroext %3) #0 {
  %5 = alloca i16, align 2
  %6 = alloca ptr, align 8
  %7 = alloca i16, align 2
  %8 = alloca i16, align 2
  %9 = alloca i16, align 2
  %10 = alloca i16, align 2
  %11 = alloca i16, align 2
  %12 = alloca i16, align 2
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store i16 %1, ptr %7, align 2, !tbaa !9
  store i16 %2, ptr %8, align 2, !tbaa !9
  store i16 %3, ptr %9, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 2, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 2, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  br label %15

15:                                               ; preds = %4
  %16 = call zeroext i8 @DebugAssertEnabled()
  %17 = icmp ne i8 %16, 0
  br i1 %17, label %18, label %24

18:                                               ; preds = %15
  %19 = load i16, ptr %7, align 2, !tbaa !9
  %20 = zext i16 %19 to i32
  %21 = icmp ule i32 %20, 31
  br i1 %21, label %23, label %22

22:                                               ; preds = %18
  call void @DebugAssert(ptr noundef @.str, i64 noundef 336, ptr noundef @.str.2)
  br label %23

23:                                               ; preds = %22, %18
  br label %24

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

25:                                               ; preds = %24
  br label %26

26:                                               ; preds = %25
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = load i16, ptr %8, align 2, !tbaa !9
  %29 = call i32 @GetBits(ptr noundef %27, i16 noundef zeroext %28)
  %30 = trunc i32 %29 to i16
  store i16 %30, ptr %10, align 2, !tbaa !9
  %31 = load i16, ptr %10, align 2, !tbaa !9
  %32 = zext i16 %31 to i32
  %33 = icmp eq i32 %32, 0
  br i1 %33, label %34, label %50

34:                                               ; preds = %26
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = load i16, ptr %8, align 2, !tbaa !9
  %37 = call i32 @GetBits(ptr noundef %35, i16 noundef zeroext %36)
  %38 = trunc i32 %37 to i16
  store i16 %38, ptr %11, align 2, !tbaa !9
  %39 = load ptr, ptr %6, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %39, i32 0, i32 16
  %41 = getelementptr inbounds [256 x i16], ptr %40, i64 0, i64 0
  %42 = load i16, ptr %11, align 2, !tbaa !9
  %43 = call ptr @SetMem16(ptr noundef %41, i64 noundef 512, i16 noundef zeroext %42)
  %44 = load ptr, ptr %6, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %44, i32 0, i32 14
  %46 = getelementptr inbounds [31 x i8], ptr %45, i64 0, i64 0
  %47 = load i16, ptr %7, align 2, !tbaa !9
  %48 = zext i16 %47 to i64
  %49 = call ptr @SetMem(ptr noundef %46, i64 noundef %48, i8 noundef zeroext 0)
  store i16 0, ptr %5, align 2
  store i32 1, ptr %14, align 4
  br label %168

50:                                               ; preds = %26
  store i16 0, ptr %12, align 2, !tbaa !9
  br label %51

51:                                               ; preds = %137, %50
  %52 = load i16, ptr %12, align 2, !tbaa !9
  %53 = zext i16 %52 to i32
  %54 = load i16, ptr %10, align 2, !tbaa !9
  %55 = zext i16 %54 to i32
  %56 = icmp slt i32 %53, %55
  br i1 %56, label %57, label %61

57:                                               ; preds = %51
  %58 = load i16, ptr %12, align 2, !tbaa !9
  %59 = zext i16 %58 to i32
  %60 = icmp ult i32 %59, 31
  br label %61

61:                                               ; preds = %57, %51
  %62 = phi i1 [ false, %51 ], [ %60, %57 ]
  br i1 %62, label %63, label %138

63:                                               ; preds = %61
  %64 = load ptr, ptr %6, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %64, i32 0, i32 5
  %66 = load i32, ptr %65, align 4, !tbaa !11
  %67 = lshr i32 %66, 29
  %68 = trunc i32 %67 to i16
  store i16 %68, ptr %11, align 2, !tbaa !9
  %69 = load i16, ptr %11, align 2, !tbaa !9
  %70 = zext i16 %69 to i32
  %71 = icmp eq i32 %70, 7
  br i1 %71, label %72, label %88

72:                                               ; preds = %63
  store i32 268435456, ptr %13, align 4, !tbaa !14
  br label %73

73:                                               ; preds = %80, %72
  %74 = load i32, ptr %13, align 4, !tbaa !14
  %75 = load ptr, ptr %6, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %75, i32 0, i32 5
  %77 = load i32, ptr %76, align 4, !tbaa !11
  %78 = and i32 %74, %77
  %79 = icmp ne i32 %78, 0
  br i1 %79, label %80, label %87

80:                                               ; preds = %73
  %81 = load i32, ptr %13, align 4, !tbaa !14
  %82 = lshr i32 %81, 1
  store i32 %82, ptr %13, align 4, !tbaa !14
  %83 = load i16, ptr %11, align 2, !tbaa !9
  %84 = zext i16 %83 to i32
  %85 = add nsw i32 %84, 1
  %86 = trunc i32 %85 to i16
  store i16 %86, ptr %11, align 2, !tbaa !9
  br label %73, !llvm.loop !15

87:                                               ; preds = %73
  br label %88

88:                                               ; preds = %87, %63
  %89 = load ptr, ptr %6, align 8, !tbaa !5
  %90 = load i16, ptr %11, align 2, !tbaa !9
  %91 = zext i16 %90 to i32
  %92 = icmp slt i32 %91, 7
  br i1 %92, label %93, label %94

93:                                               ; preds = %88
  br label %98

94:                                               ; preds = %88
  %95 = load i16, ptr %11, align 2, !tbaa !9
  %96 = zext i16 %95 to i32
  %97 = sub nsw i32 %96, 3
  br label %98

98:                                               ; preds = %94, %93
  %99 = phi i32 [ 3, %93 ], [ %97, %94 ]
  %100 = trunc i32 %99 to i16
  call void @FillBuf(ptr noundef %89, i16 noundef zeroext %100)
  %101 = load i16, ptr %11, align 2, !tbaa !9
  %102 = trunc i16 %101 to i8
  %103 = load ptr, ptr %6, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %103, i32 0, i32 14
  %105 = load i16, ptr %12, align 2, !tbaa !9
  %106 = add i16 %105, 1
  store i16 %106, ptr %12, align 2, !tbaa !9
  %107 = zext i16 %105 to i64
  %108 = getelementptr inbounds [31 x i8], ptr %104, i64 0, i64 %107
  store i8 %102, ptr %108, align 1, !tbaa !17
  %109 = load i16, ptr %12, align 2, !tbaa !9
  %110 = zext i16 %109 to i32
  %111 = load i16, ptr %9, align 2, !tbaa !9
  %112 = zext i16 %111 to i32
  %113 = icmp eq i32 %110, %112
  br i1 %113, label %114, label %137

114:                                              ; preds = %98
  %115 = load ptr, ptr %6, align 8, !tbaa !5
  %116 = call i32 @GetBits(ptr noundef %115, i16 noundef zeroext 2)
  %117 = trunc i32 %116 to i16
  store i16 %117, ptr %11, align 2, !tbaa !9
  br label %118

118:                                              ; preds = %129, %114
  %119 = load i16, ptr %11, align 2, !tbaa !9
  %120 = add i16 %119, -1
  store i16 %120, ptr %11, align 2, !tbaa !9
  %121 = sext i16 %120 to i32
  %122 = icmp sge i32 %121, 0
  br i1 %122, label %123, label %127

123:                                              ; preds = %118
  %124 = load i16, ptr %12, align 2, !tbaa !9
  %125 = zext i16 %124 to i32
  %126 = icmp ult i32 %125, 31
  br label %127

127:                                              ; preds = %123, %118
  %128 = phi i1 [ false, %118 ], [ %126, %123 ]
  br i1 %128, label %129, label %136

129:                                              ; preds = %127
  %130 = load ptr, ptr %6, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %130, i32 0, i32 14
  %132 = load i16, ptr %12, align 2, !tbaa !9
  %133 = add i16 %132, 1
  store i16 %133, ptr %12, align 2, !tbaa !9
  %134 = zext i16 %132 to i64
  %135 = getelementptr inbounds [31 x i8], ptr %131, i64 0, i64 %134
  store i8 0, ptr %135, align 1, !tbaa !17
  br label %118, !llvm.loop !18

136:                                              ; preds = %127
  br label %137

137:                                              ; preds = %136, %98
  br label %51, !llvm.loop !19

138:                                              ; preds = %61
  br label %139

139:                                              ; preds = %151, %138
  %140 = load i16, ptr %12, align 2, !tbaa !9
  %141 = zext i16 %140 to i32
  %142 = load i16, ptr %7, align 2, !tbaa !9
  %143 = zext i16 %142 to i32
  %144 = icmp slt i32 %141, %143
  br i1 %144, label %145, label %149

145:                                              ; preds = %139
  %146 = load i16, ptr %12, align 2, !tbaa !9
  %147 = zext i16 %146 to i32
  %148 = icmp ult i32 %147, 31
  br label %149

149:                                              ; preds = %145, %139
  %150 = phi i1 [ false, %139 ], [ %148, %145 ]
  br i1 %150, label %151, label %158

151:                                              ; preds = %149
  %152 = load ptr, ptr %6, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %152, i32 0, i32 14
  %154 = load i16, ptr %12, align 2, !tbaa !9
  %155 = add i16 %154, 1
  store i16 %155, ptr %12, align 2, !tbaa !9
  %156 = zext i16 %154 to i64
  %157 = getelementptr inbounds [31 x i8], ptr %153, i64 0, i64 %156
  store i8 0, ptr %157, align 1, !tbaa !17
  br label %139, !llvm.loop !20

158:                                              ; preds = %149
  %159 = load ptr, ptr %6, align 8, !tbaa !5
  %160 = load i16, ptr %7, align 2, !tbaa !9
  %161 = load ptr, ptr %6, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %161, i32 0, i32 14
  %163 = getelementptr inbounds [31 x i8], ptr %162, i64 0, i64 0
  %164 = load ptr, ptr %6, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.SCRATCH_DATA, ptr %164, i32 0, i32 16
  %166 = getelementptr inbounds [256 x i16], ptr %165, i64 0, i64 0
  %167 = call zeroext i16 @MakeTable(ptr noundef %159, i16 noundef zeroext %160, ptr noundef %163, i16 noundef zeroext 8, ptr noundef %166)
  store i16 %167, ptr %5, align 2
  store i32 1, ptr %14, align 4
  br label %168

168:                                              ; preds = %158, %34
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %10) #3
  %169 = load i16, ptr %5, align 2
  ret i16 %169
}

declare ptr @SetMem(ptr noundef, i64 noundef, i8 noundef zeroext) #2

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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = !{!"short", !7, i64 0}
!11 = !{!12, !13, i64 28}
!12 = !{!"", !6, i64 0, !6, i64 8, !13, i64 16, !13, i64 20, !10, i64 24, !13, i64 28, !13, i64 32, !10, i64 36, !13, i64 40, !13, i64 44, !10, i64 48, !7, i64 50, !7, i64 2088, !7, i64 4126, !7, i64 4636, !7, i64 4668, !7, i64 12860, !7, i64 13372}
!13 = !{!"int", !7, i64 0}
!14 = !{!13, !13, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = !{!7, !7, i64 0}
!18 = distinct !{!18, !16}
!19 = distinct !{!19, !16}
!20 = distinct !{!20, !16}


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

@.str = external hidden unnamed_addr constant [162 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [22 x i8], align 1

; Function Attrs: nounwind uwtable
declare dso_local void @FillBuf(ptr noundef, i16 noundef zeroext) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
declare dso_local zeroext i16 @MakeTable(ptr noundef, i16 noundef zeroext, ptr noundef, i16 noundef zeroext, ptr noundef) local_unnamed_addr #0

declare zeroext i8 @DebugAssertEnabled() local_unnamed_addr #1

declare void @DebugAssert(ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #1

declare ptr @SetMem16(ptr noundef, i64 noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local zeroext i16 @ReadPTLen(ptr noundef %0, i16 noundef zeroext %1, i16 noundef zeroext %2, i16 noundef zeroext %3) local_unnamed_addr #0 {
  %5 = tail call zeroext i8 @DebugAssertEnabled() #4
  %6 = icmp eq i8 %5, 0
  %7 = icmp ult i16 %1, 32
  %or.cond = or i1 %7, %6
  br i1 %or.cond, label %9, label %8

8:                                                ; preds = %4
  tail call void @DebugAssert(ptr noundef nonnull @.str, i64 noundef 336, ptr noundef nonnull @.str.2) #4
  br label %9

9:                                                ; preds = %8, %4
  %10 = tail call i32 @GetBits(ptr noundef %0, i16 noundef zeroext %2)
  %11 = and i32 %10, 65535
  %12 = icmp eq i32 %11, 0
  br i1 %12, label %15, label %.preheader51

.preheader51:                                     ; preds = %9
  %13 = getelementptr inbounds i8, ptr %0, i64 28
  %14 = getelementptr inbounds i8, ptr %0, i64 4636
  %scevgep = getelementptr i8, ptr %0, i64 4637
  br label %29

15:                                               ; preds = %9
  %16 = tail call i32 @GetBits(ptr noundef %0, i16 noundef zeroext %2)
  %17 = trunc i32 %16 to i16
  %18 = getelementptr inbounds i8, ptr %0, i64 12860
  %19 = tail call ptr @SetMem16(ptr noundef nonnull %18, i64 noundef 512, i16 noundef zeroext %17) #4
  %20 = getelementptr inbounds i8, ptr %0, i64 4636
  %21 = zext i16 %1 to i64
  %22 = tail call ptr @SetMem(ptr noundef nonnull %20, i64 noundef %21, i8 noundef zeroext 0) #4
  br label %69

.preheader:                                       ; preds = %.loopexit
  %invariant.umin = tail call i16 @llvm.umin.i16(i16 %1, i16 31)
  %23 = icmp ult i16 %.2, %invariant.umin
  br i1 %23, label %.lr.ph60, label %._crit_edge

.lr.ph60:                                         ; preds = %.preheader
  %24 = zext nneg i16 %.2 to i64
  %scevgep64 = getelementptr i8, ptr %14, i64 %24
  %25 = xor i16 %.2, -1
  %26 = add nsw i16 %invariant.umin, %25
  %27 = zext i16 %26 to i64
  %28 = add nuw nsw i64 %27, 1
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %scevgep64, i8 0, i64 %28, i1 false), !tbaa !5
  br label %._crit_edge

29:                                               ; preds = %.preheader51, %.loopexit
  %.04358 = phi i16 [ 0, %.preheader51 ], [ %.2, %.loopexit ]
  %30 = load i32, ptr %13, align 4, !tbaa !8
  %31 = lshr i32 %30, 29
  %32 = trunc nuw nsw i32 %31 to i16
  %33 = icmp eq i32 %31, 7
  br i1 %33, label %.preheader49, label %.loopexit50

.preheader49:                                     ; preds = %29
  %34 = and i32 %30, 268435456
  %.not52 = icmp eq i32 %34, 0
  br i1 %.not52, label %.loopexit50.thread, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader49, %.lr.ph
  %.054 = phi i32 [ %35, %.lr.ph ], [ 268435456, %.preheader49 ]
  %.04453 = phi i16 [ %36, %.lr.ph ], [ 7, %.preheader49 ]
  %35 = lshr i32 %.054, 1
  %36 = add i16 %.04453, 1
  %37 = and i32 %35, %30
  %.not = icmp eq i32 %37, 0
  br i1 %.not, label %.loopexit50, label %.lr.ph, !llvm.loop !13

.loopexit50:                                      ; preds = %.lr.ph, %29
  %.145 = phi i16 [ %32, %29 ], [ %36, %.lr.ph ]
  %.145.fr = freeze i16 %.145
  %38 = icmp ult i16 %.145.fr, 7
  %39 = add i16 %.145.fr, -3
  %spec.select = select i1 %38, i16 3, i16 %39
  br label %.loopexit50.thread

.loopexit50.thread:                               ; preds = %.loopexit50, %.preheader49
  %.14570 = phi i16 [ 7, %.preheader49 ], [ %.145.fr, %.loopexit50 ]
  %40 = phi i16 [ 4, %.preheader49 ], [ %spec.select, %.loopexit50 ]
  tail call void @FillBuf(ptr noundef %0, i16 noundef zeroext %40)
  %41 = trunc i16 %.14570 to i8
  %42 = add nuw nsw i16 %.04358, 1
  %43 = zext i16 %.04358 to i64
  %44 = getelementptr inbounds [31 x i8], ptr %14, i64 0, i64 %43
  store i8 %41, ptr %44, align 1, !tbaa !5
  %45 = icmp eq i16 %42, %3
  br i1 %45, label %46, label %.loopexit

46:                                               ; preds = %.loopexit50.thread
  %47 = tail call i32 @GetBits(ptr noundef nonnull %0, i16 noundef zeroext 2)
  %48 = trunc i32 %47 to i16
  %49 = add i16 %48, -1
  %50 = icmp sgt i16 %49, -1
  %51 = icmp ult i16 %.04358, 30
  %52 = and i1 %50, %51
  br i1 %52, label %.lr.ph56.preheader, label %.loopexit

.lr.ph56.preheader:                               ; preds = %46
  %scevgep62 = getelementptr i8, ptr %scevgep, i64 %43
  %53 = sub nuw nsw i16 29, %.04358
  %54 = tail call i16 @llvm.umin.i16(i16 %49, i16 %53)
  %narrow = add nuw nsw i16 %54, 1
  %55 = zext nneg i16 %narrow to i64
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %scevgep62, i8 0, i64 %55, i1 false), !tbaa !5
  %56 = add nuw nsw i64 %43, 1
  br label %.lr.ph56

.lr.ph56:                                         ; preds = %.lr.ph56.preheader, %.lr.ph56
  %indvars.iv = phi i64 [ %56, %.lr.ph56.preheader ], [ %indvars.iv.next, %.lr.ph56 ]
  %57 = phi i16 [ %49, %.lr.ph56.preheader ], [ %58, %.lr.ph56 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %58 = add nsw i16 %57, -1
  %59 = icmp ne i16 %57, 0
  %60 = icmp ult i64 %indvars.iv, 30
  %61 = and i1 %59, %60
  br i1 %61, label %.lr.ph56, label %.loopexit.loopexit, !llvm.loop !15

.loopexit.loopexit:                               ; preds = %.lr.ph56
  %62 = trunc nuw nsw i64 %indvars.iv.next to i16
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit, %46, %.loopexit50.thread
  %.2 = phi i16 [ %42, %.loopexit50.thread ], [ %3, %46 ], [ %62, %.loopexit.loopexit ]
  %63 = zext i16 %.2 to i32
  %64 = icmp ugt i32 %11, %63
  %65 = icmp ult i16 %.2, 31
  %66 = and i1 %65, %64
  br i1 %66, label %29, label %.preheader, !llvm.loop !16

._crit_edge:                                      ; preds = %.lr.ph60, %.preheader
  %67 = getelementptr inbounds i8, ptr %0, i64 12860
  %68 = tail call zeroext i16 @MakeTable(ptr noundef %0, i16 noundef zeroext %1, ptr noundef nonnull %14, i16 noundef zeroext 8, ptr noundef nonnull %67)
  br label %69

69:                                               ; preds = %._crit_edge, %15
  %.047 = phi i16 [ 0, %15 ], [ %68, %._crit_edge ]
  ret i16 %.047
}

declare ptr @SetMem(ptr noundef, i64 noundef, i8 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i16 @llvm.umin.i16(i16, i16) #2

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

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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { 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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = !{!9, !11, i64 28}
!9 = !{!"", !10, i64 0, !10, i64 8, !11, i64 16, !11, i64 20, !12, i64 24, !11, i64 28, !11, i64 32, !12, i64 36, !11, i64 40, !11, i64 44, !12, i64 48, !6, i64 50, !6, i64 2088, !6, i64 4126, !6, i64 4636, !6, i64 4668, !6, i64 12860, !6, i64 13372}
!10 = !{!"any pointer", !6, i64 0}
!11 = !{!"int", !6, i64 0}
!12 = !{!"short", !6, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = distinct !{!15, !14}
!16 = distinct !{!16, !14}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopIdiomRecognizePass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass