; LLVM IR from openanolis/openssl :: ssl/quic (quic_wire_pkt)

; 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.quic_pkt_hdr_st = type { i32, i32, %struct.quic_conn_id_st, %struct.quic_conn_id_st, [4 x i8], ptr, i64, i64, ptr }
%struct.quic_conn_id_st = type { i8, [20 x i8] }

; 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: inlinehint nounwind uwtable
declare hidden i32 @ossl_quic_pkt_type_has_pn(i32 noundef) #1

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

14:                                               ; preds = %2
  %15 = load ptr, ptr %5, align 8, !tbaa !9
  %16 = load i32, ptr %15, align 8
  %17 = and i32 %16, 255
  %18 = icmp eq i32 %17, 5
  br i1 %18, label %19, label %28

19:                                               ; preds = %14
  %20 = load ptr, ptr %5, align 8, !tbaa !9
  %21 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %20, i32 0, i32 2
  %22 = getelementptr inbounds %struct.quic_conn_id_st, ptr %21, i32 0, i32 0
  %23 = load i8, ptr %22, align 8, !tbaa !11
  %24 = zext i8 %23 to i64
  %25 = load i64, ptr %4, align 8, !tbaa !5
  %26 = icmp ne i64 %24, %25
  br i1 %26, label %27, label %28

27:                                               ; preds = %19, %2
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

28:                                               ; preds = %19, %14
  %29 = load ptr, ptr %5, align 8, !tbaa !9
  %30 = load i32, ptr %29, align 8
  %31 = and i32 %30, 255
  %32 = icmp eq i32 %31, 5
  br i1 %32, label %33, label %67

33:                                               ; preds = %28
  %34 = load ptr, ptr %5, align 8, !tbaa !9
  %35 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %34, i32 0, i32 2
  %36 = getelementptr inbounds %struct.quic_conn_id_st, ptr %35, i32 0, i32 0
  %37 = load i8, ptr %36, align 8, !tbaa !11
  %38 = zext i8 %37 to i64
  %39 = load i64, ptr %4, align 8, !tbaa !5
  %40 = icmp ne i64 %38, %39
  br i1 %40, label %56, label %41

41:                                               ; preds = %33
  %42 = load i64, ptr %4, align 8, !tbaa !5
  %43 = icmp ugt i64 %42, 20
  br i1 %43, label %56, label %44

44:                                               ; preds = %41
  %45 = load ptr, ptr %5, align 8, !tbaa !9
  %46 = load i32, ptr %45, align 8
  %47 = lshr i32 %46, 10
  %48 = and i32 %47, 15
  %49 = icmp slt i32 %48, 1
  br i1 %49, label %56, label %50

50:                                               ; preds = %44
  %51 = load ptr, ptr %5, align 8, !tbaa !9
  %52 = load i32, ptr %51, align 8
  %53 = lshr i32 %52, 10
  %54 = and i32 %53, 15
  %55 = icmp sgt i32 %54, 4
  br i1 %55, label %56, label %57

56:                                               ; preds = %50, %44, %41, %33
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

57:                                               ; preds = %50
  %58 = load i64, ptr %4, align 8, !tbaa !5
  %59 = add i64 1, %58
  %60 = load ptr, ptr %5, align 8, !tbaa !9
  %61 = load i32, ptr %60, align 8
  %62 = lshr i32 %61, 10
  %63 = and i32 %62, 15
  %64 = zext i32 %63 to i64
  %65 = add i64 %59, %64
  %66 = trunc i64 %65 to i32
  store i32 %66, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

67:                                               ; preds = %28
  %68 = load ptr, ptr %5, align 8, !tbaa !9
  %69 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %68, i32 0, i32 2
  %70 = getelementptr inbounds %struct.quic_conn_id_st, ptr %69, i32 0, i32 0
  %71 = load i8, ptr %70, align 8, !tbaa !11
  %72 = zext i8 %71 to i32
  %73 = icmp sgt i32 %72, 20
  br i1 %73, label %81, label %74

74:                                               ; preds = %67
  %75 = load ptr, ptr %5, align 8, !tbaa !9
  %76 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %75, i32 0, i32 3
  %77 = getelementptr inbounds %struct.quic_conn_id_st, ptr %76, i32 0, i32 0
  %78 = load i8, ptr %77, align 1, !tbaa !15
  %79 = zext i8 %78 to i32
  %80 = icmp sgt i32 %79, 20
  br i1 %80, label %81, label %82

81:                                               ; preds = %74, %67
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

82:                                               ; preds = %74
  %83 = load ptr, ptr %5, align 8, !tbaa !9
  %84 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %83, i32 0, i32 2
  %85 = getelementptr inbounds %struct.quic_conn_id_st, ptr %84, i32 0, i32 0
  %86 = load i8, ptr %85, align 8, !tbaa !11
  %87 = zext i8 %86 to i32
  %88 = add nsw i32 6, %87
  %89 = add nsw i32 %88, 1
  %90 = load ptr, ptr %5, align 8, !tbaa !9
  %91 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %90, i32 0, i32 3
  %92 = getelementptr inbounds %struct.quic_conn_id_st, ptr %91, i32 0, i32 0
  %93 = load i8, ptr %92, align 1, !tbaa !15
  %94 = zext i8 %93 to i32
  %95 = add nsw i32 %89, %94
  %96 = sext i32 %95 to i64
  %97 = load i64, ptr %6, align 8, !tbaa !5
  %98 = add i64 %97, %96
  store i64 %98, ptr %6, align 8, !tbaa !5
  %99 = load ptr, ptr %5, align 8, !tbaa !9
  %100 = load i32, ptr %99, align 8
  %101 = and i32 %100, 255
  %102 = call i32 @ossl_quic_pkt_type_has_pn(i32 noundef %101)
  %103 = icmp ne i32 %102, 0
  br i1 %103, label %104, label %125

104:                                              ; preds = %82
  %105 = load ptr, ptr %5, align 8, !tbaa !9
  %106 = load i32, ptr %105, align 8
  %107 = lshr i32 %106, 10
  %108 = and i32 %107, 15
  %109 = icmp slt i32 %108, 1
  br i1 %109, label %116, label %110

110:                                              ; preds = %104
  %111 = load ptr, ptr %5, align 8, !tbaa !9
  %112 = load i32, ptr %111, align 8
  %113 = lshr i32 %112, 10
  %114 = and i32 %113, 15
  %115 = icmp sgt i32 %114, 4
  br i1 %115, label %116, label %117

116:                                              ; preds = %110, %104
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

117:                                              ; preds = %110
  %118 = load ptr, ptr %5, align 8, !tbaa !9
  %119 = load i32, ptr %118, align 8
  %120 = lshr i32 %119, 10
  %121 = and i32 %120, 15
  %122 = zext i32 %121 to i64
  %123 = load i64, ptr %6, align 8, !tbaa !5
  %124 = add i64 %123, %122
  store i64 %124, ptr %6, align 8, !tbaa !5
  br label %125

125:                                              ; preds = %117, %82
  %126 = load ptr, ptr %5, align 8, !tbaa !9
  %127 = load i32, ptr %126, align 8
  %128 = and i32 %127, 255
  %129 = icmp eq i32 %128, 1
  br i1 %129, label %130, label %146

130:                                              ; preds = %125
  %131 = load ptr, ptr %5, align 8, !tbaa !9
  %132 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %131, i32 0, i32 6
  %133 = load i64, ptr %132, align 8, !tbaa !16
  %134 = call i64 @ossl_quic_vlint_encode_len(i64 noundef %133)
  store i64 %134, ptr %7, align 8, !tbaa !5
  %135 = load i64, ptr %7, align 8, !tbaa !5
  %136 = icmp ne i64 %135, 0
  br i1 %136, label %138, label %137

137:                                              ; preds = %130
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

138:                                              ; preds = %130
  %139 = load i64, ptr %7, align 8, !tbaa !5
  %140 = load ptr, ptr %5, align 8, !tbaa !9
  %141 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %140, i32 0, i32 6
  %142 = load i64, ptr %141, align 8, !tbaa !16
  %143 = add i64 %139, %142
  %144 = load i64, ptr %6, align 8, !tbaa !5
  %145 = add i64 %144, %143
  store i64 %145, ptr %6, align 8, !tbaa !5
  br label %146

146:                                              ; preds = %138, %125
  %147 = load ptr, ptr %5, align 8, !tbaa !9
  %148 = load i32, ptr %147, align 8
  %149 = and i32 %148, 255
  %150 = call i32 @ossl_quic_pkt_type_must_be_last(i32 noundef %149)
  %151 = icmp ne i32 %150, 0
  br i1 %151, label %170, label %152

152:                                              ; preds = %146
  %153 = load ptr, ptr %5, align 8, !tbaa !9
  %154 = getelementptr inbounds %struct.quic_pkt_hdr_st, ptr %153, i32 0, i32 7
  %155 = load i64, ptr %154, align 8, !tbaa !17
  %156 = load ptr, ptr %5, align 8, !tbaa !9
  %157 = load i32, ptr %156, align 8
  %158 = lshr i32 %157, 10
  %159 = and i32 %158, 15
  %160 = zext i32 %159 to i64
  %161 = add i64 %155, %160
  %162 = call i64 @ossl_quic_vlint_encode_len(i64 noundef %161)
  store i64 %162, ptr %7, align 8, !tbaa !5
  %163 = load i64, ptr %7, align 8, !tbaa !5
  %164 = icmp ne i64 %163, 0
  br i1 %164, label %166, label %165

165:                                              ; preds = %152
  store i32 0, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

166:                                              ; preds = %152
  %167 = load i64, ptr %7, align 8, !tbaa !5
  %168 = load i64, ptr %6, align 8, !tbaa !5
  %169 = add i64 %168, %167
  store i64 %169, ptr %6, align 8, !tbaa !5
  br label %170

170:                                              ; preds = %166, %146
  %171 = load i64, ptr %6, align 8, !tbaa !5
  %172 = trunc i64 %171 to i32
  store i32 %172, ptr %3, align 4
  store i32 1, ptr %8, align 4
  br label %173

173:                                              ; preds = %170, %165, %137, %116, %81, %57, %56, %27
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #3
  %174 = load i32, ptr %3, align 4
  ret i32 %174
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @ossl_quic_vlint_encode_len(i64 noundef) #1

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !7, i64 8}
!12 = !{!"quic_pkt_hdr_st", !13, i64 0, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 1, !13, i64 2, !13, i64 2, !13, i64 4, !14, i64 8, !14, i64 29, !7, i64 50, !10, i64 56, !6, i64 64, !6, i64 72, !10, i64 80}
!13 = !{!"int", !7, i64 0}
!14 = !{!"quic_conn_id_st", !7, i64 0, !7, i64 1}
!15 = !{!12, !7, i64 29}
!16 = !{!12, !6, i64 64}
!17 = !{!12, !6, i64 72}


; 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: inlinehint nounwind uwtable
declare hidden i32 @ossl_quic_pkt_type_has_pn(i32 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i32 @ossl_quic_wire_get_encoded_pkt_hdr_len(i64 noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #1 {
  %3 = load i32, ptr %1, align 8
  %4 = and i32 %3, 16384
  %.not = icmp eq i32 %4, 0
  br i1 %.not, label %5, label %63

5:                                                ; preds = %2
  %6 = and i32 %3, 255
  %7 = icmp eq i32 %6, 5
  %8 = getelementptr inbounds i8, ptr %1, i64 8
  %9 = load i8, ptr %8, align 8, !tbaa !5
  br i1 %7, label %10, label %21

10:                                               ; preds = %5
  %11 = zext i8 %9 to i64
  %.not45 = icmp ne i64 %11, %0
  %12 = icmp ugt i64 %0, 20
  %or.cond = or i1 %.not45, %12
  br i1 %or.cond, label %63, label %13

13:                                               ; preds = %10
  %14 = lshr i32 %3, 10
  %15 = and i32 %14, 15
  %16 = add nsw i32 %15, -5
  %or.cond51 = icmp ult i32 %16, -4
  br i1 %or.cond51, label %63, label %17

17:                                               ; preds = %13
  %18 = trunc nuw i64 %0 to i32
  %19 = add nuw nsw i32 %18, 1
  %20 = add nuw nsw i32 %19, %15
  br label %63

21:                                               ; preds = %5
  %22 = icmp ugt i8 %9, 20
  br i1 %22, label %63, label %23

23:                                               ; preds = %21
  %24 = getelementptr inbounds i8, ptr %1, i64 29
  %25 = load i8, ptr %24, align 1, !tbaa !13
  %26 = icmp ugt i8 %25, 20
  br i1 %26, label %63, label %27

27:                                               ; preds = %23
  %narrow = add nuw nsw i8 %9, 7
  %narrow46 = add nuw nsw i8 %narrow, %25
  %28 = zext nneg i8 %narrow46 to i64
  %29 = tail call i32 @ossl_quic_pkt_type_has_pn(i32 noundef %6)
  %.not47 = icmp eq i32 %29, 0
  %.pre = load i32, ptr %1, align 8
  br i1 %.not47, label %37, label %30

30:                                               ; preds = %27
  %31 = lshr i32 %.pre, 10
  %32 = and i32 %31, 15
  %33 = add nsw i32 %32, -5
  %or.cond52 = icmp ult i32 %33, -4
  br i1 %or.cond52, label %63, label %34

34:                                               ; preds = %30
  %35 = zext nneg i32 %32 to i64
  %36 = add nuw nsw i64 %35, %28
  br label %37

37:                                               ; preds = %34, %27
  %.0 = phi i64 [ %36, %34 ], [ %28, %27 ]
  %38 = and i32 %.pre, 255
  %39 = icmp eq i32 %38, 1
  br i1 %39, label %40, label %48

40:                                               ; preds = %37
  %41 = getelementptr inbounds i8, ptr %1, i64 64
  %42 = load i64, ptr %41, align 8, !tbaa !14
  %43 = tail call i64 @ossl_quic_vlint_encode_len(i64 noundef %42)
  %.not48 = icmp eq i64 %43, 0
  br i1 %.not48, label %63, label %44

44:                                               ; preds = %40
  %45 = load i64, ptr %41, align 8, !tbaa !14
  %46 = add i64 %43, %.0
  %47 = add i64 %46, %45
  %.pre53 = load i32, ptr %1, align 8
  %.pre54 = and i32 %.pre53, 255
  br label %48

48:                                               ; preds = %44, %37
  %.pre-phi = phi i32 [ %.pre54, %44 ], [ %38, %37 ]
  %.1 = phi i64 [ %47, %44 ], [ %.0, %37 ]
  %49 = tail call i32 @ossl_quic_pkt_type_must_be_last(i32 noundef %.pre-phi)
  %.not49 = icmp eq i32 %49, 0
  br i1 %.not49, label %50, label %61

50:                                               ; preds = %48
  %51 = getelementptr inbounds i8, ptr %1, i64 72
  %52 = load i64, ptr %51, align 8, !tbaa !15
  %53 = load i32, ptr %1, align 8
  %54 = lshr i32 %53, 10
  %55 = and i32 %54, 15
  %56 = zext nneg i32 %55 to i64
  %57 = add i64 %52, %56
  %58 = tail call i64 @ossl_quic_vlint_encode_len(i64 noundef %57)
  %.not50 = icmp eq i64 %58, 0
  br i1 %.not50, label %63, label %59

59:                                               ; preds = %50
  %60 = add i64 %58, %.1
  br label %61

61:                                               ; preds = %59, %48
  %.2 = phi i64 [ %.1, %48 ], [ %60, %59 ]
  %62 = trunc i64 %.2 to i32
  br label %63

63:                                               ; preds = %50, %40, %30, %21, %23, %13, %2, %10, %61, %17
  %.036 = phi i32 [ %20, %17 ], [ %62, %61 ], [ 0, %10 ], [ 0, %2 ], [ 0, %13 ], [ 0, %23 ], [ 0, %21 ], [ 0, %30 ], [ 0, %40 ], [ 0, %50 ]
  ret i32 %.036
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @ossl_quic_vlint_encode_len(i64 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @ossl_quic_pkt_type_must_be_last(i32 noundef) local_unnamed_addr #0

attributes #0 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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" }

!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, !8, i64 8}
!6 = !{!"quic_pkt_hdr_st", !7, i64 0, !7, i64 1, !7, i64 1, !7, i64 1, !7, i64 1, !7, i64 1, !7, i64 2, !7, i64 2, !7, i64 4, !10, i64 8, !10, i64 29, !8, i64 50, !11, i64 56, !12, i64 64, !12, i64 72, !11, i64 80}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"quic_conn_id_st", !8, i64 0, !8, i64 1}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"long", !8, i64 0}
!13 = !{!6, !8, i64 29}
!14 = !{!6, !12, i64 64}
!15 = !{!6, !12, i64 72}


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