; LLVM IR from SSBMTonberry/pocketlzma :: ref_spec/lzma1900/CPP/7zip/Compress (Bcj2Coder)

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

%"class.NCompress::NBcj2::CBaseCoder" = type { [5 x ptr], [5 x i32], [5 x i32] }
%"class.NCompress::NBcj2::CDecoder" = type { %struct.ICompressCoder2, %struct.ICompressSetFinishMode, %struct.ICompressGetInStreamProcessedSize2, %struct.ICompressSetInStream2, %struct.ISequentialInStream, %struct.ICompressSetOutStreamSize, %struct.ICompressSetBufSize, %class.CMyUnknownImp, %"class.NCompress::NBcj2::CBaseCoder", [4 x i32], [4 x i64], [4 x i32], [4 x %class.CMyComPtr.0], i8, i8, i64, i64, %struct.CBcj2Dec }
%struct.ICompressCoder2 = type { %struct.IUnknown }
%struct.IUnknown = type { ptr }
%struct.ICompressSetFinishMode = type { %struct.IUnknown }
%struct.ICompressGetInStreamProcessedSize2 = type { %struct.IUnknown }
%struct.ICompressSetInStream2 = type { %struct.IUnknown }
%struct.ISequentialInStream = type { %struct.IUnknown }
%struct.ICompressSetOutStreamSize = type { %struct.IUnknown }
%struct.ICompressSetBufSize = type { %struct.IUnknown }
%class.CMyUnknownImp = type { i32 }
%class.CMyComPtr.0 = type { ptr }
%struct.CBcj2Dec = type { [4 x ptr], [4 x ptr], ptr, ptr, i32, i32, [4 x i8], i32, i32, [258 x i16] }

; 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: mustprogress uwtable
declare dso_local noundef i32 @_ZN9NCompress5NBcj210CBaseCoder5AllocEb(ptr noundef nonnull align 8 dereferenceable(80), i1 noundef zeroext) #1 align 2

; Function Attrs: nounwind
declare noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef, ptr noundef, i64 noundef) #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN9NCompress5NBcj28CDecoder10InitCommonEv(ptr noundef nonnull align 8 dereferenceable(880)) #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_ZN9NCompress5NBcj28CDecoder4CodeEPKP19ISequentialInStreamPKPKyjPKP20ISequentialOutStreamS9_jP21ICompressProgressInfo(ptr noundef nonnull align 8 dereferenceable(880) %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, ptr noundef %4, ptr noundef %5, i32 noundef %6, ptr noundef %7) unnamed_addr #1 align 2 {
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i32, align 4
  %23 = alloca i64, align 8
  %24 = alloca ptr, align 8
  %25 = alloca i64, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i64, align 8
  %30 = alloca i32, align 4
  %31 = alloca i64, align 8
  %32 = alloca i64, align 8
  %33 = alloca i64, align 8
  %34 = alloca i64, align 8
  %35 = alloca i32, align 4
  %36 = alloca i64, align 8
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca i64, align 8
  store ptr %0, ptr %10, align 8, !tbaa !5
  store ptr %1, ptr %11, align 8, !tbaa !5
  store ptr %2, ptr %12, align 8, !tbaa !5
  store i32 %3, ptr %13, align 4, !tbaa !9
  store ptr %4, ptr %14, align 8, !tbaa !5
  store ptr %5, ptr %15, align 8, !tbaa !5
  store i32 %6, ptr %16, align 4, !tbaa !9
  store ptr %7, ptr %17, align 8, !tbaa !5
  %40 = load ptr, ptr %10, align 8
  %41 = load i32, ptr %13, align 4, !tbaa !9
  %42 = icmp ne i32 %41, 4
  br i1 %42, label %46, label %43

43:                                               ; preds = %8
  %44 = load i32, ptr %16, align 4, !tbaa !9
  %45 = icmp ne i32 %44, 1
  br i1 %45, label %46, label %47

46:                                               ; preds = %43, %8
  store i32 -2147024809, ptr %9, align 4
  br label %596

47:                                               ; preds = %43
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #4
  %48 = getelementptr inbounds i8, ptr %40, i64 64
  %49 = call noundef i32 @_ZN9NCompress5NBcj210CBaseCoder5AllocEb(ptr noundef nonnull align 8 dereferenceable(80) %48, i1 noundef zeroext true)
  store i32 %49, ptr %18, align 4, !tbaa !9
  %50 = load i32, ptr %18, align 4, !tbaa !9
  %51 = icmp ne i32 %50, 0
  br i1 %51, label %52, label %54

52:                                               ; preds = %47
  %53 = load i32, ptr %18, align 4, !tbaa !9
  store i32 %53, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %55

54:                                               ; preds = %47
  store i32 0, ptr %19, align 4
  br label %55

55:                                               ; preds = %54, %52
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #4
  %56 = load i32, ptr %19, align 4
  switch i32 %56, label %598 [
    i32 0, label %57
    i32 1, label %596
  ]

57:                                               ; preds = %55
  call void @_ZN9NCompress5NBcj28CDecoder10InitCommonEv(ptr noundef nonnull align 8 dereferenceable(880) %40)
  %58 = getelementptr inbounds i8, ptr %40, i64 64
  %59 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %58, i32 0, i32 0
  %60 = getelementptr inbounds [5 x ptr], ptr %59, i64 0, i64 4
  %61 = load ptr, ptr %60, align 8, !tbaa !5
  %62 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %63 = getelementptr inbounds %struct.CBcj2Dec, ptr %62, i32 0, i32 2
  store ptr %61, ptr %63, align 8, !tbaa !11
  %64 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %65 = getelementptr inbounds %struct.CBcj2Dec, ptr %64, i32 0, i32 3
  store ptr %61, ptr %65, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  store i64 0, ptr %20, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  store i64 0, ptr %21, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  store i32 0, ptr %22, align 4, !tbaa !9
  br label %66

66:                                               ; preds = %468, %57
  %67 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %68 = call i32 @Bcj2Dec_Decode(ptr noundef %67)
  %69 = icmp ne i32 %68, 0
  br i1 %69, label %70, label %71

70:                                               ; preds = %66
  store i32 1, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %595

71:                                               ; preds = %66
  %72 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %73 = getelementptr inbounds %struct.CBcj2Dec, ptr %72, i32 0, i32 4
  %74 = load i32, ptr %73, align 8, !tbaa !28
  %75 = icmp ult i32 %74, 4
  br i1 %75, label %76, label %325

76:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  %77 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 9
  %78 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %79 = getelementptr inbounds %struct.CBcj2Dec, ptr %78, i32 0, i32 4
  %80 = load i32, ptr %79, align 8, !tbaa !28
  %81 = zext i32 %80 to i64
  %82 = getelementptr inbounds [4 x i32], ptr %77, i64 0, i64 %81
  %83 = load i32, ptr %82, align 4, !tbaa !9
  %84 = zext i32 %83 to i64
  store i64 %84, ptr %23, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  %85 = getelementptr inbounds i8, ptr %40, i64 64
  %86 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %85, i32 0, i32 0
  %87 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %88 = getelementptr inbounds %struct.CBcj2Dec, ptr %87, i32 0, i32 4
  %89 = load i32, ptr %88, align 8, !tbaa !28
  %90 = zext i32 %89 to i64
  %91 = getelementptr inbounds [5 x ptr], ptr %86, i64 0, i64 %90
  %92 = load ptr, ptr %91, align 8, !tbaa !5
  store ptr %92, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  store i64 0, ptr %25, align 8, !tbaa !29
  br label %93

93:                                               ; preds = %113, %76
  %94 = load i64, ptr %25, align 8, !tbaa !29
  %95 = load i64, ptr %23, align 8, !tbaa !29
  %96 = icmp ult i64 %94, %95
  br i1 %96, label %98, label %97

97:                                               ; preds = %93
  store i32 4, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  br label %116

98:                                               ; preds = %93
  %99 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %100 = getelementptr inbounds %struct.CBcj2Dec, ptr %99, i32 0, i32 0
  %101 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %102 = getelementptr inbounds %struct.CBcj2Dec, ptr %101, i32 0, i32 4
  %103 = load i32, ptr %102, align 8, !tbaa !28
  %104 = zext i32 %103 to i64
  %105 = getelementptr inbounds [4 x ptr], ptr %100, i64 0, i64 %104
  %106 = load ptr, ptr %105, align 8, !tbaa !5
  %107 = load i64, ptr %25, align 8, !tbaa !29
  %108 = getelementptr inbounds i8, ptr %106, i64 %107
  %109 = load i8, ptr %108, align 1, !tbaa !31
  %110 = load ptr, ptr %24, align 8, !tbaa !5
  %111 = load i64, ptr %25, align 8, !tbaa !29
  %112 = getelementptr inbounds i8, ptr %110, i64 %111
  store i8 %109, ptr %112, align 1, !tbaa !31
  br label %113

113:                                              ; preds = %98
  %114 = load i64, ptr %25, align 8, !tbaa !29
  %115 = add i64 %114, 1
  store i64 %115, ptr %25, align 8, !tbaa !29
  br label %93, !llvm.loop !32

116:                                              ; preds = %97
  %117 = load ptr, ptr %24, align 8, !tbaa !5
  %118 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %119 = getelementptr inbounds %struct.CBcj2Dec, ptr %118, i32 0, i32 0
  %120 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %121 = getelementptr inbounds %struct.CBcj2Dec, ptr %120, i32 0, i32 4
  %122 = load i32, ptr %121, align 8, !tbaa !28
  %123 = zext i32 %122 to i64
  %124 = getelementptr inbounds [4 x ptr], ptr %119, i64 0, i64 %123
  store ptr %117, ptr %124, align 8, !tbaa !5
  %125 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %126 = getelementptr inbounds %struct.CBcj2Dec, ptr %125, i32 0, i32 1
  %127 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %128 = getelementptr inbounds %struct.CBcj2Dec, ptr %127, i32 0, i32 4
  %129 = load i32, ptr %128, align 8, !tbaa !28
  %130 = zext i32 %129 to i64
  %131 = getelementptr inbounds [4 x ptr], ptr %126, i64 0, i64 %130
  store ptr %117, ptr %131, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  %132 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %133 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %134 = getelementptr inbounds %struct.CBcj2Dec, ptr %133, i32 0, i32 4
  %135 = load i32, ptr %134, align 8, !tbaa !28
  %136 = zext i32 %135 to i64
  %137 = getelementptr inbounds [4 x i32], ptr %132, i64 0, i64 %136
  %138 = load i32, ptr %137, align 4, !tbaa !9
  %139 = icmp ne i32 %138, 0
  br i1 %139, label %140, label %148

140:                                              ; preds = %116
  %141 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %142 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %143 = getelementptr inbounds %struct.CBcj2Dec, ptr %142, i32 0, i32 4
  %144 = load i32, ptr %143, align 8, !tbaa !28
  %145 = zext i32 %144 to i64
  %146 = getelementptr inbounds [4 x i32], ptr %141, i64 0, i64 %145
  %147 = load i32, ptr %146, align 4, !tbaa !9
  store i32 %147, ptr %22, align 4, !tbaa !9
  store i32 2, ptr %19, align 4
  br label %322

148:                                              ; preds = %116
  br label %149

149:                                              ; preds = %230, %148
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  %150 = getelementptr inbounds i8, ptr %40, i64 64
  %151 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %150, i32 0, i32 1
  %152 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %153 = getelementptr inbounds %struct.CBcj2Dec, ptr %152, i32 0, i32 4
  %154 = load i32, ptr %153, align 8, !tbaa !28
  %155 = zext i32 %154 to i64
  %156 = getelementptr inbounds [5 x i32], ptr %151, i64 0, i64 %155
  %157 = load i32, ptr %156, align 4, !tbaa !9
  %158 = load i64, ptr %23, align 8, !tbaa !29
  %159 = trunc i64 %158 to i32
  %160 = sub i32 %157, %159
  store i32 %160, ptr %26, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  %161 = load ptr, ptr %11, align 8, !tbaa !5
  %162 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %163 = getelementptr inbounds %struct.CBcj2Dec, ptr %162, i32 0, i32 4
  %164 = load i32, ptr %163, align 8, !tbaa !28
  %165 = zext i32 %164 to i64
  %166 = getelementptr inbounds ptr, ptr %161, i64 %165
  %167 = load ptr, ptr %166, align 8, !tbaa !5
  %168 = getelementptr inbounds i8, ptr %40, i64 64
  %169 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %168, i32 0, i32 0
  %170 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %171 = getelementptr inbounds %struct.CBcj2Dec, ptr %170, i32 0, i32 4
  %172 = load i32, ptr %171, align 8, !tbaa !28
  %173 = zext i32 %172 to i64
  %174 = getelementptr inbounds [5 x ptr], ptr %169, i64 0, i64 %173
  %175 = load ptr, ptr %174, align 8, !tbaa !5
  %176 = load i64, ptr %23, align 8, !tbaa !29
  %177 = getelementptr inbounds i8, ptr %175, i64 %176
  %178 = load i32, ptr %26, align 4, !tbaa !9
  %179 = load ptr, ptr %167, align 8, !tbaa !34
  %180 = getelementptr inbounds ptr, ptr %179, i64 5
  %181 = load ptr, ptr %180, align 8
  %182 = call noundef i32 %181(ptr noundef nonnull align 8 dereferenceable(8) %167, ptr noundef %177, i32 noundef %178, ptr noundef %26)
  store i32 %182, ptr %27, align 4, !tbaa !9
  %183 = load i32, ptr %27, align 4, !tbaa !9
  %184 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %185 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %186 = getelementptr inbounds %struct.CBcj2Dec, ptr %185, i32 0, i32 4
  %187 = load i32, ptr %186, align 8, !tbaa !28
  %188 = zext i32 %187 to i64
  %189 = getelementptr inbounds [4 x i32], ptr %184, i64 0, i64 %188
  store i32 %183, ptr %189, align 4, !tbaa !9
  %190 = load i32, ptr %26, align 4, !tbaa !9
  %191 = icmp eq i32 %190, 0
  br i1 %191, label %192, label %193

192:                                              ; preds = %149
  store i32 7, ptr %19, align 4
  br label %212

193:                                              ; preds = %149
  %194 = load i32, ptr %26, align 4, !tbaa !9
  %195 = zext i32 %194 to i64
  %196 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 10
  %197 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %198 = getelementptr inbounds %struct.CBcj2Dec, ptr %197, i32 0, i32 4
  %199 = load i32, ptr %198, align 8, !tbaa !28
  %200 = zext i32 %199 to i64
  %201 = getelementptr inbounds [4 x i64], ptr %196, i64 0, i64 %200
  %202 = load i64, ptr %201, align 8, !tbaa !27
  %203 = add i64 %202, %195
  store i64 %203, ptr %201, align 8, !tbaa !27
  %204 = load i32, ptr %26, align 4, !tbaa !9
  %205 = zext i32 %204 to i64
  %206 = load i64, ptr %23, align 8, !tbaa !29
  %207 = add i64 %206, %205
  store i64 %207, ptr %23, align 8, !tbaa !29
  %208 = load i32, ptr %27, align 4, !tbaa !9
  %209 = icmp ne i32 %208, 0
  br i1 %209, label %210, label %211

210:                                              ; preds = %193
  store i32 7, ptr %19, align 4
  br label %212

211:                                              ; preds = %193
  store i32 0, ptr %19, align 4
  br label %212

212:                                              ; preds = %211, %210, %192
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  %213 = load i32, ptr %19, align 4
  switch i32 %213, label %598 [
    i32 0, label %214
    i32 7, label %232
  ]

214:                                              ; preds = %212
  br label %215

215:                                              ; preds = %214
  %216 = load i64, ptr %23, align 8, !tbaa !29
  %217 = icmp ult i64 %216, 4
  br i1 %217, label %218, label %230

218:                                              ; preds = %215
  %219 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %220 = getelementptr inbounds %struct.CBcj2Dec, ptr %219, i32 0, i32 4
  %221 = load i32, ptr %220, align 8, !tbaa !28
  %222 = icmp eq i32 %221, 1
  br i1 %222, label %228, label %223

223:                                              ; preds = %218
  %224 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %225 = getelementptr inbounds %struct.CBcj2Dec, ptr %224, i32 0, i32 4
  %226 = load i32, ptr %225, align 8, !tbaa !28
  %227 = icmp eq i32 %226, 2
  br label %228

228:                                              ; preds = %223, %218
  %229 = phi i1 [ true, %218 ], [ %227, %223 ]
  br label %230

230:                                              ; preds = %228, %215
  %231 = phi i1 [ false, %215 ], [ %229, %228 ]
  br i1 %231, label %149, label %232, !llvm.loop !36

232:                                              ; preds = %230, %212
  %233 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %234 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %235 = getelementptr inbounds %struct.CBcj2Dec, ptr %234, i32 0, i32 4
  %236 = load i32, ptr %235, align 8, !tbaa !28
  %237 = zext i32 %236 to i64
  %238 = getelementptr inbounds [4 x i32], ptr %233, i64 0, i64 %237
  %239 = load i32, ptr %238, align 4, !tbaa !9
  %240 = icmp ne i32 %239, 0
  br i1 %240, label %241, label %249

241:                                              ; preds = %232
  %242 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %243 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %244 = getelementptr inbounds %struct.CBcj2Dec, ptr %243, i32 0, i32 4
  %245 = load i32, ptr %244, align 8, !tbaa !28
  %246 = zext i32 %245 to i64
  %247 = getelementptr inbounds [4 x i32], ptr %242, i64 0, i64 %246
  %248 = load i32, ptr %247, align 4, !tbaa !9
  store i32 %248, ptr %22, align 4, !tbaa !9
  br label %249

249:                                              ; preds = %241, %232
  %250 = load i64, ptr %23, align 8, !tbaa !29
  %251 = icmp eq i64 %250, 0
  br i1 %251, label %252, label %253

252:                                              ; preds = %249
  store i32 2, ptr %19, align 4
  br label %322

253:                                              ; preds = %249
  %254 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %255 = getelementptr inbounds %struct.CBcj2Dec, ptr %254, i32 0, i32 4
  %256 = load i32, ptr %255, align 8, !tbaa !28
  %257 = icmp eq i32 %256, 1
  br i1 %257, label %263, label %258

258:                                              ; preds = %253
  %259 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %260 = getelementptr inbounds %struct.CBcj2Dec, ptr %259, i32 0, i32 4
  %261 = load i32, ptr %260, align 8, !tbaa !28
  %262 = icmp eq i32 %261, 2
  br i1 %262, label %263, label %304

263:                                              ; preds = %258, %253
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  %264 = load i64, ptr %23, align 8, !tbaa !29
  %265 = trunc i64 %264 to i32
  %266 = and i32 %265, 3
  store i32 %266, ptr %28, align 4, !tbaa !9
  %267 = load i32, ptr %28, align 4, !tbaa !9
  %268 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 9
  %269 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %270 = getelementptr inbounds %struct.CBcj2Dec, ptr %269, i32 0, i32 4
  %271 = load i32, ptr %270, align 8, !tbaa !28
  %272 = zext i32 %271 to i64
  %273 = getelementptr inbounds [4 x i32], ptr %268, i64 0, i64 %272
  store i32 %267, ptr %273, align 4, !tbaa !9
  %274 = load i64, ptr %23, align 8, !tbaa !29
  %275 = icmp ult i64 %274, 4
  br i1 %275, label %276, label %296

276:                                              ; preds = %263
  %277 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %278 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %279 = getelementptr inbounds %struct.CBcj2Dec, ptr %278, i32 0, i32 4
  %280 = load i32, ptr %279, align 8, !tbaa !28
  %281 = zext i32 %280 to i64
  %282 = getelementptr inbounds [4 x i32], ptr %277, i64 0, i64 %281
  %283 = load i32, ptr %282, align 4, !tbaa !9
  %284 = icmp ne i32 %283, 0
  br i1 %284, label %285, label %293

285:                                              ; preds = %276
  %286 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 11
  %287 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %288 = getelementptr inbounds %struct.CBcj2Dec, ptr %287, i32 0, i32 4
  %289 = load i32, ptr %288, align 8, !tbaa !28
  %290 = zext i32 %289 to i64
  %291 = getelementptr inbounds [4 x i32], ptr %286, i64 0, i64 %290
  %292 = load i32, ptr %291, align 4, !tbaa !9
  br label %294

293:                                              ; preds = %276
  br label %294

294:                                              ; preds = %293, %285
  %295 = phi i32 [ %292, %285 ], [ 1, %293 ]
  store i32 %295, ptr %22, align 4, !tbaa !9
  store i32 2, ptr %19, align 4
  br label %301

296:                                              ; preds = %263
  %297 = load i32, ptr %28, align 4, !tbaa !9
  %298 = zext i32 %297 to i64
  %299 = load i64, ptr %23, align 8, !tbaa !29
  %300 = sub i64 %299, %298
  store i64 %300, ptr %23, align 8, !tbaa !29
  store i32 0, ptr %19, align 4
  br label %301

301:                                              ; preds = %296, %294
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  %302 = load i32, ptr %19, align 4
  switch i32 %302, label %322 [
    i32 0, label %303
  ]

303:                                              ; preds = %301
  br label %304

304:                                              ; preds = %303, %258
  %305 = getelementptr inbounds i8, ptr %40, i64 64
  %306 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %305, i32 0, i32 0
  %307 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %308 = getelementptr inbounds %struct.CBcj2Dec, ptr %307, i32 0, i32 4
  %309 = load i32, ptr %308, align 8, !tbaa !28
  %310 = zext i32 %309 to i64
  %311 = getelementptr inbounds [5 x ptr], ptr %306, i64 0, i64 %310
  %312 = load ptr, ptr %311, align 8, !tbaa !5
  %313 = load i64, ptr %23, align 8, !tbaa !29
  %314 = getelementptr inbounds i8, ptr %312, i64 %313
  %315 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %316 = getelementptr inbounds %struct.CBcj2Dec, ptr %315, i32 0, i32 1
  %317 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %318 = getelementptr inbounds %struct.CBcj2Dec, ptr %317, i32 0, i32 4
  %319 = load i32, ptr %318, align 8, !tbaa !28
  %320 = zext i32 %319 to i64
  %321 = getelementptr inbounds [4 x ptr], ptr %316, i64 0, i64 %320
  store ptr %314, ptr %321, align 8, !tbaa !5
  store i32 0, ptr %19, align 4
  br label %322

322:                                              ; preds = %304, %301, %252, %140
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  %323 = load i32, ptr %19, align 4
  switch i32 %323, label %598 [
    i32 0, label %324
    i32 2, label %469
  ]

324:                                              ; preds = %322
  br label %409

325:                                              ; preds = %71
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  %326 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %327 = getelementptr inbounds %struct.CBcj2Dec, ptr %326, i32 0, i32 2
  %328 = load ptr, ptr %327, align 8, !tbaa !11
  %329 = getelementptr inbounds i8, ptr %40, i64 64
  %330 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %329, i32 0, i32 0
  %331 = getelementptr inbounds [5 x ptr], ptr %330, i64 0, i64 4
  %332 = load ptr, ptr %331, align 8, !tbaa !5
  %333 = ptrtoint ptr %328 to i64
  %334 = ptrtoint ptr %332 to i64
  %335 = sub i64 %333, %334
  store i64 %335, ptr %29, align 8, !tbaa !29
  %336 = load i64, ptr %29, align 8, !tbaa !29
  %337 = icmp ne i64 %336, 0
  br i1 %337, label %338, label %359

338:                                              ; preds = %325
  %339 = load i64, ptr %29, align 8, !tbaa !29
  %340 = load i64, ptr %20, align 8, !tbaa !27
  %341 = add i64 %340, %339
  store i64 %341, ptr %20, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  %342 = load ptr, ptr %14, align 8, !tbaa !5
  %343 = getelementptr inbounds ptr, ptr %342, i64 0
  %344 = load ptr, ptr %343, align 8, !tbaa !5
  %345 = getelementptr inbounds i8, ptr %40, i64 64
  %346 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %345, i32 0, i32 0
  %347 = getelementptr inbounds [5 x ptr], ptr %346, i64 0, i64 4
  %348 = load ptr, ptr %347, align 8, !tbaa !5
  %349 = load i64, ptr %29, align 8, !tbaa !29
  %350 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %344, ptr noundef %348, i64 noundef %349) #4
  store i32 %350, ptr %30, align 4, !tbaa !9
  %351 = load i32, ptr %30, align 4, !tbaa !9
  %352 = icmp ne i32 %351, 0
  br i1 %352, label %353, label %355

353:                                              ; preds = %338
  %354 = load i32, ptr %30, align 4, !tbaa !9
  store i32 %354, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %356

355:                                              ; preds = %338
  store i32 0, ptr %19, align 4
  br label %356

356:                                              ; preds = %355, %353
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  %357 = load i32, ptr %19, align 4
  switch i32 %357, label %406 [
    i32 0, label %358
  ]

358:                                              ; preds = %356
  br label %359

359:                                              ; preds = %358, %325
  %360 = getelementptr inbounds i8, ptr %40, i64 64
  %361 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %360, i32 0, i32 0
  %362 = getelementptr inbounds [5 x ptr], ptr %361, i64 0, i64 4
  %363 = load ptr, ptr %362, align 8, !tbaa !5
  %364 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %365 = getelementptr inbounds %struct.CBcj2Dec, ptr %364, i32 0, i32 2
  store ptr %363, ptr %365, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %366 = getelementptr inbounds i8, ptr %40, i64 64
  %367 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %366, i32 0, i32 1
  %368 = getelementptr inbounds [5 x i32], ptr %367, i64 0, i64 4
  %369 = load i32, ptr %368, align 8, !tbaa !9
  %370 = zext i32 %369 to i64
  store i64 %370, ptr %31, align 8, !tbaa !29
  %371 = load ptr, ptr %15, align 8, !tbaa !5
  %372 = icmp ne ptr %371, null
  br i1 %372, label %373, label %391

373:                                              ; preds = %359
  %374 = load ptr, ptr %15, align 8, !tbaa !5
  %375 = getelementptr inbounds ptr, ptr %374, i64 0
  %376 = load ptr, ptr %375, align 8, !tbaa !5
  %377 = icmp ne ptr %376, null
  br i1 %377, label %378, label %391

378:                                              ; preds = %373
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %379 = load ptr, ptr %15, align 8, !tbaa !5
  %380 = getelementptr inbounds ptr, ptr %379, i64 0
  %381 = load ptr, ptr %380, align 8, !tbaa !5
  %382 = load i64, ptr %381, align 8, !tbaa !27
  %383 = load i64, ptr %20, align 8, !tbaa !27
  %384 = sub i64 %382, %383
  store i64 %384, ptr %32, align 8, !tbaa !27
  %385 = load i64, ptr %31, align 8, !tbaa !29
  %386 = load i64, ptr %32, align 8, !tbaa !27
  %387 = icmp ugt i64 %385, %386
  br i1 %387, label %388, label %390

388:                                              ; preds = %378
  %389 = load i64, ptr %32, align 8, !tbaa !27
  store i64 %389, ptr %31, align 8, !tbaa !29
  br label %390

390:                                              ; preds = %388, %378
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  br label %391

391:                                              ; preds = %390, %373, %359
  %392 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %393 = getelementptr inbounds %struct.CBcj2Dec, ptr %392, i32 0, i32 2
  %394 = load ptr, ptr %393, align 8, !tbaa !11
  %395 = load i64, ptr %31, align 8, !tbaa !29
  %396 = getelementptr inbounds i8, ptr %394, i64 %395
  %397 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %398 = getelementptr inbounds %struct.CBcj2Dec, ptr %397, i32 0, i32 3
  store ptr %396, ptr %398, align 8, !tbaa !26
  %399 = load i64, ptr %31, align 8, !tbaa !29
  %400 = icmp eq i64 %399, 0
  br i1 %400, label %401, label %402

401:                                              ; preds = %391
  store i32 2, ptr %19, align 4
  br label %403

402:                                              ; preds = %391
  store i32 0, ptr %19, align 4
  br label %403

403:                                              ; preds = %402, %401
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  %404 = load i32, ptr %19, align 4
  switch i32 %404, label %406 [
    i32 0, label %405
  ]

405:                                              ; preds = %403
  store i32 0, ptr %19, align 4
  br label %406

406:                                              ; preds = %405, %403, %356
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  %407 = load i32, ptr %19, align 4
  switch i32 %407, label %595 [
    i32 0, label %408
    i32 2, label %469
  ]

408:                                              ; preds = %406
  br label %409

409:                                              ; preds = %408, %324
  %410 = load ptr, ptr %17, align 8, !tbaa !5
  %411 = icmp ne ptr %410, null
  br i1 %411, label %412, label %468

412:                                              ; preds = %409
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  %413 = load i64, ptr %20, align 8, !tbaa !27
  %414 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %415 = getelementptr inbounds %struct.CBcj2Dec, ptr %414, i32 0, i32 2
  %416 = load ptr, ptr %415, align 8, !tbaa !11
  %417 = getelementptr inbounds i8, ptr %40, i64 64
  %418 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %417, i32 0, i32 0
  %419 = getelementptr inbounds [5 x ptr], ptr %418, i64 0, i64 4
  %420 = load ptr, ptr %419, align 8, !tbaa !5
  %421 = ptrtoint ptr %416 to i64
  %422 = ptrtoint ptr %420 to i64
  %423 = sub i64 %421, %422
  %424 = add i64 %413, %423
  store i64 %424, ptr %33, align 8, !tbaa !27
  %425 = load i64, ptr %33, align 8, !tbaa !27
  %426 = load i64, ptr %21, align 8, !tbaa !27
  %427 = sub i64 %425, %426
  %428 = icmp uge i64 %427, 4194304
  br i1 %428, label %429, label %464

429:                                              ; preds = %412
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #4
  %430 = load i64, ptr %33, align 8, !tbaa !27
  %431 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 10
  %432 = getelementptr inbounds [4 x i64], ptr %431, i64 0, i64 3
  %433 = load i64, ptr %432, align 8, !tbaa !27
  %434 = add i64 %430, %433
  %435 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %436 = getelementptr inbounds %struct.CBcj2Dec, ptr %435, i32 0, i32 1
  %437 = getelementptr inbounds [4 x ptr], ptr %436, i64 0, i64 3
  %438 = load ptr, ptr %437, align 8, !tbaa !5
  %439 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %440 = getelementptr inbounds %struct.CBcj2Dec, ptr %439, i32 0, i32 0
  %441 = getelementptr inbounds [4 x ptr], ptr %440, i64 0, i64 3
  %442 = load ptr, ptr %441, align 8, !tbaa !5
  %443 = ptrtoint ptr %438 to i64
  %444 = ptrtoint ptr %442 to i64
  %445 = sub i64 %443, %444
  %446 = sub i64 %434, %445
  store i64 %446, ptr %34, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  %447 = load ptr, ptr %17, align 8, !tbaa !5
  %448 = load ptr, ptr %447, align 8, !tbaa !34
  %449 = getelementptr inbounds ptr, ptr %448, i64 5
  %450 = load ptr, ptr %449, align 8
  %451 = call noundef i32 %450(ptr noundef nonnull align 8 dereferenceable(8) %447, ptr noundef %34, ptr noundef %33)
  store i32 %451, ptr %35, align 4, !tbaa !9
  %452 = load i32, ptr %35, align 4, !tbaa !9
  %453 = icmp ne i32 %452, 0
  br i1 %453, label %454, label %456

454:                                              ; preds = %429
  %455 = load i32, ptr %35, align 4, !tbaa !9
  store i32 %455, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %457

456:                                              ; preds = %429
  store i32 0, ptr %19, align 4
  br label %457

457:                                              ; preds = %456, %454
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  %458 = load i32, ptr %19, align 4
  switch i32 %458, label %461 [
    i32 0, label %459
  ]

459:                                              ; preds = %457
  %460 = load i64, ptr %33, align 8, !tbaa !27
  store i64 %460, ptr %21, align 8, !tbaa !27
  store i32 0, ptr %19, align 4
  br label %461

461:                                              ; preds = %459, %457
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #4
  %462 = load i32, ptr %19, align 4
  switch i32 %462, label %465 [
    i32 0, label %463
  ]

463:                                              ; preds = %461
  br label %464

464:                                              ; preds = %463, %412
  store i32 0, ptr %19, align 4
  br label %465

465:                                              ; preds = %464, %461
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  %466 = load i32, ptr %19, align 4
  switch i32 %466, label %595 [
    i32 0, label %467
  ]

467:                                              ; preds = %465
  br label %468

468:                                              ; preds = %467, %409
  br label %66, !llvm.loop !37

469:                                              ; preds = %406, %322
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  %470 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %471 = getelementptr inbounds %struct.CBcj2Dec, ptr %470, i32 0, i32 2
  %472 = load ptr, ptr %471, align 8, !tbaa !11
  %473 = getelementptr inbounds i8, ptr %40, i64 64
  %474 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %473, i32 0, i32 0
  %475 = getelementptr inbounds [5 x ptr], ptr %474, i64 0, i64 4
  %476 = load ptr, ptr %475, align 8, !tbaa !5
  %477 = ptrtoint ptr %472 to i64
  %478 = ptrtoint ptr %476 to i64
  %479 = sub i64 %477, %478
  store i64 %479, ptr %36, align 8, !tbaa !29
  %480 = load i64, ptr %36, align 8, !tbaa !29
  %481 = icmp ne i64 %480, 0
  br i1 %481, label %482, label %503

482:                                              ; preds = %469
  %483 = load i64, ptr %36, align 8, !tbaa !29
  %484 = load i64, ptr %20, align 8, !tbaa !27
  %485 = add i64 %484, %483
  store i64 %485, ptr %20, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #4
  %486 = load ptr, ptr %14, align 8, !tbaa !5
  %487 = getelementptr inbounds ptr, ptr %486, i64 0
  %488 = load ptr, ptr %487, align 8, !tbaa !5
  %489 = getelementptr inbounds i8, ptr %40, i64 64
  %490 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %489, i32 0, i32 0
  %491 = getelementptr inbounds [5 x ptr], ptr %490, i64 0, i64 4
  %492 = load ptr, ptr %491, align 8, !tbaa !5
  %493 = load i64, ptr %36, align 8, !tbaa !29
  %494 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %488, ptr noundef %492, i64 noundef %493) #4
  store i32 %494, ptr %37, align 4, !tbaa !9
  %495 = load i32, ptr %37, align 4, !tbaa !9
  %496 = icmp ne i32 %495, 0
  br i1 %496, label %497, label %499

497:                                              ; preds = %482
  %498 = load i32, ptr %37, align 4, !tbaa !9
  store i32 %498, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %500

499:                                              ; preds = %482
  store i32 0, ptr %19, align 4
  br label %500

500:                                              ; preds = %499, %497
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #4
  %501 = load i32, ptr %19, align 4
  switch i32 %501, label %594 [
    i32 0, label %502
  ]

502:                                              ; preds = %500
  br label %503

503:                                              ; preds = %502, %469
  %504 = load i32, ptr %22, align 4, !tbaa !9
  %505 = icmp ne i32 %504, 0
  br i1 %505, label %506, label %508

506:                                              ; preds = %503
  %507 = load i32, ptr %22, align 4, !tbaa !9
  store i32 %507, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %594

508:                                              ; preds = %503
  %509 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 13
  %510 = load i8, ptr %509, align 8, !tbaa !38, !range !39, !noundef !40
  %511 = trunc i8 %510 to i1
  br i1 %511, label %512, label %593

512:                                              ; preds = %508
  %513 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %514 = getelementptr inbounds %struct.CBcj2Dec, ptr %513, i32 0, i32 8
  %515 = load i32, ptr %514, align 8, !tbaa !41
  %516 = icmp eq i32 %515, 0
  br i1 %516, label %518, label %517

517:                                              ; preds = %512
  store i32 1, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %594

518:                                              ; preds = %512
  %519 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %520 = getelementptr inbounds %struct.CBcj2Dec, ptr %519, i32 0, i32 4
  %521 = load i32, ptr %520, align 8, !tbaa !28
  %522 = icmp ne i32 %521, 0
  br i1 %522, label %523, label %529

523:                                              ; preds = %518
  %524 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %525 = getelementptr inbounds %struct.CBcj2Dec, ptr %524, i32 0, i32 4
  %526 = load i32, ptr %525, align 8, !tbaa !28
  %527 = icmp ne i32 %526, 8
  br i1 %527, label %528, label %529

528:                                              ; preds = %523
  store i32 1, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %594

529:                                              ; preds = %523, %518
  %530 = load ptr, ptr %12, align 8, !tbaa !5
  %531 = icmp ne ptr %530, null
  br i1 %531, label %532, label %592

532:                                              ; preds = %529
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #4
  store i32 0, ptr %38, align 4, !tbaa !9
  br label %533

533:                                              ; preds = %586, %532
  %534 = load i32, ptr %38, align 4, !tbaa !9
  %535 = icmp slt i32 %534, 4
  br i1 %535, label %537, label %536

536:                                              ; preds = %533
  store i32 9, ptr %19, align 4
  br label %589

537:                                              ; preds = %533
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  %538 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %539 = getelementptr inbounds %struct.CBcj2Dec, ptr %538, i32 0, i32 1
  %540 = load i32, ptr %38, align 4, !tbaa !9
  %541 = sext i32 %540 to i64
  %542 = getelementptr inbounds [4 x ptr], ptr %539, i64 0, i64 %541
  %543 = load ptr, ptr %542, align 8, !tbaa !5
  %544 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 17
  %545 = getelementptr inbounds %struct.CBcj2Dec, ptr %544, i32 0, i32 0
  %546 = load i32, ptr %38, align 4, !tbaa !9
  %547 = sext i32 %546 to i64
  %548 = getelementptr inbounds [4 x ptr], ptr %545, i64 0, i64 %547
  %549 = load ptr, ptr %548, align 8, !tbaa !5
  %550 = ptrtoint ptr %543 to i64
  %551 = ptrtoint ptr %549 to i64
  %552 = sub i64 %550, %551
  %553 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 9
  %554 = load i32, ptr %38, align 4, !tbaa !9
  %555 = sext i32 %554 to i64
  %556 = getelementptr inbounds [4 x i32], ptr %553, i64 0, i64 %555
  %557 = load i32, ptr %556, align 4, !tbaa !9
  %558 = zext i32 %557 to i64
  %559 = add nsw i64 %552, %558
  store i64 %559, ptr %39, align 8, !tbaa !29
  %560 = load ptr, ptr %12, align 8, !tbaa !5
  %561 = load i32, ptr %38, align 4, !tbaa !9
  %562 = sext i32 %561 to i64
  %563 = getelementptr inbounds ptr, ptr %560, i64 %562
  %564 = load ptr, ptr %563, align 8, !tbaa !5
  %565 = icmp ne ptr %564, null
  br i1 %565, label %566, label %582

566:                                              ; preds = %537
  %567 = load ptr, ptr %12, align 8, !tbaa !5
  %568 = load i32, ptr %38, align 4, !tbaa !9
  %569 = sext i32 %568 to i64
  %570 = getelementptr inbounds ptr, ptr %567, i64 %569
  %571 = load ptr, ptr %570, align 8, !tbaa !5
  %572 = load i64, ptr %571, align 8, !tbaa !27
  %573 = getelementptr inbounds %"class.NCompress::NBcj2::CDecoder", ptr %40, i32 0, i32 10
  %574 = load i32, ptr %38, align 4, !tbaa !9
  %575 = sext i32 %574 to i64
  %576 = getelementptr inbounds [4 x i64], ptr %573, i64 0, i64 %575
  %577 = load i64, ptr %576, align 8, !tbaa !27
  %578 = load i64, ptr %39, align 8, !tbaa !29
  %579 = sub i64 %577, %578
  %580 = icmp ne i64 %572, %579
  br i1 %580, label %581, label %582

581:                                              ; preds = %566
  store i32 1, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %583

582:                                              ; preds = %566, %537
  store i32 0, ptr %19, align 4
  br label %583

583:                                              ; preds = %582, %581
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  %584 = load i32, ptr %19, align 4
  switch i32 %584, label %589 [
    i32 0, label %585
  ]

585:                                              ; preds = %583
  br label %586

586:                                              ; preds = %585
  %587 = load i32, ptr %38, align 4, !tbaa !9
  %588 = add nsw i32 %587, 1
  store i32 %588, ptr %38, align 4, !tbaa !9
  br label %533, !llvm.loop !42

589:                                              ; preds = %583, %536
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #4
  %590 = load i32, ptr %19, align 4
  switch i32 %590, label %594 [
    i32 9, label %591
  ]

591:                                              ; preds = %589
  br label %592

592:                                              ; preds = %591, %529
  br label %593

593:                                              ; preds = %592, %508
  store i32 0, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %594

594:                                              ; preds = %593, %589, %528, %517, %506, %500
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  br label %595

595:                                              ; preds = %594, %465, %406, %70
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #4
  br label %596

596:                                              ; preds = %595, %55, %46
  %597 = load i32, ptr %9, align 4
  ret i32 %597

598:                                              ; preds = %322, %212, %55
  unreachable
}

declare i32 @Bcj2Dec_Decode(ptr noundef) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress 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 = { nounwind "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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 328}
!12 = !{!"_ZTSN9NCompress5NBcj28CDecoderE", !13, i64 0, !15, i64 8, !16, i64 16, !17, i64 24, !18, i64 32, !19, i64 40, !20, i64 48, !21, i64 56, !22, i64 64, !7, i64 144, !7, i64 160, !7, i64 192, !7, i64 208, !23, i64 240, !23, i64 241, !24, i64 248, !24, i64 256, !25, i64 264}
!13 = !{!"_ZTS15ICompressCoder2", !14, i64 0}
!14 = !{!"_ZTS8IUnknown"}
!15 = !{!"_ZTS22ICompressSetFinishMode", !14, i64 0}
!16 = !{!"_ZTS34ICompressGetInStreamProcessedSize2", !14, i64 0}
!17 = !{!"_ZTS21ICompressSetInStream2", !14, i64 0}
!18 = !{!"_ZTS19ISequentialInStream", !14, i64 0}
!19 = !{!"_ZTS25ICompressSetOutStreamSize", !14, i64 0}
!20 = !{!"_ZTS19ICompressSetBufSize", !14, i64 0}
!21 = !{!"_ZTS13CMyUnknownImp", !10, i64 0}
!22 = !{!"_ZTSN9NCompress5NBcj210CBaseCoderE", !7, i64 0, !7, i64 40, !7, i64 60}
!23 = !{!"bool", !7, i64 0}
!24 = !{!"long long", !7, i64 0}
!25 = !{!"_ZTS8CBcj2Dec", !7, i64 0, !7, i64 32, !6, i64 64, !6, i64 72, !10, i64 80, !10, i64 84, !7, i64 88, !10, i64 92, !10, i64 96, !7, i64 100}
!26 = !{!12, !6, i64 336}
!27 = !{!24, !24, i64 0}
!28 = !{!12, !10, i64 344}
!29 = !{!30, !30, i64 0}
!30 = !{!"long", !7, i64 0}
!31 = !{!7, !7, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{!35, !35, i64 0}
!35 = !{!"vtable pointer", !8, i64 0}
!36 = distinct !{!36, !33}
!37 = distinct !{!37, !33}
!38 = !{!12, !23, i64 240}
!39 = !{i8 0, i8 2}
!40 = !{}
!41 = !{!12, !10, i64 360}
!42 = distinct !{!42, !33}


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

; 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: mustprogress uwtable
declare dso_local noundef i32 @_ZN9NCompress5NBcj210CBaseCoder5AllocEb(ptr noundef nonnull align 8 dereferenceable(80), i1 noundef zeroext) local_unnamed_addr #1 align 2

; Function Attrs: nounwind
declare noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN9NCompress5NBcj28CDecoder10InitCommonEv(ptr noundef nonnull align 8 dereferenceable(880)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_ZN9NCompress5NBcj28CDecoder4CodeEPKP19ISequentialInStreamPKPKyjPKP20ISequentialOutStreamS9_jP21ICompressProgressInfo(ptr noundef nonnull align 8 dereferenceable(880) %0, ptr nocapture noundef readonly %1, ptr noundef readonly %2, i32 noundef %3, ptr nocapture noundef readonly %4, ptr noundef readonly %5, i32 noundef %6, ptr noundef %7) unnamed_addr #1 align 2 {
  %9 = alloca i32, align 4
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = icmp ne i32 %3, 4
  %13 = icmp ne i32 %6, 1
  %or.cond = or i1 %12, %13
  br i1 %or.cond, label %.thread194, label %14

14:                                               ; preds = %8
  %15 = getelementptr inbounds i8, ptr %0, i64 64
  %16 = tail call noundef i32 @_ZN9NCompress5NBcj210CBaseCoder5AllocEb(ptr noundef nonnull align 8 dereferenceable(80) %15, i1 noundef zeroext true)
  %.not.not = icmp eq i32 %16, 0
  br i1 %.not.not, label %17, label %.thread194

17:                                               ; preds = %14
  tail call void @_ZN9NCompress5NBcj28CDecoder10InitCommonEv(ptr noundef nonnull align 8 dereferenceable(880) %0)
  %18 = getelementptr inbounds i8, ptr %0, i64 96
  %19 = load ptr, ptr %18, align 8, !tbaa !5
  %20 = getelementptr inbounds i8, ptr %0, i64 264
  %21 = getelementptr inbounds i8, ptr %0, i64 328
  store ptr %19, ptr %21, align 8, !tbaa !9
  %22 = getelementptr inbounds i8, ptr %0, i64 336
  store ptr %19, ptr %22, align 8, !tbaa !25
  %23 = tail call i32 @Bcj2Dec_Decode(ptr noundef nonnull %20)
  %.not151226 = icmp eq i32 %23, 0
  br i1 %.not151226, label %.lr.ph231, label %.thread194

.lr.ph231:                                        ; preds = %17
  %24 = getelementptr inbounds i8, ptr %0, i64 344
  %25 = getelementptr inbounds i8, ptr %0, i64 120
  %.not154 = icmp eq ptr %5, null
  %26 = getelementptr inbounds i8, ptr %0, i64 144
  %27 = getelementptr inbounds i8, ptr %0, i64 296
  %28 = getelementptr inbounds i8, ptr %0, i64 192
  %29 = getelementptr inbounds i8, ptr %0, i64 104
  %30 = getelementptr inbounds i8, ptr %0, i64 160
  %.not168 = icmp eq ptr %7, null
  %31 = getelementptr inbounds i8, ptr %0, i64 184
  %32 = getelementptr inbounds i8, ptr %0, i64 320
  %33 = getelementptr inbounds i8, ptr %0, i64 288
  br label %34

34:                                               ; preds = %.lr.ph231, %184
  %.0107229 = phi i64 [ 0, %.lr.ph231 ], [ %.3110, %184 ]
  %.0112228 = phi i64 [ 0, %.lr.ph231 ], [ %.4116, %184 ]
  %.0117227 = phi i32 [ 0, %.lr.ph231 ], [ %.5122, %184 ]
  %35 = load i32, ptr %24, align 8, !tbaa !26
  %36 = icmp ult i32 %35, 4
  br i1 %36, label %37, label %140

37:                                               ; preds = %34
  %38 = zext nneg i32 %35 to i64
  %39 = getelementptr inbounds [4 x i32], ptr %26, i64 0, i64 %38
  %40 = load i32, ptr %39, align 4, !tbaa !27
  %41 = zext i32 %40 to i64
  %42 = getelementptr inbounds [5 x ptr], ptr %15, i64 0, i64 %38
  %43 = load ptr, ptr %42, align 8, !tbaa !5
  %.not = icmp eq i32 %40, 0
  br i1 %.not, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %37
  %xtraiter = and i64 %41, 3
  %44 = icmp ult i32 %40, 4
  br i1 %44, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.preheader.new

.lr.ph.preheader.new:                             ; preds = %.lr.ph.preheader
  %unroll_iter = and i64 %41, 4294967292
  br label %.lr.ph

._crit_edge.loopexit.unr-lcssa:                   ; preds = %.lr.ph, %.lr.ph.preheader
  %.0130225.unr = phi i64 [ 0, %.lr.ph.preheader ], [ %89, %.lr.ph ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge.loopexit, label %.lr.ph.epil

.lr.ph.epil:                                      ; preds = %._crit_edge.loopexit.unr-lcssa, %.lr.ph.epil
  %.0130225.epil = phi i64 [ %52, %.lr.ph.epil ], [ %.0130225.unr, %._crit_edge.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph.epil ], [ 0, %._crit_edge.loopexit.unr-lcssa ]
  %45 = load i32, ptr %24, align 8, !tbaa !26
  %46 = zext i32 %45 to i64
  %47 = getelementptr inbounds [4 x ptr], ptr %20, i64 0, i64 %46
  %48 = load ptr, ptr %47, align 8, !tbaa !5
  %49 = getelementptr inbounds i8, ptr %48, i64 %.0130225.epil
  %50 = load i8, ptr %49, align 1, !tbaa !28
  %51 = getelementptr inbounds i8, ptr %43, i64 %.0130225.epil
  store i8 %50, ptr %51, align 1, !tbaa !28
  %52 = add nuw nsw i64 %.0130225.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge.loopexit, label %.lr.ph.epil, !llvm.loop !29

._crit_edge.loopexit:                             ; preds = %.lr.ph.epil, %._crit_edge.loopexit.unr-lcssa
  %.pre243 = load i32, ptr %24, align 8, !tbaa !26
  %.pre246 = zext i32 %.pre243 to i64
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %37
  %.pre-phi = phi i64 [ %.pre246, %._crit_edge.loopexit ], [ %38, %37 ]
  %53 = phi i32 [ %.pre243, %._crit_edge.loopexit ], [ %35, %37 ]
  %54 = getelementptr inbounds [4 x ptr], ptr %20, i64 0, i64 %.pre-phi
  store ptr %43, ptr %54, align 8, !tbaa !5
  %55 = getelementptr inbounds [4 x ptr], ptr %27, i64 0, i64 %.pre-phi
  store ptr %43, ptr %55, align 8, !tbaa !5
  %56 = getelementptr inbounds [4 x i32], ptr %28, i64 0, i64 %.pre-phi
  %57 = load i32, ptr %56, align 4, !tbaa !27
  %.not156 = icmp eq i32 %57, 0
  br i1 %.not156, label %.critedge11, label %.thread190

.lr.ph:                                           ; preds = %.lr.ph, %.lr.ph.preheader.new
  %.0130225 = phi i64 [ 0, %.lr.ph.preheader.new ], [ %89, %.lr.ph ]
  %niter = phi i64 [ 0, %.lr.ph.preheader.new ], [ %niter.next.3, %.lr.ph ]
  %58 = load i32, ptr %24, align 8, !tbaa !26
  %59 = zext i32 %58 to i64
  %60 = getelementptr inbounds [4 x ptr], ptr %20, i64 0, i64 %59
  %61 = load ptr, ptr %60, align 8, !tbaa !5
  %62 = getelementptr inbounds i8, ptr %61, i64 %.0130225
  %63 = load i8, ptr %62, align 1, !tbaa !28
  %64 = getelementptr inbounds i8, ptr %43, i64 %.0130225
  store i8 %63, ptr %64, align 1, !tbaa !28
  %65 = or disjoint i64 %.0130225, 1
  %66 = load i32, ptr %24, align 8, !tbaa !26
  %67 = zext i32 %66 to i64
  %68 = getelementptr inbounds [4 x ptr], ptr %20, i64 0, i64 %67
  %69 = load ptr, ptr %68, align 8, !tbaa !5
  %70 = getelementptr inbounds i8, ptr %69, i64 %65
  %71 = load i8, ptr %70, align 1, !tbaa !28
  %72 = getelementptr inbounds i8, ptr %43, i64 %65
  store i8 %71, ptr %72, align 1, !tbaa !28
  %73 = or disjoint i64 %.0130225, 2
  %74 = load i32, ptr %24, align 8, !tbaa !26
  %75 = zext i32 %74 to i64
  %76 = getelementptr inbounds [4 x ptr], ptr %20, i64 0, i64 %75
  %77 = load ptr, ptr %76, align 8, !tbaa !5
  %78 = getelementptr inbounds i8, ptr %77, i64 %73
  %79 = load i8, ptr %78, align 1, !tbaa !28
  %80 = getelementptr inbounds i8, ptr %43, i64 %73
  store i8 %79, ptr %80, align 1, !tbaa !28
  %81 = or disjoint i64 %.0130225, 3
  %82 = load i32, ptr %24, align 8, !tbaa !26
  %83 = zext i32 %82 to i64
  %84 = getelementptr inbounds [4 x ptr], ptr %20, i64 0, i64 %83
  %85 = load ptr, ptr %84, align 8, !tbaa !5
  %86 = getelementptr inbounds i8, ptr %85, i64 %81
  %87 = load i8, ptr %86, align 1, !tbaa !28
  %88 = getelementptr inbounds i8, ptr %43, i64 %81
  store i8 %87, ptr %88, align 1, !tbaa !28
  %89 = add nuw nsw i64 %.0130225, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph, !llvm.loop !31

.critedge11:                                      ; preds = %._crit_edge, %110
  %90 = phi i32 [ %112, %110 ], [ %53, %._crit_edge ]
  %.0126 = phi i64 [ %117, %110 ], [ %41, %._crit_edge ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #5
  %91 = zext i32 %90 to i64
  %92 = getelementptr inbounds [5 x i32], ptr %29, i64 0, i64 %91
  %93 = load i32, ptr %92, align 4, !tbaa !27
  %94 = trunc i64 %.0126 to i32
  %95 = sub i32 %93, %94
  store i32 %95, ptr %9, align 4, !tbaa !27
  %96 = getelementptr inbounds ptr, ptr %1, i64 %91
  %97 = load ptr, ptr %96, align 8, !tbaa !5
  %98 = getelementptr inbounds [5 x ptr], ptr %15, i64 0, i64 %91
  %99 = load ptr, ptr %98, align 8, !tbaa !5
  %100 = getelementptr inbounds i8, ptr %99, i64 %.0126
  %101 = load ptr, ptr %97, align 8, !tbaa !33
  %102 = getelementptr inbounds i8, ptr %101, i64 40
  %103 = load ptr, ptr %102, align 8
  %104 = call noundef i32 %103(ptr noundef nonnull align 8 dereferenceable(8) %97, ptr noundef %100, i32 noundef %95, ptr noundef nonnull %9)
  %105 = load i32, ptr %24, align 8, !tbaa !26
  %106 = zext i32 %105 to i64
  %107 = getelementptr inbounds [4 x i32], ptr %28, i64 0, i64 %106
  store i32 %104, ptr %107, align 4, !tbaa !27
  %108 = load i32, ptr %9, align 4, !tbaa !27
  %109 = icmp eq i32 %108, 0
  br i1 %109, label %.thread, label %110

.thread:                                          ; preds = %.critedge11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #5
  %.pre244 = load i32, ptr %24, align 8, !tbaa !26
  %.pre247 = zext i32 %.pre244 to i64
  br label %.critedge

110:                                              ; preds = %.critedge11
  %111 = zext i32 %108 to i64
  %112 = load i32, ptr %24, align 8, !tbaa !26
  %113 = zext i32 %112 to i64
  %114 = getelementptr inbounds [4 x i64], ptr %30, i64 0, i64 %113
  %115 = load i64, ptr %114, align 8, !tbaa !35
  %116 = add i64 %115, %111
  store i64 %116, ptr %114, align 8, !tbaa !35
  %117 = add i64 %.0126, %111
  %.not157 = icmp eq i32 %104, 0
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #5
  %118 = icmp ult i64 %117, 4
  %or.cond170 = and i1 %.not157, %118
  %.off = add i32 %112, -1
  %switch177 = icmp ult i32 %.off, 2
  %or.cond254 = and i1 %or.cond170, %switch177
  br i1 %or.cond254, label %.critedge11, label %.critedge

.critedge:                                        ; preds = %110, %.thread
  %.pre-phi248 = phi i64 [ %.pre247, %.thread ], [ %113, %110 ]
  %119 = phi i32 [ %.pre244, %.thread ], [ %112, %110 ]
  %.1127185 = phi i64 [ %.0126, %.thread ], [ %117, %110 ]
  %120 = getelementptr inbounds [4 x i32], ptr %28, i64 0, i64 %.pre-phi248
  %121 = load i32, ptr %120, align 4, !tbaa !27
  %.not158 = icmp eq i32 %121, 0
  %spec.select = select i1 %.not158, i32 %.0117227, i32 %121
  %122 = icmp eq i64 %.1127185, 0
  br i1 %122, label %.thread190, label %123

123:                                              ; preds = %.critedge
  %.off178 = add i32 %119, -1
  %switch179 = icmp ult i32 %.off178, 2
  br i1 %switch179, label %124, label %135

124:                                              ; preds = %123
  %125 = trunc i64 %.1127185 to i32
  %126 = and i32 %125, 3
  %127 = getelementptr inbounds [4 x i32], ptr %26, i64 0, i64 %.pre-phi248
  store i32 %126, ptr %127, align 4, !tbaa !27
  %128 = icmp ugt i64 %.1127185, 3
  br i1 %128, label %.thread186, label %130

.thread186:                                       ; preds = %124
  %129 = and i64 %.1127185, -4
  %.pre245 = load i32, ptr %24, align 8, !tbaa !26
  %.pre249 = zext i32 %.pre245 to i64
  br label %135

130:                                              ; preds = %124
  %131 = load i32, ptr %24, align 8, !tbaa !26
  %132 = zext i32 %131 to i64
  %133 = getelementptr inbounds [4 x i32], ptr %28, i64 0, i64 %132
  %134 = load i32, ptr %133, align 4, !tbaa !27
  %spec.select171 = call i32 @llvm.umax.i32(i32 %134, i32 1)
  br label %.thread190

135:                                              ; preds = %123, %.thread186
  %.pre-phi250 = phi i64 [ %.pre-phi248, %123 ], [ %.pre249, %.thread186 ]
  %.3129 = phi i64 [ %.1127185, %123 ], [ %129, %.thread186 ]
  %136 = getelementptr inbounds [5 x ptr], ptr %15, i64 0, i64 %.pre-phi250
  %137 = load ptr, ptr %136, align 8, !tbaa !5
  %138 = getelementptr inbounds i8, ptr %137, i64 %.3129
  %139 = getelementptr inbounds [4 x ptr], ptr %27, i64 0, i64 %.pre-phi250
  store ptr %138, ptr %139, align 8, !tbaa !5
  br label %.thread198

140:                                              ; preds = %34
  %141 = load ptr, ptr %21, align 8, !tbaa !9
  %142 = load ptr, ptr %18, align 8, !tbaa !5
  %.not152 = icmp eq ptr %141, %142
  br i1 %.not152, label %150, label %143

143:                                              ; preds = %140
  %144 = ptrtoint ptr %142 to i64
  %145 = ptrtoint ptr %141 to i64
  %146 = sub i64 %145, %144
  %147 = load ptr, ptr %4, align 8, !tbaa !5
  %148 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %147, ptr noundef %142, i64 noundef %146) #5
  %.not153 = icmp eq i32 %148, 0
  br i1 %.not153, label %._crit_edge242, label %.thread194

._crit_edge242:                                   ; preds = %143
  %149 = add i64 %146, %.0107229
  %.pre = load ptr, ptr %18, align 8, !tbaa !5
  br label %150

150:                                              ; preds = %._crit_edge242, %140
  %151 = phi ptr [ %.pre, %._crit_edge242 ], [ %142, %140 ]
  %.1108 = phi i64 [ %149, %._crit_edge242 ], [ %.0107229, %140 ]
  store ptr %151, ptr %21, align 8, !tbaa !9
  %152 = load i32, ptr %25, align 8, !tbaa !27
  %153 = zext i32 %152 to i64
  br i1 %.not154, label %159, label %154

154:                                              ; preds = %150
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  %.not155 = icmp eq ptr %155, null
  br i1 %.not155, label %159, label %156

156:                                              ; preds = %154
  %157 = load i64, ptr %155, align 8, !tbaa !35
  %158 = sub i64 %157, %.1108
  %spec.select174 = call i64 @llvm.umin.i64(i64 %158, i64 %153)
  br label %159

159:                                              ; preds = %156, %154, %150
  %.1125 = phi i64 [ %spec.select174, %156 ], [ %153, %154 ], [ %153, %150 ]
  %160 = getelementptr inbounds i8, ptr %151, i64 %.1125
  store ptr %160, ptr %22, align 8, !tbaa !25
  %161 = icmp eq i64 %.1125, 0
  br i1 %161, label %.thread190, label %.thread198

.thread198:                                       ; preds = %159, %135
  %.5122 = phi i32 [ %spec.select, %135 ], [ %.0117227, %159 ]
  %.3110 = phi i64 [ %.0107229, %135 ], [ %.1108, %159 ]
  br i1 %.not168, label %184, label %162

162:                                              ; preds = %.thread198
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #5
  %163 = load ptr, ptr %21, align 8, !tbaa !9
  %164 = load ptr, ptr %18, align 8, !tbaa !5
  %165 = ptrtoint ptr %163 to i64
  %166 = ptrtoint ptr %164 to i64
  %167 = sub i64 %165, %166
  %168 = add i64 %167, %.3110
  store i64 %168, ptr %10, align 8, !tbaa !35
  %169 = sub i64 %168, %.0112228
  %170 = icmp ugt i64 %169, 4194303
  br i1 %170, label %171, label %.thread202

.thread202:                                       ; preds = %162
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #5
  br label %184

171:                                              ; preds = %162
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #5
  %172 = load i64, ptr %31, align 8, !tbaa !35
  %173 = load ptr, ptr %32, align 8, !tbaa !5
  %174 = load ptr, ptr %33, align 8, !tbaa !5
  %175 = ptrtoint ptr %173 to i64
  %176 = ptrtoint ptr %174 to i64
  %.neg = add i64 %172, %168
  %177 = sub i64 %.neg, %175
  %178 = add i64 %177, %176
  store i64 %178, ptr %11, align 8, !tbaa !35
  %179 = load ptr, ptr %7, align 8, !tbaa !33
  %180 = getelementptr inbounds i8, ptr %179, i64 40
  %181 = load ptr, ptr %180, align 8
  %182 = call noundef i32 %181(ptr noundef nonnull align 8 dereferenceable(8) %7, ptr noundef nonnull %11, ptr noundef nonnull %10)
  %.not169 = icmp eq i32 %182, 0
  %183 = load i64, ptr %10, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #5
  br i1 %.not169, label %184, label %.thread194

184:                                              ; preds = %.thread202, %171, %.thread198
  %.4116 = phi i64 [ %183, %171 ], [ %.0112228, %.thread198 ], [ %.0112228, %.thread202 ]
  %185 = call i32 @Bcj2Dec_Decode(ptr noundef nonnull %20)
  %.not151 = icmp eq i32 %185, 0
  br i1 %.not151, label %34, label %.thread194, !llvm.loop !36

.thread190:                                       ; preds = %.critedge, %._crit_edge, %159, %130
  %.6123 = phi i32 [ %spec.select171, %130 ], [ %57, %._crit_edge ], [ %spec.select, %.critedge ], [ %.0117227, %159 ]
  %186 = load ptr, ptr %21, align 8, !tbaa !9
  %187 = load ptr, ptr %18, align 8, !tbaa !5
  %.not160 = icmp eq ptr %186, %187
  br i1 %.not160, label %194, label %188

188:                                              ; preds = %.thread190
  %189 = ptrtoint ptr %187 to i64
  %190 = ptrtoint ptr %186 to i64
  %191 = sub i64 %190, %189
  %192 = load ptr, ptr %4, align 8, !tbaa !5
  %193 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %192, ptr noundef %187, i64 noundef %191) #5
  %.not161 = icmp eq i32 %193, 0
  br i1 %.not161, label %194, label %.thread194

194:                                              ; preds = %188, %.thread190
  %.not162 = icmp eq i32 %.6123, 0
  br i1 %.not162, label %195, label %.thread194

195:                                              ; preds = %194
  %196 = getelementptr inbounds i8, ptr %0, i64 240
  %197 = load i8, ptr %196, align 8, !tbaa !37, !range !38, !noundef !39
  %198 = trunc nuw i8 %197 to i1
  br i1 %198, label %199, label %.thread194

199:                                              ; preds = %195
  %200 = getelementptr inbounds i8, ptr %0, i64 360
  %201 = load i32, ptr %200, align 8, !tbaa !40
  %202 = icmp eq i32 %201, 0
  br i1 %202, label %203, label %.thread194

203:                                              ; preds = %199
  %204 = load i32, ptr %24, align 8, !tbaa !26
  switch i32 %204, label %.thread194 [
    i32 0, label %205
    i32 8, label %205
  ]

205:                                              ; preds = %203, %203
  %.not165 = icmp eq ptr %2, null
  br i1 %.not165, label %.thread194, label %.preheader

.preheader:                                       ; preds = %205
  %206 = load ptr, ptr %2, align 8, !tbaa !5
  %.not166 = icmp eq ptr %206, null
  br i1 %.not166, label %218, label %207

207:                                              ; preds = %.preheader
  %208 = load ptr, ptr %27, align 8, !tbaa !5
  %209 = ptrtoint ptr %208 to i64
  %210 = load ptr, ptr %20, align 8, !tbaa !5
  %211 = ptrtoint ptr %210 to i64
  %212 = load i32, ptr %26, align 8, !tbaa !27
  %213 = zext i32 %212 to i64
  %214 = load i64, ptr %206, align 8, !tbaa !35
  %215 = load i64, ptr %30, align 8, !tbaa !35
  %216 = add i64 %209, %213
  %.neg218 = sub i64 %211, %216
  %217 = add i64 %.neg218, %215
  %.not167 = icmp eq i64 %214, %217
  br i1 %.not167, label %218, label %.thread194

218:                                              ; preds = %.preheader, %207
  %219 = getelementptr inbounds i8, ptr %2, i64 8
  %220 = load ptr, ptr %219, align 8, !tbaa !5
  %.not166.1 = icmp eq ptr %220, null
  br i1 %.not166.1, label %236, label %221

221:                                              ; preds = %218
  %222 = getelementptr inbounds i8, ptr %0, i64 304
  %223 = load ptr, ptr %222, align 8, !tbaa !5
  %224 = ptrtoint ptr %223 to i64
  %225 = getelementptr inbounds i8, ptr %0, i64 272
  %226 = load ptr, ptr %225, align 8, !tbaa !5
  %227 = ptrtoint ptr %226 to i64
  %228 = getelementptr inbounds i8, ptr %0, i64 148
  %229 = load i32, ptr %228, align 4, !tbaa !27
  %230 = zext i32 %229 to i64
  %231 = load i64, ptr %220, align 8, !tbaa !35
  %232 = getelementptr inbounds i8, ptr %0, i64 168
  %233 = load i64, ptr %232, align 8, !tbaa !35
  %234 = add i64 %224, %230
  %.neg218.1 = sub i64 %227, %234
  %235 = add i64 %.neg218.1, %233
  %.not167.1 = icmp eq i64 %231, %235
  br i1 %.not167.1, label %236, label %.thread194

236:                                              ; preds = %221, %218
  %237 = getelementptr inbounds i8, ptr %2, i64 16
  %238 = load ptr, ptr %237, align 8, !tbaa !5
  %.not166.2 = icmp eq ptr %238, null
  br i1 %.not166.2, label %254, label %239

239:                                              ; preds = %236
  %240 = getelementptr inbounds i8, ptr %0, i64 312
  %241 = load ptr, ptr %240, align 8, !tbaa !5
  %242 = ptrtoint ptr %241 to i64
  %243 = getelementptr inbounds i8, ptr %0, i64 280
  %244 = load ptr, ptr %243, align 8, !tbaa !5
  %245 = ptrtoint ptr %244 to i64
  %246 = getelementptr inbounds i8, ptr %0, i64 152
  %247 = load i32, ptr %246, align 8, !tbaa !27
  %248 = zext i32 %247 to i64
  %249 = load i64, ptr %238, align 8, !tbaa !35
  %250 = getelementptr inbounds i8, ptr %0, i64 176
  %251 = load i64, ptr %250, align 8, !tbaa !35
  %252 = add i64 %242, %248
  %.neg218.2 = sub i64 %245, %252
  %253 = add i64 %.neg218.2, %251
  %.not167.2 = icmp eq i64 %249, %253
  br i1 %.not167.2, label %254, label %.thread194

254:                                              ; preds = %239, %236
  %255 = getelementptr inbounds i8, ptr %2, i64 24
  %256 = load ptr, ptr %255, align 8, !tbaa !5
  %.not166.3 = icmp eq ptr %256, null
  br i1 %.not166.3, label %272, label %257

257:                                              ; preds = %254
  %258 = getelementptr inbounds i8, ptr %0, i64 320
  %259 = load ptr, ptr %258, align 8, !tbaa !5
  %260 = ptrtoint ptr %259 to i64
  %261 = getelementptr inbounds i8, ptr %0, i64 288
  %262 = load ptr, ptr %261, align 8, !tbaa !5
  %263 = ptrtoint ptr %262 to i64
  %264 = getelementptr inbounds i8, ptr %0, i64 156
  %265 = load i32, ptr %264, align 4, !tbaa !27
  %266 = zext i32 %265 to i64
  %267 = load i64, ptr %256, align 8, !tbaa !35
  %268 = getelementptr inbounds i8, ptr %0, i64 184
  %269 = load i64, ptr %268, align 8, !tbaa !35
  %270 = add i64 %260, %266
  %.neg218.3 = sub i64 %263, %270
  %271 = add i64 %.neg218.3, %269
  %.not167.3 = icmp eq i64 %267, %271
  br i1 %.not167.3, label %272, label %.thread194

272:                                              ; preds = %257, %254
  br label %.thread194

.thread194:                                       ; preds = %184, %171, %143, %207, %221, %239, %257, %272, %17, %195, %205, %14, %203, %199, %194, %188, %8
  %.18 = phi i32 [ %16, %14 ], [ -2147024809, %8 ], [ %193, %188 ], [ %.6123, %194 ], [ 1, %199 ], [ 1, %203 ], [ 0, %205 ], [ 0, %195 ], [ 1, %17 ], [ 1, %207 ], [ 1, %221 ], [ 1, %239 ], [ 1, %257 ], [ 0, %272 ], [ 1, %184 ], [ %182, %171 ], [ %148, %143 ]
  ret i32 %.18
}

declare i32 @Bcj2Dec_Decode(ptr noundef) local_unnamed_addr #3

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress 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 = { nounwind "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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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++ TBAA"}
!9 = !{!10, !6, i64 328}
!10 = !{!"_ZTSN9NCompress5NBcj28CDecoderE", !11, i64 0, !13, i64 8, !14, i64 16, !15, i64 24, !16, i64 32, !17, i64 40, !18, i64 48, !19, i64 56, !21, i64 64, !7, i64 144, !7, i64 160, !7, i64 192, !7, i64 208, !22, i64 240, !22, i64 241, !23, i64 248, !23, i64 256, !24, i64 264}
!11 = !{!"_ZTS15ICompressCoder2", !12, i64 0}
!12 = !{!"_ZTS8IUnknown"}
!13 = !{!"_ZTS22ICompressSetFinishMode", !12, i64 0}
!14 = !{!"_ZTS34ICompressGetInStreamProcessedSize2", !12, i64 0}
!15 = !{!"_ZTS21ICompressSetInStream2", !12, i64 0}
!16 = !{!"_ZTS19ISequentialInStream", !12, i64 0}
!17 = !{!"_ZTS25ICompressSetOutStreamSize", !12, i64 0}
!18 = !{!"_ZTS19ICompressSetBufSize", !12, i64 0}
!19 = !{!"_ZTS13CMyUnknownImp", !20, i64 0}
!20 = !{!"int", !7, i64 0}
!21 = !{!"_ZTSN9NCompress5NBcj210CBaseCoderE", !7, i64 0, !7, i64 40, !7, i64 60}
!22 = !{!"bool", !7, i64 0}
!23 = !{!"long long", !7, i64 0}
!24 = !{!"_ZTS8CBcj2Dec", !7, i64 0, !7, i64 32, !6, i64 64, !6, i64 72, !20, i64 80, !20, i64 84, !7, i64 88, !20, i64 92, !20, i64 96, !7, i64 100}
!25 = !{!10, !6, i64 336}
!26 = !{!10, !20, i64 344}
!27 = !{!20, !20, i64 0}
!28 = !{!7, !7, i64 0}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.unroll.disable"}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!34, !34, i64 0}
!34 = !{!"vtable pointer", !8, i64 0}
!35 = !{!23, !23, i64 0}
!36 = distinct !{!36, !32}
!37 = !{!10, !22, i64 240}
!38 = !{i8 0, i8 2}
!39 = !{}
!40 = !{!10, !20, i64 360}


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