; LLVM IR from Farama-Foundation/stable-retro :: cores/gba/src/third-party/lzma (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 i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i8, align 1
  %17 = alloca i32, align 4
  %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 %238

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

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

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

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 4, ptr %14) #3
  store i32 0, ptr %14, align 4, !tbaa !21
  br label %168

168:                                              ; preds = %205, %141
  %169 = load i32, ptr %14, align 4, !tbaa !21
  %170 = zext i32 %169 to i64
  %171 = icmp ult i64 %170, 32
  br i1 %171, label %172, label %208

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

205:                                              ; preds = %172
  %206 = load i32, ptr %14, align 4, !tbaa !21
  %207 = add i32 %206, 8
  store i32 %207, ptr %14, align 4, !tbaa !21
  br label %168, !llvm.loop !34

208:                                              ; preds = %168
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  %209 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %210 = load ptr, ptr %7, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.CPpmd_State, ptr %210, i32 0, i32 0
  %212 = load i8, ptr %211, align 1, !tbaa !26
  %213 = zext i8 %212 to i64
  %214 = getelementptr inbounds i8, ptr %209, i64 %213
  store i8 0, ptr %214, align 1, !tbaa !27
  %215 = load ptr, ptr %4, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.CPpmd7, ptr %215, i32 0, i32 0
  %217 = load ptr, ptr %216, align 8, !tbaa !9
  %218 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %217, i32 0, i32 0
  %219 = load i16, ptr %218, align 4, !tbaa !14
  %220 = zext i16 %219 to i32
  %221 = sub nsw i32 %220, 1
  store i32 %221, ptr %8, align 4, !tbaa !21
  br label %222

222:                                              ; preds = %230, %208
  %223 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %224 = load ptr, ptr %7, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.CPpmd_State, ptr %224, i32 -1
  store ptr %225, ptr %7, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.CPpmd_State, ptr %225, i32 0, i32 0
  %227 = load i8, ptr %226, align 1, !tbaa !26
  %228 = zext i8 %227 to i64
  %229 = getelementptr inbounds i8, ptr %223, i64 %228
  store i8 0, ptr %229, align 1, !tbaa !27
  br label %230

230:                                              ; preds = %222
  %231 = load i32, ptr %8, align 4, !tbaa !21
  %232 = add i32 %231, -1
  store i32 %232, ptr %8, align 4, !tbaa !21
  %233 = icmp ne i32 %232, 0
  br i1 %233, label %222, label %234, !llvm.loop !35

234:                                              ; preds = %230
  store i32 0, ptr %12, align 4
  br label %235

235:                                              ; preds = %234, %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
  %236 = load i32, ptr %12, align 4
  switch i32 %236, label %639 [
    i32 0, label %237
  ]

237:                                              ; preds = %235
  br label %421

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

320:                                              ; preds = %238
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #3
  %321 = load ptr, ptr %15, align 8, !tbaa !5
  %322 = load i16, ptr %321, align 2, !tbaa !39
  %323 = zext i16 %322 to i32
  %324 = add nsw i32 %323, 128
  %325 = load ptr, ptr %15, align 8, !tbaa !5
  %326 = load i16, ptr %325, align 2, !tbaa !39
  %327 = zext i16 %326 to i32
  %328 = add nsw i32 %327, 32
  %329 = ashr i32 %328, 7
  %330 = sub nsw i32 %324, %329
  %331 = trunc i32 %330 to i16
  %332 = load ptr, ptr %15, align 8, !tbaa !5
  store i16 %331, ptr %332, align 2, !tbaa !39
  %333 = load ptr, ptr %4, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.CPpmd7, ptr %333, i32 0, i32 0
  %335 = load ptr, ptr %334, align 8, !tbaa !9
  %336 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %335, i32 0, i32 1
  %337 = load ptr, ptr %4, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct.CPpmd7, ptr %337, i32 0, i32 2
  store ptr %336, ptr %338, align 8, !tbaa !25
  %339 = getelementptr inbounds %struct.CPpmd_State, ptr %336, i32 0, i32 0
  %340 = load i8, ptr %339, align 1, !tbaa !26
  store i8 %340, ptr %16, align 1, !tbaa !27
  %341 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_UpdateBin(ptr noundef %341)
  %342 = load i8, ptr %16, align 1, !tbaa !27
  %343 = zext i8 %342 to i32
  store i32 %343, ptr %3, align 4
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #3
  br label %418

344:                                              ; preds = %238
  %345 = load ptr, ptr %15, align 8, !tbaa !5
  %346 = load i16, ptr %345, align 2, !tbaa !39
  %347 = zext i16 %346 to i32
  %348 = load ptr, ptr %15, align 8, !tbaa !5
  %349 = load i16, ptr %348, align 2, !tbaa !39
  %350 = zext i16 %349 to i32
  %351 = add nsw i32 %350, 32
  %352 = ashr i32 %351, 7
  %353 = sub nsw i32 %347, %352
  %354 = trunc i32 %353 to i16
  %355 = load ptr, ptr %15, align 8, !tbaa !5
  store i16 %354, ptr %355, align 2, !tbaa !39
  %356 = load ptr, ptr %15, align 8, !tbaa !5
  %357 = load i16, ptr %356, align 2, !tbaa !39
  %358 = zext i16 %357 to i32
  %359 = ashr i32 %358, 10
  %360 = sext i32 %359 to i64
  %361 = getelementptr inbounds [16 x i8], ptr @PPMD7_kExpEscape, i64 0, i64 %360
  %362 = load i8, ptr %361, align 1, !tbaa !27
  %363 = zext i8 %362 to i32
  %364 = load ptr, ptr %4, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.CPpmd7, ptr %364, i32 0, i32 4
  store i32 %363, ptr %365, align 4, !tbaa !40
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #3
  store i32 0, ptr %17, align 4, !tbaa !21
  br label %366

366:                                              ; preds = %403, %344
  %367 = load i32, ptr %17, align 4, !tbaa !21
  %368 = zext i32 %367 to i64
  %369 = icmp ult i64 %368, 32
  br i1 %369, label %370, label %406

370:                                              ; preds = %366
  %371 = load i32, ptr %17, align 4, !tbaa !21
  %372 = add i32 %371, 0
  %373 = zext i32 %372 to i64
  %374 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %373
  store i64 -1, ptr %374, align 8, !tbaa !32
  %375 = load i32, ptr %17, align 4, !tbaa !21
  %376 = add i32 %375, 1
  %377 = zext i32 %376 to i64
  %378 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %377
  store i64 -1, ptr %378, align 8, !tbaa !32
  %379 = load i32, ptr %17, align 4, !tbaa !21
  %380 = add i32 %379, 2
  %381 = zext i32 %380 to i64
  %382 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %381
  store i64 -1, ptr %382, align 8, !tbaa !32
  %383 = load i32, ptr %17, align 4, !tbaa !21
  %384 = add i32 %383, 3
  %385 = zext i32 %384 to i64
  %386 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %385
  store i64 -1, ptr %386, align 8, !tbaa !32
  %387 = load i32, ptr %17, align 4, !tbaa !21
  %388 = add i32 %387, 4
  %389 = zext i32 %388 to i64
  %390 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %389
  store i64 -1, ptr %390, align 8, !tbaa !32
  %391 = load i32, ptr %17, align 4, !tbaa !21
  %392 = add i32 %391, 5
  %393 = zext i32 %392 to i64
  %394 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %393
  store i64 -1, ptr %394, align 8, !tbaa !32
  %395 = load i32, ptr %17, align 4, !tbaa !21
  %396 = add i32 %395, 6
  %397 = zext i32 %396 to i64
  %398 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %397
  store i64 -1, ptr %398, align 8, !tbaa !32
  %399 = load i32, ptr %17, align 4, !tbaa !21
  %400 = add i32 %399, 7
  %401 = zext i32 %400 to i64
  %402 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 %401
  store i64 -1, ptr %402, align 8, !tbaa !32
  br label %403

403:                                              ; preds = %370
  %404 = load i32, ptr %17, align 4, !tbaa !21
  %405 = add i32 %404, 8
  store i32 %405, ptr %17, align 4, !tbaa !21
  br label %366, !llvm.loop !41

406:                                              ; preds = %366
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #3
  %407 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %408 = load ptr, ptr %4, align 8, !tbaa !5
  %409 = getelementptr inbounds %struct.CPpmd7, ptr %408, i32 0, i32 0
  %410 = load ptr, ptr %409, align 8, !tbaa !9
  %411 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %410, i32 0, i32 1
  %412 = getelementptr inbounds %struct.CPpmd_State, ptr %411, i32 0, i32 0
  %413 = load i8, ptr %412, align 2, !tbaa !26
  %414 = zext i8 %413 to i64
  %415 = getelementptr inbounds i8, ptr %407, i64 %414
  store i8 0, ptr %415, align 1, !tbaa !27
  %416 = load ptr, ptr %4, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.CPpmd7, ptr %416, i32 0, i32 5
  store i32 0, ptr %417, align 8, !tbaa !28
  store i32 0, ptr %12, align 4
  br label %418

418:                                              ; preds = %406, %320
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  %419 = load i32, ptr %12, align 4
  switch i32 %419, label %639 [
    i32 0, label %420
  ]

420:                                              ; preds = %418
  br label %421

421:                                              ; preds = %420, %237
  br label %422

422:                                              ; preds = %638, %421
  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
  %423 = load ptr, ptr %4, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.CPpmd7, ptr %423, i32 0, i32 0
  %425 = load ptr, ptr %424, align 8, !tbaa !9
  %426 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %425, i32 0, i32 0
  %427 = load i16, ptr %426, align 4, !tbaa !14
  %428 = zext i16 %427 to i32
  store i32 %428, ptr %26, align 4, !tbaa !21
  br label %429

429:                                              ; preds = %454, %422
  %430 = load ptr, ptr %4, align 8, !tbaa !5
  %431 = getelementptr inbounds %struct.CPpmd7, ptr %430, i32 0, i32 3
  %432 = load i32, ptr %431, align 8, !tbaa !42
  %433 = add i32 %432, 1
  store i32 %433, ptr %431, align 8, !tbaa !42
  %434 = load ptr, ptr %4, align 8, !tbaa !5
  %435 = getelementptr inbounds %struct.CPpmd7, ptr %434, i32 0, i32 0
  %436 = load ptr, ptr %435, align 8, !tbaa !9
  %437 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %436, i32 0, i32 3
  %438 = load i32, ptr %437, align 4, !tbaa !36
  %439 = icmp ne i32 %438, 0
  br i1 %439, label %441, label %440

440:                                              ; preds = %429
  store i32 -1, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %636

441:                                              ; preds = %429
  %442 = load ptr, ptr %4, align 8, !tbaa !5
  %443 = getelementptr inbounds %struct.CPpmd7, ptr %442, i32 0, i32 12
  %444 = load ptr, ptr %443, align 8, !tbaa !16
  %445 = load ptr, ptr %4, align 8, !tbaa !5
  %446 = getelementptr inbounds %struct.CPpmd7, ptr %445, i32 0, i32 0
  %447 = load ptr, ptr %446, align 8, !tbaa !9
  %448 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %447, i32 0, i32 3
  %449 = load i32, ptr %448, align 4, !tbaa !36
  %450 = zext i32 %449 to i64
  %451 = getelementptr inbounds i8, ptr %444, i64 %450
  %452 = load ptr, ptr %4, align 8, !tbaa !5
  %453 = getelementptr inbounds %struct.CPpmd7, ptr %452, i32 0, i32 0
  store ptr %451, ptr %453, align 8, !tbaa !9
  br label %454

454:                                              ; preds = %441
  %455 = load ptr, ptr %4, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.CPpmd7, ptr %455, i32 0, i32 0
  %457 = load ptr, ptr %456, align 8, !tbaa !9
  %458 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %457, i32 0, i32 0
  %459 = load i16, ptr %458, align 4, !tbaa !14
  %460 = zext i16 %459 to i32
  %461 = load i32, ptr %26, align 4, !tbaa !21
  %462 = icmp eq i32 %460, %461
  br i1 %462, label %429, label %463, !llvm.loop !43

463:                                              ; preds = %454
  store i32 0, ptr %22, align 4, !tbaa !21
  %464 = load ptr, ptr %4, align 8, !tbaa !5
  %465 = getelementptr inbounds %struct.CPpmd7, ptr %464, i32 0, i32 12
  %466 = load ptr, ptr %465, align 8, !tbaa !16
  %467 = load ptr, ptr %4, align 8, !tbaa !5
  %468 = getelementptr inbounds %struct.CPpmd7, ptr %467, i32 0, i32 0
  %469 = load ptr, ptr %468, align 8, !tbaa !9
  %470 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %469, i32 0, i32 2
  %471 = load i32, ptr %470, align 4, !tbaa !17
  %472 = zext i32 %471 to i64
  %473 = getelementptr inbounds i8, ptr %466, i64 %472
  store ptr %473, ptr %19, align 8, !tbaa !5
  store i32 0, ptr %24, align 4, !tbaa !21
  %474 = load ptr, ptr %4, align 8, !tbaa !5
  %475 = getelementptr inbounds %struct.CPpmd7, ptr %474, i32 0, i32 0
  %476 = load ptr, ptr %475, align 8, !tbaa !9
  %477 = getelementptr inbounds %struct.CPpmd7_Context_, ptr %476, i32 0, i32 0
  %478 = load i16, ptr %477, align 4, !tbaa !14
  %479 = zext i16 %478 to i32
  %480 = load i32, ptr %26, align 4, !tbaa !21
  %481 = sub i32 %479, %480
  store i32 %481, ptr %25, align 4, !tbaa !21
  br label %482

482:                                              ; preds = %507, %463
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #3
  %483 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %484 = load ptr, ptr %19, align 8, !tbaa !5
  %485 = getelementptr inbounds %struct.CPpmd_State, ptr %484, i32 0, i32 0
  %486 = load i8, ptr %485, align 1, !tbaa !26
  %487 = zext i8 %486 to i64
  %488 = getelementptr inbounds i8, ptr %483, i64 %487
  %489 = load i8, ptr %488, align 1, !tbaa !27
  %490 = sext i8 %489 to i32
  store i32 %490, ptr %27, align 4, !tbaa !21
  %491 = load ptr, ptr %19, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.CPpmd_State, ptr %491, i32 0, i32 1
  %493 = load i8, ptr %492, align 1, !tbaa !22
  %494 = zext i8 %493 to i32
  %495 = load i32, ptr %27, align 4, !tbaa !21
  %496 = and i32 %494, %495
  %497 = load i32, ptr %22, align 4, !tbaa !21
  %498 = add i32 %497, %496
  store i32 %498, ptr %22, align 4, !tbaa !21
  %499 = load ptr, ptr %19, align 8, !tbaa !5
  %500 = getelementptr inbounds %struct.CPpmd_State, ptr %499, i32 1
  store ptr %500, ptr %19, align 8, !tbaa !5
  %501 = load i32, ptr %24, align 4, !tbaa !21
  %502 = zext i32 %501 to i64
  %503 = getelementptr inbounds [256 x ptr], ptr %18, i64 0, i64 %502
  store ptr %499, ptr %503, align 8, !tbaa !5
  %504 = load i32, ptr %27, align 4, !tbaa !21
  %505 = load i32, ptr %24, align 4, !tbaa !21
  %506 = sub i32 %505, %504
  store i32 %506, ptr %24, align 4, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #3
  br label %507

507:                                              ; preds = %482
  %508 = load i32, ptr %24, align 4, !tbaa !21
  %509 = load i32, ptr %25, align 4, !tbaa !21
  %510 = icmp ne i32 %508, %509
  br i1 %510, label %482, label %511, !llvm.loop !44

511:                                              ; preds = %507
  %512 = load ptr, ptr %4, align 8, !tbaa !5
  %513 = load i32, ptr %26, align 4, !tbaa !21
  %514 = call ptr @Ppmd7_MakeEscFreq(ptr noundef %512, i32 noundef %513, ptr noundef %20)
  store ptr %514, ptr %23, align 8, !tbaa !5
  %515 = load i32, ptr %22, align 4, !tbaa !21
  %516 = load i32, ptr %20, align 4, !tbaa !21
  %517 = add i32 %516, %515
  store i32 %517, ptr %20, align 4, !tbaa !21
  %518 = load ptr, ptr %5, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %518, i32 0, i32 0
  %520 = load ptr, ptr %519, align 8, !tbaa !18
  %521 = load ptr, ptr %5, align 8, !tbaa !5
  %522 = load i32, ptr %20, align 4, !tbaa !21
  %523 = call i32 %520(ptr noundef %521, i32 noundef %522)
  store i32 %523, ptr %21, align 4, !tbaa !21
  %524 = load i32, ptr %21, align 4, !tbaa !21
  %525 = load i32, ptr %22, align 4, !tbaa !21
  %526 = icmp ult i32 %524, %525
  br i1 %526, label %527, label %598

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

529:                                              ; preds = %540, %527
  %530 = load ptr, ptr %29, align 8, !tbaa !5
  %531 = load ptr, ptr %530, align 8, !tbaa !5
  %532 = getelementptr inbounds %struct.CPpmd_State, ptr %531, i32 0, i32 1
  %533 = load i8, ptr %532, align 1, !tbaa !22
  %534 = zext i8 %533 to i32
  %535 = load i32, ptr %22, align 4, !tbaa !21
  %536 = add i32 %535, %534
  store i32 %536, ptr %22, align 4, !tbaa !21
  %537 = load i32, ptr %21, align 4, !tbaa !21
  %538 = icmp ule i32 %536, %537
  br i1 %538, label %539, label %543

539:                                              ; preds = %529
  br label %540

540:                                              ; preds = %539
  %541 = load ptr, ptr %29, align 8, !tbaa !5
  %542 = getelementptr inbounds ptr, ptr %541, i32 1
  store ptr %542, ptr %29, align 8, !tbaa !5
  br label %529, !llvm.loop !45

543:                                              ; preds = %529
  %544 = load ptr, ptr %29, align 8, !tbaa !5
  %545 = load ptr, ptr %544, align 8, !tbaa !5
  store ptr %545, ptr %19, align 8, !tbaa !5
  %546 = load ptr, ptr %5, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %546, i32 0, i32 1
  %548 = load ptr, ptr %547, align 8, !tbaa !24
  %549 = load ptr, ptr %5, align 8, !tbaa !5
  %550 = load i32, ptr %22, align 4, !tbaa !21
  %551 = load ptr, ptr %19, align 8, !tbaa !5
  %552 = getelementptr inbounds %struct.CPpmd_State, ptr %551, i32 0, i32 1
  %553 = load i8, ptr %552, align 1, !tbaa !22
  %554 = zext i8 %553 to i32
  %555 = sub i32 %550, %554
  %556 = load ptr, ptr %19, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.CPpmd_State, ptr %556, i32 0, i32 1
  %558 = load i8, ptr %557, align 1, !tbaa !22
  %559 = zext i8 %558 to i32
  call void %548(ptr noundef %549, i32 noundef %555, i32 noundef %559)
  %560 = load ptr, ptr %23, align 8, !tbaa !5
  %561 = getelementptr inbounds %struct.CPpmd_See, ptr %560, i32 0, i32 1
  %562 = load i8, ptr %561, align 1, !tbaa !46
  %563 = zext i8 %562 to i32
  %564 = icmp slt i32 %563, 7
  br i1 %564, label %565, label %588

565:                                              ; preds = %543
  %566 = load ptr, ptr %23, align 8, !tbaa !5
  %567 = getelementptr inbounds %struct.CPpmd_See, ptr %566, i32 0, i32 2
  %568 = load i8, ptr %567, align 1, !tbaa !47
  %569 = add i8 %568, -1
  store i8 %569, ptr %567, align 1, !tbaa !47
  %570 = zext i8 %569 to i32
  %571 = icmp eq i32 %570, 0
  br i1 %571, label %572, label %588

572:                                              ; preds = %565
  %573 = load ptr, ptr %23, align 8, !tbaa !5
  %574 = getelementptr inbounds %struct.CPpmd_See, ptr %573, i32 0, i32 0
  %575 = load i16, ptr %574, align 1, !tbaa !48
  %576 = zext i16 %575 to i32
  %577 = shl i32 %576, 1
  %578 = trunc i32 %577 to i16
  store i16 %578, ptr %574, align 1, !tbaa !48
  %579 = load ptr, ptr %23, align 8, !tbaa !5
  %580 = getelementptr inbounds %struct.CPpmd_See, ptr %579, i32 0, i32 1
  %581 = load i8, ptr %580, align 1, !tbaa !46
  %582 = add i8 %581, 1
  store i8 %582, ptr %580, align 1, !tbaa !46
  %583 = zext i8 %581 to i32
  %584 = shl i32 3, %583
  %585 = trunc i32 %584 to i8
  %586 = load ptr, ptr %23, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.CPpmd_See, ptr %586, i32 0, i32 2
  store i8 %585, ptr %587, align 1, !tbaa !47
  br label %588

588:                                              ; preds = %572, %565, %543
  %589 = load ptr, ptr %19, align 8, !tbaa !5
  %590 = load ptr, ptr %4, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.CPpmd7, ptr %590, i32 0, i32 2
  store ptr %589, ptr %591, align 8, !tbaa !25
  %592 = load ptr, ptr %19, align 8, !tbaa !5
  %593 = getelementptr inbounds %struct.CPpmd_State, ptr %592, i32 0, i32 0
  %594 = load i8, ptr %593, align 1, !tbaa !26
  store i8 %594, ptr %28, align 1, !tbaa !27
  %595 = load ptr, ptr %4, align 8, !tbaa !5
  call void @Ppmd7_Update2(ptr noundef %595)
  %596 = load i8, ptr %28, align 1, !tbaa !27
  %597 = zext i8 %596 to i32
  store i32 %597, 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 %636

598:                                              ; preds = %511
  %599 = load i32, ptr %21, align 4, !tbaa !21
  %600 = load i32, ptr %20, align 4, !tbaa !21
  %601 = icmp uge i32 %599, %600
  br i1 %601, label %602, label %603

602:                                              ; preds = %598
  store i32 -2, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %636

603:                                              ; preds = %598
  %604 = load ptr, ptr %5, align 8, !tbaa !5
  %605 = getelementptr inbounds %struct.IPpmd7_RangeDec, ptr %604, i32 0, i32 1
  %606 = load ptr, ptr %605, align 8, !tbaa !24
  %607 = load ptr, ptr %5, align 8, !tbaa !5
  %608 = load i32, ptr %22, align 4, !tbaa !21
  %609 = load i32, ptr %20, align 4, !tbaa !21
  %610 = load i32, ptr %22, align 4, !tbaa !21
  %611 = sub i32 %609, %610
  call void %606(ptr noundef %607, i32 noundef %608, i32 noundef %611)
  %612 = load ptr, ptr %23, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.CPpmd_See, ptr %612, i32 0, i32 0
  %614 = load i16, ptr %613, align 1, !tbaa !48
  %615 = zext i16 %614 to i32
  %616 = load i32, ptr %20, align 4, !tbaa !21
  %617 = add i32 %615, %616
  %618 = trunc i32 %617 to i16
  %619 = load ptr, ptr %23, align 8, !tbaa !5
  %620 = getelementptr inbounds %struct.CPpmd_See, ptr %619, i32 0, i32 0
  store i16 %618, ptr %620, align 1, !tbaa !48
  br label %621

621:                                              ; preds = %632, %603
  %622 = getelementptr inbounds [32 x i64], ptr %6, i64 0, i64 0
  %623 = load i32, ptr %24, align 4, !tbaa !21
  %624 = add i32 %623, -1
  store i32 %624, ptr %24, align 4, !tbaa !21
  %625 = zext i32 %624 to i64
  %626 = getelementptr inbounds [256 x ptr], ptr %18, i64 0, i64 %625
  %627 = load ptr, ptr %626, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.CPpmd_State, ptr %627, i32 0, i32 0
  %629 = load i8, ptr %628, align 1, !tbaa !26
  %630 = zext i8 %629 to i64
  %631 = getelementptr inbounds i8, ptr %622, i64 %630
  store i8 0, ptr %631, align 1, !tbaa !27
  br label %632

632:                                              ; preds = %621
  %633 = load i32, ptr %24, align 4, !tbaa !21
  %634 = icmp ne i32 %633, 0
  br i1 %634, label %621, label %635, !llvm.loop !49

635:                                              ; preds = %632
  store i32 0, ptr %12, align 4
  br label %636

636:                                              ; preds = %635, %602, %588, %440
  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
  %637 = load i32, ptr %12, align 4
  switch i32 %637, label %639 [
    i32 0, label %638
  ]

638:                                              ; preds = %636
  br label %422

639:                                              ; preds = %636, %418, %235
  call void @llvm.lifetime.end.p0(i64 256, ptr %6) #3
  %640 = load i32, ptr %3, align 4
  ret i32 %640
}

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 = !{!"", !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
  %.not190 = icmp eq i32 %50, 0
  br i1 %.not190, 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
  %.not191 = icmp ult i32 %19, %54
  br i1 %.not191, 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
  %.not192.3 = icmp eq i32 %98, 0
  br i1 %.not192.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
  %.not189 = icmp eq i32 %150, 0
  %151 = load i16, ptr %145, align 2, !tbaa !38
  %152 = zext i16 %151 to i32
  br i1 %.not189, label %.thread200, label %162

.thread200:                                       ; 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
  %.not193 = icmp eq i32 %191, 0
  br i1 %.not193, label %.thread203.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
  %.not194 = icmp eq i32 %219, %204
  br i1 %.not194, 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
  %.not197 = icmp ugt i32 %231, %225
  %232 = getelementptr inbounds i8, ptr %.0, i64 8
  br i1 %.not197, 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 %.thread203

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

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
  %xtraiter314 = and i32 %204, 3
  %lcmp.mod315.not = icmp eq i32 %xtraiter314, 0
  br i1 %lcmp.mod315.not, label %.prol.loopexit312, label %.prol.preheader311

.prol.preheader311:                               ; preds = %256, %.prol.preheader311
  %.1164.prol = phi i32 [ %263, %.prol.preheader311 ], [ %204, %256 ]
  %prol.iter316 = phi i32 [ %prol.iter316.next, %.prol.preheader311 ], [ 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.iter316.next = add i32 %prol.iter316, 1
  %prol.iter316.cmp.not = icmp eq i32 %prol.iter316.next, %xtraiter314
  br i1 %prol.iter316.cmp.not, label %.prol.loopexit312, label %.prol.preheader311, !llvm.loop !49

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

.new313:                                          ; preds = %.prol.loopexit312, %.new313
  %.1164 = phi i32 [ %293, %.new313 ], [ %.1164.unr, %.prol.loopexit312 ]
  %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
  %.not196.3 = icmp eq i32 %293, 0
  br i1 %.not196.3, label %.unr-lcssa, label %.new313, !llvm.loop !50

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

.thread203:                                       ; preds = %254, %.thread203.loopexit, %250
  %.4.ph = phi i32 [ %253, %250 ], [ -1, %.thread203.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 = %.new313, %.prol.loopexit312
  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, %.thread203, %.thread200
  %.5 = phi i32 [ %161, %.thread200 ], [ %.4.ph, %.thread203 ], [ -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 = !{!"", !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