; LLVM IR from itchio/go-brotli :: enc (brotli_bit_stream)

; 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.HuffmanTree = type { i32, i16, i16 }

@kZeroRepsDepth = external hidden constant [704 x i32], align 16
@kZeroRepsBits = external hidden constant [704 x i64], align 16
@kCodeLengthDepth = external hidden constant [18 x i8], align 16
@kCodeLengthBits = external hidden constant [18 x i32], align 16
@kNonZeroRepsDepth = external hidden constant [704 x i32], align 16
@kNonZeroRepsBits = external hidden constant [704 x i64], align 16

; 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 nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1

declare hidden void @BrotliConvertBitDepthsToSymbols(ptr noundef, i64 noundef, ptr noundef) #2

; 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 hidden void @BrotliBuildAndStoreHuffmanTreeFast(ptr noundef %0, ptr noundef %1, i64 noundef %2, i64 noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7) #3 {
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i64, align 8
  %18 = alloca [4 x i64], align 16
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca ptr, align 8
  %26 = alloca i64, align 8
  %27 = alloca i32, align 4
  %28 = alloca %struct.HuffmanTree, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i64, align 8
  %35 = alloca i64, align 8
  %36 = alloca i64, align 8
  %37 = alloca i8, align 1
  %38 = alloca i64, align 8
  %39 = alloca i8, align 1
  %40 = alloca i64, align 8
  %41 = alloca i64, align 8
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store i64 %2, ptr %11, align 8, !tbaa !9
  store i64 %3, ptr %12, align 8, !tbaa !9
  store ptr %4, ptr %13, align 8, !tbaa !5
  store ptr %5, ptr %14, align 8, !tbaa !5
  store ptr %6, ptr %15, align 8, !tbaa !5
  store ptr %7, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  store i64 0, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %18) #7
  call void @llvm.memset.p0.i64(ptr align 16 %18, i8 0, i64 32, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  store i64 0, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  %42 = load i64, ptr %11, align 8, !tbaa !9
  store i64 %42, ptr %20, align 8, !tbaa !9
  br label %43

43:                                               ; preds = %69, %8
  %44 = load i64, ptr %20, align 8, !tbaa !9
  %45 = icmp ne i64 %44, 0
  br i1 %45, label %46, label %72

46:                                               ; preds = %43
  %47 = load ptr, ptr %10, align 8, !tbaa !5
  %48 = load i64, ptr %19, align 8, !tbaa !9
  %49 = getelementptr inbounds i32, ptr %47, i64 %48
  %50 = load i32, ptr %49, align 4, !tbaa !11
  %51 = icmp ne i32 %50, 0
  br i1 %51, label %52, label %69

52:                                               ; preds = %46
  %53 = load i64, ptr %17, align 8, !tbaa !9
  %54 = icmp ult i64 %53, 4
  br i1 %54, label %55, label %59

55:                                               ; preds = %52
  %56 = load i64, ptr %19, align 8, !tbaa !9
  %57 = load i64, ptr %17, align 8, !tbaa !9
  %58 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %57
  store i64 %56, ptr %58, align 8, !tbaa !9
  br label %59

59:                                               ; preds = %55, %52
  %60 = load i64, ptr %17, align 8, !tbaa !9
  %61 = add i64 %60, 1
  store i64 %61, ptr %17, align 8, !tbaa !9
  %62 = load ptr, ptr %10, align 8, !tbaa !5
  %63 = load i64, ptr %19, align 8, !tbaa !9
  %64 = getelementptr inbounds i32, ptr %62, i64 %63
  %65 = load i32, ptr %64, align 4, !tbaa !11
  %66 = zext i32 %65 to i64
  %67 = load i64, ptr %20, align 8, !tbaa !9
  %68 = sub i64 %67, %66
  store i64 %68, ptr %20, align 8, !tbaa !9
  br label %69

69:                                               ; preds = %59, %46
  %70 = load i64, ptr %19, align 8, !tbaa !9
  %71 = add i64 %70, 1
  store i64 %71, ptr %19, align 8, !tbaa !9
  br label %43, !llvm.loop !13

72:                                               ; preds = %43
  %73 = load i64, ptr %17, align 8, !tbaa !9
  %74 = icmp ule i64 %73, 1
  br i1 %74, label %75, label %91

75:                                               ; preds = %72
  %76 = load ptr, ptr %15, align 8, !tbaa !5
  %77 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef 4, i64 noundef 1, ptr noundef %76, ptr noundef %77)
  %78 = load i64, ptr %12, align 8, !tbaa !9
  %79 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %80 = load i64, ptr %79, align 16, !tbaa !9
  %81 = load ptr, ptr %15, align 8, !tbaa !5
  %82 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %78, i64 noundef %80, ptr noundef %81, ptr noundef %82)
  %83 = load ptr, ptr %13, align 8, !tbaa !5
  %84 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %85 = load i64, ptr %84, align 16, !tbaa !9
  %86 = getelementptr inbounds i8, ptr %83, i64 %85
  store i8 0, ptr %86, align 1, !tbaa !15
  %87 = load ptr, ptr %14, align 8, !tbaa !5
  %88 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %89 = load i64, ptr %88, align 16, !tbaa !9
  %90 = getelementptr inbounds i16, ptr %87, i64 %89
  store i16 0, ptr %90, align 2, !tbaa !16
  store i32 1, ptr %21, align 4
  br label %512

91:                                               ; preds = %72
  %92 = load ptr, ptr %13, align 8, !tbaa !5
  %93 = load i64, ptr %19, align 8, !tbaa !9
  %94 = mul i64 %93, 1
  call void @llvm.memset.p0.i64(ptr align 1 %92, i8 0, i64 %94, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  %95 = load i64, ptr %19, align 8, !tbaa !9
  %96 = mul i64 2, %95
  %97 = add i64 %96, 1
  store i64 %97, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #7
  %98 = load i64, ptr %22, align 8, !tbaa !9
  %99 = icmp ugt i64 %98, 0
  br i1 %99, label %100, label %105

100:                                              ; preds = %91
  %101 = load ptr, ptr %9, align 8, !tbaa !5
  %102 = load i64, ptr %22, align 8, !tbaa !9
  %103 = mul i64 %102, 8
  %104 = call ptr @BrotliAllocate(ptr noundef %101, i64 noundef %103)
  br label %106

105:                                              ; preds = %91
  br label %106

106:                                              ; preds = %105, %100
  %107 = phi ptr [ %104, %100 ], [ null, %105 ]
  store ptr %107, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  store i32 1, ptr %24, align 4, !tbaa !11
  br label %108

108:                                              ; preds = %266, %106
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %109 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %109, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #7
  %110 = load i64, ptr %19, align 8, !tbaa !9
  store i64 %110, ptr %26, align 8, !tbaa !9
  br label %111

111:                                              ; preds = %151, %108
  %112 = load i64, ptr %26, align 8, !tbaa !9
  %113 = icmp ne i64 %112, 0
  br i1 %113, label %114, label %152

114:                                              ; preds = %111
  %115 = load i64, ptr %26, align 8, !tbaa !9
  %116 = add i64 %115, -1
  store i64 %116, ptr %26, align 8, !tbaa !9
  %117 = load ptr, ptr %10, align 8, !tbaa !5
  %118 = load i64, ptr %26, align 8, !tbaa !9
  %119 = getelementptr inbounds i32, ptr %117, i64 %118
  %120 = load i32, ptr %119, align 4, !tbaa !11
  %121 = icmp ne i32 %120, 0
  br i1 %121, label %122, label %151

122:                                              ; preds = %114
  %123 = load ptr, ptr %10, align 8, !tbaa !5
  %124 = load i64, ptr %26, align 8, !tbaa !9
  %125 = getelementptr inbounds i32, ptr %123, i64 %124
  %126 = load i32, ptr %125, align 4, !tbaa !11
  %127 = load i32, ptr %24, align 4, !tbaa !11
  %128 = icmp uge i32 %126, %127
  %129 = xor i1 %128, true
  %130 = xor i1 %129, true
  %131 = zext i1 %130 to i32
  %132 = sext i32 %131 to i64
  %133 = call i64 @llvm.expect.i64(i64 %132, i64 1)
  %134 = icmp ne i64 %133, 0
  br i1 %134, label %135, label %143

135:                                              ; preds = %122
  %136 = load ptr, ptr %25, align 8, !tbaa !5
  %137 = load ptr, ptr %10, align 8, !tbaa !5
  %138 = load i64, ptr %26, align 8, !tbaa !9
  %139 = getelementptr inbounds i32, ptr %137, i64 %138
  %140 = load i32, ptr %139, align 4, !tbaa !11
  %141 = load i64, ptr %26, align 8, !tbaa !9
  %142 = trunc i64 %141 to i16
  call void @InitHuffmanTree(ptr noundef %136, i32 noundef %140, i16 noundef signext -1, i16 noundef signext %142)
  br label %148

143:                                              ; preds = %122
  %144 = load ptr, ptr %25, align 8, !tbaa !5
  %145 = load i32, ptr %24, align 4, !tbaa !11
  %146 = load i64, ptr %26, align 8, !tbaa !9
  %147 = trunc i64 %146 to i16
  call void @InitHuffmanTree(ptr noundef %144, i32 noundef %145, i16 noundef signext -1, i16 noundef signext %147)
  br label %148

148:                                              ; preds = %143, %135
  %149 = load ptr, ptr %25, align 8, !tbaa !5
  %150 = getelementptr inbounds %struct.HuffmanTree, ptr %149, i32 1
  store ptr %150, ptr %25, align 8, !tbaa !5
  br label %151

151:                                              ; preds = %148, %114
  br label %111, !llvm.loop !18

152:                                              ; preds = %111
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  %153 = load ptr, ptr %25, align 8, !tbaa !5
  %154 = load ptr, ptr %23, align 8, !tbaa !5
  %155 = ptrtoint ptr %153 to i64
  %156 = ptrtoint ptr %154 to i64
  %157 = sub i64 %155, %156
  %158 = sdiv exact i64 %157, 8
  %159 = trunc i64 %158 to i32
  store i32 %159, ptr %27, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  store i32 0, ptr %29, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #7
  %160 = load i32, ptr %27, align 4, !tbaa !11
  %161 = add nsw i32 %160, 1
  store i32 %161, ptr %30, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #7
  %162 = load ptr, ptr %23, align 8, !tbaa !5
  %163 = load i32, ptr %27, align 4, !tbaa !11
  %164 = sext i32 %163 to i64
  call void @SortHuffmanTreeItems(ptr noundef %162, i64 noundef %164, ptr noundef @SortHuffmanTree)
  call void @InitHuffmanTree(ptr noundef %28, i32 noundef -1, i16 noundef signext -1, i16 noundef signext -1)
  %165 = load ptr, ptr %25, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.HuffmanTree, ptr %165, i32 1
  store ptr %166, ptr %25, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %165, ptr align 4 %28, i64 8, i1 false), !tbaa.struct !19
  %167 = load ptr, ptr %25, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.HuffmanTree, ptr %167, i32 1
  store ptr %168, ptr %25, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %167, ptr align 4 %28, i64 8, i1 false), !tbaa.struct !19
  %169 = load i32, ptr %27, align 4, !tbaa !11
  %170 = sub nsw i32 %169, 1
  store i32 %170, ptr %31, align 4, !tbaa !11
  br label %171

171:                                              ; preds = %247, %152
  %172 = load i32, ptr %31, align 4, !tbaa !11
  %173 = icmp sgt i32 %172, 0
  br i1 %173, label %174, label %250

174:                                              ; preds = %171
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #7
  %175 = load ptr, ptr %23, align 8, !tbaa !5
  %176 = load i32, ptr %29, align 4, !tbaa !11
  %177 = sext i32 %176 to i64
  %178 = getelementptr inbounds %struct.HuffmanTree, ptr %175, i64 %177
  %179 = getelementptr inbounds %struct.HuffmanTree, ptr %178, i32 0, i32 0
  %180 = load i32, ptr %179, align 4, !tbaa !20
  %181 = load ptr, ptr %23, align 8, !tbaa !5
  %182 = load i32, ptr %30, align 4, !tbaa !11
  %183 = sext i32 %182 to i64
  %184 = getelementptr inbounds %struct.HuffmanTree, ptr %181, i64 %183
  %185 = getelementptr inbounds %struct.HuffmanTree, ptr %184, i32 0, i32 0
  %186 = load i32, ptr %185, align 4, !tbaa !20
  %187 = icmp ule i32 %180, %186
  br i1 %187, label %188, label %192

188:                                              ; preds = %174
  %189 = load i32, ptr %29, align 4, !tbaa !11
  store i32 %189, ptr %32, align 4, !tbaa !11
  %190 = load i32, ptr %29, align 4, !tbaa !11
  %191 = add nsw i32 %190, 1
  store i32 %191, ptr %29, align 4, !tbaa !11
  br label %196

192:                                              ; preds = %174
  %193 = load i32, ptr %30, align 4, !tbaa !11
  store i32 %193, ptr %32, align 4, !tbaa !11
  %194 = load i32, ptr %30, align 4, !tbaa !11
  %195 = add nsw i32 %194, 1
  store i32 %195, ptr %30, align 4, !tbaa !11
  br label %196

196:                                              ; preds = %192, %188
  %197 = load ptr, ptr %23, align 8, !tbaa !5
  %198 = load i32, ptr %29, align 4, !tbaa !11
  %199 = sext i32 %198 to i64
  %200 = getelementptr inbounds %struct.HuffmanTree, ptr %197, i64 %199
  %201 = getelementptr inbounds %struct.HuffmanTree, ptr %200, i32 0, i32 0
  %202 = load i32, ptr %201, align 4, !tbaa !20
  %203 = load ptr, ptr %23, align 8, !tbaa !5
  %204 = load i32, ptr %30, align 4, !tbaa !11
  %205 = sext i32 %204 to i64
  %206 = getelementptr inbounds %struct.HuffmanTree, ptr %203, i64 %205
  %207 = getelementptr inbounds %struct.HuffmanTree, ptr %206, i32 0, i32 0
  %208 = load i32, ptr %207, align 4, !tbaa !20
  %209 = icmp ule i32 %202, %208
  br i1 %209, label %210, label %214

210:                                              ; preds = %196
  %211 = load i32, ptr %29, align 4, !tbaa !11
  store i32 %211, ptr %33, align 4, !tbaa !11
  %212 = load i32, ptr %29, align 4, !tbaa !11
  %213 = add nsw i32 %212, 1
  store i32 %213, ptr %29, align 4, !tbaa !11
  br label %218

214:                                              ; preds = %196
  %215 = load i32, ptr %30, align 4, !tbaa !11
  store i32 %215, ptr %33, align 4, !tbaa !11
  %216 = load i32, ptr %30, align 4, !tbaa !11
  %217 = add nsw i32 %216, 1
  store i32 %217, ptr %30, align 4, !tbaa !11
  br label %218

218:                                              ; preds = %214, %210
  %219 = load ptr, ptr %23, align 8, !tbaa !5
  %220 = load i32, ptr %32, align 4, !tbaa !11
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds %struct.HuffmanTree, ptr %219, i64 %221
  %223 = getelementptr inbounds %struct.HuffmanTree, ptr %222, i32 0, i32 0
  %224 = load i32, ptr %223, align 4, !tbaa !20
  %225 = load ptr, ptr %23, align 8, !tbaa !5
  %226 = load i32, ptr %33, align 4, !tbaa !11
  %227 = sext i32 %226 to i64
  %228 = getelementptr inbounds %struct.HuffmanTree, ptr %225, i64 %227
  %229 = getelementptr inbounds %struct.HuffmanTree, ptr %228, i32 0, i32 0
  %230 = load i32, ptr %229, align 4, !tbaa !20
  %231 = add i32 %224, %230
  %232 = load ptr, ptr %25, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.HuffmanTree, ptr %232, i64 -1
  %234 = getelementptr inbounds %struct.HuffmanTree, ptr %233, i32 0, i32 0
  store i32 %231, ptr %234, align 4, !tbaa !20
  %235 = load i32, ptr %32, align 4, !tbaa !11
  %236 = trunc i32 %235 to i16
  %237 = load ptr, ptr %25, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.HuffmanTree, ptr %237, i64 -1
  %239 = getelementptr inbounds %struct.HuffmanTree, ptr %238, i32 0, i32 1
  store i16 %236, ptr %239, align 4, !tbaa !22
  %240 = load i32, ptr %33, align 4, !tbaa !11
  %241 = trunc i32 %240 to i16
  %242 = load ptr, ptr %25, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.HuffmanTree, ptr %242, i64 -1
  %244 = getelementptr inbounds %struct.HuffmanTree, ptr %243, i32 0, i32 2
  store i16 %241, ptr %244, align 2, !tbaa !23
  %245 = load ptr, ptr %25, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.HuffmanTree, ptr %245, i32 1
  store ptr %246, ptr %25, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %245, ptr align 4 %28, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #7
  br label %247

247:                                              ; preds = %218
  %248 = load i32, ptr %31, align 4, !tbaa !11
  %249 = add nsw i32 %248, -1
  store i32 %249, ptr %31, align 4, !tbaa !11
  br label %171, !llvm.loop !24

250:                                              ; preds = %171
  %251 = load i32, ptr %27, align 4, !tbaa !11
  %252 = mul nsw i32 2, %251
  %253 = sub nsw i32 %252, 1
  %254 = load ptr, ptr %23, align 8, !tbaa !5
  %255 = load ptr, ptr %13, align 8, !tbaa !5
  %256 = call i32 @BrotliSetDepth(i32 noundef %253, ptr noundef %254, ptr noundef %255, i32 noundef 14)
  %257 = icmp ne i32 %256, 0
  br i1 %257, label %258, label %259

258:                                              ; preds = %250
  store i32 4, ptr %21, align 4
  br label %260

259:                                              ; preds = %250
  store i32 0, ptr %21, align 4
  br label %260

260:                                              ; preds = %259, %258
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  %261 = load i32, ptr %21, align 4
  switch i32 %261, label %263 [
    i32 0, label %262
  ]

262:                                              ; preds = %260
  store i32 0, ptr %21, align 4
  br label %263

263:                                              ; preds = %262, %260
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  %264 = load i32, ptr %21, align 4
  switch i32 %264, label %515 [
    i32 0, label %265
    i32 4, label %269
  ]

265:                                              ; preds = %263
  br label %266

266:                                              ; preds = %265
  %267 = load i32, ptr %24, align 4, !tbaa !11
  %268 = mul i32 %267, 2
  store i32 %268, ptr %24, align 4, !tbaa !11
  br label %108

269:                                              ; preds = %263
  %270 = load ptr, ptr %9, align 8, !tbaa !5
  %271 = load ptr, ptr %23, align 8, !tbaa !5
  call void @BrotliFree(ptr noundef %270, ptr noundef %271)
  store ptr null, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  %272 = load ptr, ptr %13, align 8, !tbaa !5
  %273 = load i64, ptr %19, align 8, !tbaa !9
  %274 = load ptr, ptr %14, align 8, !tbaa !5
  call void @BrotliConvertBitDepthsToSymbols(ptr noundef %272, i64 noundef %273, ptr noundef %274)
  %275 = load i64, ptr %17, align 8, !tbaa !9
  %276 = icmp ule i64 %275, 4
  br i1 %276, label %277, label %399

277:                                              ; preds = %269
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #7
  %278 = load ptr, ptr %15, align 8, !tbaa !5
  %279 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef 2, i64 noundef 1, ptr noundef %278, ptr noundef %279)
  %280 = load i64, ptr %17, align 8, !tbaa !9
  %281 = sub i64 %280, 1
  %282 = load ptr, ptr %15, align 8, !tbaa !5
  %283 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef 2, i64 noundef %281, ptr noundef %282, ptr noundef %283)
  store i64 0, ptr %34, align 8, !tbaa !9
  br label %284

284:                                              ; preds = %328, %277
  %285 = load i64, ptr %34, align 8, !tbaa !9
  %286 = load i64, ptr %17, align 8, !tbaa !9
  %287 = icmp ult i64 %285, %286
  br i1 %287, label %288, label %331

288:                                              ; preds = %284
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #7
  %289 = load i64, ptr %34, align 8, !tbaa !9
  %290 = add i64 %289, 1
  store i64 %290, ptr %35, align 8, !tbaa !9
  br label %291

291:                                              ; preds = %324, %288
  %292 = load i64, ptr %35, align 8, !tbaa !9
  %293 = load i64, ptr %17, align 8, !tbaa !9
  %294 = icmp ult i64 %292, %293
  br i1 %294, label %295, label %327

295:                                              ; preds = %291
  %296 = load ptr, ptr %13, align 8, !tbaa !5
  %297 = load i64, ptr %35, align 8, !tbaa !9
  %298 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %297
  %299 = load i64, ptr %298, align 8, !tbaa !9
  %300 = getelementptr inbounds i8, ptr %296, i64 %299
  %301 = load i8, ptr %300, align 1, !tbaa !15
  %302 = zext i8 %301 to i32
  %303 = load ptr, ptr %13, align 8, !tbaa !5
  %304 = load i64, ptr %34, align 8, !tbaa !9
  %305 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %304
  %306 = load i64, ptr %305, align 8, !tbaa !9
  %307 = getelementptr inbounds i8, ptr %303, i64 %306
  %308 = load i8, ptr %307, align 1, !tbaa !15
  %309 = zext i8 %308 to i32
  %310 = icmp slt i32 %302, %309
  br i1 %310, label %311, label %323

311:                                              ; preds = %295
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #7
  %312 = load i64, ptr %35, align 8, !tbaa !9
  %313 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %312
  %314 = load i64, ptr %313, align 8, !tbaa !9
  store i64 %314, ptr %36, align 8, !tbaa !9
  %315 = load i64, ptr %34, align 8, !tbaa !9
  %316 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %315
  %317 = load i64, ptr %316, align 8, !tbaa !9
  %318 = load i64, ptr %35, align 8, !tbaa !9
  %319 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %318
  store i64 %317, ptr %319, align 8, !tbaa !9
  %320 = load i64, ptr %36, align 8, !tbaa !9
  %321 = load i64, ptr %34, align 8, !tbaa !9
  %322 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 %321
  store i64 %320, ptr %322, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #7
  br label %323

323:                                              ; preds = %311, %295
  br label %324

324:                                              ; preds = %323
  %325 = load i64, ptr %35, align 8, !tbaa !9
  %326 = add i64 %325, 1
  store i64 %326, ptr %35, align 8, !tbaa !9
  br label %291, !llvm.loop !25

327:                                              ; preds = %291
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #7
  br label %328

328:                                              ; preds = %327
  %329 = load i64, ptr %34, align 8, !tbaa !9
  %330 = add i64 %329, 1
  store i64 %330, ptr %34, align 8, !tbaa !9
  br label %284, !llvm.loop !26

331:                                              ; preds = %284
  %332 = load i64, ptr %17, align 8, !tbaa !9
  %333 = icmp eq i64 %332, 2
  br i1 %333, label %334, label %345

334:                                              ; preds = %331
  %335 = load i64, ptr %12, align 8, !tbaa !9
  %336 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %337 = load i64, ptr %336, align 16, !tbaa !9
  %338 = load ptr, ptr %15, align 8, !tbaa !5
  %339 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %335, i64 noundef %337, ptr noundef %338, ptr noundef %339)
  %340 = load i64, ptr %12, align 8, !tbaa !9
  %341 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 1
  %342 = load i64, ptr %341, align 8, !tbaa !9
  %343 = load ptr, ptr %15, align 8, !tbaa !5
  %344 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %340, i64 noundef %342, ptr noundef %343, ptr noundef %344)
  br label %398

345:                                              ; preds = %331
  %346 = load i64, ptr %17, align 8, !tbaa !9
  %347 = icmp eq i64 %346, 3
  br i1 %347, label %348, label %364

348:                                              ; preds = %345
  %349 = load i64, ptr %12, align 8, !tbaa !9
  %350 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %351 = load i64, ptr %350, align 16, !tbaa !9
  %352 = load ptr, ptr %15, align 8, !tbaa !5
  %353 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %349, i64 noundef %351, ptr noundef %352, ptr noundef %353)
  %354 = load i64, ptr %12, align 8, !tbaa !9
  %355 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 1
  %356 = load i64, ptr %355, align 8, !tbaa !9
  %357 = load ptr, ptr %15, align 8, !tbaa !5
  %358 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %354, i64 noundef %356, ptr noundef %357, ptr noundef %358)
  %359 = load i64, ptr %12, align 8, !tbaa !9
  %360 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 2
  %361 = load i64, ptr %360, align 16, !tbaa !9
  %362 = load ptr, ptr %15, align 8, !tbaa !5
  %363 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %359, i64 noundef %361, ptr noundef %362, ptr noundef %363)
  br label %397

364:                                              ; preds = %345
  %365 = load i64, ptr %12, align 8, !tbaa !9
  %366 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %367 = load i64, ptr %366, align 16, !tbaa !9
  %368 = load ptr, ptr %15, align 8, !tbaa !5
  %369 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %365, i64 noundef %367, ptr noundef %368, ptr noundef %369)
  %370 = load i64, ptr %12, align 8, !tbaa !9
  %371 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 1
  %372 = load i64, ptr %371, align 8, !tbaa !9
  %373 = load ptr, ptr %15, align 8, !tbaa !5
  %374 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %370, i64 noundef %372, ptr noundef %373, ptr noundef %374)
  %375 = load i64, ptr %12, align 8, !tbaa !9
  %376 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 2
  %377 = load i64, ptr %376, align 16, !tbaa !9
  %378 = load ptr, ptr %15, align 8, !tbaa !5
  %379 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %375, i64 noundef %377, ptr noundef %378, ptr noundef %379)
  %380 = load i64, ptr %12, align 8, !tbaa !9
  %381 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 3
  %382 = load i64, ptr %381, align 8, !tbaa !9
  %383 = load ptr, ptr %15, align 8, !tbaa !5
  %384 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %380, i64 noundef %382, ptr noundef %383, ptr noundef %384)
  %385 = load ptr, ptr %13, align 8, !tbaa !5
  %386 = getelementptr inbounds [4 x i64], ptr %18, i64 0, i64 0
  %387 = load i64, ptr %386, align 16, !tbaa !9
  %388 = getelementptr inbounds i8, ptr %385, i64 %387
  %389 = load i8, ptr %388, align 1, !tbaa !15
  %390 = zext i8 %389 to i32
  %391 = icmp eq i32 %390, 1
  %392 = zext i1 %391 to i64
  %393 = select i1 %391, i32 1, i32 0
  %394 = sext i32 %393 to i64
  %395 = load ptr, ptr %15, align 8, !tbaa !5
  %396 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef 1, i64 noundef %394, ptr noundef %395, ptr noundef %396)
  br label %397

397:                                              ; preds = %364, %348
  br label %398

398:                                              ; preds = %397, %334
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  br label %511

399:                                              ; preds = %269
  call void @llvm.lifetime.start.p0(i64 1, ptr %37) #7
  store i8 8, ptr %37, align 1, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #7
  %400 = load ptr, ptr %15, align 8, !tbaa !5
  %401 = load ptr, ptr %16, align 8, !tbaa !5
  call void @StoreStaticCodeLengthCode(ptr noundef %400, ptr noundef %401)
  store i64 0, ptr %38, align 8, !tbaa !9
  br label %402

402:                                              ; preds = %509, %399
  %403 = load i64, ptr %38, align 8, !tbaa !9
  %404 = load i64, ptr %19, align 8, !tbaa !9
  %405 = icmp ult i64 %403, %404
  br i1 %405, label %406, label %510

406:                                              ; preds = %402
  call void @llvm.lifetime.start.p0(i64 1, ptr %39) #7
  %407 = load ptr, ptr %13, align 8, !tbaa !5
  %408 = load i64, ptr %38, align 8, !tbaa !9
  %409 = getelementptr inbounds i8, ptr %407, i64 %408
  %410 = load i8, ptr %409, align 1, !tbaa !15
  store i8 %410, ptr %39, align 1, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #7
  store i64 1, ptr %40, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #7
  %411 = load i64, ptr %38, align 8, !tbaa !9
  %412 = add i64 %411, 1
  store i64 %412, ptr %41, align 8, !tbaa !9
  br label %413

413:                                              ; preds = %431, %406
  %414 = load i64, ptr %41, align 8, !tbaa !9
  %415 = load i64, ptr %19, align 8, !tbaa !9
  %416 = icmp ult i64 %414, %415
  br i1 %416, label %417, label %426

417:                                              ; preds = %413
  %418 = load ptr, ptr %13, align 8, !tbaa !5
  %419 = load i64, ptr %41, align 8, !tbaa !9
  %420 = getelementptr inbounds i8, ptr %418, i64 %419
  %421 = load i8, ptr %420, align 1, !tbaa !15
  %422 = zext i8 %421 to i32
  %423 = load i8, ptr %39, align 1, !tbaa !15
  %424 = zext i8 %423 to i32
  %425 = icmp eq i32 %422, %424
  br label %426

426:                                              ; preds = %417, %413
  %427 = phi i1 [ false, %413 ], [ %425, %417 ]
  br i1 %427, label %428, label %434

428:                                              ; preds = %426
  %429 = load i64, ptr %40, align 8, !tbaa !9
  %430 = add i64 %429, 1
  store i64 %430, ptr %40, align 8, !tbaa !9
  br label %431

431:                                              ; preds = %428
  %432 = load i64, ptr %41, align 8, !tbaa !9
  %433 = add i64 %432, 1
  store i64 %433, ptr %41, align 8, !tbaa !9
  br label %413, !llvm.loop !27

434:                                              ; preds = %426
  %435 = load i64, ptr %40, align 8, !tbaa !9
  %436 = load i64, ptr %38, align 8, !tbaa !9
  %437 = add i64 %436, %435
  store i64 %437, ptr %38, align 8, !tbaa !9
  %438 = load i8, ptr %39, align 1, !tbaa !15
  %439 = zext i8 %438 to i32
  %440 = icmp eq i32 %439, 0
  br i1 %440, label %441, label %451

441:                                              ; preds = %434
  %442 = load i64, ptr %40, align 8, !tbaa !9
  %443 = getelementptr inbounds [704 x i32], ptr @kZeroRepsDepth, i64 0, i64 %442
  %444 = load i32, ptr %443, align 4, !tbaa !11
  %445 = zext i32 %444 to i64
  %446 = load i64, ptr %40, align 8, !tbaa !9
  %447 = getelementptr inbounds [704 x i64], ptr @kZeroRepsBits, i64 0, i64 %446
  %448 = load i64, ptr %447, align 8, !tbaa !9
  %449 = load ptr, ptr %15, align 8, !tbaa !5
  %450 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %445, i64 noundef %448, ptr noundef %449, ptr noundef %450)
  br label %509

451:                                              ; preds = %434
  %452 = load i8, ptr %37, align 1, !tbaa !15
  %453 = zext i8 %452 to i32
  %454 = load i8, ptr %39, align 1, !tbaa !15
  %455 = zext i8 %454 to i32
  %456 = icmp ne i32 %453, %455
  br i1 %456, label %457, label %472

457:                                              ; preds = %451
  %458 = load i8, ptr %39, align 1, !tbaa !15
  %459 = zext i8 %458 to i64
  %460 = getelementptr inbounds [18 x i8], ptr @kCodeLengthDepth, i64 0, i64 %459
  %461 = load i8, ptr %460, align 1, !tbaa !15
  %462 = zext i8 %461 to i64
  %463 = load i8, ptr %39, align 1, !tbaa !15
  %464 = zext i8 %463 to i64
  %465 = getelementptr inbounds [18 x i32], ptr @kCodeLengthBits, i64 0, i64 %464
  %466 = load i32, ptr %465, align 4, !tbaa !11
  %467 = zext i32 %466 to i64
  %468 = load ptr, ptr %15, align 8, !tbaa !5
  %469 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %462, i64 noundef %467, ptr noundef %468, ptr noundef %469)
  %470 = load i64, ptr %40, align 8, !tbaa !9
  %471 = add i64 %470, -1
  store i64 %471, ptr %40, align 8, !tbaa !9
  br label %472

472:                                              ; preds = %457, %451
  %473 = load i64, ptr %40, align 8, !tbaa !9
  %474 = icmp ult i64 %473, 3
  br i1 %474, label %475, label %495

475:                                              ; preds = %472
  br label %476

476:                                              ; preds = %479, %475
  %477 = load i64, ptr %40, align 8, !tbaa !9
  %478 = icmp ne i64 %477, 0
  br i1 %478, label %479, label %494

479:                                              ; preds = %476
  %480 = load i64, ptr %40, align 8, !tbaa !9
  %481 = add i64 %480, -1
  store i64 %481, ptr %40, align 8, !tbaa !9
  %482 = load i8, ptr %39, align 1, !tbaa !15
  %483 = zext i8 %482 to i64
  %484 = getelementptr inbounds [18 x i8], ptr @kCodeLengthDepth, i64 0, i64 %483
  %485 = load i8, ptr %484, align 1, !tbaa !15
  %486 = zext i8 %485 to i64
  %487 = load i8, ptr %39, align 1, !tbaa !15
  %488 = zext i8 %487 to i64
  %489 = getelementptr inbounds [18 x i32], ptr @kCodeLengthBits, i64 0, i64 %488
  %490 = load i32, ptr %489, align 4, !tbaa !11
  %491 = zext i32 %490 to i64
  %492 = load ptr, ptr %15, align 8, !tbaa !5
  %493 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %486, i64 noundef %491, ptr noundef %492, ptr noundef %493)
  br label %476, !llvm.loop !28

494:                                              ; preds = %476
  br label %507

495:                                              ; preds = %472
  %496 = load i64, ptr %40, align 8, !tbaa !9
  %497 = sub i64 %496, 3
  store i64 %497, ptr %40, align 8, !tbaa !9
  %498 = load i64, ptr %40, align 8, !tbaa !9
  %499 = getelementptr inbounds [704 x i32], ptr @kNonZeroRepsDepth, i64 0, i64 %498
  %500 = load i32, ptr %499, align 4, !tbaa !11
  %501 = zext i32 %500 to i64
  %502 = load i64, ptr %40, align 8, !tbaa !9
  %503 = getelementptr inbounds [704 x i64], ptr @kNonZeroRepsBits, i64 0, i64 %502
  %504 = load i64, ptr %503, align 8, !tbaa !9
  %505 = load ptr, ptr %15, align 8, !tbaa !5
  %506 = load ptr, ptr %16, align 8, !tbaa !5
  call void @BrotliWriteBits(i64 noundef %501, i64 noundef %504, ptr noundef %505, ptr noundef %506)
  br label %507

507:                                              ; preds = %495, %494
  %508 = load i8, ptr %39, align 1, !tbaa !15
  store i8 %508, ptr %37, align 1, !tbaa !15
  br label %509

509:                                              ; preds = %507, %441
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %39) #7
  br label %402, !llvm.loop !29

510:                                              ; preds = %402
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %37) #7
  br label %511

511:                                              ; preds = %510, %398
  store i32 0, ptr %21, align 4
  br label %512

512:                                              ; preds = %511, %75
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 32, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  %513 = load i32, ptr %21, align 4
  switch i32 %513, label %515 [
    i32 0, label %514
    i32 1, label %514
  ]

514:                                              ; preds = %512, %512
  ret void

515:                                              ; preds = %512, %263
  unreachable
}

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @BrotliWriteBits(i64 noundef, i64 noundef, ptr noalias noundef, ptr noalias noundef) #4

declare hidden ptr @BrotliAllocate(ptr noundef, i64 noundef) #2

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare i64 @llvm.expect.i64(i64, i64) #5

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @InitHuffmanTree(ptr noundef, i32 noundef, i16 noundef signext, i16 noundef signext) #4

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @SortHuffmanTreeItems(ptr noundef, i64 noundef, ptr noundef) #4

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @SortHuffmanTree(ptr noundef, ptr noundef) #4

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #6

declare hidden i32 @BrotliSetDepth(i32 noundef, ptr noundef, ptr noundef, i32 noundef) #2

declare hidden void @BrotliFree(ptr noundef, ptr noundef) #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @StoreStaticCodeLengthCode(ptr noundef, ptr noundef) #4

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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 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 #4 = { alwaysinline 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 #5 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #6 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { 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 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!7, !7, i64 0}
!16 = !{!17, !17, i64 0}
!17 = !{!"short", !7, i64 0}
!18 = distinct !{!18, !14}
!19 = !{i64 0, i64 4, !11, i64 4, i64 2, !16, i64 6, i64 2, !16}
!20 = !{!21, !12, i64 0}
!21 = !{!"HuffmanTree", !12, i64 0, !17, i64 4, !17, i64 6}
!22 = !{!21, !17, i64 4}
!23 = !{!21, !17, i64 6}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !14}
!29 = distinct !{!29, !14}


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

%struct.HuffmanTree = type { i32, i16, i16 }

@kZeroRepsDepth = external hidden local_unnamed_addr constant [704 x i32], align 16
@kZeroRepsBits = external hidden local_unnamed_addr constant [704 x i64], align 16
@kCodeLengthDepth = external hidden local_unnamed_addr constant [18 x i8], align 16
@kCodeLengthBits = external hidden local_unnamed_addr constant [18 x i32], align 16
@kNonZeroRepsDepth = external hidden local_unnamed_addr constant [704 x i32], align 16
@kNonZeroRepsBits = external hidden local_unnamed_addr constant [704 x i64], align 16

; 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 nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1

declare hidden void @BrotliConvertBitDepthsToSymbols(ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
define hidden void @BrotliBuildAndStoreHuffmanTreeFast(ptr noundef %0, ptr nocapture noundef readonly %1, i64 noundef %2, i64 noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6, ptr noundef %7) local_unnamed_addr #3 {
  %9 = alloca [4 x i64], align 16
  %10 = alloca %struct.HuffmanTree, align 8
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %9) #6
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(32) %9, i8 0, i64 32, i1 false)
  %.not223 = icmp eq i64 %2, 0
  br i1 %.not223, label %._crit_edge.thread, label %.lr.ph

.lr.ph:                                           ; preds = %8, %21
  %.0185226 = phi i64 [ %.1186, %21 ], [ 0, %8 ]
  %.0190225 = phi i64 [ %22, %21 ], [ 0, %8 ]
  %.0202224 = phi i64 [ %.1203, %21 ], [ %2, %8 ]
  %11 = getelementptr inbounds i32, ptr %1, i64 %.0190225
  %12 = load i32, ptr %11, align 4, !tbaa !5
  %.not220 = icmp eq i32 %12, 0
  br i1 %.not220, label %21, label %13

13:                                               ; preds = %.lr.ph
  %14 = icmp ult i64 %.0185226, 4
  br i1 %14, label %15, label %17

15:                                               ; preds = %13
  %16 = getelementptr inbounds [4 x i64], ptr %9, i64 0, i64 %.0185226
  store i64 %.0190225, ptr %16, align 8, !tbaa !9
  br label %17

17:                                               ; preds = %15, %13
  %18 = add i64 %.0185226, 1
  %19 = zext i32 %12 to i64
  %20 = sub i64 %.0202224, %19
  br label %21

21:                                               ; preds = %17, %.lr.ph
  %.1203 = phi i64 [ %20, %17 ], [ %.0202224, %.lr.ph ]
  %.1186 = phi i64 [ %18, %17 ], [ %.0185226, %.lr.ph ]
  %22 = add i64 %.0190225, 1
  %.not = icmp eq i64 %.1203, 0
  br i1 %.not, label %._crit_edge, label %.lr.ph, !llvm.loop !11

._crit_edge:                                      ; preds = %21
  %23 = icmp ult i64 %.1186, 2
  br i1 %23, label %._crit_edge.thread, label %27

._crit_edge.thread:                               ; preds = %8, %._crit_edge
  tail call void @BrotliWriteBits(i64 noundef 4, i64 noundef 1, ptr noundef %6, ptr noundef %7)
  %24 = load i64, ptr %9, align 16, !tbaa !9
  tail call void @BrotliWriteBits(i64 noundef %3, i64 noundef %24, ptr noundef %6, ptr noundef %7)
  %25 = getelementptr inbounds i8, ptr %4, i64 %24
  store i8 0, ptr %25, align 1, !tbaa !13
  %26 = getelementptr inbounds i16, ptr %5, i64 %24
  store i16 0, ptr %26, align 2, !tbaa !14
  br label %.loopexit222

27:                                               ; preds = %._crit_edge
  tail call void @llvm.memset.p0.i64(ptr align 1 %4, i8 0, i64 %22, i1 false)
  %28 = shl i64 %22, 4
  %29 = or disjoint i64 %28, 8
  %30 = tail call ptr @BrotliAllocate(ptr noundef %0, i64 noundef %29) #6
  %.not212228 = icmp eq i64 %22, 0
  %31 = ptrtoint ptr %30 to i64
  br label %32

32:                                               ; preds = %._crit_edge241, %27
  %.0208 = phi i32 [ 1, %27 ], [ %84, %._crit_edge241 ]
  br i1 %.not212228, label %._crit_edge233, label %.lr.ph232

.lr.ph232:                                        ; preds = %32, %39
  %.0204230 = phi i64 [ %33, %39 ], [ %22, %32 ]
  %.0205229 = phi ptr [ %.1206, %39 ], [ %30, %32 ]
  %33 = add i64 %.0204230, -1
  %34 = getelementptr inbounds i32, ptr %1, i64 %33
  %35 = load i32, ptr %34, align 4, !tbaa !5
  %.not218 = icmp eq i32 %35, 0
  br i1 %.not218, label %39, label %36

36:                                               ; preds = %.lr.ph232
  %37 = trunc i64 %33 to i16
  %.0208. = call i32 @llvm.umax.i32(i32 %35, i32 %.0208)
  call void @InitHuffmanTree(ptr noundef %.0205229, i32 noundef %.0208., i16 noundef signext -1, i16 noundef signext %37)
  %38 = getelementptr inbounds i8, ptr %.0205229, i64 8
  br label %39

39:                                               ; preds = %36, %.lr.ph232
  %.1206 = phi ptr [ %38, %36 ], [ %.0205229, %.lr.ph232 ]
  %.not212 = icmp eq i64 %33, 0
  br i1 %.not212, label %._crit_edge233.loopexit, label %.lr.ph232, !llvm.loop !16

._crit_edge233.loopexit:                          ; preds = %39
  %.pre263 = ptrtoint ptr %.1206 to i64
  br label %._crit_edge233

._crit_edge233:                                   ; preds = %._crit_edge233.loopexit, %32
  %.pre-phi = phi i64 [ %.pre263, %._crit_edge233.loopexit ], [ %31, %32 ]
  %.0205.lcssa = phi ptr [ %.1206, %._crit_edge233.loopexit ], [ %30, %32 ]
  %40 = sub i64 %.pre-phi, %31
  %41 = lshr exact i64 %40, 3
  %42 = trunc i64 %41 to i32
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #6
  %sext = shl i64 %40, 29
  %43 = ashr i64 %sext, 32
  call void @SortHuffmanTreeItems(ptr noundef %30, i64 noundef %43, ptr noundef nonnull @SortHuffmanTree)
  call void @InitHuffmanTree(ptr noundef nonnull %10, i32 noundef -1, i16 noundef signext -1, i16 noundef signext -1)
  %44 = getelementptr inbounds i8, ptr %.0205.lcssa, i64 8
  %45 = load i64, ptr %10, align 8
  store i64 %45, ptr %.0205.lcssa, align 4
  %46 = load i64, ptr %10, align 8
  store i64 %46, ptr %44, align 4
  %47 = icmp sgt i32 %42, 1
  br i1 %47, label %.lr.ph240.preheader, label %._crit_edge241

.lr.ph240.preheader:                              ; preds = %._crit_edge233
  %48 = getelementptr inbounds i8, ptr %.0205.lcssa, i64 16
  %49 = add nuw nsw i32 %42, 1
  br label %.lr.ph240

.lr.ph240:                                        ; preds = %.lr.ph240.preheader, %.lr.ph240
  %.0195.in238 = phi i32 [ %.0195, %.lr.ph240 ], [ %42, %.lr.ph240.preheader ]
  %.0196237 = phi i32 [ %.2198, %.lr.ph240 ], [ %49, %.lr.ph240.preheader ]
  %.0199236 = phi i32 [ %.2201, %.lr.ph240 ], [ 0, %.lr.ph240.preheader ]
  %.2207235 = phi ptr [ %78, %.lr.ph240 ], [ %48, %.lr.ph240.preheader ]
  %.0195 = add nsw i32 %.0195.in238, -1
  %50 = sext i32 %.0199236 to i64
  %51 = getelementptr inbounds %struct.HuffmanTree, ptr %30, i64 %50
  %52 = load i32, ptr %51, align 4, !tbaa !17
  %53 = sext i32 %.0196237 to i64
  %54 = getelementptr inbounds %struct.HuffmanTree, ptr %30, i64 %53
  %55 = load i32, ptr %54, align 4, !tbaa !17
  %.not216 = icmp ule i32 %52, %55
  %56 = zext i1 %.not216 to i32
  %.1200 = add nsw i32 %.0199236, %56
  %not..not216 = xor i1 %.not216, true
  %57 = zext i1 %not..not216 to i32
  %.1197 = add nsw i32 %.0196237, %57
  %.0194 = select i1 %.not216, i32 %.0199236, i32 %.0196237
  %58 = sext i32 %.1200 to i64
  %59 = getelementptr inbounds %struct.HuffmanTree, ptr %30, i64 %58
  %60 = load i32, ptr %59, align 4, !tbaa !17
  %61 = sext i32 %.1197 to i64
  %62 = getelementptr inbounds %struct.HuffmanTree, ptr %30, i64 %61
  %63 = load i32, ptr %62, align 4, !tbaa !17
  %.not217 = icmp ule i32 %60, %63
  %64 = zext i1 %.not217 to i32
  %.2201 = add nsw i32 %.1200, %64
  %not..not217 = xor i1 %.not217, true
  %65 = zext i1 %not..not217 to i32
  %.2198 = add nsw i32 %.1197, %65
  %.0193 = select i1 %.not217, i32 %.1200, i32 %.1197
  %66 = sext i32 %.0194 to i64
  %67 = getelementptr inbounds %struct.HuffmanTree, ptr %30, i64 %66
  %68 = load i32, ptr %67, align 4, !tbaa !17
  %69 = sext i32 %.0193 to i64
  %70 = getelementptr inbounds %struct.HuffmanTree, ptr %30, i64 %69
  %71 = load i32, ptr %70, align 4, !tbaa !17
  %72 = add i32 %71, %68
  %73 = getelementptr inbounds i8, ptr %.2207235, i64 -8
  store i32 %72, ptr %73, align 4, !tbaa !17
  %74 = trunc i32 %.0194 to i16
  %75 = getelementptr inbounds i8, ptr %.2207235, i64 -4
  store i16 %74, ptr %75, align 4, !tbaa !19
  %76 = trunc i32 %.0193 to i16
  %77 = getelementptr inbounds i8, ptr %.2207235, i64 -2
  store i16 %76, ptr %77, align 2, !tbaa !20
  %78 = getelementptr inbounds i8, ptr %.2207235, i64 8
  %79 = load i64, ptr %10, align 8
  store i64 %79, ptr %.2207235, align 4
  %80 = icmp ugt i32 %.0195.in238, 2
  br i1 %80, label %.lr.ph240, label %._crit_edge241, !llvm.loop !21

._crit_edge241:                                   ; preds = %.lr.ph240, %._crit_edge233
  %81 = shl nsw i32 %42, 1
  %82 = add nsw i32 %81, -1
  %83 = call i32 @BrotliSetDepth(i32 noundef %82, ptr noundef %30, ptr noundef %4, i32 noundef 14) #6
  %.not213 = icmp eq i32 %83, 0
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #6
  %84 = shl i32 %.0208, 1
  br i1 %.not213, label %32, label %85

85:                                               ; preds = %._crit_edge241
  call void @BrotliFree(ptr noundef %0, ptr noundef %30) #6
  call void @BrotliConvertBitDepthsToSymbols(ptr noundef %4, i64 noundef %22, ptr noundef %5) #6
  %86 = icmp ult i64 %.1186, 5
  br i1 %86, label %.lr.ph259, label %145

.lr.ph259:                                        ; preds = %85
  call void @BrotliWriteBits(i64 noundef 2, i64 noundef 1, ptr noundef %6, ptr noundef %7)
  %87 = add nsw i64 %.1186, -1
  call void @BrotliWriteBits(i64 noundef 2, i64 noundef %87, ptr noundef %6, ptr noundef %7)
  %.pre = load i64, ptr %9, align 16, !tbaa !9
  %.promoted = load i64, ptr %9, align 1, !tbaa !9
  br label %118

.loopexit.loopexit:                               ; preds = %118
  store i64 %spec.select, ptr %9, align 1, !tbaa !9
  %cond = icmp eq i64 %.1186, 2
  br i1 %cond, label %.loopexit.3, label %.lr.ph259.1

.lr.ph259.1:                                      ; preds = %.loopexit.loopexit
  %88 = getelementptr inbounds i8, ptr %9, i64 8
  %.pre.1 = load i64, ptr %88, align 8, !tbaa !9
  br label %89

89:                                               ; preds = %99, %.lr.ph259.1
  %90 = phi i64 [ %.pre.1, %.lr.ph259.1 ], [ %100, %99 ]
  %.0191257.1 = phi i64 [ 2, %.lr.ph259.1 ], [ %101, %99 ]
  %91 = getelementptr inbounds [4 x i64], ptr %9, i64 0, i64 %.0191257.1
  %92 = load i64, ptr %91, align 8, !tbaa !9
  %93 = getelementptr inbounds i8, ptr %4, i64 %92
  %94 = load i8, ptr %93, align 1, !tbaa !13
  %95 = getelementptr inbounds i8, ptr %4, i64 %90
  %96 = load i8, ptr %95, align 1, !tbaa !13
  %97 = icmp ult i8 %94, %96
  br i1 %97, label %98, label %99

98:                                               ; preds = %89
  store i64 %90, ptr %91, align 8, !tbaa !9
  store i64 %92, ptr %88, align 8, !tbaa !9
  br label %99

99:                                               ; preds = %98, %89
  %100 = phi i64 [ %90, %89 ], [ %92, %98 ]
  %101 = add nuw nsw i64 %.0191257.1, 1
  %102 = icmp ult i64 %101, %.1186
  br i1 %102, label %89, label %.loopexit.1, !llvm.loop !22

.loopexit.1:                                      ; preds = %99
  %cond273 = icmp eq i64 %.1186, 4
  br i1 %cond273, label %.lr.ph259.2, label %.loopexit.3

.lr.ph259.2:                                      ; preds = %.loopexit.1
  %103 = getelementptr inbounds i8, ptr %9, i64 16
  %.pre.2 = load i64, ptr %103, align 16, !tbaa !9
  br label %104

104:                                              ; preds = %114, %.lr.ph259.2
  %105 = phi i64 [ %.pre.2, %.lr.ph259.2 ], [ %115, %114 ]
  %.0191257.2 = phi i64 [ 3, %.lr.ph259.2 ], [ %116, %114 ]
  %106 = getelementptr inbounds [4 x i64], ptr %9, i64 0, i64 %.0191257.2
  %107 = load i64, ptr %106, align 8, !tbaa !9
  %108 = getelementptr inbounds i8, ptr %4, i64 %107
  %109 = load i8, ptr %108, align 1, !tbaa !13
  %110 = getelementptr inbounds i8, ptr %4, i64 %105
  %111 = load i8, ptr %110, align 1, !tbaa !13
  %112 = icmp ult i8 %109, %111
  br i1 %112, label %113, label %114

113:                                              ; preds = %104
  store i64 %105, ptr %106, align 8, !tbaa !9
  store i64 %107, ptr %103, align 16, !tbaa !9
  br label %114

114:                                              ; preds = %113, %104
  %115 = phi i64 [ %105, %104 ], [ %107, %113 ]
  %116 = add nuw nsw i64 %.0191257.2, 1
  %117 = icmp ult i64 %116, %.1186
  br i1 %117, label %104, label %.loopexit.2, !llvm.loop !22

.loopexit.2:                                      ; preds = %114
  br label %.loopexit.3, !llvm.loop !23

118:                                              ; preds = %.lr.ph259, %118
  %119 = phi i64 [ %.promoted, %.lr.ph259 ], [ %spec.select, %118 ]
  %120 = phi i64 [ %.pre, %.lr.ph259 ], [ %spec.select272, %118 ]
  %.0191257 = phi i64 [ 1, %.lr.ph259 ], [ %128, %118 ]
  %121 = getelementptr inbounds [4 x i64], ptr %9, i64 0, i64 %.0191257
  %122 = load i64, ptr %121, align 8, !tbaa !9
  %123 = getelementptr inbounds i8, ptr %4, i64 %122
  %124 = load i8, ptr %123, align 1, !tbaa !13
  %125 = getelementptr inbounds i8, ptr %4, i64 %120
  %126 = load i8, ptr %125, align 1, !tbaa !13
  %127 = icmp ult i8 %124, %126
  %spec.store.select = select i1 %127, i64 %120, i64 %122
  store i64 %spec.store.select, ptr %121, align 8
  %spec.select = select i1 %127, i64 %122, i64 %119
  %spec.select272 = select i1 %127, i64 %122, i64 %120
  %128 = add nuw nsw i64 %.0191257, 1
  %129 = icmp ult i64 %128, %.1186
  br i1 %129, label %118, label %.loopexit.loopexit, !llvm.loop !22

.loopexit.3:                                      ; preds = %.loopexit.2, %.loopexit.1, %.loopexit.loopexit
  %130 = load i64, ptr %9, align 16, !tbaa !9
  call void @BrotliWriteBits(i64 noundef %3, i64 noundef %130, ptr noundef %6, ptr noundef %7)
  %131 = getelementptr inbounds i8, ptr %9, i64 8
  %132 = load i64, ptr %131, align 8, !tbaa !9
  call void @BrotliWriteBits(i64 noundef %3, i64 noundef %132, ptr noundef %6, ptr noundef %7)
  switch i64 %.1186, label %136 [
    i64 2, label %.loopexit222
    i64 3, label %133
  ]

133:                                              ; preds = %.loopexit.3
  %134 = getelementptr inbounds i8, ptr %9, i64 16
  %135 = load i64, ptr %134, align 16, !tbaa !9
  call void @BrotliWriteBits(i64 noundef %3, i64 noundef %135, ptr noundef %6, ptr noundef %7)
  br label %.loopexit222

136:                                              ; preds = %.loopexit.3
  %137 = getelementptr inbounds i8, ptr %9, i64 16
  %138 = load i64, ptr %137, align 16, !tbaa !9
  call void @BrotliWriteBits(i64 noundef %3, i64 noundef %138, ptr noundef %6, ptr noundef %7)
  %139 = getelementptr inbounds i8, ptr %9, i64 24
  %140 = load i64, ptr %139, align 8, !tbaa !9
  call void @BrotliWriteBits(i64 noundef %3, i64 noundef %140, ptr noundef %6, ptr noundef %7)
  %141 = getelementptr inbounds i8, ptr %4, i64 %130
  %142 = load i8, ptr %141, align 1, !tbaa !13
  %143 = icmp eq i8 %142, 1
  %144 = zext i1 %143 to i64
  call void @BrotliWriteBits(i64 noundef 1, i64 noundef %144, ptr noundef %6, ptr noundef %7)
  br label %.loopexit222

145:                                              ; preds = %85
  call void @StoreStaticCodeLengthCode(ptr noundef %6, ptr noundef %7)
  br i1 %.not212228, label %.loopexit222, label %.lr.ph256

.lr.ph256:                                        ; preds = %145, %.loopexit221
  %.0187254 = phi i64 [ %.pre-phi265, %.loopexit221 ], [ 0, %145 ]
  %.0188253 = phi i8 [ %.1189, %.loopexit221 ], [ 8, %145 ]
  %146 = getelementptr inbounds i8, ptr %4, i64 %.0187254
  %147 = load i8, ptr %146, align 1, !tbaa !13
  %.0242 = add nuw i64 %.0187254, 1
  %148 = icmp ult i64 %.0242, %22
  br i1 %148, label %.lr.ph246.preheader, label %.critedge

.lr.ph246.preheader:                              ; preds = %.lr.ph256
  %149 = sub i64 %22, %.0187254
  br label %.lr.ph246

.lr.ph246:                                        ; preds = %.lr.ph246.preheader, %153
  %.0244 = phi i64 [ %.0, %153 ], [ %.0242, %.lr.ph246.preheader ]
  %.0184243 = phi i64 [ %154, %153 ], [ 1, %.lr.ph246.preheader ]
  %150 = getelementptr inbounds i8, ptr %4, i64 %.0244
  %151 = load i8, ptr %150, align 1, !tbaa !13
  %152 = icmp eq i8 %151, %147
  br i1 %152, label %153, label %.critedge.loopexit

153:                                              ; preds = %.lr.ph246
  %154 = add i64 %.0184243, 1
  %.0 = add nuw i64 %.0244, 1
  %exitcond.not = icmp eq i64 %.0244, %.0190225
  br i1 %exitcond.not, label %.critedge.loopexit, label %.lr.ph246, !llvm.loop !24

.critedge.loopexit:                               ; preds = %153, %.lr.ph246
  %.0184.lcssa.ph = phi i64 [ %.0184243, %.lr.ph246 ], [ %149, %153 ]
  %.pre264 = add i64 %.0184.lcssa.ph, %.0187254
  br label %.critedge

.critedge:                                        ; preds = %.critedge.loopexit, %.lr.ph256
  %.pre-phi265 = phi i64 [ %.pre264, %.critedge.loopexit ], [ %.0242, %.lr.ph256 ]
  %.0184.lcssa = phi i64 [ %.0184.lcssa.ph, %.critedge.loopexit ], [ 1, %.lr.ph256 ]
  %155 = icmp eq i8 %147, 0
  br i1 %155, label %156, label %159

156:                                              ; preds = %.critedge
  %157 = getelementptr inbounds [704 x i32], ptr @kZeroRepsDepth, i64 0, i64 %.0184.lcssa
  %158 = getelementptr inbounds [704 x i64], ptr @kZeroRepsBits, i64 0, i64 %.0184.lcssa
  br label %.loopexit221.sink.split

159:                                              ; preds = %.critedge
  %.not214 = icmp eq i8 %.0188253, %147
  br i1 %.not214, label %169, label %160

160:                                              ; preds = %159
  %161 = zext i8 %147 to i64
  %162 = getelementptr inbounds [18 x i8], ptr @kCodeLengthDepth, i64 0, i64 %161
  %163 = load i8, ptr %162, align 1, !tbaa !13
  %164 = zext i8 %163 to i64
  %165 = getelementptr inbounds [18 x i32], ptr @kCodeLengthBits, i64 0, i64 %161
  %166 = load i32, ptr %165, align 4, !tbaa !5
  %167 = zext i32 %166 to i64
  call void @BrotliWriteBits(i64 noundef %164, i64 noundef %167, ptr noundef %6, ptr noundef %7)
  %168 = add i64 %.0184.lcssa, -1
  br label %169

169:                                              ; preds = %160, %159
  %.1 = phi i64 [ %168, %160 ], [ %.0184.lcssa, %159 ]
  %170 = icmp ult i64 %.1, 3
  br i1 %170, label %.preheader, label %180

.preheader:                                       ; preds = %169
  %.not215250 = icmp eq i64 %.1, 0
  br i1 %.not215250, label %.loopexit221, label %.lr.ph252

.lr.ph252:                                        ; preds = %.preheader
  %171 = zext i8 %147 to i64
  %172 = getelementptr inbounds [18 x i8], ptr @kCodeLengthDepth, i64 0, i64 %171
  %173 = load i8, ptr %172, align 1, !tbaa !13
  %174 = zext i8 %173 to i64
  %175 = getelementptr inbounds [18 x i32], ptr @kCodeLengthBits, i64 0, i64 %171
  %176 = load i32, ptr %175, align 4, !tbaa !5
  %177 = zext i32 %176 to i64
  br label %178

178:                                              ; preds = %.lr.ph252, %178
  %.2251 = phi i64 [ %.1, %.lr.ph252 ], [ %179, %178 ]
  %179 = add nsw i64 %.2251, -1
  call void @BrotliWriteBits(i64 noundef %174, i64 noundef %177, ptr noundef %6, ptr noundef %7)
  %.not215 = icmp eq i64 %179, 0
  br i1 %.not215, label %.loopexit221, label %178, !llvm.loop !25

180:                                              ; preds = %169
  %181 = add i64 %.1, -3
  %182 = getelementptr inbounds [704 x i32], ptr @kNonZeroRepsDepth, i64 0, i64 %181
  %183 = getelementptr inbounds [704 x i64], ptr @kNonZeroRepsBits, i64 0, i64 %181
  br label %.loopexit221.sink.split

.loopexit221.sink.split:                          ; preds = %156, %180
  %.sink269 = phi ptr [ %183, %180 ], [ %158, %156 ]
  %.sink.in.in = phi ptr [ %182, %180 ], [ %157, %156 ]
  %.1189.ph = phi i8 [ %147, %180 ], [ %.0188253, %156 ]
  %.sink.in = load i32, ptr %.sink.in.in, align 4, !tbaa !5
  %.sink = zext i32 %.sink.in to i64
  %184 = load i64, ptr %.sink269, align 8, !tbaa !9
  call void @BrotliWriteBits(i64 noundef %.sink, i64 noundef %184, ptr noundef %6, ptr noundef %7)
  br label %.loopexit221

.loopexit221:                                     ; preds = %178, %.loopexit221.sink.split, %.preheader
  %.1189 = phi i8 [ %147, %.preheader ], [ %.1189.ph, %.loopexit221.sink.split ], [ %147, %178 ]
  %185 = icmp ult i64 %.pre-phi265, %22
  br i1 %185, label %.lr.ph256, label %.loopexit222, !llvm.loop !26

.loopexit222:                                     ; preds = %.loopexit221, %.loopexit.3, %145, %133, %136, %._crit_edge.thread
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #6
  ret void
}

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @BrotliWriteBits(i64 noundef, i64 noundef, ptr noalias noundef, ptr noalias noundef) local_unnamed_addr #4

declare hidden ptr @BrotliAllocate(ptr noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @InitHuffmanTree(ptr noundef, i32 noundef, i16 noundef signext, i16 noundef signext) local_unnamed_addr #4

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @SortHuffmanTreeItems(ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @SortHuffmanTree(ptr noundef, ptr noundef) #4

declare hidden i32 @BrotliSetDepth(i32 noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

declare hidden void @BrotliFree(ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @StoreStaticCodeLengthCode(ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.umax.i32(i32, i32) #5

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
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 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 #4 = { alwaysinline 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 #5 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!7, !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"short", !7, i64 0}
!16 = distinct !{!16, !12}
!17 = !{!18, !6, i64 0}
!18 = !{!"HuffmanTree", !6, i64 0, !15, i64 4, !15, i64 6}
!19 = !{!18, !15, i64 4}
!20 = !{!18, !15, i64 6}
!21 = distinct !{!21, !12}
!22 = distinct !{!22, !12}
!23 = distinct !{!23, !12}
!24 = distinct !{!24, !12}
!25 = distinct !{!25, !12}
!26 = distinct !{!26, !12}


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