; LLVM IR from SSBMTonberry/pocketlzma :: ref_spec/lzma1900/C (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 i64, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i64, align 8
  %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 %206

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 %203

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 %203

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 8, ptr %12) #3
  store i64 0, ptr %12, align 8, !tbaa !29
  br label %129

129:                                              ; preds = %157, %115
  %130 = load i64, ptr %12, align 8, !tbaa !29
  %131 = icmp ult i64 %130, 32
  br i1 %131, label %132, label %160

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

157:                                              ; preds = %132
  %158 = load i64, ptr %12, align 8, !tbaa !29
  %159 = add i64 %158, 8
  store i64 %159, ptr %12, align 8, !tbaa !29
  br label %129, !llvm.loop !31

160:                                              ; preds = %129
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  %161 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %162 = load ptr, ptr %8, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.CPpmd_State, ptr %162, i32 0, i32 0
  %164 = load i8, ptr %163, align 1, !tbaa !19
  %165 = zext i8 %164 to i64
  %166 = getelementptr inbounds i8, ptr %161, i64 %165
  store i8 0, ptr %166, align 1, !tbaa !27
  %167 = load ptr, ptr %4, align 8, !tbaa !5
  %168 = getelementptr inbounds %struct.CPpmd7, ptr %167, i32 0, i32 0
  %169 = load ptr, ptr %168, align 8, !tbaa !11
  %170 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %169, i32 0, i32 0
  %171 = load i16, ptr %170, align 4, !tbaa !15
  %172 = zext i16 %171 to i32
  %173 = sub nsw i32 %172, 1
  store i32 %173, ptr %10, align 4, !tbaa !9
  br label %174

174:                                              ; preds = %182, %160
  %175 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %176 = load ptr, ptr %8, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.CPpmd_State, ptr %176, i32 -1
  store ptr %177, ptr %8, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.CPpmd_State, ptr %177, i32 0, i32 0
  %179 = load i8, ptr %178, align 1, !tbaa !19
  %180 = zext i8 %179 to i64
  %181 = getelementptr inbounds i8, ptr %175, i64 %180
  store i8 0, ptr %181, align 1, !tbaa !27
  br label %182

182:                                              ; preds = %174
  %183 = load i32, ptr %10, align 4, !tbaa !9
  %184 = add i32 %183, -1
  store i32 %184, ptr %10, align 4, !tbaa !9
  %185 = icmp ne i32 %184, 0
  br i1 %185, label %174, label %186, !llvm.loop !32

186:                                              ; preds = %182
  %187 = load ptr, ptr %5, align 8, !tbaa !5
  %188 = load i32, ptr %9, align 4, !tbaa !9
  %189 = load ptr, ptr %4, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.CPpmd7, ptr %189, i32 0, i32 0
  %191 = load ptr, ptr %190, align 8, !tbaa !11
  %192 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %191, i32 0, i32 1
  %193 = load i16, ptr %192, align 2, !tbaa !22
  %194 = zext i16 %193 to i32
  %195 = load i32, ptr %9, align 4, !tbaa !9
  %196 = sub i32 %194, %195
  %197 = load ptr, ptr %4, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.CPpmd7, ptr %197, i32 0, i32 0
  %199 = load ptr, ptr %198, align 8, !tbaa !11
  %200 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %199, i32 0, i32 1
  %201 = load i16, ptr %200, align 2, !tbaa !22
  %202 = zext i16 %201 to i32
  call void @RangeEnc_Encode(ptr noundef %187, i32 noundef %188, i32 noundef %196, i32 noundef %202)
  store i32 0, ptr %11, align 4
  br label %203

203:                                              ; preds = %186, %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
  %204 = load i32, ptr %11, align 4
  switch i32 %204, label %566 [
    i32 0, label %205
  ]

205:                                              ; preds = %203
  br label %380

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

289:                                              ; preds = %206
  %290 = load ptr, ptr %5, align 8, !tbaa !5
  %291 = load ptr, ptr %13, align 8, !tbaa !5
  %292 = load i16, ptr %291, align 2, !tbaa !35
  %293 = zext i16 %292 to i32
  call void @RangeEnc_EncodeBit_0(ptr noundef %290, i32 noundef %293)
  %294 = load ptr, ptr %13, align 8, !tbaa !5
  %295 = load i16, ptr %294, align 2, !tbaa !35
  %296 = zext i16 %295 to i32
  %297 = add nsw i32 %296, 128
  %298 = load ptr, ptr %13, align 8, !tbaa !5
  %299 = load i16, ptr %298, align 2, !tbaa !35
  %300 = zext i16 %299 to i32
  %301 = add nsw i32 %300, 32
  %302 = ashr i32 %301, 7
  %303 = sub nsw i32 %297, %302
  %304 = trunc i32 %303 to i16
  %305 = load ptr, ptr %13, align 8, !tbaa !5
  store i16 %304, ptr %305, align 2, !tbaa !35
  %306 = load ptr, ptr %14, align 8, !tbaa !5
  %307 = load ptr, ptr %4, align 8, !tbaa !5
  %308 = getelementptr inbounds %struct.CPpmd7, ptr %307, i32 0, i32 2
  store ptr %306, ptr %308, align 8, !tbaa !23
  %309 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_UpdateBin(ptr noundef %309)
  store i32 1, ptr %11, align 4
  br label %377

310:                                              ; preds = %206
  %311 = load ptr, ptr %5, align 8, !tbaa !5
  %312 = load ptr, ptr %13, align 8, !tbaa !5
  %313 = load i16, ptr %312, align 2, !tbaa !35
  %314 = zext i16 %313 to i32
  call void @RangeEnc_EncodeBit_1(ptr noundef %311, i32 noundef %314)
  %315 = load ptr, ptr %13, align 8, !tbaa !5
  %316 = load i16, ptr %315, align 2, !tbaa !35
  %317 = zext i16 %316 to i32
  %318 = load ptr, ptr %13, align 8, !tbaa !5
  %319 = load i16, ptr %318, align 2, !tbaa !35
  %320 = zext i16 %319 to i32
  %321 = add nsw i32 %320, 32
  %322 = ashr i32 %321, 7
  %323 = sub nsw i32 %317, %322
  %324 = trunc i32 %323 to i16
  %325 = load ptr, ptr %13, align 8, !tbaa !5
  store i16 %324, ptr %325, align 2, !tbaa !35
  %326 = load ptr, ptr %13, align 8, !tbaa !5
  %327 = load i16, ptr %326, align 2, !tbaa !35
  %328 = zext i16 %327 to i32
  %329 = ashr i32 %328, 10
  %330 = sext i32 %329 to i64
  %331 = getelementptr inbounds [16 x i8], ptr @PPMD7_kExpEscape, i64 0, i64 %330
  %332 = load i8, ptr %331, align 1, !tbaa !27
  %333 = zext i8 %332 to i32
  %334 = load ptr, ptr %4, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.CPpmd7, ptr %334, i32 0, i32 4
  store i32 %333, ptr %335, align 4, !tbaa !36
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  store i64 0, ptr %15, align 8, !tbaa !29
  br label %336

336:                                              ; preds = %364, %310
  %337 = load i64, ptr %15, align 8, !tbaa !29
  %338 = icmp ult i64 %337, 32
  br i1 %338, label %339, label %367

339:                                              ; preds = %336
  %340 = load i64, ptr %15, align 8, !tbaa !29
  %341 = add i64 %340, 0
  %342 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %341
  store i64 -1, ptr %342, align 8, !tbaa !29
  %343 = load i64, ptr %15, align 8, !tbaa !29
  %344 = add i64 %343, 1
  %345 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %344
  store i64 -1, ptr %345, align 8, !tbaa !29
  %346 = load i64, ptr %15, align 8, !tbaa !29
  %347 = add i64 %346, 2
  %348 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %347
  store i64 -1, ptr %348, align 8, !tbaa !29
  %349 = load i64, ptr %15, align 8, !tbaa !29
  %350 = add i64 %349, 3
  %351 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %350
  store i64 -1, ptr %351, align 8, !tbaa !29
  %352 = load i64, ptr %15, align 8, !tbaa !29
  %353 = add i64 %352, 4
  %354 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %353
  store i64 -1, ptr %354, align 8, !tbaa !29
  %355 = load i64, ptr %15, align 8, !tbaa !29
  %356 = add i64 %355, 5
  %357 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %356
  store i64 -1, ptr %357, align 8, !tbaa !29
  %358 = load i64, ptr %15, align 8, !tbaa !29
  %359 = add i64 %358, 6
  %360 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %359
  store i64 -1, ptr %360, align 8, !tbaa !29
  %361 = load i64, ptr %15, align 8, !tbaa !29
  %362 = add i64 %361, 7
  %363 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 %362
  store i64 -1, ptr %363, align 8, !tbaa !29
  br label %364

364:                                              ; preds = %339
  %365 = load i64, ptr %15, align 8, !tbaa !29
  %366 = add i64 %365, 8
  store i64 %366, ptr %15, align 8, !tbaa !29
  br label %336, !llvm.loop !37

367:                                              ; preds = %336
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  %368 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %369 = load ptr, ptr %14, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.CPpmd_State, ptr %369, i32 0, i32 0
  %371 = load i8, ptr %370, align 1, !tbaa !19
  %372 = zext i8 %371 to i64
  %373 = getelementptr inbounds i8, ptr %368, i64 %372
  store i8 0, ptr %373, align 1, !tbaa !27
  %374 = load ptr, ptr %4, align 8, !tbaa !5
  %375 = getelementptr inbounds %struct.CPpmd7, ptr %374, i32 0, i32 5
  store i32 0, ptr %375, align 8, !tbaa !24
  br label %376

376:                                              ; preds = %367
  store i32 0, ptr %11, align 4
  br label %377

377:                                              ; preds = %376, %289
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #3
  %378 = load i32, ptr %11, align 4
  switch i32 %378, label %566 [
    i32 0, label %379
  ]

379:                                              ; preds = %377
  br label %380

380:                                              ; preds = %379, %205
  br label %381

381:                                              ; preds = %565, %380
  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
  %382 = load ptr, ptr %4, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.CPpmd7, ptr %382, i32 0, i32 0
  %384 = load ptr, ptr %383, align 8, !tbaa !11
  %385 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %384, i32 0, i32 0
  %386 = load i16, ptr %385, align 4, !tbaa !15
  %387 = zext i16 %386 to i32
  store i32 %387, ptr %21, align 4, !tbaa !9
  br label %388

388:                                              ; preds = %413, %381
  %389 = load ptr, ptr %4, align 8, !tbaa !5
  %390 = getelementptr inbounds %struct.CPpmd7, ptr %389, i32 0, i32 3
  %391 = load i32, ptr %390, align 8, !tbaa !38
  %392 = add i32 %391, 1
  store i32 %392, ptr %390, align 8, !tbaa !38
  %393 = load ptr, ptr %4, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.CPpmd7, ptr %393, i32 0, i32 0
  %395 = load ptr, ptr %394, align 8, !tbaa !11
  %396 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %395, i32 0, i32 3
  %397 = load i32, ptr %396, align 4, !tbaa !33
  %398 = icmp ne i32 %397, 0
  br i1 %398, label %400, label %399

399:                                              ; preds = %388
  store i32 1, ptr %11, align 4
  br label %563

400:                                              ; preds = %388
  %401 = load ptr, ptr %4, align 8, !tbaa !5
  %402 = getelementptr inbounds %struct.CPpmd7, ptr %401, i32 0, i32 12
  %403 = load ptr, ptr %402, align 8, !tbaa !17
  %404 = load ptr, ptr %4, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.CPpmd7, ptr %404, i32 0, i32 0
  %406 = load ptr, ptr %405, align 8, !tbaa !11
  %407 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %406, i32 0, i32 3
  %408 = load i32, ptr %407, align 4, !tbaa !33
  %409 = zext i32 %408 to i64
  %410 = getelementptr inbounds i8, ptr %403, i64 %409
  %411 = load ptr, ptr %4, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.CPpmd7, ptr %411, i32 0, i32 0
  store ptr %410, ptr %412, align 8, !tbaa !11
  br label %413

413:                                              ; preds = %400
  %414 = load ptr, ptr %4, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct.CPpmd7, ptr %414, i32 0, i32 0
  %416 = load ptr, ptr %415, align 8, !tbaa !11
  %417 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %416, i32 0, i32 0
  %418 = load i16, ptr %417, align 4, !tbaa !15
  %419 = zext i16 %418 to i32
  %420 = load i32, ptr %21, align 4, !tbaa !9
  %421 = icmp eq i32 %419, %420
  br i1 %421, label %388, label %422, !llvm.loop !39

422:                                              ; preds = %413
  %423 = load ptr, ptr %4, align 8, !tbaa !5
  %424 = load i32, ptr %21, align 4, !tbaa !9
  %425 = call ptr @Ppmd7_MakeEscFreq(ptr noundef %423, i32 noundef %424, ptr noundef %16)
  store ptr %425, ptr %17, align 8, !tbaa !5
  %426 = load ptr, ptr %4, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.CPpmd7, ptr %426, i32 0, i32 12
  %428 = load ptr, ptr %427, align 8, !tbaa !17
  %429 = load ptr, ptr %4, align 8, !tbaa !5
  %430 = getelementptr inbounds %struct.CPpmd7, ptr %429, i32 0, i32 0
  %431 = load ptr, ptr %430, align 8, !tbaa !11
  %432 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %431, i32 0, i32 2
  %433 = load i32, ptr %432, align 4, !tbaa !18
  %434 = zext i32 %433 to i64
  %435 = getelementptr inbounds i8, ptr %428, i64 %434
  store ptr %435, ptr %18, align 8, !tbaa !5
  store i32 0, ptr %19, align 4, !tbaa !9
  %436 = load ptr, ptr %4, align 8, !tbaa !5
  %437 = getelementptr inbounds %struct.CPpmd7, ptr %436, i32 0, i32 0
  %438 = load ptr, ptr %437, align 8, !tbaa !11
  %439 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %438, i32 0, i32 0
  %440 = load i16, ptr %439, align 4, !tbaa !15
  %441 = zext i16 %440 to i32
  store i32 %441, ptr %20, align 4, !tbaa !9
  br label %442

442:                                              ; preds = %541, %422
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #3
  %443 = load ptr, ptr %18, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.CPpmd_State, ptr %443, i32 0, i32 0
  %445 = load i8, ptr %444, align 1, !tbaa !19
  %446 = zext i8 %445 to i32
  store i32 %446, ptr %22, align 4, !tbaa !9
  %447 = load i32, ptr %22, align 4, !tbaa !9
  %448 = load i32, ptr %6, align 4, !tbaa !9
  %449 = icmp eq i32 %447, %448
  br i1 %449, label %450, label %518

450:                                              ; preds = %442
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #3
  %451 = load i32, ptr %19, align 4, !tbaa !9
  store i32 %451, ptr %23, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #3
  %452 = load ptr, ptr %18, align 8, !tbaa !5
  store ptr %452, ptr %24, align 8, !tbaa !5
  br label %453

453:                                              ; preds = %471, %450
  %454 = load ptr, ptr %18, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.CPpmd_State, ptr %454, i32 0, i32 1
  %456 = load i8, ptr %455, align 1, !tbaa !21
  %457 = zext i8 %456 to i32
  %458 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %459 = load ptr, ptr %18, align 8, !tbaa !5
  %460 = getelementptr inbounds %struct.CPpmd_State, ptr %459, i32 0, i32 0
  %461 = load i8, ptr %460, align 1, !tbaa !19
  %462 = zext i8 %461 to i64
  %463 = getelementptr inbounds i8, ptr %458, i64 %462
  %464 = load i8, ptr %463, align 1, !tbaa !27
  %465 = sext i8 %464 to i32
  %466 = and i32 %457, %465
  %467 = load i32, ptr %19, align 4, !tbaa !9
  %468 = add i32 %467, %466
  store i32 %468, ptr %19, align 4, !tbaa !9
  %469 = load ptr, ptr %18, align 8, !tbaa !5
  %470 = getelementptr inbounds %struct.CPpmd_State, ptr %469, i32 1
  store ptr %470, ptr %18, align 8, !tbaa !5
  br label %471

471:                                              ; preds = %453
  %472 = load i32, ptr %20, align 4, !tbaa !9
  %473 = add i32 %472, -1
  store i32 %473, ptr %20, align 4, !tbaa !9
  %474 = icmp ne i32 %473, 0
  br i1 %474, label %453, label %475, !llvm.loop !40

475:                                              ; preds = %471
  %476 = load ptr, ptr %5, align 8, !tbaa !5
  %477 = load i32, ptr %23, align 4, !tbaa !9
  %478 = load ptr, ptr %24, align 8, !tbaa !5
  %479 = getelementptr inbounds %struct.CPpmd_State, ptr %478, i32 0, i32 1
  %480 = load i8, ptr %479, align 1, !tbaa !21
  %481 = zext i8 %480 to i32
  %482 = load i32, ptr %19, align 4, !tbaa !9
  %483 = load i32, ptr %16, align 4, !tbaa !9
  %484 = add i32 %482, %483
  call void @RangeEnc_Encode(ptr noundef %476, i32 noundef %477, i32 noundef %481, i32 noundef %484)
  %485 = load ptr, ptr %17, align 8, !tbaa !5
  %486 = getelementptr inbounds %struct.CPpmd_See, ptr %485, i32 0, i32 1
  %487 = load i8, ptr %486, align 1, !tbaa !41
  %488 = zext i8 %487 to i32
  %489 = icmp slt i32 %488, 7
  br i1 %489, label %490, label %513

490:                                              ; preds = %475
  %491 = load ptr, ptr %17, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.CPpmd_See, ptr %491, i32 0, i32 2
  %493 = load i8, ptr %492, align 1, !tbaa !42
  %494 = add i8 %493, -1
  store i8 %494, ptr %492, align 1, !tbaa !42
  %495 = zext i8 %494 to i32
  %496 = icmp eq i32 %495, 0
  br i1 %496, label %497, label %513

497:                                              ; preds = %490
  %498 = load ptr, ptr %17, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.CPpmd_See, ptr %498, i32 0, i32 0
  %500 = load i16, ptr %499, align 1, !tbaa !43
  %501 = zext i16 %500 to i32
  %502 = shl i32 %501, 1
  %503 = trunc i32 %502 to i16
  store i16 %503, ptr %499, align 1, !tbaa !43
  %504 = load ptr, ptr %17, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.CPpmd_See, ptr %504, i32 0, i32 1
  %506 = load i8, ptr %505, align 1, !tbaa !41
  %507 = add i8 %506, 1
  store i8 %507, ptr %505, align 1, !tbaa !41
  %508 = zext i8 %506 to i32
  %509 = shl i32 3, %508
  %510 = trunc i32 %509 to i8
  %511 = load ptr, ptr %17, align 8, !tbaa !5
  %512 = getelementptr inbounds %struct.CPpmd_See, ptr %511, i32 0, i32 2
  store i8 %510, ptr %512, align 1, !tbaa !42
  br label %513

513:                                              ; preds = %497, %490, %475
  %514 = load ptr, ptr %24, align 8, !tbaa !5
  %515 = load ptr, ptr %4, align 8, !tbaa !5
  %516 = getelementptr inbounds %struct.CPpmd7, ptr %515, i32 0, i32 2
  store ptr %514, ptr %516, align 8, !tbaa !23
  %517 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update2(ptr noundef %517)
  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 %538

518:                                              ; preds = %442
  %519 = load ptr, ptr %18, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.CPpmd_State, ptr %519, i32 0, i32 1
  %521 = load i8, ptr %520, align 1, !tbaa !21
  %522 = zext i8 %521 to i32
  %523 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %524 = load i32, ptr %22, align 4, !tbaa !9
  %525 = sext i32 %524 to i64
  %526 = getelementptr inbounds i8, ptr %523, i64 %525
  %527 = load i8, ptr %526, align 1, !tbaa !27
  %528 = sext i8 %527 to i32
  %529 = and i32 %522, %528
  %530 = load i32, ptr %19, align 4, !tbaa !9
  %531 = add i32 %530, %529
  store i32 %531, ptr %19, align 4, !tbaa !9
  %532 = getelementptr inbounds [32 x i64], ptr %7, i64 0, i64 0
  %533 = load i32, ptr %22, align 4, !tbaa !9
  %534 = sext i32 %533 to i64
  %535 = getelementptr inbounds i8, ptr %532, i64 %534
  store i8 0, ptr %535, align 1, !tbaa !27
  %536 = load ptr, ptr %18, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.CPpmd_State, ptr %536, i32 1
  store ptr %537, ptr %18, align 8, !tbaa !5
  store i32 0, ptr %11, align 4
  br label %538

538:                                              ; preds = %518, %513
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #3
  %539 = load i32, ptr %11, align 4
  switch i32 %539, label %563 [
    i32 0, label %540
  ]

540:                                              ; preds = %538
  br label %541

541:                                              ; preds = %540
  %542 = load i32, ptr %20, align 4, !tbaa !9
  %543 = add i32 %542, -1
  store i32 %543, ptr %20, align 4, !tbaa !9
  %544 = icmp ne i32 %543, 0
  br i1 %544, label %442, label %545, !llvm.loop !44

545:                                              ; preds = %541
  %546 = load ptr, ptr %5, align 8, !tbaa !5
  %547 = load i32, ptr %19, align 4, !tbaa !9
  %548 = load i32, ptr %16, align 4, !tbaa !9
  %549 = load i32, ptr %19, align 4, !tbaa !9
  %550 = load i32, ptr %16, align 4, !tbaa !9
  %551 = add i32 %549, %550
  call void @RangeEnc_Encode(ptr noundef %546, i32 noundef %547, i32 noundef %548, i32 noundef %551)
  %552 = load ptr, ptr %17, align 8, !tbaa !5
  %553 = getelementptr inbounds %struct.CPpmd_See, ptr %552, i32 0, i32 0
  %554 = load i16, ptr %553, align 1, !tbaa !43
  %555 = zext i16 %554 to i32
  %556 = load i32, ptr %19, align 4, !tbaa !9
  %557 = add i32 %555, %556
  %558 = load i32, ptr %16, align 4, !tbaa !9
  %559 = add i32 %557, %558
  %560 = trunc i32 %559 to i16
  %561 = load ptr, ptr %17, align 8, !tbaa !5
  %562 = getelementptr inbounds %struct.CPpmd_See, ptr %561, i32 0, i32 0
  store i16 %560, ptr %562, align 1, !tbaa !43
  store i32 0, ptr %11, align 4
  br label %563

563:                                              ; preds = %545, %538, %399
  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
  %564 = load i32, ptr %11, align 4
  switch i32 %564, label %566 [
    i32 0, label %565
  ]

565:                                              ; preds = %563
  br label %381

566:                                              ; preds = %563, %377, %203
  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
  %.not167 = icmp eq i32 %48, 0
  br i1 %.not167, 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
  %.not168.3 = icmp eq i32 %84, 0
  br i1 %.not168.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 i32
  %124 = zext i8 %122 to i64
  %125 = getelementptr inbounds [256 x i8], ptr %111, i64 0, i64 %124
  %126 = load i8, ptr %125, align 1, !tbaa !25
  %127 = zext i8 %126 to i32
  %128 = shl nuw nsw i32 %127, 1
  %129 = add i32 %120, %128
  %130 = getelementptr inbounds i8, ptr %0, i64 44
  %131 = load i32, ptr %130, align 4, !tbaa !33
  %132 = lshr i32 %131, 26
  %133 = and i32 %132, 32
  %134 = add i32 %129, %133
  %135 = zext i32 %134 to i64
  %136 = getelementptr inbounds [128 x [64 x i16]], ptr %90, i64 0, i64 %94, i64 %135
  %.not166 = icmp eq i32 %123, %2
  %137 = load i16, ptr %136, align 2, !tbaa !34
  %138 = zext i16 %137 to i32
  br i1 %.not166, label %.thread, label %146

.thread:                                          ; preds = %89
  tail call void @RangeEnc_EncodeBit_0(ptr noundef %1, i32 noundef %138)
  %139 = load i16, ptr %136, 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 %136, 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 %136, 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 %136, 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 = %.critedge174, %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
  %.not169 = icmp eq i32 %175, 0
  br i1 %.not169, label %.loopexit182, 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 = %.thread175, %182
  %indvar = phi i32 [ %indvar.next, %.thread175 ], [ 0, %182 ]
  %.0154 = phi ptr [ %258, %.thread175 ], [ %189, %182 ]
  %.0151 = phi i32 [ %257, %.thread175 ], [ 0, %182 ]
  %.0148 = phi i32 [ %259, %.thread175 ], [ %191, %182 ]
  %193 = load i8, ptr %.0154, align 1, !tbaa !17
  %194 = zext i8 %193 to i32
  %.not171 = icmp eq i32 %194, %2
  br i1 %.not171, label %.preheader.preheader, label %.thread175

.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
  %xtraiter262 = and i32 %.0148, 1
  %lcmp.mod263.not = icmp eq i32 %xtraiter262, 0
  br i1 %lcmp.mod263.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-lcssa265, 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
  %.not170.1 = icmp eq i32 %231, 0
  br i1 %.not170.1, label %.unr-lcssa265, label %.preheader, !llvm.loop !38

.unr-lcssa265:                                    ; 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-lcssa265
  %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

.thread175:                                       ; 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
  %.not172 = icmp eq i32 %259, 0
  %indvar.next = add i32 %indvar, 1
  br i1 %.not172, label %.critedge174, label %192, !llvm.loop !43

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

.critedge174:                                     ; preds = %.thread175
  %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

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

268:                                              ; preds = %.loopexit182, %.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