; LLVM IR from Farama-Foundation/stable-retro :: cores/gba/src/third-party/lzma (Ppmd7Enc)

; 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.CPpmd7 = type { ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, i32, [38 x i8], [128 x i8], [38 x i32], [256 x i8], [256 x i8], [256 x i8], %struct.CPpmd_See, [25 x [16 x %struct.CPpmd_See]], [128 x [64 x i16]] }
%struct.CPpmd_See = type { i16, i8, i8 }
%struct.CPpmd7_Context_ = type { i16, i16, i32, i32 }
%struct.CPpmd_State = type { i8, i8, i16, i16 }

@PPMD7_kExpEscape = external constant [16 x i8], 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 nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
define dso_local void @Ppmd7_EncodeSymbol(ptr noundef %0, ptr noundef %1, i32 noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca [32 x i64], align 16
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store i32 %2, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 256, ptr %7) #3
  %25 = load ptr, ptr %4, align 8, !tbaa !5
  %26 = getelementptr inbounds %struct.CPpmd7, ptr %25, i32 0, i32 0
  %27 = load ptr, ptr %26, align 8, !tbaa !11
  %28 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %27, i32 0, i32 0
  %29 = load i16, ptr %28, align 4, !tbaa !15
  %30 = zext i16 %29 to i32
  %31 = icmp ne i32 %30, 1
  br i1 %31, label %32, label %215

32:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  %33 = load ptr, ptr %4, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.CPpmd7, ptr %33, i32 0, i32 12
  %35 = load ptr, ptr %34, align 8, !tbaa !17
  %36 = load ptr, ptr %4, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.CPpmd7, ptr %36, i32 0, i32 0
  %38 = load ptr, ptr %37, align 8, !tbaa !11
  %39 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %38, i32 0, i32 2
  %40 = load i32, ptr %39, align 4, !tbaa !18
  %41 = zext i32 %40 to i64
  %42 = getelementptr inbounds i8, ptr %35, i64 %41
  store ptr %42, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  %43 = load ptr, ptr %8, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.CPpmd_State, ptr %43, i32 0, i32 0
  %45 = load i8, ptr %44, align 1, !tbaa !19
  %46 = zext i8 %45 to i32
  %47 = load i32, ptr %6, align 4, !tbaa !9
  %48 = icmp eq i32 %46, %47
  br i1 %48, label %49, label %65

49:                                               ; preds = %32
  %50 = load ptr, ptr %5, align 8, !tbaa !5
  %51 = load ptr, ptr %8, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.CPpmd_State, ptr %51, i32 0, i32 1
  %53 = load i8, ptr %52, align 1, !tbaa !21
  %54 = zext i8 %53 to i32
  %55 = load ptr, ptr %4, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.CPpmd7, ptr %55, i32 0, i32 0
  %57 = load ptr, ptr %56, align 8, !tbaa !11
  %58 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %57, i32 0, i32 1
  %59 = load i16, ptr %58, align 2, !tbaa !22
  %60 = zext i16 %59 to i32
  call void @RangeEnc_Encode(ptr noundef %50, i32 noundef 0, i32 noundef %54, i32 noundef %60)
  %61 = load ptr, ptr %8, align 8, !tbaa !5
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.CPpmd7, ptr %62, i32 0, i32 2
  store ptr %61, ptr %63, align 8, !tbaa !23
  %64 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update1_0(ptr noundef %64)
  store i32 1, ptr %11, align 4
  br label %212

65:                                               ; preds = %32
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.CPpmd7, ptr %66, i32 0, i32 5
  store i32 0, ptr %67, align 8, !tbaa !24
  %68 = load ptr, ptr %8, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.CPpmd_State, ptr %68, i32 0, i32 1
  %70 = load i8, ptr %69, align 1, !tbaa !21
  %71 = zext i8 %70 to i32
  store i32 %71, ptr %9, align 4, !tbaa !9
  %72 = load ptr, ptr %4, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.CPpmd7, ptr %72, i32 0, i32 0
  %74 = load ptr, ptr %73, align 8, !tbaa !11
  %75 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %74, i32 0, i32 0
  %76 = load i16, ptr %75, align 4, !tbaa !15
  %77 = zext i16 %76 to i32
  %78 = sub nsw i32 %77, 1
  store i32 %78, ptr %10, align 4, !tbaa !9
  br label %79

79:                                               ; preds = %111, %65
  %80 = load ptr, ptr %8, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.CPpmd_State, ptr %80, i32 1
  store ptr %81, ptr %8, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.CPpmd_State, ptr %81, i32 0, i32 0
  %83 = load i8, ptr %82, align 1, !tbaa !19
  %84 = zext i8 %83 to i32
  %85 = load i32, ptr %6, align 4, !tbaa !9
  %86 = icmp eq i32 %84, %85
  br i1 %86, label %87, label %104

87:                                               ; preds = %79
  %88 = load ptr, ptr %5, align 8, !tbaa !5
  %89 = load i32, ptr %9, align 4, !tbaa !9
  %90 = load ptr, ptr %8, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.CPpmd_State, ptr %90, i32 0, i32 1
  %92 = load i8, ptr %91, align 1, !tbaa !21
  %93 = zext i8 %92 to i32
  %94 = load ptr, ptr %4, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.CPpmd7, ptr %94, i32 0, i32 0
  %96 = load ptr, ptr %95, align 8, !tbaa !11
  %97 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %96, i32 0, i32 1
  %98 = load i16, ptr %97, align 2, !tbaa !22
  %99 = zext i16 %98 to i32
  call void @RangeEnc_Encode(ptr noundef %88, i32 noundef %89, i32 noundef %93, i32 noundef %99)
  %100 = load ptr, ptr %8, align 8, !tbaa !5
  %101 = load ptr, ptr %4, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.CPpmd7, ptr %101, i32 0, i32 2
  store ptr %100, ptr %102, align 8, !tbaa !23
  %103 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update1(ptr noundef %103)
  store i32 1, ptr %11, align 4
  br label %212

104:                                              ; preds = %79
  %105 = load ptr, ptr %8, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.CPpmd_State, ptr %105, i32 0, i32 1
  %107 = load i8, ptr %106, align 1, !tbaa !21
  %108 = zext i8 %107 to i32
  %109 = load i32, ptr %9, align 4, !tbaa !9
  %110 = add i32 %109, %108
  store i32 %110, ptr %9, align 4, !tbaa !9
  br label %111

111:                                              ; preds = %104
  %112 = load i32, ptr %10, align 4, !tbaa !9
  %113 = add i32 %112, -1
  store i32 %113, ptr %10, align 4, !tbaa !9
  %114 = icmp ne i32 %113, 0
  br i1 %114, label %79, label %115, !llvm.loop !25

115:                                              ; preds = %111
  %116 = load ptr, ptr %4, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.CPpmd7, ptr %116, i32 0, i32 23
  %118 = load ptr, ptr %4, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.CPpmd7, ptr %118, i32 0, i32 2
  %120 = load ptr, ptr %119, align 8, !tbaa !23
  %121 = getelementptr inbounds %struct.CPpmd_State, ptr %120, i32 0, i32 0
  %122 = load i8, ptr %121, align 1, !tbaa !19
  %123 = zext i8 %122 to i64
  %124 = getelementptr inbounds [256 x i8], ptr %117, i64 0, i64 %123
  %125 = load i8, ptr %124, align 1, !tbaa !27
  %126 = zext i8 %125 to i32
  %127 = load ptr, ptr %4, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.CPpmd7, ptr %127, i32 0, i32 7
  store i32 %126, ptr %128, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %129

129:                                              ; preds = %166, %115
  %130 = load i32, ptr %12, align 4, !tbaa !9
  %131 = zext i32 %130 to i64
  %132 = icmp ult i64 %131, 32
  br i1 %132, label %133, label %169

133:                                              ; preds = %129
  %134 = load i32, ptr %12, align 4, !tbaa !9
  %135 = add i32 %134, 0
  %136 = zext i32 %135 to i64
  %137 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %136
  store i64 -1, ptr %137, align 8, !tbaa !29
  %138 = load i32, ptr %12, align 4, !tbaa !9
  %139 = add i32 %138, 1
  %140 = zext i32 %139 to i64
  %141 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %140
  store i64 -1, ptr %141, align 8, !tbaa !29
  %142 = load i32, ptr %12, align 4, !tbaa !9
  %143 = add i32 %142, 2
  %144 = zext i32 %143 to i64
  %145 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %144
  store i64 -1, ptr %145, align 8, !tbaa !29
  %146 = load i32, ptr %12, align 4, !tbaa !9
  %147 = add i32 %146, 3
  %148 = zext i32 %147 to i64
  %149 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %148
  store i64 -1, ptr %149, align 8, !tbaa !29
  %150 = load i32, ptr %12, align 4, !tbaa !9
  %151 = add i32 %150, 4
  %152 = zext i32 %151 to i64
  %153 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %152
  store i64 -1, ptr %153, align 8, !tbaa !29
  %154 = load i32, ptr %12, align 4, !tbaa !9
  %155 = add i32 %154, 5
  %156 = zext i32 %155 to i64
  %157 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %156
  store i64 -1, ptr %157, align 8, !tbaa !29
  %158 = load i32, ptr %12, align 4, !tbaa !9
  %159 = add i32 %158, 6
  %160 = zext i32 %159 to i64
  %161 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %160
  store i64 -1, ptr %161, align 8, !tbaa !29
  %162 = load i32, ptr %12, align 4, !tbaa !9
  %163 = add i32 %162, 7
  %164 = zext i32 %163 to i64
  %165 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %164
  store i64 -1, ptr %165, align 8, !tbaa !29
  br label %166

166:                                              ; preds = %133
  %167 = load i32, ptr %12, align 4, !tbaa !9
  %168 = add i32 %167, 8
  store i32 %168, ptr %12, align 4, !tbaa !9
  br label %129, !llvm.loop !31

169:                                              ; preds = %129
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  %170 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %171 = load ptr, ptr %8, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.CPpmd_State, ptr %171, i32 0, i32 0
  %173 = load i8, ptr %172, align 1, !tbaa !19
  %174 = zext i8 %173 to i64
  %175 = getelementptr inbounds i8, ptr %170, i64 %174
  store i8 0, ptr %175, align 1, !tbaa !27
  %176 = load ptr, ptr %4, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.CPpmd7, ptr %176, i32 0, i32 0
  %178 = load ptr, ptr %177, align 8, !tbaa !11
  %179 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %178, i32 0, i32 0
  %180 = load i16, ptr %179, align 4, !tbaa !15
  %181 = zext i16 %180 to i32
  %182 = sub nsw i32 %181, 1
  store i32 %182, ptr %10, align 4, !tbaa !9
  br label %183

183:                                              ; preds = %191, %169
  %184 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %185 = load ptr, ptr %8, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.CPpmd_State, ptr %185, i32 -1
  store ptr %186, ptr %8, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.CPpmd_State, ptr %186, i32 0, i32 0
  %188 = load i8, ptr %187, align 1, !tbaa !19
  %189 = zext i8 %188 to i64
  %190 = getelementptr inbounds i8, ptr %184, i64 %189
  store i8 0, ptr %190, align 1, !tbaa !27
  br label %191

191:                                              ; preds = %183
  %192 = load i32, ptr %10, align 4, !tbaa !9
  %193 = add i32 %192, -1
  store i32 %193, ptr %10, align 4, !tbaa !9
  %194 = icmp ne i32 %193, 0
  br i1 %194, label %183, label %195, !llvm.loop !32

195:                                              ; preds = %191
  %196 = load ptr, ptr %5, align 8, !tbaa !5
  %197 = load i32, ptr %9, align 4, !tbaa !9
  %198 = load ptr, ptr %4, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.CPpmd7, ptr %198, i32 0, i32 0
  %200 = load ptr, ptr %199, align 8, !tbaa !11
  %201 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %200, i32 0, i32 1
  %202 = load i16, ptr %201, align 2, !tbaa !22
  %203 = zext i16 %202 to i32
  %204 = load i32, ptr %9, align 4, !tbaa !9
  %205 = sub i32 %203, %204
  %206 = load ptr, ptr %4, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.CPpmd7, ptr %206, i32 0, i32 0
  %208 = load ptr, ptr %207, align 8, !tbaa !11
  %209 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %208, i32 0, i32 1
  %210 = load i16, ptr %209, align 2, !tbaa !22
  %211 = zext i16 %210 to i32
  call void @RangeEnc_Encode(ptr noundef %196, i32 noundef %197, i32 noundef %205, i32 noundef %211)
  store i32 0, ptr %11, align 4
  br label %212

212:                                              ; preds = %195, %87, %49
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  %213 = load i32, ptr %11, align 4
  switch i32 %213, label %584 [
    i32 0, label %214
  ]

214:                                              ; preds = %212
  br label %398

215:                                              ; preds = %3
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #3
  %216 = load ptr, ptr %4, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.CPpmd7, ptr %216, i32 0, i32 26
  %218 = load ptr, ptr %4, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.CPpmd7, ptr %218, i32 0, i32 0
  %220 = load ptr, ptr %219, align 8, !tbaa !11
  %221 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %220, i32 0, i32 1
  %222 = getelementptr inbounds %struct.CPpmd_State, ptr %221, i32 0, i32 1
  %223 = load i8, ptr %222, align 1, !tbaa !21
  %224 = zext i8 %223 to i32
  %225 = sub nsw i32 %224, 1
  %226 = sext i32 %225 to i64
  %227 = getelementptr inbounds [128 x [64 x i16]], ptr %217, i64 0, i64 %226
  %228 = load ptr, ptr %4, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.CPpmd7, ptr %228, i32 0, i32 5
  %230 = load i32, ptr %229, align 8, !tbaa !24
  %231 = load ptr, ptr %4, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.CPpmd7, ptr %231, i32 0, i32 22
  %233 = load ptr, ptr %4, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.CPpmd7, ptr %233, i32 0, i32 12
  %235 = load ptr, ptr %234, align 8, !tbaa !17
  %236 = load ptr, ptr %4, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.CPpmd7, ptr %236, i32 0, i32 0
  %238 = load ptr, ptr %237, align 8, !tbaa !11
  %239 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %238, i32 0, i32 3
  %240 = load i32, ptr %239, align 4, !tbaa !33
  %241 = zext i32 %240 to i64
  %242 = getelementptr inbounds i8, ptr %235, i64 %241
  %243 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %242, i32 0, i32 0
  %244 = load i16, ptr %243, align 4, !tbaa !15
  %245 = zext i16 %244 to i32
  %246 = sub nsw i32 %245, 1
  %247 = sext i32 %246 to i64
  %248 = getelementptr inbounds [256 x i8], ptr %232, i64 0, i64 %247
  %249 = load i8, ptr %248, align 1, !tbaa !27
  %250 = zext i8 %249 to i32
  %251 = add i32 %230, %250
  %252 = load ptr, ptr %4, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.CPpmd7, ptr %252, i32 0, i32 23
  %254 = load ptr, ptr %4, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.CPpmd7, ptr %254, i32 0, i32 2
  %256 = load ptr, ptr %255, align 8, !tbaa !23
  %257 = getelementptr inbounds %struct.CPpmd_State, ptr %256, i32 0, i32 0
  %258 = load i8, ptr %257, align 1, !tbaa !19
  %259 = zext i8 %258 to i64
  %260 = getelementptr inbounds [256 x i8], ptr %253, i64 0, i64 %259
  %261 = load i8, ptr %260, align 1, !tbaa !27
  %262 = zext i8 %261 to i32
  %263 = load ptr, ptr %4, align 8, !tbaa !5
  %264 = getelementptr inbounds %struct.CPpmd7, ptr %263, i32 0, i32 7
  store i32 %262, ptr %264, align 8, !tbaa !28
  %265 = add i32 %251, %262
  %266 = load ptr, ptr %4, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct.CPpmd7, ptr %266, i32 0, i32 23
  %268 = load ptr, ptr %4, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.CPpmd7, ptr %268, i32 0, i32 0
  %270 = load ptr, ptr %269, align 8, !tbaa !11
  %271 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %270, i32 0, i32 1
  %272 = getelementptr inbounds %struct.CPpmd_State, ptr %271, i32 0, i32 0
  %273 = load i8, ptr %272, align 2, !tbaa !19
  %274 = zext i8 %273 to i64
  %275 = getelementptr inbounds [256 x i8], ptr %267, i64 0, i64 %274
  %276 = load i8, ptr %275, align 1, !tbaa !27
  %277 = zext i8 %276 to i32
  %278 = mul nsw i32 2, %277
  %279 = add i32 %265, %278
  %280 = load ptr, ptr %4, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.CPpmd7, ptr %280, i32 0, i32 8
  %282 = load i32, ptr %281, align 4, !tbaa !34
  %283 = ashr i32 %282, 26
  %284 = and i32 %283, 32
  %285 = add i32 %279, %284
  %286 = zext i32 %285 to i64
  %287 = getelementptr inbounds [64 x i16], ptr %227, i64 0, i64 %286
  store ptr %287, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  %288 = load ptr, ptr %4, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.CPpmd7, ptr %288, i32 0, i32 0
  %290 = load ptr, ptr %289, align 8, !tbaa !11
  %291 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %290, i32 0, i32 1
  store ptr %291, ptr %14, align 8, !tbaa !5
  %292 = load ptr, ptr %14, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.CPpmd_State, ptr %292, i32 0, i32 0
  %294 = load i8, ptr %293, align 1, !tbaa !19
  %295 = zext i8 %294 to i32
  %296 = load i32, ptr %6, align 4, !tbaa !9
  %297 = icmp eq i32 %295, %296
  br i1 %297, label %298, label %319

298:                                              ; preds = %215
  %299 = load ptr, ptr %5, align 8, !tbaa !5
  %300 = load ptr, ptr %13, align 8, !tbaa !5
  %301 = load i16, ptr %300, align 2, !tbaa !35
  %302 = zext i16 %301 to i32
  call void @RangeEnc_EncodeBit_0(ptr noundef %299, i32 noundef %302)
  %303 = load ptr, ptr %13, align 8, !tbaa !5
  %304 = load i16, ptr %303, align 2, !tbaa !35
  %305 = zext i16 %304 to i32
  %306 = add nsw i32 %305, 128
  %307 = load ptr, ptr %13, align 8, !tbaa !5
  %308 = load i16, ptr %307, align 2, !tbaa !35
  %309 = zext i16 %308 to i32
  %310 = add nsw i32 %309, 32
  %311 = ashr i32 %310, 7
  %312 = sub nsw i32 %306, %311
  %313 = trunc i32 %312 to i16
  %314 = load ptr, ptr %13, align 8, !tbaa !5
  store i16 %313, ptr %314, align 2, !tbaa !35
  %315 = load ptr, ptr %14, align 8, !tbaa !5
  %316 = load ptr, ptr %4, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.CPpmd7, ptr %316, i32 0, i32 2
  store ptr %315, ptr %317, align 8, !tbaa !23
  %318 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_UpdateBin(ptr noundef %318)
  store i32 1, ptr %11, align 4
  br label %395

319:                                              ; preds = %215
  %320 = load ptr, ptr %5, align 8, !tbaa !5
  %321 = load ptr, ptr %13, align 8, !tbaa !5
  %322 = load i16, ptr %321, align 2, !tbaa !35
  %323 = zext i16 %322 to i32
  call void @RangeEnc_EncodeBit_1(ptr noundef %320, i32 noundef %323)
  %324 = load ptr, ptr %13, align 8, !tbaa !5
  %325 = load i16, ptr %324, align 2, !tbaa !35
  %326 = zext i16 %325 to i32
  %327 = load ptr, ptr %13, align 8, !tbaa !5
  %328 = load i16, ptr %327, align 2, !tbaa !35
  %329 = zext i16 %328 to i32
  %330 = add nsw i32 %329, 32
  %331 = ashr i32 %330, 7
  %332 = sub nsw i32 %326, %331
  %333 = trunc i32 %332 to i16
  %334 = load ptr, ptr %13, align 8, !tbaa !5
  store i16 %333, ptr %334, align 2, !tbaa !35
  %335 = load ptr, ptr %13, align 8, !tbaa !5
  %336 = load i16, ptr %335, align 2, !tbaa !35
  %337 = zext i16 %336 to i32
  %338 = ashr i32 %337, 10
  %339 = sext i32 %338 to i64
  %340 = getelementptr inbounds [16 x i8], ptr @PPMD7_kExpEscape, i64 0, i64 %339
  %341 = load i8, ptr %340, align 1, !tbaa !27
  %342 = zext i8 %341 to i32
  %343 = load ptr, ptr %4, align 8, !tbaa !5
  %344 = getelementptr inbounds %struct.CPpmd7, ptr %343, i32 0, i32 4
  store i32 %342, ptr %344, align 4, !tbaa !36
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  store i32 0, ptr %15, align 4, !tbaa !9
  br label %345

345:                                              ; preds = %382, %319
  %346 = load i32, ptr %15, align 4, !tbaa !9
  %347 = zext i32 %346 to i64
  %348 = icmp ult i64 %347, 32
  br i1 %348, label %349, label %385

349:                                              ; preds = %345
  %350 = load i32, ptr %15, align 4, !tbaa !9
  %351 = add i32 %350, 0
  %352 = zext i32 %351 to i64
  %353 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %352
  store i64 -1, ptr %353, align 8, !tbaa !29
  %354 = load i32, ptr %15, align 4, !tbaa !9
  %355 = add i32 %354, 1
  %356 = zext i32 %355 to i64
  %357 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %356
  store i64 -1, ptr %357, align 8, !tbaa !29
  %358 = load i32, ptr %15, align 4, !tbaa !9
  %359 = add i32 %358, 2
  %360 = zext i32 %359 to i64
  %361 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %360
  store i64 -1, ptr %361, align 8, !tbaa !29
  %362 = load i32, ptr %15, align 4, !tbaa !9
  %363 = add i32 %362, 3
  %364 = zext i32 %363 to i64
  %365 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %364
  store i64 -1, ptr %365, align 8, !tbaa !29
  %366 = load i32, ptr %15, align 4, !tbaa !9
  %367 = add i32 %366, 4
  %368 = zext i32 %367 to i64
  %369 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %368
  store i64 -1, ptr %369, align 8, !tbaa !29
  %370 = load i32, ptr %15, align 4, !tbaa !9
  %371 = add i32 %370, 5
  %372 = zext i32 %371 to i64
  %373 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %372
  store i64 -1, ptr %373, align 8, !tbaa !29
  %374 = load i32, ptr %15, align 4, !tbaa !9
  %375 = add i32 %374, 6
  %376 = zext i32 %375 to i64
  %377 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %376
  store i64 -1, ptr %377, align 8, !tbaa !29
  %378 = load i32, ptr %15, align 4, !tbaa !9
  %379 = add i32 %378, 7
  %380 = zext i32 %379 to i64
  %381 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %380
  store i64 -1, ptr %381, align 8, !tbaa !29
  br label %382

382:                                              ; preds = %349
  %383 = load i32, ptr %15, align 4, !tbaa !9
  %384 = add i32 %383, 8
  store i32 %384, ptr %15, align 4, !tbaa !9
  br label %345, !llvm.loop !37

385:                                              ; preds = %345
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  %386 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %387 = load ptr, ptr %14, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.CPpmd_State, ptr %387, i32 0, i32 0
  %389 = load i8, ptr %388, align 1, !tbaa !19
  %390 = zext i8 %389 to i64
  %391 = getelementptr inbounds i8, ptr %386, i64 %390
  store i8 0, ptr %391, align 1, !tbaa !27
  %392 = load ptr, ptr %4, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.CPpmd7, ptr %392, i32 0, i32 5
  store i32 0, ptr %393, align 8, !tbaa !24
  br label %394

394:                                              ; preds = %385
  store i32 0, ptr %11, align 4
  br label %395

395:                                              ; preds = %394, %298
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  %396 = load i32, ptr %11, align 4
  switch i32 %396, label %584 [
    i32 0, label %397
  ]

397:                                              ; preds = %395
  br label %398

398:                                              ; preds = %397, %214
  br label %399

399:                                              ; preds = %583, %398
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #3
  %400 = load ptr, ptr %4, align 8, !tbaa !5
  %401 = getelementptr inbounds %struct.CPpmd7, ptr %400, i32 0, i32 0
  %402 = load ptr, ptr %401, align 8, !tbaa !11
  %403 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %402, i32 0, i32 0
  %404 = load i16, ptr %403, align 4, !tbaa !15
  %405 = zext i16 %404 to i32
  store i32 %405, ptr %21, align 4, !tbaa !9
  br label %406

406:                                              ; preds = %431, %399
  %407 = load ptr, ptr %4, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.CPpmd7, ptr %407, i32 0, i32 3
  %409 = load i32, ptr %408, align 8, !tbaa !38
  %410 = add i32 %409, 1
  store i32 %410, ptr %408, align 8, !tbaa !38
  %411 = load ptr, ptr %4, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.CPpmd7, ptr %411, i32 0, i32 0
  %413 = load ptr, ptr %412, align 8, !tbaa !11
  %414 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %413, i32 0, i32 3
  %415 = load i32, ptr %414, align 4, !tbaa !33
  %416 = icmp ne i32 %415, 0
  br i1 %416, label %418, label %417

417:                                              ; preds = %406
  store i32 1, ptr %11, align 4
  br label %581

418:                                              ; preds = %406
  %419 = load ptr, ptr %4, align 8, !tbaa !5
  %420 = getelementptr inbounds %struct.CPpmd7, ptr %419, i32 0, i32 12
  %421 = load ptr, ptr %420, align 8, !tbaa !17
  %422 = load ptr, ptr %4, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.CPpmd7, ptr %422, i32 0, i32 0
  %424 = load ptr, ptr %423, align 8, !tbaa !11
  %425 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %424, i32 0, i32 3
  %426 = load i32, ptr %425, align 4, !tbaa !33
  %427 = zext i32 %426 to i64
  %428 = getelementptr inbounds i8, ptr %421, i64 %427
  %429 = load ptr, ptr %4, align 8, !tbaa !5
  %430 = getelementptr inbounds %struct.CPpmd7, ptr %429, i32 0, i32 0
  store ptr %428, ptr %430, align 8, !tbaa !11
  br label %431

431:                                              ; preds = %418
  %432 = load ptr, ptr %4, align 8, !tbaa !5
  %433 = getelementptr inbounds %struct.CPpmd7, ptr %432, i32 0, i32 0
  %434 = load ptr, ptr %433, align 8, !tbaa !11
  %435 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %434, i32 0, i32 0
  %436 = load i16, ptr %435, align 4, !tbaa !15
  %437 = zext i16 %436 to i32
  %438 = load i32, ptr %21, align 4, !tbaa !9
  %439 = icmp eq i32 %437, %438
  br i1 %439, label %406, label %440, !llvm.loop !39

440:                                              ; preds = %431
  %441 = load ptr, ptr %4, align 8, !tbaa !5
  %442 = load i32, ptr %21, align 4, !tbaa !9
  %443 = call ptr @Ppmd7_MakeEscFreq(ptr noundef %441, i32 noundef %442, ptr noundef %16)
  store ptr %443, ptr %17, align 8, !tbaa !5
  %444 = load ptr, ptr %4, align 8, !tbaa !5
  %445 = getelementptr inbounds %struct.CPpmd7, ptr %444, i32 0, i32 12
  %446 = load ptr, ptr %445, align 8, !tbaa !17
  %447 = load ptr, ptr %4, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.CPpmd7, ptr %447, i32 0, i32 0
  %449 = load ptr, ptr %448, align 8, !tbaa !11
  %450 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %449, i32 0, i32 2
  %451 = load i32, ptr %450, align 4, !tbaa !18
  %452 = zext i32 %451 to i64
  %453 = getelementptr inbounds i8, ptr %446, i64 %452
  store ptr %453, ptr %18, align 8, !tbaa !5
  store i32 0, ptr %19, align 4, !tbaa !9
  %454 = load ptr, ptr %4, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.CPpmd7, ptr %454, i32 0, i32 0
  %456 = load ptr, ptr %455, align 8, !tbaa !11
  %457 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %456, i32 0, i32 0
  %458 = load i16, ptr %457, align 4, !tbaa !15
  %459 = zext i16 %458 to i32
  store i32 %459, ptr %20, align 4, !tbaa !9
  br label %460

460:                                              ; preds = %559, %440
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #3
  %461 = load ptr, ptr %18, align 8, !tbaa !5
  %462 = getelementptr inbounds %struct.CPpmd_State, ptr %461, i32 0, i32 0
  %463 = load i8, ptr %462, align 1, !tbaa !19
  %464 = zext i8 %463 to i32
  store i32 %464, ptr %22, align 4, !tbaa !9
  %465 = load i32, ptr %22, align 4, !tbaa !9
  %466 = load i32, ptr %6, align 4, !tbaa !9
  %467 = icmp eq i32 %465, %466
  br i1 %467, label %468, label %536

468:                                              ; preds = %460
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #3
  %469 = load i32, ptr %19, align 4, !tbaa !9
  store i32 %469, ptr %23, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  %470 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %470, ptr %24, align 8, !tbaa !5
  br label %471

471:                                              ; preds = %489, %468
  %472 = load ptr, ptr %18, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.CPpmd_State, ptr %472, i32 0, i32 1
  %474 = load i8, ptr %473, align 1, !tbaa !21
  %475 = zext i8 %474 to i32
  %476 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %477 = load ptr, ptr %18, align 8, !tbaa !5
  %478 = getelementptr inbounds %struct.CPpmd_State, ptr %477, i32 0, i32 0
  %479 = load i8, ptr %478, align 1, !tbaa !19
  %480 = zext i8 %479 to i64
  %481 = getelementptr inbounds i8, ptr %476, i64 %480
  %482 = load i8, ptr %481, align 1, !tbaa !27
  %483 = sext i8 %482 to i32
  %484 = and i32 %475, %483
  %485 = load i32, ptr %19, align 4, !tbaa !9
  %486 = add i32 %485, %484
  store i32 %486, ptr %19, align 4, !tbaa !9
  %487 = load ptr, ptr %18, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.CPpmd_State, ptr %487, i32 1
  store ptr %488, ptr %18, align 8, !tbaa !5
  br label %489

489:                                              ; preds = %471
  %490 = load i32, ptr %20, align 4, !tbaa !9
  %491 = add i32 %490, -1
  store i32 %491, ptr %20, align 4, !tbaa !9
  %492 = icmp ne i32 %491, 0
  br i1 %492, label %471, label %493, !llvm.loop !40

493:                                              ; preds = %489
  %494 = load ptr, ptr %5, align 8, !tbaa !5
  %495 = load i32, ptr %23, align 4, !tbaa !9
  %496 = load ptr, ptr %24, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.CPpmd_State, ptr %496, i32 0, i32 1
  %498 = load i8, ptr %497, align 1, !tbaa !21
  %499 = zext i8 %498 to i32
  %500 = load i32, ptr %19, align 4, !tbaa !9
  %501 = load i32, ptr %16, align 4, !tbaa !9
  %502 = add i32 %500, %501
  call void @RangeEnc_Encode(ptr noundef %494, i32 noundef %495, i32 noundef %499, i32 noundef %502)
  %503 = load ptr, ptr %17, align 8, !tbaa !5
  %504 = getelementptr inbounds %struct.CPpmd_See, ptr %503, i32 0, i32 1
  %505 = load i8, ptr %504, align 1, !tbaa !41
  %506 = zext i8 %505 to i32
  %507 = icmp slt i32 %506, 7
  br i1 %507, label %508, label %531

508:                                              ; preds = %493
  %509 = load ptr, ptr %17, align 8, !tbaa !5
  %510 = getelementptr inbounds %struct.CPpmd_See, ptr %509, i32 0, i32 2
  %511 = load i8, ptr %510, align 1, !tbaa !42
  %512 = add i8 %511, -1
  store i8 %512, ptr %510, align 1, !tbaa !42
  %513 = zext i8 %512 to i32
  %514 = icmp eq i32 %513, 0
  br i1 %514, label %515, label %531

515:                                              ; preds = %508
  %516 = load ptr, ptr %17, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.CPpmd_See, ptr %516, i32 0, i32 0
  %518 = load i16, ptr %517, align 1, !tbaa !43
  %519 = zext i16 %518 to i32
  %520 = shl i32 %519, 1
  %521 = trunc i32 %520 to i16
  store i16 %521, ptr %517, align 1, !tbaa !43
  %522 = load ptr, ptr %17, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.CPpmd_See, ptr %522, i32 0, i32 1
  %524 = load i8, ptr %523, align 1, !tbaa !41
  %525 = add i8 %524, 1
  store i8 %525, ptr %523, align 1, !tbaa !41
  %526 = zext i8 %524 to i32
  %527 = shl i32 3, %526
  %528 = trunc i32 %527 to i8
  %529 = load ptr, ptr %17, align 8, !tbaa !5
  %530 = getelementptr inbounds %struct.CPpmd_See, ptr %529, i32 0, i32 2
  store i8 %528, ptr %530, align 1, !tbaa !42
  br label %531

531:                                              ; preds = %515, %508, %493
  %532 = load ptr, ptr %24, align 8, !tbaa !5
  %533 = load ptr, ptr %4, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.CPpmd7, ptr %533, i32 0, i32 2
  store ptr %532, ptr %534, align 8, !tbaa !23
  %535 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update2(ptr noundef %535)
  store i32 1, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #3
  br label %556

536:                                              ; preds = %460
  %537 = load ptr, ptr %18, align 8, !tbaa !5
  %538 = getelementptr inbounds %struct.CPpmd_State, ptr %537, i32 0, i32 1
  %539 = load i8, ptr %538, align 1, !tbaa !21
  %540 = zext i8 %539 to i32
  %541 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %542 = load i32, ptr %22, align 4, !tbaa !9
  %543 = sext i32 %542 to i64
  %544 = getelementptr inbounds i8, ptr %541, i64 %543
  %545 = load i8, ptr %544, align 1, !tbaa !27
  %546 = sext i8 %545 to i32
  %547 = and i32 %540, %546
  %548 = load i32, ptr %19, align 4, !tbaa !9
  %549 = add i32 %548, %547
  store i32 %549, ptr %19, align 4, !tbaa !9
  %550 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %551 = load i32, ptr %22, align 4, !tbaa !9
  %552 = sext i32 %551 to i64
  %553 = getelementptr inbounds i8, ptr %550, i64 %552
  store i8 0, ptr %553, align 1, !tbaa !27
  %554 = load ptr, ptr %18, align 8, !tbaa !5
  %555 = getelementptr inbounds %struct.CPpmd_State, ptr %554, i32 1
  store ptr %555, ptr %18, align 8, !tbaa !5
  store i32 0, ptr %11, align 4
  br label %556

556:                                              ; preds = %536, %531
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #3
  %557 = load i32, ptr %11, align 4
  switch i32 %557, label %581 [
    i32 0, label %558
  ]

558:                                              ; preds = %556
  br label %559

559:                                              ; preds = %558
  %560 = load i32, ptr %20, align 4, !tbaa !9
  %561 = add i32 %560, -1
  store i32 %561, ptr %20, align 4, !tbaa !9
  %562 = icmp ne i32 %561, 0
  br i1 %562, label %460, label %563, !llvm.loop !44

563:                                              ; preds = %559
  %564 = load ptr, ptr %5, align 8, !tbaa !5
  %565 = load i32, ptr %19, align 4, !tbaa !9
  %566 = load i32, ptr %16, align 4, !tbaa !9
  %567 = load i32, ptr %19, align 4, !tbaa !9
  %568 = load i32, ptr %16, align 4, !tbaa !9
  %569 = add i32 %567, %568
  call void @RangeEnc_Encode(ptr noundef %564, i32 noundef %565, i32 noundef %566, i32 noundef %569)
  %570 = load ptr, ptr %17, align 8, !tbaa !5
  %571 = getelementptr inbounds %struct.CPpmd_See, ptr %570, i32 0, i32 0
  %572 = load i16, ptr %571, align 1, !tbaa !43
  %573 = zext i16 %572 to i32
  %574 = load i32, ptr %19, align 4, !tbaa !9
  %575 = add i32 %573, %574
  %576 = load i32, ptr %16, align 4, !tbaa !9
  %577 = add i32 %575, %576
  %578 = trunc i32 %577 to i16
  %579 = load ptr, ptr %17, align 8, !tbaa !5
  %580 = getelementptr inbounds %struct.CPpmd_See, ptr %579, i32 0, i32 0
  store i16 %578, ptr %580, align 1, !tbaa !43
  store i32 0, ptr %11, align 4
  br label %581

581:                                              ; preds = %563, %556, %417
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  %582 = load i32, ptr %11, align 4
  switch i32 %582, label %584 [
    i32 0, label %583
  ]

583:                                              ; preds = %581
  br label %399

584:                                              ; preds = %581, %395, %212
  call void @llvm.lifetime.end.p0(i64 256, ptr %7) #3
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden void @RangeEnc_Encode(ptr noundef, i32 noundef, i32 noundef, i32 noundef) #1

declare void @Ppmd7_Update1_0(ptr noundef) #2

declare void @Ppmd7_Update1(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden void @RangeEnc_EncodeBit_0(ptr noundef, i32 noundef) #1

declare void @Ppmd7_UpdateBin(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden void @RangeEnc_EncodeBit_1(ptr noundef, i32 noundef) #1

declare ptr @Ppmd7_MakeEscFreq(ptr noundef, i32 noundef, ptr noundef) #2

declare void @Ppmd7_Update2(ptr noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 0}
!12 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !10, i64 104, !7, i64 108, !7, i64 146, !7, i64 276, !7, i64 428, !7, i64 684, !7, i64 940, !13, i64 1196, !7, i64 1200, !7, i64 2800}
!13 = !{!"", !14, i64 0, !7, i64 2, !7, i64 3}
!14 = !{!"short", !7, i64 0}
!15 = !{!16, !14, i64 0}
!16 = !{!"CPpmd7_Context_", !14, i64 0, !14, i64 2, !10, i64 4, !10, i64 8}
!17 = !{!12, !6, i64 64}
!18 = !{!16, !10, i64 4}
!19 = !{!20, !7, i64 0}
!20 = !{!"", !7, i64 0, !7, i64 1, !14, i64 2, !14, i64 4}
!21 = !{!20, !7, i64 1}
!22 = !{!16, !14, i64 2}
!23 = !{!12, !6, i64 16}
!24 = !{!12, !10, i64 32}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!7, !7, i64 0}
!28 = !{!12, !10, i64 40}
!29 = !{!30, !30, i64 0}
!30 = !{!"long", !7, i64 0}
!31 = distinct !{!31, !26}
!32 = distinct !{!32, !26}
!33 = !{!16, !10, i64 8}
!34 = !{!12, !10, i64 44}
!35 = !{!14, !14, i64 0}
!36 = !{!12, !10, i64 28}
!37 = distinct !{!37, !26}
!38 = !{!12, !10, i64 24}
!39 = distinct !{!39, !26}
!40 = distinct !{!40, !26}
!41 = !{!13, !7, i64 2}
!42 = !{!13, !7, i64 3}
!43 = !{!13, !14, i64 0}
!44 = distinct !{!44, !26}


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

@PPMD7_kExpEscape = external local_unnamed_addr constant [16 x i8], 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 nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
define dso_local void @Ppmd7_EncodeSymbol(ptr noundef %0, ptr noundef %1, i32 noundef %2) local_unnamed_addr #1 {
  %4 = alloca [32 x i64], align 16
  %5 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %4) #4
  %6 = load ptr, ptr %0, align 8, !tbaa !5
  %7 = load i16, ptr %6, align 4, !tbaa !13
  %.not = icmp eq i16 %7, 1
  br i1 %.not, label %89, label %8

8:                                                ; preds = %3
  %9 = getelementptr inbounds i8, ptr %0, i64 64
  %10 = load ptr, ptr %9, align 8, !tbaa !15
  %11 = getelementptr inbounds i8, ptr %6, i64 4
  %12 = load i32, ptr %11, align 4, !tbaa !16
  %13 = zext i32 %12 to i64
  %14 = getelementptr inbounds i8, ptr %10, i64 %13
  %15 = load i8, ptr %14, align 1, !tbaa !17
  %16 = zext i8 %15 to i32
  %17 = icmp eq i32 %16, %2
  br i1 %17, label %18, label %26

18:                                               ; preds = %8
  %19 = getelementptr inbounds i8, ptr %14, i64 1
  %20 = load i8, ptr %19, align 1, !tbaa !19
  %21 = zext i8 %20 to i32
  %22 = getelementptr inbounds i8, ptr %6, i64 2
  %23 = load i16, ptr %22, align 2, !tbaa !20
  %24 = zext i16 %23 to i32
  tail call void @RangeEnc_Encode(ptr noundef %1, i32 noundef 0, i32 noundef %21, i32 noundef %24)
  %25 = getelementptr inbounds i8, ptr %0, i64 16
  store ptr %14, ptr %25, align 8, !tbaa !21
  tail call void @Ppmd7_Update1_0(ptr noundef nonnull %0) #4
  br label %.critedge

26:                                               ; preds = %8
  %27 = getelementptr inbounds i8, ptr %0, i64 32
  store i32 0, ptr %27, align 8, !tbaa !22
  %28 = getelementptr inbounds i8, ptr %14, i64 1
  %29 = load i8, ptr %28, align 1, !tbaa !19
  %30 = zext i8 %29 to i32
  %31 = zext i16 %7 to i32
  %32 = add nsw i32 %31, -1
  br label %33

33:                                               ; preds = %46, %26
  %.0144 = phi i32 [ %32, %26 ], [ %48, %46 ]
  %.0143 = phi i32 [ %30, %26 ], [ %47, %46 ]
  %.0 = phi ptr [ %14, %26 ], [ %34, %46 ]
  %34 = getelementptr inbounds i8, ptr %.0, i64 6
  %35 = load i8, ptr %34, align 1, !tbaa !17
  %36 = zext i8 %35 to i32
  %37 = icmp eq i32 %36, %2
  %38 = getelementptr inbounds i8, ptr %.0, i64 7
  %39 = load i8, ptr %38, align 1, !tbaa !19
  %40 = zext i8 %39 to i32
  br i1 %37, label %41, label %46

41:                                               ; preds = %33
  %42 = getelementptr inbounds i8, ptr %6, i64 2
  %43 = load i16, ptr %42, align 2, !tbaa !20
  %44 = zext i16 %43 to i32
  tail call void @RangeEnc_Encode(ptr noundef %1, i32 noundef %.0143, i32 noundef %40, i32 noundef %44)
  %45 = getelementptr inbounds i8, ptr %0, i64 16
  store ptr %34, ptr %45, align 8, !tbaa !21
  tail call void @Ppmd7_Update1(ptr noundef %0) #4
  br label %.critedge

46:                                               ; preds = %33
  %47 = add i32 %.0143, %40
  %48 = add i32 %.0144, -1
  %.not169 = icmp eq i32 %48, 0
  br i1 %.not169, label %49, label %33, !llvm.loop !23

49:                                               ; preds = %46
  %50 = getelementptr inbounds i8, ptr %0, i64 940
  %51 = getelementptr inbounds i8, ptr %0, i64 16
  %52 = load ptr, ptr %51, align 8, !tbaa !21
  %53 = load i8, ptr %52, align 1, !tbaa !17
  %54 = zext i8 %53 to i64
  %55 = getelementptr inbounds [256 x i8], ptr %50, i64 0, i64 %54
  %56 = load i8, ptr %55, align 1, !tbaa !25
  %57 = zext i8 %56 to i32
  %58 = getelementptr inbounds i8, ptr %0, i64 40
  store i32 %57, ptr %58, align 8, !tbaa !26
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %4, i8 -1, i64 256, i1 false), !tbaa !27
  %59 = zext i8 %35 to i64
  %60 = getelementptr inbounds i8, ptr %4, i64 %59
  store i8 0, ptr %60, align 1, !tbaa !25
  %61 = add nsw i32 %31, -2
  %xtraiter = and i32 %32, 3
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.prol.loopexit, label %.prol.preheader

.prol.preheader:                                  ; preds = %49, %.prol.preheader
  %.1145.prol = phi i32 [ %66, %.prol.preheader ], [ %32, %49 ]
  %.1.prol = phi ptr [ %62, %.prol.preheader ], [ %34, %49 ]
  %prol.iter = phi i32 [ %prol.iter.next, %.prol.preheader ], [ 0, %49 ]
  %62 = getelementptr inbounds i8, ptr %.1.prol, i64 -6
  %63 = load i8, ptr %62, align 1, !tbaa !17
  %64 = zext i8 %63 to i64
  %65 = getelementptr inbounds i8, ptr %4, i64 %64
  store i8 0, ptr %65, align 1, !tbaa !25
  %66 = add i32 %.1145.prol, -1
  %prol.iter.next = add i32 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i32 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.prol.loopexit, label %.prol.preheader, !llvm.loop !29

.prol.loopexit:                                   ; preds = %.prol.preheader, %49
  %.1145.unr = phi i32 [ %32, %49 ], [ %66, %.prol.preheader ]
  %.1.unr = phi ptr [ %34, %49 ], [ %62, %.prol.preheader ]
  %67 = icmp ult i32 %61, 3
  br i1 %67, label %.unr-lcssa, label %.new

.new:                                             ; preds = %.prol.loopexit, %.new
  %.1145 = phi i32 [ %84, %.new ], [ %.1145.unr, %.prol.loopexit ]
  %.1 = phi ptr [ %80, %.new ], [ %.1.unr, %.prol.loopexit ]
  %68 = getelementptr inbounds i8, ptr %.1, i64 -6
  %69 = load i8, ptr %68, align 1, !tbaa !17
  %70 = zext i8 %69 to i64
  %71 = getelementptr inbounds i8, ptr %4, i64 %70
  store i8 0, ptr %71, align 1, !tbaa !25
  %72 = getelementptr inbounds i8, ptr %.1, i64 -12
  %73 = load i8, ptr %72, align 1, !tbaa !17
  %74 = zext i8 %73 to i64
  %75 = getelementptr inbounds i8, ptr %4, i64 %74
  store i8 0, ptr %75, align 1, !tbaa !25
  %76 = getelementptr inbounds i8, ptr %.1, i64 -18
  %77 = load i8, ptr %76, align 1, !tbaa !17
  %78 = zext i8 %77 to i64
  %79 = getelementptr inbounds i8, ptr %4, i64 %78
  store i8 0, ptr %79, align 1, !tbaa !25
  %80 = getelementptr inbounds i8, ptr %.1, i64 -24
  %81 = load i8, ptr %80, align 1, !tbaa !17
  %82 = zext i8 %81 to i64
  %83 = getelementptr inbounds i8, ptr %4, i64 %82
  store i8 0, ptr %83, align 1, !tbaa !25
  %84 = add i32 %.1145, -4
  %.not170.3 = icmp eq i32 %84, 0
  br i1 %.not170.3, label %.unr-lcssa, label %.new, !llvm.loop !31

.unr-lcssa:                                       ; preds = %.new, %.prol.loopexit
  %85 = getelementptr inbounds i8, ptr %6, i64 2
  %86 = load i16, ptr %85, align 2, !tbaa !20
  %87 = zext i16 %86 to i32
  %88 = sub i32 %87, %47
  tail call void @RangeEnc_Encode(ptr noundef %1, i32 noundef %47, i32 noundef %88, i32 noundef %87)
  br label %162

89:                                               ; preds = %3
  %90 = getelementptr inbounds i8, ptr %0, i64 2800
  %91 = getelementptr inbounds i8, ptr %6, i64 3
  %92 = load i8, ptr %91, align 1, !tbaa !19
  %93 = zext i8 %92 to i64
  %94 = add nsw i64 %93, -1
  %95 = getelementptr inbounds i8, ptr %0, i64 32
  %96 = load i32, ptr %95, align 8, !tbaa !22
  %97 = getelementptr inbounds i8, ptr %0, i64 684
  %98 = getelementptr inbounds i8, ptr %0, i64 64
  %99 = load ptr, ptr %98, align 8, !tbaa !15
  %100 = getelementptr inbounds i8, ptr %6, i64 8
  %101 = load i32, ptr %100, align 4, !tbaa !32
  %102 = zext i32 %101 to i64
  %103 = getelementptr inbounds i8, ptr %99, i64 %102
  %104 = load i16, ptr %103, align 4, !tbaa !13
  %105 = zext i16 %104 to i64
  %106 = add nsw i64 %105, -1
  %107 = getelementptr inbounds [256 x i8], ptr %97, i64 0, i64 %106
  %108 = load i8, ptr %107, align 1, !tbaa !25
  %109 = zext i8 %108 to i32
  %110 = add i32 %96, %109
  %111 = getelementptr inbounds i8, ptr %0, i64 940
  %112 = getelementptr inbounds i8, ptr %0, i64 16
  %113 = load ptr, ptr %112, align 8, !tbaa !21
  %114 = load i8, ptr %113, align 1, !tbaa !17
  %115 = zext i8 %114 to i64
  %116 = getelementptr inbounds [256 x i8], ptr %111, i64 0, i64 %115
  %117 = load i8, ptr %116, align 1, !tbaa !25
  %118 = zext i8 %117 to i32
  %119 = getelementptr inbounds i8, ptr %0, i64 40
  store i32 %118, ptr %119, align 8, !tbaa !26
  %120 = add i32 %110, %118
  %121 = getelementptr inbounds i8, ptr %6, i64 2
  %122 = load i8, ptr %121, align 2, !tbaa !17
  %123 = zext i8 %122 to i64
  %124 = getelementptr inbounds [256 x i8], ptr %111, i64 0, i64 %123
  %125 = load i8, ptr %124, align 1, !tbaa !25
  %126 = zext i8 %125 to i32
  %127 = shl nuw nsw i32 %126, 1
  %128 = add i32 %120, %127
  %129 = getelementptr inbounds i8, ptr %0, i64 44
  %130 = load i32, ptr %129, align 4, !tbaa !33
  %131 = lshr i32 %130, 26
  %132 = and i32 %131, 32
  %133 = add i32 %128, %132
  %134 = zext i32 %133 to i64
  %135 = getelementptr inbounds [128 x [64 x i16]], ptr %90, i64 0, i64 %94, i64 %134
  %136 = zext i8 %122 to i32
  %.not168 = icmp eq i32 %136, %2
  %137 = load i16, ptr %135, align 2, !tbaa !34
  %138 = zext i16 %137 to i32
  br i1 %.not168, label %.thread, label %146

.thread:                                          ; preds = %89
  tail call void @RangeEnc_EncodeBit_0(ptr noundef %1, i32 noundef %138)
  %139 = load i16, ptr %135, align 2, !tbaa !34
  %140 = zext i16 %139 to i32
  %141 = add nuw nsw i32 %140, 128
  %142 = add nuw nsw i32 %140, 32
  %143 = lshr i32 %142, 7
  %144 = sub nsw i32 %141, %143
  %145 = trunc i32 %144 to i16
  store i16 %145, ptr %135, align 2, !tbaa !34
  store ptr %121, ptr %112, align 8, !tbaa !21
  tail call void @Ppmd7_UpdateBin(ptr noundef nonnull %0) #4
  br label %.critedge

146:                                              ; preds = %89
  tail call void @RangeEnc_EncodeBit_1(ptr noundef %1, i32 noundef %138)
  %147 = load i16, ptr %135, align 2, !tbaa !34
  %148 = zext i16 %147 to i32
  %149 = add nuw nsw i32 %148, 32
  %150 = lshr i32 %149, 7
  %151 = trunc nuw nsw i32 %150 to i16
  %152 = sub i16 %147, %151
  store i16 %152, ptr %135, align 2, !tbaa !34
  %153 = lshr i16 %152, 10
  %154 = zext nneg i16 %153 to i64
  %155 = getelementptr inbounds [16 x i8], ptr @PPMD7_kExpEscape, i64 0, i64 %154
  %156 = load i8, ptr %155, align 1, !tbaa !25
  %157 = zext i8 %156 to i32
  %158 = getelementptr inbounds i8, ptr %0, i64 28
  store i32 %157, ptr %158, align 4, !tbaa !35
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %4, i8 -1, i64 256, i1 false), !tbaa !27
  %159 = load i8, ptr %121, align 1, !tbaa !17
  %160 = zext i8 %159 to i64
  %161 = getelementptr inbounds i8, ptr %4, i64 %160
  store i8 0, ptr %161, align 1, !tbaa !25
  store i32 0, ptr %95, align 8, !tbaa !22
  br label %162

162:                                              ; preds = %146, %.unr-lcssa
  %163 = getelementptr inbounds i8, ptr %0, i64 24
  %164 = getelementptr inbounds i8, ptr %0, i64 64
  %165 = getelementptr inbounds i8, ptr %0, i64 16
  br label %166

166:                                              ; preds = %.critedge176, %162
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #4
  %167 = load ptr, ptr %0, align 8, !tbaa !5
  %168 = load i16, ptr %167, align 4, !tbaa !13
  %169 = zext i16 %168 to i32
  %.promoted = load i32, ptr %163, align 8, !tbaa !36
  br label %170

170:                                              ; preds = %176, %166
  %171 = phi ptr [ %179, %176 ], [ %167, %166 ]
  %172 = phi i32 [ %173, %176 ], [ %.promoted, %166 ]
  %173 = add i32 %172, 1
  %174 = getelementptr inbounds i8, ptr %171, i64 8
  %175 = load i32, ptr %174, align 4, !tbaa !32
  %.not171 = icmp eq i32 %175, 0
  br i1 %.not171, label %.loopexit184, label %176

176:                                              ; preds = %170
  %177 = load ptr, ptr %164, align 8, !tbaa !15
  %178 = zext i32 %175 to i64
  %179 = getelementptr inbounds i8, ptr %177, i64 %178
  store ptr %179, ptr %0, align 8, !tbaa !5
  %180 = load i16, ptr %179, align 4, !tbaa !13
  %181 = icmp eq i16 %180, %168
  br i1 %181, label %170, label %182, !llvm.loop !37

182:                                              ; preds = %176
  store i32 %173, ptr %163, align 8, !tbaa !36
  %183 = call ptr @Ppmd7_MakeEscFreq(ptr noundef nonnull %0, i32 noundef %169, ptr noundef nonnull %5) #4
  %184 = load ptr, ptr %164, align 8, !tbaa !15
  %185 = load ptr, ptr %0, align 8, !tbaa !5
  %186 = getelementptr inbounds i8, ptr %185, i64 4
  %187 = load i32, ptr %186, align 4, !tbaa !16
  %188 = zext i32 %187 to i64
  %189 = getelementptr inbounds i8, ptr %184, i64 %188
  %190 = load i16, ptr %185, align 4, !tbaa !13
  %191 = zext i16 %190 to i32
  br label %192

192:                                              ; preds = %.thread177, %182
  %indvar = phi i32 [ %indvar.next, %.thread177 ], [ 0, %182 ]
  %.0154 = phi ptr [ %258, %.thread177 ], [ %189, %182 ]
  %.0151 = phi i32 [ %257, %.thread177 ], [ 0, %182 ]
  %.0148 = phi i32 [ %259, %.thread177 ], [ %191, %182 ]
  %193 = load i8, ptr %.0154, align 1, !tbaa !17
  %194 = zext i8 %193 to i32
  %.not173 = icmp eq i32 %194, %2
  br i1 %.not173, label %.preheader.preheader, label %.thread177

.preheader.preheader:                             ; preds = %192
  %195 = getelementptr inbounds i8, ptr %183, i64 2
  %196 = getelementptr inbounds i8, ptr %183, i64 3
  %197 = zext i16 %190 to i32
  %xtraiter266 = and i32 %.0148, 1
  %lcmp.mod267.not = icmp eq i32 %xtraiter266, 0
  br i1 %lcmp.mod267.not, label %.preheader.prol.loopexit, label %.preheader.prol

.preheader.prol:                                  ; preds = %.preheader.preheader
  %198 = getelementptr inbounds i8, ptr %.0154, i64 1
  %199 = load i8, ptr %198, align 1, !tbaa !19
  %200 = load i8, ptr %.0154, align 1, !tbaa !17
  %201 = zext i8 %200 to i64
  %202 = getelementptr inbounds i8, ptr %4, i64 %201
  %203 = load i8, ptr %202, align 1, !tbaa !25
  %204 = and i8 %203, %199
  %205 = zext i8 %204 to i32
  %206 = add i32 %.0151, %205
  %207 = getelementptr inbounds i8, ptr %.0154, i64 6
  %208 = add nsw i32 %.0148, -1
  br label %.preheader.prol.loopexit

.preheader.prol.loopexit:                         ; preds = %.preheader.prol, %.preheader.preheader
  %.lcssa.unr = phi i32 [ poison, %.preheader.preheader ], [ %206, %.preheader.prol ]
  %.1155.unr = phi ptr [ %.0154, %.preheader.preheader ], [ %207, %.preheader.prol ]
  %.1152.unr = phi i32 [ %.0151, %.preheader.preheader ], [ %206, %.preheader.prol ]
  %.1149.unr = phi i32 [ %.0148, %.preheader.preheader ], [ %208, %.preheader.prol ]
  %209 = add nsw i32 %197, -1
  %210 = icmp eq i32 %indvar, %209
  br i1 %210, label %.unr-lcssa269, label %.preheader

.preheader:                                       ; preds = %.preheader.prol.loopexit, %.preheader
  %.1155 = phi ptr [ %230, %.preheader ], [ %.1155.unr, %.preheader.prol.loopexit ]
  %.1152 = phi i32 [ %229, %.preheader ], [ %.1152.unr, %.preheader.prol.loopexit ]
  %.1149 = phi i32 [ %231, %.preheader ], [ %.1149.unr, %.preheader.prol.loopexit ]
  %211 = getelementptr inbounds i8, ptr %.1155, i64 1
  %212 = load i8, ptr %211, align 1, !tbaa !19
  %213 = load i8, ptr %.1155, align 1, !tbaa !17
  %214 = zext i8 %213 to i64
  %215 = getelementptr inbounds i8, ptr %4, i64 %214
  %216 = load i8, ptr %215, align 1, !tbaa !25
  %217 = and i8 %216, %212
  %218 = zext i8 %217 to i32
  %219 = add i32 %.1152, %218
  %220 = getelementptr inbounds i8, ptr %.1155, i64 6
  %221 = getelementptr inbounds i8, ptr %.1155, i64 7
  %222 = load i8, ptr %221, align 1, !tbaa !19
  %223 = load i8, ptr %220, align 1, !tbaa !17
  %224 = zext i8 %223 to i64
  %225 = getelementptr inbounds i8, ptr %4, i64 %224
  %226 = load i8, ptr %225, align 1, !tbaa !25
  %227 = and i8 %226, %222
  %228 = zext i8 %227 to i32
  %229 = add i32 %219, %228
  %230 = getelementptr inbounds i8, ptr %.1155, i64 12
  %231 = add i32 %.1149, -2
  %.not172.1 = icmp eq i32 %231, 0
  br i1 %.not172.1, label %.unr-lcssa269, label %.preheader, !llvm.loop !38

.unr-lcssa269:                                    ; preds = %.preheader, %.preheader.prol.loopexit
  %.lcssa = phi i32 [ %.lcssa.unr, %.preheader.prol.loopexit ], [ %229, %.preheader ]
  %232 = getelementptr inbounds i8, ptr %.0154, i64 1
  %233 = load i8, ptr %232, align 1, !tbaa !19
  %234 = zext i8 %233 to i32
  %235 = load i32, ptr %5, align 4, !tbaa !39
  %236 = add i32 %235, %.lcssa
  call void @RangeEnc_Encode(ptr noundef %1, i32 noundef %.0151, i32 noundef %234, i32 noundef %236)
  %237 = load i8, ptr %195, align 1, !tbaa !40
  %238 = icmp ult i8 %237, 7
  br i1 %238, label %239, label %.loopexit

239:                                              ; preds = %.unr-lcssa269
  %240 = load i8, ptr %196, align 1, !tbaa !41
  %241 = add i8 %240, -1
  store i8 %241, ptr %196, align 1, !tbaa !41
  %242 = icmp eq i8 %241, 0
  br i1 %242, label %243, label %.loopexit

243:                                              ; preds = %239
  %244 = load i16, ptr %183, align 1, !tbaa !42
  %245 = shl i16 %244, 1
  store i16 %245, ptr %183, align 1, !tbaa !42
  %246 = add nuw nsw i8 %237, 1
  store i8 %246, ptr %195, align 1, !tbaa !40
  %247 = zext nneg i8 %237 to i32
  %248 = shl nuw nsw i32 3, %247
  %249 = trunc i32 %248 to i8
  store i8 %249, ptr %196, align 1, !tbaa !41
  br label %.loopexit

.thread177:                                       ; preds = %192
  %250 = getelementptr inbounds i8, ptr %.0154, i64 1
  %251 = load i8, ptr %250, align 1, !tbaa !19
  %252 = zext i8 %193 to i64
  %253 = getelementptr inbounds i8, ptr %4, i64 %252
  %254 = load i8, ptr %253, align 1, !tbaa !25
  %255 = and i8 %254, %251
  %256 = zext i8 %255 to i32
  %257 = add i32 %.0151, %256
  store i8 0, ptr %253, align 1, !tbaa !25
  %258 = getelementptr inbounds i8, ptr %.0154, i64 6
  %259 = add i32 %.0148, -1
  %.not174 = icmp eq i32 %259, 0
  %indvar.next = add i32 %indvar, 1
  br i1 %.not174, label %.critedge176, label %192, !llvm.loop !43

.loopexit:                                        ; preds = %.unr-lcssa269, %239, %243
  store ptr %.0154, ptr %165, align 8, !tbaa !21
  call void @Ppmd7_Update2(ptr noundef nonnull %0) #4
  br label %268

.critedge176:                                     ; preds = %.thread177
  %260 = load i32, ptr %5, align 4, !tbaa !39
  %261 = add i32 %260, %257
  call void @RangeEnc_Encode(ptr noundef %1, i32 noundef %257, i32 noundef %260, i32 noundef %261)
  %262 = load i16, ptr %183, align 1, !tbaa !42
  %263 = zext i16 %262 to i32
  %264 = add i32 %257, %263
  %265 = load i32, ptr %5, align 4, !tbaa !39
  %266 = add i32 %264, %265
  %267 = trunc i32 %266 to i16
  store i16 %267, ptr %183, align 1, !tbaa !42
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #4
  br label %166

.loopexit184:                                     ; preds = %170
  store i32 %173, ptr %163, align 8, !tbaa !36
  br label %268

268:                                              ; preds = %.loopexit184, %.loopexit
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #4
  br label %.critedge

.critedge:                                        ; preds = %.thread, %18, %41, %268
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %4) #4
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden void @RangeEnc_Encode(ptr noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

declare void @Ppmd7_Update1_0(ptr noundef) local_unnamed_addr #2

declare void @Ppmd7_Update1(ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden void @RangeEnc_EncodeBit_0(ptr noundef, i32 noundef) local_unnamed_addr #1

declare void @Ppmd7_UpdateBin(ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden void @RangeEnc_EncodeBit_1(ptr noundef, i32 noundef) local_unnamed_addr #1

declare ptr @Ppmd7_MakeEscFreq(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

declare void @Ppmd7_Update2(ptr noundef) local_unnamed_addr #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 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 = { 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, !7, i64 0}
!6 = !{!"", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !10, i64 104, !8, i64 108, !8, i64 146, !8, i64 276, !8, i64 428, !8, i64 684, !8, i64 940, !11, i64 1196, !8, i64 1200, !8, i64 2800}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"", !12, i64 0, !8, i64 2, !8, i64 3}
!12 = !{!"short", !8, i64 0}
!13 = !{!14, !12, i64 0}
!14 = !{!"CPpmd7_Context_", !12, i64 0, !12, i64 2, !10, i64 4, !10, i64 8}
!15 = !{!6, !7, i64 64}
!16 = !{!14, !10, i64 4}
!17 = !{!18, !8, i64 0}
!18 = !{!"", !8, i64 0, !8, i64 1, !12, i64 2, !12, i64 4}
!19 = !{!18, !8, i64 1}
!20 = !{!14, !12, i64 2}
!21 = !{!6, !7, i64 16}
!22 = !{!6, !10, i64 32}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!8, !8, i64 0}
!26 = !{!6, !10, i64 40}
!27 = !{!28, !28, i64 0}
!28 = !{!"long", !8, i64 0}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.unroll.disable"}
!31 = distinct !{!31, !24}
!32 = !{!14, !10, i64 8}
!33 = !{!6, !10, i64 44}
!34 = !{!12, !12, i64 0}
!35 = !{!6, !10, i64 28}
!36 = !{!6, !10, i64 24}
!37 = distinct !{!37, !24}
!38 = distinct !{!38, !24}
!39 = !{!10, !10, i64 0}
!40 = !{!11, !8, i64 2}
!41 = !{!11, !8, i64 3}
!42 = !{!11, !12, i64 0}
!43 = distinct !{!43, !24}


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