; LLVM IR from SSBMTonberry/pocketlzma :: ref_spec/lzma1900/C (Ppmd7Dec)

; 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.IPpmd7_RangeDec = type { ptr, ptr, ptr }
%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 i32 @Ppmd7_DecodeSymbol(ptr noundef %0, ptr noundef %1) #1 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca [32 x i64], align 16
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i8, align 1
  %12 = alloca i32, align 4
  %13 = alloca i8, align 1
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i8, align 1
  %17 = alloca i64, align 8
  %18 = alloca [256 x ptr], align 16
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i8, align 1
  %29 = alloca ptr, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 256, ptr %6) #3
  %30 = load ptr, ptr %4, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.CPpmd7, ptr %30, i32 0, i32 0
  %32 = load ptr, ptr %31, align 8, !tbaa !9
  %33 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %32, i32 0, i32 0
  %34 = load i16, ptr %33, align 4, !tbaa !14
  %35 = zext i16 %34 to i32
  %36 = icmp ne i32 %35, 1
  br i1 %36, label %37, label %229

37:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #3
  %38 = load ptr, ptr %4, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.CPpmd7, ptr %38, i32 0, i32 12
  %40 = load ptr, ptr %39, align 8, !tbaa !16
  %41 = load ptr, ptr %4, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.CPpmd7, ptr %41, i32 0, i32 0
  %43 = load ptr, ptr %42, align 8, !tbaa !9
  %44 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %43, i32 0, i32 2
  %45 = load i32, ptr %44, align 4, !tbaa !17
  %46 = zext i32 %45 to i64
  %47 = getelementptr inbounds i8, ptr %40, i64 %46
  store ptr %47, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  %48 = load ptr, ptr %5, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %48, i32 0, i32 0
  %50 = load ptr, ptr %49, align 8, !tbaa !18
  %51 = load ptr, ptr %5, align 8, !tbaa !5
  %52 = load ptr, ptr %4, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.CPpmd7, ptr %52, i32 0, i32 0
  %54 = load ptr, ptr %53, align 8, !tbaa !9
  %55 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %54, i32 0, i32 1
  %56 = load i16, ptr %55, align 2, !tbaa !20
  %57 = zext i16 %56 to i32
  %58 = call i32 %50(ptr noundef %51, i32 noundef %57)
  store i32 %58, ptr %9, align 4, !tbaa !21
  %59 = load ptr, ptr %7, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.CPpmd_State, ptr %59, i32 0, i32 1
  %61 = load i8, ptr %60, align 1, !tbaa !22
  %62 = zext i8 %61 to i32
  store i32 %62, ptr %10, align 4, !tbaa !21
  %63 = icmp ult i32 %58, %62
  br i1 %63, label %64, label %82

64:                                               ; preds = %37
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #3
  %65 = load ptr, ptr %5, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %65, i32 0, i32 1
  %67 = load ptr, ptr %66, align 8, !tbaa !24
  %68 = load ptr, ptr %5, align 8, !tbaa !5
  %69 = load ptr, ptr %7, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.CPpmd_State, ptr %69, i32 0, i32 1
  %71 = load i8, ptr %70, align 1, !tbaa !22
  %72 = zext i8 %71 to i32
  call void %67(ptr noundef %68, i32 noundef 0, i32 noundef %72)
  %73 = load ptr, ptr %7, align 8, !tbaa !5
  %74 = load ptr, ptr %4, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.CPpmd7, ptr %74, i32 0, i32 2
  store ptr %73, ptr %75, align 8, !tbaa !25
  %76 = load ptr, ptr %7, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct.CPpmd_State, ptr %76, i32 0, i32 0
  %78 = load i8, ptr %77, align 1, !tbaa !26
  store i8 %78, ptr %11, align 1, !tbaa !27
  %79 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update1_0(ptr noundef %79)
  %80 = load i8, ptr %11, align 1, !tbaa !27
  %81 = zext i8 %80 to i32
  store i32 %81, ptr %3, align 4
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #3
  br label %226

82:                                               ; preds = %37
  %83 = load ptr, ptr %4, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.CPpmd7, ptr %83, i32 0, i32 5
  store i32 0, ptr %84, align 8, !tbaa !28
  %85 = load ptr, ptr %4, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.CPpmd7, ptr %85, i32 0, i32 0
  %87 = load ptr, ptr %86, align 8, !tbaa !9
  %88 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %87, i32 0, i32 0
  %89 = load i16, ptr %88, align 4, !tbaa !14
  %90 = zext i16 %89 to i32
  %91 = sub nsw i32 %90, 1
  store i32 %91, ptr %8, align 4, !tbaa !21
  br label %92

92:                                               ; preds = %127, %82
  %93 = load ptr, ptr %7, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.CPpmd_State, ptr %93, i32 1
  store ptr %94, ptr %7, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.CPpmd_State, ptr %94, i32 0, i32 1
  %96 = load i8, ptr %95, align 1, !tbaa !22
  %97 = zext i8 %96 to i32
  %98 = load i32, ptr %10, align 4, !tbaa !21
  %99 = add i32 %98, %97
  store i32 %99, ptr %10, align 4, !tbaa !21
  %100 = load i32, ptr %9, align 4, !tbaa !21
  %101 = icmp ugt i32 %99, %100
  br i1 %101, label %102, label %126

102:                                              ; preds = %92
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #3
  %103 = load ptr, ptr %5, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %103, i32 0, i32 1
  %105 = load ptr, ptr %104, align 8, !tbaa !24
  %106 = load ptr, ptr %5, align 8, !tbaa !5
  %107 = load i32, ptr %10, align 4, !tbaa !21
  %108 = load ptr, ptr %7, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.CPpmd_State, ptr %108, i32 0, i32 1
  %110 = load i8, ptr %109, align 1, !tbaa !22
  %111 = zext i8 %110 to i32
  %112 = sub i32 %107, %111
  %113 = load ptr, ptr %7, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.CPpmd_State, ptr %113, i32 0, i32 1
  %115 = load i8, ptr %114, align 1, !tbaa !22
  %116 = zext i8 %115 to i32
  call void %105(ptr noundef %106, i32 noundef %112, i32 noundef %116)
  %117 = load ptr, ptr %7, align 8, !tbaa !5
  %118 = load ptr, ptr %4, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.CPpmd7, ptr %118, i32 0, i32 2
  store ptr %117, ptr %119, align 8, !tbaa !25
  %120 = load ptr, ptr %7, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.CPpmd_State, ptr %120, i32 0, i32 0
  %122 = load i8, ptr %121, align 1, !tbaa !26
  store i8 %122, ptr %13, align 1, !tbaa !27
  %123 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update1(ptr noundef %123)
  %124 = load i8, ptr %13, align 1, !tbaa !27
  %125 = zext i8 %124 to i32
  store i32 %125, ptr %3, align 4
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #3
  br label %226

126:                                              ; preds = %92
  br label %127

127:                                              ; preds = %126
  %128 = load i32, ptr %8, align 4, !tbaa !21
  %129 = add i32 %128, -1
  store i32 %129, ptr %8, align 4, !tbaa !21
  %130 = icmp ne i32 %129, 0
  br i1 %130, label %92, label %131, !llvm.loop !29

131:                                              ; preds = %127
  %132 = load i32, ptr %9, align 4, !tbaa !21
  %133 = load ptr, ptr %4, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.CPpmd7, ptr %133, i32 0, i32 0
  %135 = load ptr, ptr %134, align 8, !tbaa !9
  %136 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %135, i32 0, i32 1
  %137 = load i16, ptr %136, align 2, !tbaa !20
  %138 = zext i16 %137 to i32
  %139 = icmp uge i32 %132, %138
  br i1 %139, label %140, label %141

140:                                              ; preds = %131
  store i32 -2, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %226

141:                                              ; preds = %131
  %142 = load ptr, ptr %4, align 8, !tbaa !5
  %143 = getelementptr inbounds %struct.CPpmd7, ptr %142, i32 0, i32 23
  %144 = load ptr, ptr %4, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.CPpmd7, ptr %144, i32 0, i32 2
  %146 = load ptr, ptr %145, align 8, !tbaa !25
  %147 = getelementptr inbounds %struct.CPpmd_State, ptr %146, i32 0, i32 0
  %148 = load i8, ptr %147, align 1, !tbaa !26
  %149 = zext i8 %148 to i64
  %150 = getelementptr inbounds [256 x i8], ptr %143, i64 0, i64 %149
  %151 = load i8, ptr %150, align 1, !tbaa !27
  %152 = zext i8 %151 to i32
  %153 = load ptr, ptr %4, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.CPpmd7, ptr %153, i32 0, i32 7
  store i32 %152, ptr %154, align 8, !tbaa !31
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %155, i32 0, i32 1
  %157 = load ptr, ptr %156, align 8, !tbaa !24
  %158 = load ptr, ptr %5, align 8, !tbaa !5
  %159 = load i32, ptr %10, align 4, !tbaa !21
  %160 = load ptr, ptr %4, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.CPpmd7, ptr %160, i32 0, i32 0
  %162 = load ptr, ptr %161, align 8, !tbaa !9
  %163 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %162, i32 0, i32 1
  %164 = load i16, ptr %163, align 2, !tbaa !20
  %165 = zext i16 %164 to i32
  %166 = load i32, ptr %10, align 4, !tbaa !21
  %167 = sub i32 %165, %166
  call void %157(ptr noundef %158, i32 noundef %159, i32 noundef %167)
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  store i64 0, ptr %14, align 8, !tbaa !32
  br label %168

168:                                              ; preds = %196, %141
  %169 = load i64, ptr %14, align 8, !tbaa !32
  %170 = icmp ult i64 %169, 32
  br i1 %170, label %171, label %199

171:                                              ; preds = %168
  %172 = load i64, ptr %14, align 8, !tbaa !32
  %173 = add i64 %172, 0
  %174 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %173
  store i64 -1, ptr %174, align 8, !tbaa !32
  %175 = load i64, ptr %14, align 8, !tbaa !32
  %176 = add i64 %175, 1
  %177 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %176
  store i64 -1, ptr %177, align 8, !tbaa !32
  %178 = load i64, ptr %14, align 8, !tbaa !32
  %179 = add i64 %178, 2
  %180 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %179
  store i64 -1, ptr %180, align 8, !tbaa !32
  %181 = load i64, ptr %14, align 8, !tbaa !32
  %182 = add i64 %181, 3
  %183 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %182
  store i64 -1, ptr %183, align 8, !tbaa !32
  %184 = load i64, ptr %14, align 8, !tbaa !32
  %185 = add i64 %184, 4
  %186 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %185
  store i64 -1, ptr %186, align 8, !tbaa !32
  %187 = load i64, ptr %14, align 8, !tbaa !32
  %188 = add i64 %187, 5
  %189 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %188
  store i64 -1, ptr %189, align 8, !tbaa !32
  %190 = load i64, ptr %14, align 8, !tbaa !32
  %191 = add i64 %190, 6
  %192 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %191
  store i64 -1, ptr %192, align 8, !tbaa !32
  %193 = load i64, ptr %14, align 8, !tbaa !32
  %194 = add i64 %193, 7
  %195 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %194
  store i64 -1, ptr %195, align 8, !tbaa !32
  br label %196

196:                                              ; preds = %171
  %197 = load i64, ptr %14, align 8, !tbaa !32
  %198 = add i64 %197, 8
  store i64 %198, ptr %14, align 8, !tbaa !32
  br label %168, !llvm.loop !34

199:                                              ; preds = %168
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  %200 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %201 = load ptr, ptr %7, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.CPpmd_State, ptr %201, i32 0, i32 0
  %203 = load i8, ptr %202, align 1, !tbaa !26
  %204 = zext i8 %203 to i64
  %205 = getelementptr inbounds i8, ptr %200, i64 %204
  store i8 0, ptr %205, align 1, !tbaa !27
  %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 !9
  %209 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %208, i32 0, i32 0
  %210 = load i16, ptr %209, align 4, !tbaa !14
  %211 = zext i16 %210 to i32
  %212 = sub nsw i32 %211, 1
  store i32 %212, ptr %8, align 4, !tbaa !21
  br label %213

213:                                              ; preds = %221, %199
  %214 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %215 = load ptr, ptr %7, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.CPpmd_State, ptr %215, i32 -1
  store ptr %216, ptr %7, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.CPpmd_State, ptr %216, i32 0, i32 0
  %218 = load i8, ptr %217, align 1, !tbaa !26
  %219 = zext i8 %218 to i64
  %220 = getelementptr inbounds i8, ptr %214, i64 %219
  store i8 0, ptr %220, align 1, !tbaa !27
  br label %221

221:                                              ; preds = %213
  %222 = load i32, ptr %8, align 4, !tbaa !21
  %223 = add i32 %222, -1
  store i32 %223, ptr %8, align 4, !tbaa !21
  %224 = icmp ne i32 %223, 0
  br i1 %224, label %213, label %225, !llvm.loop !35

225:                                              ; preds = %221
  store i32 0, ptr %12, align 4
  br label %226

226:                                              ; preds = %225, %140, %102, %64
  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 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  %227 = load i32, ptr %12, align 4
  switch i32 %227, label %621 [
    i32 0, label %228
  ]

228:                                              ; preds = %226
  br label %403

229:                                              ; preds = %2
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  %230 = load ptr, ptr %4, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.CPpmd7, ptr %230, i32 0, i32 26
  %232 = load ptr, ptr %4, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.CPpmd7, ptr %232, i32 0, i32 0
  %234 = load ptr, ptr %233, align 8, !tbaa !9
  %235 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %234, i32 0, i32 1
  %236 = getelementptr inbounds %struct.CPpmd_State, ptr %235, i32 0, i32 1
  %237 = load i8, ptr %236, align 1, !tbaa !22
  %238 = zext i8 %237 to i32
  %239 = zext i32 %238 to i64
  %240 = sub i64 %239, 1
  %241 = getelementptr inbounds [128 x [64 x i16]], ptr %231, i64 0, i64 %240
  %242 = load ptr, ptr %4, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.CPpmd7, ptr %242, i32 0, i32 5
  %244 = load i32, ptr %243, align 8, !tbaa !28
  %245 = load ptr, ptr %4, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.CPpmd7, ptr %245, i32 0, i32 22
  %247 = load ptr, ptr %4, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.CPpmd7, ptr %247, i32 0, i32 12
  %249 = load ptr, ptr %248, align 8, !tbaa !16
  %250 = load ptr, ptr %4, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.CPpmd7, ptr %250, i32 0, i32 0
  %252 = load ptr, ptr %251, align 8, !tbaa !9
  %253 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %252, i32 0, i32 3
  %254 = load i32, ptr %253, align 4, !tbaa !36
  %255 = zext i32 %254 to i64
  %256 = getelementptr inbounds i8, ptr %249, i64 %255
  %257 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %256, i32 0, i32 0
  %258 = load i16, ptr %257, align 4, !tbaa !14
  %259 = zext i16 %258 to i64
  %260 = sub i64 %259, 1
  %261 = getelementptr inbounds [256 x i8], ptr %246, i64 0, i64 %260
  %262 = load i8, ptr %261, align 1, !tbaa !27
  %263 = zext i8 %262 to i32
  %264 = add i32 %244, %263
  %265 = load ptr, ptr %4, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.CPpmd7, ptr %265, i32 0, i32 23
  %267 = load ptr, ptr %4, align 8, !tbaa !5
  %268 = getelementptr inbounds %struct.CPpmd7, ptr %267, i32 0, i32 2
  %269 = load ptr, ptr %268, align 8, !tbaa !25
  %270 = getelementptr inbounds %struct.CPpmd_State, ptr %269, i32 0, i32 0
  %271 = load i8, ptr %270, align 1, !tbaa !26
  %272 = zext i8 %271 to i64
  %273 = getelementptr inbounds [256 x i8], ptr %266, i64 0, i64 %272
  %274 = load i8, ptr %273, align 1, !tbaa !27
  %275 = zext i8 %274 to i32
  %276 = load ptr, ptr %4, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.CPpmd7, ptr %276, i32 0, i32 7
  store i32 %275, ptr %277, align 8, !tbaa !31
  %278 = add i32 %264, %275
  %279 = load ptr, ptr %4, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.CPpmd7, ptr %279, i32 0, i32 23
  %281 = load ptr, ptr %4, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.CPpmd7, ptr %281, i32 0, i32 0
  %283 = load ptr, ptr %282, align 8, !tbaa !9
  %284 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %283, i32 0, i32 1
  %285 = getelementptr inbounds %struct.CPpmd_State, ptr %284, i32 0, i32 0
  %286 = load i8, ptr %285, align 2, !tbaa !26
  %287 = zext i8 %286 to i32
  %288 = zext i32 %287 to i64
  %289 = getelementptr inbounds [256 x i8], ptr %280, i64 0, i64 %288
  %290 = load i8, ptr %289, align 1, !tbaa !27
  %291 = zext i8 %290 to i32
  %292 = mul nsw i32 2, %291
  %293 = add i32 %278, %292
  %294 = load ptr, ptr %4, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.CPpmd7, ptr %294, i32 0, i32 8
  %296 = load i32, ptr %295, align 4, !tbaa !37
  %297 = ashr i32 %296, 26
  %298 = and i32 %297, 32
  %299 = add i32 %293, %298
  %300 = zext i32 %299 to i64
  %301 = getelementptr inbounds [64 x i16], ptr %241, i64 0, i64 %300
  store ptr %301, ptr %15, align 8, !tbaa !5
  %302 = load ptr, ptr %5, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %302, i32 0, i32 2
  %304 = load ptr, ptr %303, align 8, !tbaa !38
  %305 = load ptr, ptr %5, align 8, !tbaa !5
  %306 = load ptr, ptr %15, align 8, !tbaa !5
  %307 = load i16, ptr %306, align 2, !tbaa !39
  %308 = zext i16 %307 to i32
  %309 = call i32 %304(ptr noundef %305, i32 noundef %308)
  %310 = icmp eq i32 %309, 0
  br i1 %310, label %311, label %335

311:                                              ; preds = %229
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #3
  %312 = load ptr, ptr %15, align 8, !tbaa !5
  %313 = load i16, ptr %312, align 2, !tbaa !39
  %314 = zext i16 %313 to i32
  %315 = add nsw i32 %314, 128
  %316 = load ptr, ptr %15, align 8, !tbaa !5
  %317 = load i16, ptr %316, align 2, !tbaa !39
  %318 = zext i16 %317 to i32
  %319 = add nsw i32 %318, 32
  %320 = ashr i32 %319, 7
  %321 = sub nsw i32 %315, %320
  %322 = trunc i32 %321 to i16
  %323 = load ptr, ptr %15, align 8, !tbaa !5
  store i16 %322, ptr %323, align 2, !tbaa !39
  %324 = load ptr, ptr %4, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.CPpmd7, ptr %324, i32 0, i32 0
  %326 = load ptr, ptr %325, align 8, !tbaa !9
  %327 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %326, i32 0, i32 1
  %328 = load ptr, ptr %4, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct.CPpmd7, ptr %328, i32 0, i32 2
  store ptr %327, ptr %329, align 8, !tbaa !25
  %330 = getelementptr inbounds %struct.CPpmd_State, ptr %327, i32 0, i32 0
  %331 = load i8, ptr %330, align 1, !tbaa !26
  store i8 %331, ptr %16, align 1, !tbaa !27
  %332 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_UpdateBin(ptr noundef %332)
  %333 = load i8, ptr %16, align 1, !tbaa !27
  %334 = zext i8 %333 to i32
  store i32 %334, ptr %3, align 4
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #3
  br label %400

335:                                              ; preds = %229
  %336 = load ptr, ptr %15, align 8, !tbaa !5
  %337 = load i16, ptr %336, align 2, !tbaa !39
  %338 = zext i16 %337 to i32
  %339 = load ptr, ptr %15, align 8, !tbaa !5
  %340 = load i16, ptr %339, align 2, !tbaa !39
  %341 = zext i16 %340 to i32
  %342 = add nsw i32 %341, 32
  %343 = ashr i32 %342, 7
  %344 = sub nsw i32 %338, %343
  %345 = trunc i32 %344 to i16
  %346 = load ptr, ptr %15, align 8, !tbaa !5
  store i16 %345, ptr %346, align 2, !tbaa !39
  %347 = load ptr, ptr %15, align 8, !tbaa !5
  %348 = load i16, ptr %347, align 2, !tbaa !39
  %349 = zext i16 %348 to i32
  %350 = ashr i32 %349, 10
  %351 = sext i32 %350 to i64
  %352 = getelementptr inbounds [16 x i8], ptr @PPMD7_kExpEscape, i64 0, i64 %351
  %353 = load i8, ptr %352, align 1, !tbaa !27
  %354 = zext i8 %353 to i32
  %355 = load ptr, ptr %4, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.CPpmd7, ptr %355, i32 0, i32 4
  store i32 %354, ptr %356, align 4, !tbaa !40
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  store i64 0, ptr %17, align 8, !tbaa !32
  br label %357

357:                                              ; preds = %385, %335
  %358 = load i64, ptr %17, align 8, !tbaa !32
  %359 = icmp ult i64 %358, 32
  br i1 %359, label %360, label %388

360:                                              ; preds = %357
  %361 = load i64, ptr %17, align 8, !tbaa !32
  %362 = add i64 %361, 0
  %363 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %362
  store i64 -1, ptr %363, align 8, !tbaa !32
  %364 = load i64, ptr %17, align 8, !tbaa !32
  %365 = add i64 %364, 1
  %366 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %365
  store i64 -1, ptr %366, align 8, !tbaa !32
  %367 = load i64, ptr %17, align 8, !tbaa !32
  %368 = add i64 %367, 2
  %369 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %368
  store i64 -1, ptr %369, align 8, !tbaa !32
  %370 = load i64, ptr %17, align 8, !tbaa !32
  %371 = add i64 %370, 3
  %372 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %371
  store i64 -1, ptr %372, align 8, !tbaa !32
  %373 = load i64, ptr %17, align 8, !tbaa !32
  %374 = add i64 %373, 4
  %375 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %374
  store i64 -1, ptr %375, align 8, !tbaa !32
  %376 = load i64, ptr %17, align 8, !tbaa !32
  %377 = add i64 %376, 5
  %378 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %377
  store i64 -1, ptr %378, align 8, !tbaa !32
  %379 = load i64, ptr %17, align 8, !tbaa !32
  %380 = add i64 %379, 6
  %381 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %380
  store i64 -1, ptr %381, align 8, !tbaa !32
  %382 = load i64, ptr %17, align 8, !tbaa !32
  %383 = add i64 %382, 7
  %384 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %383
  store i64 -1, ptr %384, align 8, !tbaa !32
  br label %385

385:                                              ; preds = %360
  %386 = load i64, ptr %17, align 8, !tbaa !32
  %387 = add i64 %386, 8
  store i64 %387, ptr %17, align 8, !tbaa !32
  br label %357, !llvm.loop !41

388:                                              ; preds = %357
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  %389 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %390 = load ptr, ptr %4, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.CPpmd7, ptr %390, i32 0, i32 0
  %392 = load ptr, ptr %391, align 8, !tbaa !9
  %393 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %392, i32 0, i32 1
  %394 = getelementptr inbounds %struct.CPpmd_State, ptr %393, i32 0, i32 0
  %395 = load i8, ptr %394, align 2, !tbaa !26
  %396 = zext i8 %395 to i64
  %397 = getelementptr inbounds i8, ptr %389, i64 %396
  store i8 0, ptr %397, align 1, !tbaa !27
  %398 = load ptr, ptr %4, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.CPpmd7, ptr %398, i32 0, i32 5
  store i32 0, ptr %399, align 8, !tbaa !28
  store i32 0, ptr %12, align 4
  br label %400

400:                                              ; preds = %388, %311
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  %401 = load i32, ptr %12, align 4
  switch i32 %401, label %621 [
    i32 0, label %402
  ]

402:                                              ; preds = %400
  br label %403

403:                                              ; preds = %402, %228
  br label %404

404:                                              ; preds = %620, %403
  call void @llvm.lifetime.start.p0(i64 2048, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 8, 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
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #3
  %405 = load ptr, ptr %4, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct.CPpmd7, ptr %405, i32 0, i32 0
  %407 = load ptr, ptr %406, align 8, !tbaa !9
  %408 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %407, i32 0, i32 0
  %409 = load i16, ptr %408, align 4, !tbaa !14
  %410 = zext i16 %409 to i32
  store i32 %410, ptr %26, align 4, !tbaa !21
  br label %411

411:                                              ; preds = %436, %404
  %412 = load ptr, ptr %4, align 8, !tbaa !5
  %413 = getelementptr inbounds %struct.CPpmd7, ptr %412, i32 0, i32 3
  %414 = load i32, ptr %413, align 8, !tbaa !42
  %415 = add i32 %414, 1
  store i32 %415, ptr %413, align 8, !tbaa !42
  %416 = load ptr, ptr %4, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.CPpmd7, ptr %416, i32 0, i32 0
  %418 = load ptr, ptr %417, align 8, !tbaa !9
  %419 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %418, i32 0, i32 3
  %420 = load i32, ptr %419, align 4, !tbaa !36
  %421 = icmp ne i32 %420, 0
  br i1 %421, label %423, label %422

422:                                              ; preds = %411
  store i32 -1, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %618

423:                                              ; preds = %411
  %424 = load ptr, ptr %4, align 8, !tbaa !5
  %425 = getelementptr inbounds %struct.CPpmd7, ptr %424, i32 0, i32 12
  %426 = load ptr, ptr %425, align 8, !tbaa !16
  %427 = load ptr, ptr %4, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.CPpmd7, ptr %427, i32 0, i32 0
  %429 = load ptr, ptr %428, align 8, !tbaa !9
  %430 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %429, i32 0, i32 3
  %431 = load i32, ptr %430, align 4, !tbaa !36
  %432 = zext i32 %431 to i64
  %433 = getelementptr inbounds i8, ptr %426, i64 %432
  %434 = load ptr, ptr %4, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.CPpmd7, ptr %434, i32 0, i32 0
  store ptr %433, ptr %435, align 8, !tbaa !9
  br label %436

436:                                              ; preds = %423
  %437 = load ptr, ptr %4, align 8, !tbaa !5
  %438 = getelementptr inbounds %struct.CPpmd7, ptr %437, i32 0, i32 0
  %439 = load ptr, ptr %438, align 8, !tbaa !9
  %440 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %439, i32 0, i32 0
  %441 = load i16, ptr %440, align 4, !tbaa !14
  %442 = zext i16 %441 to i32
  %443 = load i32, ptr %26, align 4, !tbaa !21
  %444 = icmp eq i32 %442, %443
  br i1 %444, label %411, label %445, !llvm.loop !43

445:                                              ; preds = %436
  store i32 0, ptr %22, align 4, !tbaa !21
  %446 = load ptr, ptr %4, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.CPpmd7, ptr %446, i32 0, i32 12
  %448 = load ptr, ptr %447, align 8, !tbaa !16
  %449 = load ptr, ptr %4, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.CPpmd7, ptr %449, i32 0, i32 0
  %451 = load ptr, ptr %450, align 8, !tbaa !9
  %452 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %451, i32 0, i32 2
  %453 = load i32, ptr %452, align 4, !tbaa !17
  %454 = zext i32 %453 to i64
  %455 = getelementptr inbounds i8, ptr %448, i64 %454
  store ptr %455, ptr %19, align 8, !tbaa !5
  store i32 0, ptr %24, align 4, !tbaa !21
  %456 = load ptr, ptr %4, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.CPpmd7, ptr %456, i32 0, i32 0
  %458 = load ptr, ptr %457, align 8, !tbaa !9
  %459 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %458, i32 0, i32 0
  %460 = load i16, ptr %459, align 4, !tbaa !14
  %461 = zext i16 %460 to i32
  %462 = load i32, ptr %26, align 4, !tbaa !21
  %463 = sub i32 %461, %462
  store i32 %463, ptr %25, align 4, !tbaa !21
  br label %464

464:                                              ; preds = %489, %445
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #3
  %465 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %466 = load ptr, ptr %19, align 8, !tbaa !5
  %467 = getelementptr inbounds %struct.CPpmd_State, ptr %466, i32 0, i32 0
  %468 = load i8, ptr %467, align 1, !tbaa !26
  %469 = zext i8 %468 to i64
  %470 = getelementptr inbounds i8, ptr %465, i64 %469
  %471 = load i8, ptr %470, align 1, !tbaa !27
  %472 = sext i8 %471 to i32
  store i32 %472, ptr %27, align 4, !tbaa !21
  %473 = load ptr, ptr %19, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.CPpmd_State, ptr %473, i32 0, i32 1
  %475 = load i8, ptr %474, align 1, !tbaa !22
  %476 = zext i8 %475 to i32
  %477 = load i32, ptr %27, align 4, !tbaa !21
  %478 = and i32 %476, %477
  %479 = load i32, ptr %22, align 4, !tbaa !21
  %480 = add i32 %479, %478
  store i32 %480, ptr %22, align 4, !tbaa !21
  %481 = load ptr, ptr %19, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.CPpmd_State, ptr %481, i32 1
  store ptr %482, ptr %19, align 8, !tbaa !5
  %483 = load i32, ptr %24, align 4, !tbaa !21
  %484 = zext i32 %483 to i64
  %485 = getelementptr inbounds [256 x ptr], ptr %18, i64 0, i64 %484
  store ptr %481, ptr %485, align 8, !tbaa !5
  %486 = load i32, ptr %27, align 4, !tbaa !21
  %487 = load i32, ptr %24, align 4, !tbaa !21
  %488 = sub i32 %487, %486
  store i32 %488, ptr %24, align 4, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #3
  br label %489

489:                                              ; preds = %464
  %490 = load i32, ptr %24, align 4, !tbaa !21
  %491 = load i32, ptr %25, align 4, !tbaa !21
  %492 = icmp ne i32 %490, %491
  br i1 %492, label %464, label %493, !llvm.loop !44

493:                                              ; preds = %489
  %494 = load ptr, ptr %4, align 8, !tbaa !5
  %495 = load i32, ptr %26, align 4, !tbaa !21
  %496 = call ptr @Ppmd7_MakeEscFreq(ptr noundef %494, i32 noundef %495, ptr noundef %20)
  store ptr %496, ptr %23, align 8, !tbaa !5
  %497 = load i32, ptr %22, align 4, !tbaa !21
  %498 = load i32, ptr %20, align 4, !tbaa !21
  %499 = add i32 %498, %497
  store i32 %499, ptr %20, align 4, !tbaa !21
  %500 = load ptr, ptr %5, align 8, !tbaa !5
  %501 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %500, i32 0, i32 0
  %502 = load ptr, ptr %501, align 8, !tbaa !18
  %503 = load ptr, ptr %5, align 8, !tbaa !5
  %504 = load i32, ptr %20, align 4, !tbaa !21
  %505 = call i32 %502(ptr noundef %503, i32 noundef %504)
  store i32 %505, ptr %21, align 4, !tbaa !21
  %506 = load i32, ptr %21, align 4, !tbaa !21
  %507 = load i32, ptr %22, align 4, !tbaa !21
  %508 = icmp ult i32 %506, %507
  br i1 %508, label %509, label %580

509:                                              ; preds = %493
  call void @llvm.lifetime.start.p0(i64 1, ptr %28) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #3
  %510 = getelementptr inbounds [256 x ptr], ptr %18, i64 0, i64 0
  store ptr %510, ptr %29, align 8, !tbaa !5
  store i32 0, ptr %22, align 4, !tbaa !21
  br label %511

511:                                              ; preds = %522, %509
  %512 = load ptr, ptr %29, align 8, !tbaa !5
  %513 = load ptr, ptr %512, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.CPpmd_State, ptr %513, i32 0, i32 1
  %515 = load i8, ptr %514, align 1, !tbaa !22
  %516 = zext i8 %515 to i32
  %517 = load i32, ptr %22, align 4, !tbaa !21
  %518 = add i32 %517, %516
  store i32 %518, ptr %22, align 4, !tbaa !21
  %519 = load i32, ptr %21, align 4, !tbaa !21
  %520 = icmp ule i32 %518, %519
  br i1 %520, label %521, label %525

521:                                              ; preds = %511
  br label %522

522:                                              ; preds = %521
  %523 = load ptr, ptr %29, align 8, !tbaa !5
  %524 = getelementptr inbounds ptr, ptr %523, i32 1
  store ptr %524, ptr %29, align 8, !tbaa !5
  br label %511, !llvm.loop !45

525:                                              ; preds = %511
  %526 = load ptr, ptr %29, align 8, !tbaa !5
  %527 = load ptr, ptr %526, align 8, !tbaa !5
  store ptr %527, ptr %19, align 8, !tbaa !5
  %528 = load ptr, ptr %5, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %528, i32 0, i32 1
  %530 = load ptr, ptr %529, align 8, !tbaa !24
  %531 = load ptr, ptr %5, align 8, !tbaa !5
  %532 = load i32, ptr %22, align 4, !tbaa !21
  %533 = load ptr, ptr %19, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.CPpmd_State, ptr %533, i32 0, i32 1
  %535 = load i8, ptr %534, align 1, !tbaa !22
  %536 = zext i8 %535 to i32
  %537 = sub i32 %532, %536
  %538 = load ptr, ptr %19, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.CPpmd_State, ptr %538, i32 0, i32 1
  %540 = load i8, ptr %539, align 1, !tbaa !22
  %541 = zext i8 %540 to i32
  call void %530(ptr noundef %531, i32 noundef %537, i32 noundef %541)
  %542 = load ptr, ptr %23, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.CPpmd_See, ptr %542, i32 0, i32 1
  %544 = load i8, ptr %543, align 1, !tbaa !46
  %545 = zext i8 %544 to i32
  %546 = icmp slt i32 %545, 7
  br i1 %546, label %547, label %570

547:                                              ; preds = %525
  %548 = load ptr, ptr %23, align 8, !tbaa !5
  %549 = getelementptr inbounds %struct.CPpmd_See, ptr %548, i32 0, i32 2
  %550 = load i8, ptr %549, align 1, !tbaa !47
  %551 = add i8 %550, -1
  store i8 %551, ptr %549, align 1, !tbaa !47
  %552 = zext i8 %551 to i32
  %553 = icmp eq i32 %552, 0
  br i1 %553, label %554, label %570

554:                                              ; preds = %547
  %555 = load ptr, ptr %23, align 8, !tbaa !5
  %556 = getelementptr inbounds %struct.CPpmd_See, ptr %555, i32 0, i32 0
  %557 = load i16, ptr %556, align 1, !tbaa !48
  %558 = zext i16 %557 to i32
  %559 = shl i32 %558, 1
  %560 = trunc i32 %559 to i16
  store i16 %560, ptr %556, align 1, !tbaa !48
  %561 = load ptr, ptr %23, align 8, !tbaa !5
  %562 = getelementptr inbounds %struct.CPpmd_See, ptr %561, i32 0, i32 1
  %563 = load i8, ptr %562, align 1, !tbaa !46
  %564 = add i8 %563, 1
  store i8 %564, ptr %562, align 1, !tbaa !46
  %565 = zext i8 %563 to i32
  %566 = shl i32 3, %565
  %567 = trunc i32 %566 to i8
  %568 = load ptr, ptr %23, align 8, !tbaa !5
  %569 = getelementptr inbounds %struct.CPpmd_See, ptr %568, i32 0, i32 2
  store i8 %567, ptr %569, align 1, !tbaa !47
  br label %570

570:                                              ; preds = %554, %547, %525
  %571 = load ptr, ptr %19, align 8, !tbaa !5
  %572 = load ptr, ptr %4, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.CPpmd7, ptr %572, i32 0, i32 2
  store ptr %571, ptr %573, align 8, !tbaa !25
  %574 = load ptr, ptr %19, align 8, !tbaa !5
  %575 = getelementptr inbounds %struct.CPpmd_State, ptr %574, i32 0, i32 0
  %576 = load i8, ptr %575, align 1, !tbaa !26
  store i8 %576, ptr %28, align 1, !tbaa !27
  %577 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update2(ptr noundef %577)
  %578 = load i8, ptr %28, align 1, !tbaa !27
  %579 = zext i8 %578 to i32
  store i32 %579, ptr %3, align 4
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %28) #3
  br label %618

580:                                              ; preds = %493
  %581 = load i32, ptr %21, align 4, !tbaa !21
  %582 = load i32, ptr %20, align 4, !tbaa !21
  %583 = icmp uge i32 %581, %582
  br i1 %583, label %584, label %585

584:                                              ; preds = %580
  store i32 -2, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %618

585:                                              ; preds = %580
  %586 = load ptr, ptr %5, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %586, i32 0, i32 1
  %588 = load ptr, ptr %587, align 8, !tbaa !24
  %589 = load ptr, ptr %5, align 8, !tbaa !5
  %590 = load i32, ptr %22, align 4, !tbaa !21
  %591 = load i32, ptr %20, align 4, !tbaa !21
  %592 = load i32, ptr %22, align 4, !tbaa !21
  %593 = sub i32 %591, %592
  call void %588(ptr noundef %589, i32 noundef %590, i32 noundef %593)
  %594 = load ptr, ptr %23, align 8, !tbaa !5
  %595 = getelementptr inbounds %struct.CPpmd_See, ptr %594, i32 0, i32 0
  %596 = load i16, ptr %595, align 1, !tbaa !48
  %597 = zext i16 %596 to i32
  %598 = load i32, ptr %20, align 4, !tbaa !21
  %599 = add i32 %597, %598
  %600 = trunc i32 %599 to i16
  %601 = load ptr, ptr %23, align 8, !tbaa !5
  %602 = getelementptr inbounds %struct.CPpmd_See, ptr %601, i32 0, i32 0
  store i16 %600, ptr %602, align 1, !tbaa !48
  br label %603

603:                                              ; preds = %614, %585
  %604 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %605 = load i32, ptr %24, align 4, !tbaa !21
  %606 = add i32 %605, -1
  store i32 %606, ptr %24, align 4, !tbaa !21
  %607 = zext i32 %606 to i64
  %608 = getelementptr inbounds [256 x ptr], ptr %18, i64 0, i64 %607
  %609 = load ptr, ptr %608, align 8, !tbaa !5
  %610 = getelementptr inbounds %struct.CPpmd_State, ptr %609, i32 0, i32 0
  %611 = load i8, ptr %610, align 1, !tbaa !26
  %612 = zext i8 %611 to i64
  %613 = getelementptr inbounds i8, ptr %604, i64 %612
  store i8 0, ptr %613, align 1, !tbaa !27
  br label %614

614:                                              ; preds = %603
  %615 = load i32, ptr %24, align 4, !tbaa !21
  %616 = icmp ne i32 %615, 0
  br i1 %616, label %603, label %617, !llvm.loop !49

617:                                              ; preds = %614
  store i32 0, ptr %12, align 4
  br label %618

618:                                              ; preds = %617, %584, %570, %422
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #3
  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 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 2048, ptr %18) #3
  %619 = load i32, ptr %12, align 4
  switch i32 %619, label %621 [
    i32 0, label %620
  ]

620:                                              ; preds = %618
  br label %404

621:                                              ; preds = %618, %400, %226
  call void @llvm.lifetime.end.p0(i64 256, ptr %6) #3
  %622 = load i32, ptr %3, align 4
  ret i32 %622
}

declare void @Ppmd7_Update1_0(ptr noundef) #2

declare void @Ppmd7_Update1(ptr noundef) #2

declare void @Ppmd7_UpdateBin(ptr noundef) #2

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, !6, i64 0}
!10 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !11, i64 104, !7, i64 108, !7, i64 146, !7, i64 276, !7, i64 428, !7, i64 684, !7, i64 940, !12, i64 1196, !7, i64 1200, !7, i64 2800}
!11 = !{!"int", !7, i64 0}
!12 = !{!"", !13, i64 0, !7, i64 2, !7, i64 3}
!13 = !{!"short", !7, i64 0}
!14 = !{!15, !13, i64 0}
!15 = !{!"CPpmd7_Context_", !13, i64 0, !13, i64 2, !11, i64 4, !11, i64 8}
!16 = !{!10, !6, i64 64}
!17 = !{!15, !11, i64 4}
!18 = !{!19, !6, i64 0}
!19 = !{!"IPpmd7_RangeDec", !6, i64 0, !6, i64 8, !6, i64 16}
!20 = !{!15, !13, i64 2}
!21 = !{!11, !11, i64 0}
!22 = !{!23, !7, i64 1}
!23 = !{!"", !7, i64 0, !7, i64 1, !13, i64 2, !13, i64 4}
!24 = !{!19, !6, i64 8}
!25 = !{!10, !6, i64 16}
!26 = !{!23, !7, i64 0}
!27 = !{!7, !7, i64 0}
!28 = !{!10, !11, i64 32}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!10, !11, i64 40}
!32 = !{!33, !33, i64 0}
!33 = !{!"long", !7, i64 0}
!34 = distinct !{!34, !30}
!35 = distinct !{!35, !30}
!36 = !{!15, !11, i64 8}
!37 = !{!10, !11, i64 44}
!38 = !{!19, !6, i64 16}
!39 = !{!13, !13, i64 0}
!40 = !{!10, !11, i64 28}
!41 = distinct !{!41, !30}
!42 = !{!10, !11, i64 24}
!43 = distinct !{!43, !30}
!44 = distinct !{!44, !30}
!45 = distinct !{!45, !30}
!46 = !{!12, !7, i64 2}
!47 = !{!12, !7, i64 3}
!48 = !{!12, !13, i64 0}
!49 = distinct !{!49, !30}


; 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 i32 @Ppmd7_DecodeSymbol(ptr noundef %0, ptr noundef %1) local_unnamed_addr #1 {
  %3 = alloca [32 x i64], align 16
  %4 = alloca [256 x ptr], align 16
  %5 = alloca i32, align 4
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %3) #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 %99, label %8

8:                                                ; preds = %2
  %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 ptr, ptr %1, align 8, !tbaa !17
  %16 = getelementptr inbounds i8, ptr %6, i64 2
  %17 = load i16, ptr %16, align 2, !tbaa !19
  %18 = zext i16 %17 to i32
  %19 = tail call i32 %15(ptr noundef nonnull %1, i32 noundef %18) #4
  %20 = getelementptr inbounds i8, ptr %14, i64 1
  %21 = load i8, ptr %20, align 1, !tbaa !20
  %22 = zext i8 %21 to i32
  %23 = icmp ult i32 %19, %22
  br i1 %23, label %24, label %30

24:                                               ; preds = %8
  %25 = getelementptr inbounds i8, ptr %1, i64 8
  %26 = load ptr, ptr %25, align 8, !tbaa !22
  tail call void %26(ptr noundef nonnull %1, i32 noundef 0, i32 noundef %22) #4
  %27 = getelementptr inbounds i8, ptr %0, i64 16
  store ptr %14, ptr %27, align 8, !tbaa !23
  %28 = load i8, ptr %14, align 1, !tbaa !24
  tail call void @Ppmd7_Update1_0(ptr noundef nonnull %0) #4
  %29 = zext i8 %28 to i32
  br label %.thread

30:                                               ; preds = %8
  %31 = getelementptr inbounds i8, ptr %0, i64 32
  store i32 0, ptr %31, align 8, !tbaa !25
  %32 = load ptr, ptr %0, align 8, !tbaa !5
  %33 = load i16, ptr %32, align 4, !tbaa !13
  %34 = zext i16 %33 to i32
  %35 = add nsw i32 %34, -1
  br label %36

36:                                               ; preds = %49, %30
  %.0162 = phi i32 [ %22, %30 ], [ %41, %49 ]
  %.0160 = phi i32 [ %35, %30 ], [ %50, %49 ]
  %.0158 = phi ptr [ %14, %30 ], [ %37, %49 ]
  %37 = getelementptr inbounds i8, ptr %.0158, i64 6
  %38 = getelementptr inbounds i8, ptr %.0158, i64 7
  %39 = load i8, ptr %38, align 1, !tbaa !20
  %40 = zext i8 %39 to i32
  %41 = add i32 %.0162, %40
  %42 = icmp ugt i32 %41, %19
  br i1 %42, label %43, label %49

43:                                               ; preds = %36
  %44 = getelementptr inbounds i8, ptr %1, i64 8
  %45 = load ptr, ptr %44, align 8, !tbaa !22
  tail call void %45(ptr noundef nonnull %1, i32 noundef %.0162, i32 noundef %40) #4
  %46 = getelementptr inbounds i8, ptr %0, i64 16
  store ptr %37, ptr %46, align 8, !tbaa !23
  %47 = load i8, ptr %37, align 1, !tbaa !24
  tail call void @Ppmd7_Update1(ptr noundef %0) #4
  %48 = zext i8 %47 to i32
  br label %.thread

49:                                               ; preds = %36
  %50 = add i32 %.0160, -1
  %.not188 = icmp eq i32 %50, 0
  br i1 %.not188, label %51, label %36, !llvm.loop !26

51:                                               ; preds = %49
  %52 = getelementptr inbounds i8, ptr %32, i64 2
  %53 = load i16, ptr %52, align 2, !tbaa !19
  %54 = zext i16 %53 to i32
  %.not189 = icmp ult i32 %19, %54
  br i1 %.not189, label %55, label %.thread

55:                                               ; preds = %51
  %56 = getelementptr inbounds i8, ptr %0, i64 940
  %57 = getelementptr inbounds i8, ptr %0, i64 16
  %58 = load ptr, ptr %57, align 8, !tbaa !23
  %59 = load i8, ptr %58, align 1, !tbaa !24
  %60 = zext i8 %59 to i64
  %61 = getelementptr inbounds [256 x i8], ptr %56, i64 0, i64 %60
  %62 = load i8, ptr %61, align 1, !tbaa !28
  %63 = zext i8 %62 to i32
  %64 = getelementptr inbounds i8, ptr %0, i64 40
  store i32 %63, ptr %64, align 8, !tbaa !29
  %65 = getelementptr inbounds i8, ptr %1, i64 8
  %66 = load ptr, ptr %65, align 8, !tbaa !22
  %67 = sub i32 %54, %41
  tail call void %66(ptr noundef nonnull %1, i32 noundef %41, i32 noundef %67) #4
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %3, i8 -1, i64 256, i1 false), !tbaa !30
  %68 = load i8, ptr %37, align 1, !tbaa !24
  %69 = zext i8 %68 to i64
  %70 = getelementptr inbounds i8, ptr %3, i64 %69
  store i8 0, ptr %70, align 1, !tbaa !28
  %71 = load ptr, ptr %0, align 8, !tbaa !5
  %72 = load i16, ptr %71, align 4, !tbaa !13
  %73 = zext i16 %72 to i32
  %74 = add nsw i32 %73, -1
  %75 = add nsw i32 %73, -2
  %xtraiter = and i32 %74, 3
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.prol.loopexit, label %.prol.preheader

.prol.preheader:                                  ; preds = %55, %.prol.preheader
  %.1161.prol = phi i32 [ %80, %.prol.preheader ], [ %74, %55 ]
  %.1159.prol = phi ptr [ %76, %.prol.preheader ], [ %37, %55 ]
  %prol.iter = phi i32 [ %prol.iter.next, %.prol.preheader ], [ 0, %55 ]
  %76 = getelementptr inbounds i8, ptr %.1159.prol, i64 -6
  %77 = load i8, ptr %76, align 1, !tbaa !24
  %78 = zext i8 %77 to i64
  %79 = getelementptr inbounds i8, ptr %3, i64 %78
  store i8 0, ptr %79, align 1, !tbaa !28
  %80 = add i32 %.1161.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 !32

.prol.loopexit:                                   ; preds = %.prol.preheader, %55
  %.1161.unr = phi i32 [ %74, %55 ], [ %80, %.prol.preheader ]
  %.1159.unr = phi ptr [ %37, %55 ], [ %76, %.prol.preheader ]
  %81 = icmp ult i32 %75, 3
  br i1 %81, label %.loopexit, label %.new

.new:                                             ; preds = %.prol.loopexit, %.new
  %.1161 = phi i32 [ %98, %.new ], [ %.1161.unr, %.prol.loopexit ]
  %.1159 = phi ptr [ %94, %.new ], [ %.1159.unr, %.prol.loopexit ]
  %82 = getelementptr inbounds i8, ptr %.1159, i64 -6
  %83 = load i8, ptr %82, align 1, !tbaa !24
  %84 = zext i8 %83 to i64
  %85 = getelementptr inbounds i8, ptr %3, i64 %84
  store i8 0, ptr %85, align 1, !tbaa !28
  %86 = getelementptr inbounds i8, ptr %.1159, i64 -12
  %87 = load i8, ptr %86, align 1, !tbaa !24
  %88 = zext i8 %87 to i64
  %89 = getelementptr inbounds i8, ptr %3, i64 %88
  store i8 0, ptr %89, align 1, !tbaa !28
  %90 = getelementptr inbounds i8, ptr %.1159, i64 -18
  %91 = load i8, ptr %90, align 1, !tbaa !24
  %92 = zext i8 %91 to i64
  %93 = getelementptr inbounds i8, ptr %3, i64 %92
  store i8 0, ptr %93, align 1, !tbaa !28
  %94 = getelementptr inbounds i8, ptr %.1159, i64 -24
  %95 = load i8, ptr %94, align 1, !tbaa !24
  %96 = zext i8 %95 to i64
  %97 = getelementptr inbounds i8, ptr %3, i64 %96
  store i8 0, ptr %97, align 1, !tbaa !28
  %98 = add i32 %.1161, -4
  %.not190.3 = icmp eq i32 %98, 0
  br i1 %.not190.3, label %.loopexit, label %.new, !llvm.loop !34

99:                                               ; preds = %2
  %100 = getelementptr inbounds i8, ptr %0, i64 2800
  %101 = getelementptr inbounds i8, ptr %6, i64 3
  %102 = load i8, ptr %101, align 1, !tbaa !20
  %103 = zext i8 %102 to i64
  %104 = add nsw i64 %103, -1
  %105 = getelementptr inbounds i8, ptr %0, i64 32
  %106 = load i32, ptr %105, align 8, !tbaa !25
  %107 = getelementptr inbounds i8, ptr %0, i64 684
  %108 = getelementptr inbounds i8, ptr %0, i64 64
  %109 = load ptr, ptr %108, align 8, !tbaa !15
  %110 = getelementptr inbounds i8, ptr %6, i64 8
  %111 = load i32, ptr %110, align 4, !tbaa !35
  %112 = zext i32 %111 to i64
  %113 = getelementptr inbounds i8, ptr %109, i64 %112
  %114 = load i16, ptr %113, align 4, !tbaa !13
  %115 = zext i16 %114 to i64
  %116 = add nsw i64 %115, -1
  %117 = getelementptr inbounds [256 x i8], ptr %107, i64 0, i64 %116
  %118 = load i8, ptr %117, align 1, !tbaa !28
  %119 = zext i8 %118 to i32
  %120 = add i32 %106, %119
  %121 = getelementptr inbounds i8, ptr %0, i64 940
  %122 = getelementptr inbounds i8, ptr %0, i64 16
  %123 = load ptr, ptr %122, align 8, !tbaa !23
  %124 = load i8, ptr %123, align 1, !tbaa !24
  %125 = zext i8 %124 to i64
  %126 = getelementptr inbounds [256 x i8], ptr %121, i64 0, i64 %125
  %127 = load i8, ptr %126, align 1, !tbaa !28
  %128 = zext i8 %127 to i32
  %129 = getelementptr inbounds i8, ptr %0, i64 40
  store i32 %128, ptr %129, align 8, !tbaa !29
  %130 = add i32 %120, %128
  %131 = getelementptr inbounds i8, ptr %6, i64 2
  %132 = load i8, ptr %131, align 2, !tbaa !24
  %133 = zext i8 %132 to i64
  %134 = getelementptr inbounds [256 x i8], ptr %121, i64 0, i64 %133
  %135 = load i8, ptr %134, align 1, !tbaa !28
  %136 = zext i8 %135 to i32
  %137 = shl nuw nsw i32 %136, 1
  %138 = add i32 %130, %137
  %139 = getelementptr inbounds i8, ptr %0, i64 44
  %140 = load i32, ptr %139, align 4, !tbaa !36
  %141 = lshr i32 %140, 26
  %142 = and i32 %141, 32
  %143 = add i32 %138, %142
  %144 = zext i32 %143 to i64
  %145 = getelementptr inbounds [128 x [64 x i16]], ptr %100, i64 0, i64 %104, i64 %144
  %146 = getelementptr inbounds i8, ptr %1, i64 16
  %147 = load ptr, ptr %146, align 8, !tbaa !37
  %148 = load i16, ptr %145, align 2, !tbaa !38
  %149 = zext i16 %148 to i32
  %150 = tail call i32 %147(ptr noundef %1, i32 noundef %149) #4
  %.not187 = icmp eq i32 %150, 0
  %151 = load i16, ptr %145, align 2, !tbaa !38
  %152 = zext i16 %151 to i32
  br i1 %.not187, label %.thread198, label %162

.thread198:                                       ; preds = %99
  %153 = add nuw nsw i32 %152, 128
  %154 = add nuw nsw i32 %152, 32
  %155 = lshr i32 %154, 7
  %156 = sub nsw i32 %153, %155
  %157 = trunc i32 %156 to i16
  store i16 %157, ptr %145, align 2, !tbaa !38
  %158 = load ptr, ptr %0, align 8, !tbaa !5
  %159 = getelementptr inbounds i8, ptr %158, i64 2
  store ptr %159, ptr %122, align 8, !tbaa !23
  %160 = load i8, ptr %159, align 1, !tbaa !24
  tail call void @Ppmd7_UpdateBin(ptr noundef nonnull %0) #4
  %161 = zext i8 %160 to i32
  br label %.thread

162:                                              ; preds = %99
  %163 = add nuw nsw i32 %152, 32
  %164 = lshr i32 %163, 7
  %165 = trunc nuw nsw i32 %164 to i16
  %166 = sub i16 %151, %165
  store i16 %166, ptr %145, align 2, !tbaa !38
  %167 = lshr i16 %166, 10
  %168 = zext nneg i16 %167 to i64
  %169 = getelementptr inbounds [16 x i8], ptr @PPMD7_kExpEscape, i64 0, i64 %168
  %170 = load i8, ptr %169, align 1, !tbaa !28
  %171 = zext i8 %170 to i32
  %172 = getelementptr inbounds i8, ptr %0, i64 28
  store i32 %171, ptr %172, align 4, !tbaa !39
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %3, i8 -1, i64 256, i1 false), !tbaa !30
  %173 = load ptr, ptr %0, align 8, !tbaa !5
  %174 = getelementptr inbounds i8, ptr %173, i64 2
  %175 = load i8, ptr %174, align 2, !tbaa !24
  %176 = zext i8 %175 to i64
  %177 = getelementptr inbounds i8, ptr %3, i64 %176
  store i8 0, ptr %177, align 1, !tbaa !28
  store i32 0, ptr %105, align 8, !tbaa !25
  br label %.loopexit

.loopexit:                                        ; preds = %.prol.loopexit, %.new, %162
  %178 = phi ptr [ %173, %162 ], [ %71, %.new ], [ %71, %.prol.loopexit ]
  %179 = getelementptr inbounds i8, ptr %0, i64 24
  %180 = getelementptr inbounds i8, ptr %0, i64 64
  %181 = getelementptr inbounds i8, ptr %1, i64 8
  br label %182

182:                                              ; preds = %.unr-lcssa, %.loopexit
  %183 = phi ptr [ %.pre, %.unr-lcssa ], [ %178, %.loopexit ]
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %4) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #4
  %184 = load i16, ptr %183, align 4, !tbaa !13
  %185 = zext i16 %184 to i32
  %.promoted = load i32, ptr %179, align 8, !tbaa !40
  br label %186

186:                                              ; preds = %192, %182
  %187 = phi ptr [ %195, %192 ], [ %183, %182 ]
  %188 = phi i32 [ %189, %192 ], [ %.promoted, %182 ]
  %189 = add i32 %188, 1
  %190 = getelementptr inbounds i8, ptr %187, i64 8
  %191 = load i32, ptr %190, align 4, !tbaa !35
  %.not191 = icmp eq i32 %191, 0
  br i1 %.not191, label %.thread201.loopexit, label %192

192:                                              ; preds = %186
  %193 = load ptr, ptr %180, align 8, !tbaa !15
  %194 = zext i32 %191 to i64
  %195 = getelementptr inbounds i8, ptr %193, i64 %194
  store ptr %195, ptr %0, align 8, !tbaa !5
  %196 = load i16, ptr %195, align 4, !tbaa !13
  %197 = icmp eq i16 %196, %184
  br i1 %197, label %186, label %198, !llvm.loop !41

198:                                              ; preds = %192
  store i32 %189, ptr %179, align 8, !tbaa !40
  %199 = zext i16 %196 to i32
  %200 = getelementptr inbounds i8, ptr %195, i64 4
  %201 = load i32, ptr %200, align 4, !tbaa !16
  %202 = zext i32 %201 to i64
  %203 = getelementptr inbounds i8, ptr %193, i64 %202
  %204 = sub nsw i32 %199, %185
  br label %205

205:                                              ; preds = %205, %198
  %.0171 = phi ptr [ %203, %198 ], [ %216, %205 ]
  %.0168 = phi i32 [ 0, %198 ], [ %215, %205 ]
  %.0163 = phi i32 [ 0, %198 ], [ %219, %205 ]
  %206 = load i8, ptr %.0171, align 1, !tbaa !24
  %207 = zext i8 %206 to i64
  %208 = getelementptr inbounds i8, ptr %3, i64 %207
  %209 = load i8, ptr %208, align 1, !tbaa !28
  %210 = sext i8 %209 to i32
  %211 = getelementptr inbounds i8, ptr %.0171, i64 1
  %212 = load i8, ptr %211, align 1, !tbaa !20
  %213 = zext i8 %212 to i32
  %214 = and i32 %213, %210
  %215 = add i32 %214, %.0168
  %216 = getelementptr inbounds i8, ptr %.0171, i64 6
  %217 = zext i32 %.0163 to i64
  %218 = getelementptr inbounds [256 x ptr], ptr %4, i64 0, i64 %217
  store ptr %.0171, ptr %218, align 8, !tbaa !42
  %219 = sub i32 %.0163, %210
  %.not192 = icmp eq i32 %219, %204
  br i1 %.not192, label %220, label %205, !llvm.loop !43

220:                                              ; preds = %205
  %221 = call ptr @Ppmd7_MakeEscFreq(ptr noundef %0, i32 noundef %185, ptr noundef nonnull %5) #4
  %222 = load i32, ptr %5, align 4, !tbaa !44
  %223 = add i32 %222, %215
  store i32 %223, ptr %5, align 4, !tbaa !44
  %224 = load ptr, ptr %1, align 8, !tbaa !17
  %225 = call i32 %224(ptr noundef nonnull %1, i32 noundef %223) #4
  %226 = icmp ult i32 %225, %215
  br i1 %226, label %.preheader, label %254

.preheader:                                       ; preds = %220, %.preheader
  %.1169 = phi i32 [ %231, %.preheader ], [ 0, %220 ]
  %.0 = phi ptr [ %232, %.preheader ], [ %4, %220 ]
  %227 = load ptr, ptr %.0, align 8, !tbaa !42
  %228 = getelementptr inbounds i8, ptr %227, i64 1
  %229 = load i8, ptr %228, align 1, !tbaa !20
  %230 = zext i8 %229 to i32
  %231 = add i32 %.1169, %230
  %.not195 = icmp ugt i32 %231, %225
  %232 = getelementptr inbounds i8, ptr %.0, i64 8
  br i1 %.not195, label %233, label %.preheader, !llvm.loop !45

233:                                              ; preds = %.preheader
  %234 = load ptr, ptr %181, align 8, !tbaa !22
  call void %234(ptr noundef nonnull %1, i32 noundef %.1169, i32 noundef %230) #4
  %235 = getelementptr inbounds i8, ptr %221, i64 2
  %236 = load i8, ptr %235, align 1, !tbaa !46
  %237 = icmp ult i8 %236, 7
  br i1 %237, label %238, label %250

238:                                              ; preds = %233
  %239 = getelementptr inbounds i8, ptr %221, i64 3
  %240 = load i8, ptr %239, align 1, !tbaa !47
  %241 = add i8 %240, -1
  store i8 %241, ptr %239, align 1, !tbaa !47
  %242 = icmp eq i8 %241, 0
  br i1 %242, label %243, label %250

243:                                              ; preds = %238
  %244 = load i16, ptr %221, align 1, !tbaa !48
  %245 = shl i16 %244, 1
  store i16 %245, ptr %221, align 1, !tbaa !48
  %246 = add nuw nsw i8 %236, 1
  store i8 %246, ptr %235, align 1, !tbaa !46
  %247 = zext nneg i8 %236 to i32
  %248 = shl nuw nsw i32 3, %247
  %249 = trunc i32 %248 to i8
  store i8 %249, ptr %239, align 1, !tbaa !47
  br label %250

250:                                              ; preds = %243, %238, %233
  %251 = getelementptr inbounds i8, ptr %0, i64 16
  store ptr %227, ptr %251, align 8, !tbaa !23
  %252 = load i8, ptr %227, align 1, !tbaa !24
  call void @Ppmd7_Update2(ptr noundef %0) #4
  %253 = zext i8 %252 to i32
  br label %.thread201

254:                                              ; preds = %220
  %255 = load i32, ptr %5, align 4, !tbaa !44
  %.not193 = icmp ult i32 %225, %255
  br i1 %.not193, label %256, label %.thread201

256:                                              ; preds = %254
  %257 = load ptr, ptr %181, align 8, !tbaa !22
  %258 = sub i32 %255, %215
  call void %257(ptr noundef nonnull %1, i32 noundef %215, i32 noundef %258) #4
  %259 = load i16, ptr %221, align 1, !tbaa !48
  %260 = load i32, ptr %5, align 4, !tbaa !44
  %261 = trunc i32 %260 to i16
  %262 = add i16 %259, %261
  store i16 %262, ptr %221, align 1, !tbaa !48
  %xtraiter310 = and i32 %204, 3
  %lcmp.mod311.not = icmp eq i32 %xtraiter310, 0
  br i1 %lcmp.mod311.not, label %.prol.loopexit308, label %.prol.preheader307

.prol.preheader307:                               ; preds = %256, %.prol.preheader307
  %.1164.prol = phi i32 [ %263, %.prol.preheader307 ], [ %204, %256 ]
  %prol.iter312 = phi i32 [ %prol.iter312.next, %.prol.preheader307 ], [ 0, %256 ]
  %263 = add i32 %.1164.prol, -1
  %264 = zext i32 %263 to i64
  %265 = getelementptr inbounds [256 x ptr], ptr %4, i64 0, i64 %264
  %266 = load ptr, ptr %265, align 8, !tbaa !42
  %267 = load i8, ptr %266, align 1, !tbaa !24
  %268 = zext i8 %267 to i64
  %269 = getelementptr inbounds i8, ptr %3, i64 %268
  store i8 0, ptr %269, align 1, !tbaa !28
  %prol.iter312.next = add i32 %prol.iter312, 1
  %prol.iter312.cmp.not = icmp eq i32 %prol.iter312.next, %xtraiter310
  br i1 %prol.iter312.cmp.not, label %.prol.loopexit308, label %.prol.preheader307, !llvm.loop !49

.prol.loopexit308:                                ; preds = %.prol.preheader307, %256
  %.1164.unr = phi i32 [ %204, %256 ], [ %263, %.prol.preheader307 ]
  %270 = sub nsw i32 %185, %199
  %271 = icmp ugt i32 %270, -4
  br i1 %271, label %.unr-lcssa, label %.new309

.new309:                                          ; preds = %.prol.loopexit308, %.new309
  %.1164 = phi i32 [ %293, %.new309 ], [ %.1164.unr, %.prol.loopexit308 ]
  %272 = add i32 %.1164, -1
  %273 = zext i32 %272 to i64
  %274 = getelementptr inbounds [256 x ptr], ptr %4, i64 0, i64 %273
  %275 = load ptr, ptr %274, align 8, !tbaa !42
  %276 = load i8, ptr %275, align 1, !tbaa !24
  %277 = zext i8 %276 to i64
  %278 = getelementptr inbounds i8, ptr %3, i64 %277
  store i8 0, ptr %278, align 1, !tbaa !28
  %279 = add i32 %.1164, -2
  %280 = zext i32 %279 to i64
  %281 = getelementptr inbounds [256 x ptr], ptr %4, i64 0, i64 %280
  %282 = load ptr, ptr %281, align 8, !tbaa !42
  %283 = load i8, ptr %282, align 1, !tbaa !24
  %284 = zext i8 %283 to i64
  %285 = getelementptr inbounds i8, ptr %3, i64 %284
  store i8 0, ptr %285, align 1, !tbaa !28
  %286 = add i32 %.1164, -3
  %287 = zext i32 %286 to i64
  %288 = getelementptr inbounds [256 x ptr], ptr %4, i64 0, i64 %287
  %289 = load ptr, ptr %288, align 8, !tbaa !42
  %290 = load i8, ptr %289, align 1, !tbaa !24
  %291 = zext i8 %290 to i64
  %292 = getelementptr inbounds i8, ptr %3, i64 %291
  store i8 0, ptr %292, align 1, !tbaa !28
  %293 = add i32 %.1164, -4
  %294 = zext i32 %293 to i64
  %295 = getelementptr inbounds [256 x ptr], ptr %4, i64 0, i64 %294
  %296 = load ptr, ptr %295, align 8, !tbaa !42
  %297 = load i8, ptr %296, align 1, !tbaa !24
  %298 = zext i8 %297 to i64
  %299 = getelementptr inbounds i8, ptr %3, i64 %298
  store i8 0, ptr %299, align 1, !tbaa !28
  %.not194.3 = icmp eq i32 %293, 0
  br i1 %.not194.3, label %.unr-lcssa, label %.new309, !llvm.loop !50

.thread201.loopexit:                              ; preds = %186
  store i32 %189, ptr %179, align 8, !tbaa !40
  br label %.thread201

.thread201:                                       ; preds = %254, %.thread201.loopexit, %250
  %.4.ph = phi i32 [ %253, %250 ], [ -1, %.thread201.loopexit ], [ -2, %254 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %4) #4
  br label %.thread

.unr-lcssa:                                       ; preds = %.new309, %.prol.loopexit308
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %4) #4
  %.pre = load ptr, ptr %0, align 8, !tbaa !5
  br label %182

.thread:                                          ; preds = %51, %43, %24, %.thread201, %.thread198
  %.5 = phi i32 [ %161, %.thread198 ], [ %.4.ph, %.thread201 ], [ -2, %51 ], [ %48, %43 ], [ %29, %24 ]
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %3) #4
  ret i32 %.5
}

declare void @Ppmd7_Update1_0(ptr noundef) local_unnamed_addr #2

declare void @Ppmd7_Update1(ptr noundef) local_unnamed_addr #2

declare void @Ppmd7_UpdateBin(ptr noundef) local_unnamed_addr #2

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, !7, i64 0}
!18 = !{!"IPpmd7_RangeDec", !7, i64 0, !7, i64 8, !7, i64 16}
!19 = !{!14, !12, i64 2}
!20 = !{!21, !8, i64 1}
!21 = !{!"", !8, i64 0, !8, i64 1, !12, i64 2, !12, i64 4}
!22 = !{!18, !7, i64 8}
!23 = !{!6, !7, i64 16}
!24 = !{!21, !8, i64 0}
!25 = !{!6, !10, i64 32}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = !{!8, !8, i64 0}
!29 = !{!6, !10, i64 40}
!30 = !{!31, !31, i64 0}
!31 = !{!"long", !8, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.unroll.disable"}
!34 = distinct !{!34, !27}
!35 = !{!14, !10, i64 8}
!36 = !{!6, !10, i64 44}
!37 = !{!18, !7, i64 16}
!38 = !{!12, !12, i64 0}
!39 = !{!6, !10, i64 28}
!40 = !{!6, !10, i64 24}
!41 = distinct !{!41, !27}
!42 = !{!7, !7, i64 0}
!43 = distinct !{!43, !27}
!44 = !{!10, !10, i64 0}
!45 = distinct !{!45, !27}
!46 = !{!11, !8, i64 2}
!47 = !{!11, !8, i64 3}
!48 = !{!11, !12, i64 0}
!49 = distinct !{!49, !33}
!50 = distinct !{!50, !27}


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