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

%struct.GUID = type { i32, i16, i16, [8 x i8] }
%class.CMyComPtr = type { ptr }
%struct.CBcj2Enc = type { [4 x ptr], [4 x ptr], ptr, ptr, i32, i32, i8, i8, i32, i64, i64, i32, i32, i32, i32, i32, i32, [8 x i8], i32, [258 x i16] }
%"class.NCompress::NBcj2::CBaseCoder" = type { [5 x ptr], [5 x i32], [5 x i32] }
%"class.NCompress::NBcj2::CEncoder" = type <{ %struct.ICompressCoder2, %struct.ICompressSetCoderProperties, %struct.ICompressSetBufSize, %class.CMyUnknownImp, [4 x i8], %"class.NCompress::NBcj2::CBaseCoder", i32, [4 x i8] }>
%struct.ICompressCoder2 = type { %struct.IUnknown }
%struct.IUnknown = type { ptr }
%struct.ICompressSetCoderProperties = type { %struct.IUnknown }
%struct.ICompressSetBufSize = type { %struct.IUnknown }
%class.CMyUnknownImp = type { i32 }

@IID_ICompressGetSubStreamSize = external global %struct.GUID, align 4

; 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

declare i32 @__gxx_personality_v0(...)

; 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: mustprogress uwtable
define dso_local noundef i32 @_ZN9NCompress5NBcj28CEncoder8CodeRealEPKP19ISequentialInStreamPKPKyjPKP20ISequentialOutStreamS9_jP21ICompressProgressInfo(ptr noundef nonnull align 8 dereferenceable(116) %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, ptr noundef %4, ptr noundef %5, i32 noundef %6, ptr noundef %7) #1 align 2 personality ptr @__gxx_personality_v0 {
  %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 i32, align 4
  %21 = alloca i64, align 8
  %22 = alloca %class.CMyComPtr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca %struct.CBcj2Enc, align 8
  %26 = alloca i32, align 4
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i64, align 8
  %32 = alloca i8, align 1
  %33 = alloca i64, align 8
  %34 = alloca i64, align 8
  %35 = alloca i8, align 1
  %36 = alloca i64, align 8
  %37 = alloca i32, align 4
  %38 = alloca i64, align 8
  %39 = alloca i8, align 1
  %40 = alloca i64, align 8
  %41 = alloca i64, align 8
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca i32, align 4
  %45 = alloca i64, align 8
  %46 = alloca i32, align 4
  %47 = alloca i32, align 4
  %48 = alloca i32, align 4
  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
  %49 = load ptr, ptr %10, align 8
  %50 = load i32, ptr %13, align 4, !tbaa !9
  %51 = icmp ne i32 %50, 1
  br i1 %51, label %55, label %52

52:                                               ; preds = %8
  %53 = load i32, ptr %16, align 4, !tbaa !9
  %54 = icmp ne i32 %53, 4
  br i1 %54, label %55, label %56

55:                                               ; preds = %52, %8
  store i32 -2147024809, ptr %9, align 4
  br label %598

56:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  %57 = getelementptr inbounds i8, ptr %49, i64 32
  %58 = call noundef i32 @_ZN9NCompress5NBcj210CBaseCoder5AllocEb(ptr noundef nonnull align 8 dereferenceable(80) %57, i1 noundef zeroext true)
  store i32 %58, ptr %18, align 4, !tbaa !9
  %59 = load i32, ptr %18, align 4, !tbaa !9
  %60 = icmp ne i32 %59, 0
  br i1 %60, label %61, label %63

61:                                               ; preds = %56
  %62 = load i32, ptr %18, align 4, !tbaa !9
  store i32 %62, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %64

63:                                               ; preds = %56
  store i32 0, ptr %19, align 4
  br label %64

64:                                               ; preds = %63, %61
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  %65 = load i32, ptr %19, align 4
  switch i32 %65, label %605 [
    i32 0, label %66
    i32 1, label %598
  ]

66:                                               ; preds = %64
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  store i32 0, ptr %20, align 4, !tbaa !9
  %67 = load ptr, ptr %12, align 8, !tbaa !5
  %68 = icmp ne ptr %67, null
  br i1 %68, label %69, label %85

69:                                               ; preds = %66
  %70 = load ptr, ptr %12, align 8, !tbaa !5
  %71 = getelementptr inbounds ptr, ptr %70, i64 0
  %72 = load ptr, ptr %71, align 8, !tbaa !5
  %73 = icmp ne ptr %72, null
  br i1 %73, label %74, label %85

74:                                               ; preds = %69
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  %75 = load ptr, ptr %12, align 8, !tbaa !5
  %76 = getelementptr inbounds ptr, ptr %75, i64 0
  %77 = load ptr, ptr %76, align 8, !tbaa !5
  %78 = load i64, ptr %77, align 8, !tbaa !11
  store i64 %78, ptr %21, align 8, !tbaa !11
  %79 = load i64, ptr %21, align 8, !tbaa !11
  %80 = icmp ule i64 %79, 2147483648
  br i1 %80, label %81, label %84

81:                                               ; preds = %74
  %82 = load i64, ptr %21, align 8, !tbaa !11
  %83 = trunc i64 %82 to i32
  store i32 %83, ptr %20, align 4, !tbaa !9
  br label %84

84:                                               ; preds = %81, %74
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  br label %85

85:                                               ; preds = %84, %69, %66
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  call void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %22)
  %86 = load ptr, ptr %11, align 8, !tbaa !5
  %87 = getelementptr inbounds ptr, ptr %86, i64 0
  %88 = load ptr, ptr %87, align 8, !tbaa !5
  %89 = invoke noundef ptr @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEadEv(ptr noundef nonnull align 8 dereferenceable(8) %22)
          to label %90 unwind label %108

90:                                               ; preds = %85
  %91 = load ptr, ptr %88, align 8, !tbaa !13
  %92 = getelementptr inbounds ptr, ptr %91, i64 0
  %93 = load ptr, ptr %92, align 8
  %94 = invoke noundef i32 %93(ptr noundef nonnull align 8 dereferenceable(8) %88, ptr noundef nonnull align 4 dereferenceable(16) @IID_ICompressGetSubStreamSize, ptr noundef %89)
          to label %95 unwind label %108

95:                                               ; preds = %90
  call void @llvm.lifetime.start.p0(i64 664, ptr %25) #5
  %96 = getelementptr inbounds i8, ptr %49, i64 32
  %97 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %96, i32 0, i32 0
  %98 = getelementptr inbounds [5 x ptr], ptr %97, i64 0, i64 4
  %99 = load ptr, ptr %98, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  store ptr %99, ptr %100, align 8, !tbaa !15
  %101 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  %102 = load ptr, ptr %101, align 8, !tbaa !15
  %103 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  store ptr %102, ptr %103, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #5
  store i32 0, ptr %26, align 4, !tbaa !9
  br label %104

104:                                              ; preds = %141, %95
  %105 = load i32, ptr %26, align 4, !tbaa !9
  %106 = icmp slt i32 %105, 4
  br i1 %106, label %112, label %107

107:                                              ; preds = %104
  store i32 2, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #5
  br label %144

108:                                              ; preds = %90, %85
  %109 = landingpad { ptr, i32 }
          cleanup
  %110 = extractvalue { ptr, i32 } %109, 0
  store ptr %110, ptr %23, align 8
  %111 = extractvalue { ptr, i32 } %109, 1
  store i32 %111, ptr %24, align 4
  br label %597

112:                                              ; preds = %104
  %113 = getelementptr inbounds i8, ptr %49, i64 32
  %114 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %113, i32 0, i32 0
  %115 = load i32, ptr %26, align 4, !tbaa !9
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds [5 x ptr], ptr %114, i64 0, i64 %116
  %118 = load ptr, ptr %117, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 0
  %120 = load i32, ptr %26, align 4, !tbaa !9
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds [4 x ptr], ptr %119, i64 0, i64 %121
  store ptr %118, ptr %122, align 8, !tbaa !5
  %123 = getelementptr inbounds i8, ptr %49, i64 32
  %124 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %123, i32 0, i32 0
  %125 = load i32, ptr %26, align 4, !tbaa !9
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds [5 x ptr], ptr %124, i64 0, i64 %126
  %128 = load ptr, ptr %127, align 8, !tbaa !5
  %129 = getelementptr inbounds i8, ptr %49, i64 32
  %130 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %129, i32 0, i32 1
  %131 = load i32, ptr %26, align 4, !tbaa !9
  %132 = sext i32 %131 to i64
  %133 = getelementptr inbounds [5 x i32], ptr %130, i64 0, i64 %132
  %134 = load i32, ptr %133, align 4, !tbaa !9
  %135 = zext i32 %134 to i64
  %136 = getelementptr inbounds i8, ptr %128, i64 %135
  %137 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 1
  %138 = load i32, ptr %26, align 4, !tbaa !9
  %139 = sext i32 %138 to i64
  %140 = getelementptr inbounds [4 x ptr], ptr %137, i64 0, i64 %139
  store ptr %136, ptr %140, align 8, !tbaa !5
  br label %141

141:                                              ; preds = %112
  %142 = load i32, ptr %26, align 4, !tbaa !9
  %143 = add nsw i32 %142, 1
  store i32 %143, ptr %26, align 4, !tbaa !9
  br label %104, !llvm.loop !19

144:                                              ; preds = %107
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  store i64 0, ptr %27, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  store i64 0, ptr %28, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  store i64 0, ptr %29, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  store i64 0, ptr %30, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #5
  store i64 0, ptr %31, align 8, !tbaa !11
  invoke void @Bcj2Enc_Init(ptr noundef %25)
          to label %145 unwind label %205

145:                                              ; preds = %144
  %146 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 12
  store i32 0, ptr %146, align 4, !tbaa !23
  %147 = load i32, ptr %20, align 4, !tbaa !9
  %148 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 13
  store i32 %147, ptr %148, align 8, !tbaa !24
  %149 = getelementptr inbounds %"class.NCompress::NBcj2::CEncoder", ptr %49, i32 0, i32 6
  %150 = load i32, ptr %149, align 8, !tbaa !25
  %151 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 14
  store i32 %150, ptr %151, align 4, !tbaa !33
  %152 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 5
  store i32 0, ptr %152, align 4, !tbaa !34
  call void @llvm.lifetime.start.p0(i64 1, ptr %32) #5
  store i8 0, ptr %32, align 1, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  store i64 0, ptr %33, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  store i64 0, ptr %34, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %35) #5
  store i8 0, ptr %35, align 1, !tbaa !35
  br label %153

153:                                              ; preds = %547, %499, %442, %431, %145
  %154 = load i8, ptr %32, align 1, !tbaa !35, !range !37, !noundef !38
  %155 = trunc i8 %154 to i1
  br i1 %155, label %156, label %282

156:                                              ; preds = %153
  %157 = invoke noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEcvPS0_Ev(ptr noundef nonnull align 8 dereferenceable(8) %22)
          to label %158 unwind label %209

158:                                              ; preds = %156
  %159 = icmp ne ptr %157, null
  br i1 %159, label %160, label %282

160:                                              ; preds = %158
  %161 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 12
  store i32 0, ptr %161, align 4, !tbaa !23
  %162 = load i32, ptr %20, align 4, !tbaa !9
  %163 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 13
  store i32 %162, ptr %163, align 8, !tbaa !24
  %164 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 5
  store i32 0, ptr %164, align 4, !tbaa !34
  br label %165

165:                                              ; preds = %279, %160
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  store i64 0, ptr %36, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #5
  %166 = invoke noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEptEv(ptr noundef nonnull align 8 dereferenceable(8) %22)
          to label %167 unwind label %213

167:                                              ; preds = %165
  %168 = load i64, ptr %33, align 8, !tbaa !11
  %169 = load ptr, ptr %166, align 8, !tbaa !13
  %170 = getelementptr inbounds ptr, ptr %169, i64 5
  %171 = load ptr, ptr %170, align 8
  %172 = invoke noundef i32 %171(ptr noundef nonnull align 8 dereferenceable(8) %166, i64 noundef %168, ptr noundef %36)
          to label %173 unwind label %213

173:                                              ; preds = %167
  store i32 %172, ptr %37, align 4, !tbaa !9
  store i8 0, ptr %32, align 1, !tbaa !35
  %174 = load i32, ptr %37, align 4, !tbaa !9
  %175 = icmp eq i32 %174, 0
  br i1 %175, label %176, label %268

176:                                              ; preds = %173
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #5
  %177 = load i64, ptr %34, align 8, !tbaa !11
  %178 = load i64, ptr %36, align 8, !tbaa !11
  %179 = add i64 %177, %178
  store i64 %179, ptr %38, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %39) #5
  %180 = load i64, ptr %38, align 8, !tbaa !11
  %181 = load i64, ptr %29, align 8, !tbaa !11
  %182 = icmp ult i64 %180, %181
  br i1 %182, label %192, label %183

183:                                              ; preds = %176
  %184 = load i64, ptr %38, align 8, !tbaa !11
  %185 = load i64, ptr %29, align 8, !tbaa !11
  %186 = icmp ule i64 %184, %185
  br i1 %186, label %187, label %190

187:                                              ; preds = %183
  %188 = load i8, ptr %35, align 1, !tbaa !35, !range !37, !noundef !38
  %189 = trunc i8 %188 to i1
  br label %190

190:                                              ; preds = %187, %183
  %191 = phi i1 [ false, %183 ], [ %189, %187 ]
  br label %192

192:                                              ; preds = %190, %176
  %193 = phi i1 [ true, %176 ], [ %191, %190 ]
  %194 = zext i1 %193 to i8
  store i8 %194, ptr %39, align 1, !tbaa !35
  %195 = load i64, ptr %38, align 8, !tbaa !11
  %196 = load i64, ptr %30, align 8, !tbaa !11
  %197 = icmp ule i64 %195, %196
  br i1 %197, label %198, label %217

198:                                              ; preds = %192
  %199 = load i8, ptr %39, align 1, !tbaa !35, !range !37, !noundef !38
  %200 = trunc i8 %199 to i1
  br i1 %200, label %201, label %217

201:                                              ; preds = %198
  %202 = load i64, ptr %38, align 8, !tbaa !11
  store i64 %202, ptr %34, align 8, !tbaa !11
  %203 = load i64, ptr %33, align 8, !tbaa !11
  %204 = add i64 %203, 1
  store i64 %204, ptr %33, align 8, !tbaa !11
  store i32 8, ptr %19, align 4
  br label %267, !llvm.loop !39

205:                                              ; preds = %144
  %206 = landingpad { ptr, i32 }
          cleanup
  %207 = extractvalue { ptr, i32 } %206, 0
  store ptr %207, ptr %23, align 8
  %208 = extractvalue { ptr, i32 } %206, 1
  store i32 %208, ptr %24, align 4
  br label %596

209:                                              ; preds = %303, %156
  %210 = landingpad { ptr, i32 }
          cleanup
  %211 = extractvalue { ptr, i32 } %210, 0
  store ptr %211, ptr %23, align 8
  %212 = extractvalue { ptr, i32 } %210, 1
  store i32 %212, ptr %24, align 4
  br label %595

213:                                              ; preds = %275, %167, %165
  %214 = landingpad { ptr, i32 }
          cleanup
  %215 = extractvalue { ptr, i32 } %214, 0
  store ptr %215, ptr %23, align 8
  %216 = extractvalue { ptr, i32 } %214, 1
  store i32 %216, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  br label %595

217:                                              ; preds = %198, %192
  %218 = getelementptr inbounds i8, ptr %49, i64 32
  %219 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %218, i32 0, i32 0
  %220 = getelementptr inbounds [5 x ptr], ptr %219, i64 0, i64 4
  %221 = load ptr, ptr %220, align 8, !tbaa !5
  %222 = load i64, ptr %27, align 8, !tbaa !21
  %223 = getelementptr inbounds i8, ptr %221, i64 %222
  %224 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  store ptr %223, ptr %224, align 8, !tbaa !18
  %225 = load i8, ptr %39, align 1, !tbaa !35, !range !37, !noundef !38
  %226 = trunc i8 %225 to i1
  br i1 %226, label %227, label %251

227:                                              ; preds = %217
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #5
  %228 = load i64, ptr %29, align 8, !tbaa !11
  %229 = load i64, ptr %38, align 8, !tbaa !11
  %230 = sub i64 %228, %229
  store i64 %230, ptr %40, align 8, !tbaa !21
  %231 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  %232 = load ptr, ptr %231, align 8, !tbaa !18
  %233 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  %234 = load ptr, ptr %233, align 8, !tbaa !15
  %235 = ptrtoint ptr %232 to i64
  %236 = ptrtoint ptr %234 to i64
  %237 = sub i64 %235, %236
  %238 = load i64, ptr %40, align 8, !tbaa !21
  %239 = icmp ult i64 %237, %238
  br i1 %239, label %240, label %241

240:                                              ; preds = %227
  store i32 -2147467259, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %248

241:                                              ; preds = %227
  %242 = load i64, ptr %40, align 8, !tbaa !21
  %243 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  %244 = load ptr, ptr %243, align 8, !tbaa !18
  %245 = sub i64 0, %242
  %246 = getelementptr inbounds i8, ptr %244, i64 %245
  store ptr %246, ptr %243, align 8, !tbaa !18
  %247 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 5
  store i32 1, ptr %247, align 4, !tbaa !34
  store i32 0, ptr %19, align 4
  br label %248

248:                                              ; preds = %241, %240
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #5
  %249 = load i32, ptr %19, align 4
  switch i32 %249, label %267 [
    i32 0, label %250
  ]

250:                                              ; preds = %248
  br label %251

251:                                              ; preds = %250, %217
  %252 = load i64, ptr %36, align 8, !tbaa !11
  %253 = icmp ule i64 %252, 2147483648
  br i1 %253, label %254, label %266

254:                                              ; preds = %251
  %255 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 11
  %256 = load i32, ptr %255, align 8, !tbaa !40
  %257 = load i64, ptr %34, align 8, !tbaa !11
  %258 = load i64, ptr %30, align 8, !tbaa !11
  %259 = sub i64 %257, %258
  %260 = trunc i64 %259 to i32
  %261 = add i32 %256, %260
  %262 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 12
  store i32 %261, ptr %262, align 4, !tbaa !23
  %263 = load i64, ptr %36, align 8, !tbaa !11
  %264 = trunc i64 %263 to i32
  %265 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 13
  store i32 %264, ptr %265, align 8, !tbaa !24
  br label %266

266:                                              ; preds = %254, %251
  store i32 7, ptr %19, align 4
  br label %267

267:                                              ; preds = %266, %248, %201
  call void @llvm.lifetime.end.p0(i64 1, ptr %39) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #5
  br label %279

268:                                              ; preds = %173
  %269 = load i32, ptr %37, align 4, !tbaa !9
  %270 = icmp eq i32 %269, 1
  br i1 %270, label %271, label %272

271:                                              ; preds = %268
  store i32 7, ptr %19, align 4
  br label %279

272:                                              ; preds = %268
  %273 = load i32, ptr %37, align 4, !tbaa !9
  %274 = icmp eq i32 %273, -2147467263
  br i1 %274, label %275, label %277

275:                                              ; preds = %272
  invoke void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeE7ReleaseEv(ptr noundef nonnull align 8 dereferenceable(8) %22)
          to label %276 unwind label %213

276:                                              ; preds = %275
  store i32 7, ptr %19, align 4
  br label %279

277:                                              ; preds = %272
  %278 = load i32, ptr %37, align 4, !tbaa !9
  store i32 %278, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %279

279:                                              ; preds = %277, %276, %271, %267
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  %280 = load i32, ptr %19, align 4
  switch i32 %280, label %594 [
    i32 8, label %165
    i32 7, label %281
  ]

281:                                              ; preds = %279
  br label %282

282:                                              ; preds = %281, %158, %153
  %283 = load i8, ptr %35, align 1, !tbaa !35, !range !37, !noundef !38
  %284 = trunc i8 %283 to i1
  br i1 %284, label %285, label %303

285:                                              ; preds = %282
  %286 = load i64, ptr %29, align 8, !tbaa !11
  %287 = load i64, ptr %30, align 8, !tbaa !11
  %288 = sub i64 %286, %287
  %289 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  %290 = load ptr, ptr %289, align 8, !tbaa !18
  %291 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  %292 = load ptr, ptr %291, align 8, !tbaa !15
  %293 = ptrtoint ptr %290 to i64
  %294 = ptrtoint ptr %292 to i64
  %295 = sub i64 %293, %294
  %296 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 16
  %297 = load i32, ptr %296, align 4, !tbaa !41
  %298 = zext i32 %297 to i64
  %299 = add i64 %295, %298
  %300 = icmp eq i64 %288, %299
  br i1 %300, label %301, label %303

301:                                              ; preds = %285
  %302 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 5
  store i32 2, ptr %302, align 4, !tbaa !34
  br label %303

303:                                              ; preds = %301, %285, %282
  invoke void @Bcj2Enc_Encode(ptr noundef %25)
          to label %304 unwind label %209

304:                                              ; preds = %303
  %305 = load i64, ptr %29, align 8, !tbaa !11
  %306 = load i64, ptr %27, align 8, !tbaa !21
  %307 = sub i64 %305, %306
  %308 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  %309 = load ptr, ptr %308, align 8, !tbaa !15
  %310 = getelementptr inbounds i8, ptr %49, i64 32
  %311 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %310, i32 0, i32 0
  %312 = getelementptr inbounds [5 x ptr], ptr %311, i64 0, i64 4
  %313 = load ptr, ptr %312, align 8, !tbaa !5
  %314 = ptrtoint ptr %309 to i64
  %315 = ptrtoint ptr %313 to i64
  %316 = sub i64 %314, %315
  %317 = add i64 %307, %316
  %318 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 16
  %319 = load i32, ptr %318, align 4, !tbaa !41
  %320 = zext i32 %319 to i64
  %321 = sub i64 %317, %320
  store i64 %321, ptr %30, align 8, !tbaa !11
  %322 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 18
  %323 = load i32, ptr %322, align 8, !tbaa !42
  %324 = icmp eq i32 %323, 5
  br i1 %324, label %325, label %326

325:                                              ; preds = %304
  br label %548

326:                                              ; preds = %304
  %327 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %328 = load i32, ptr %327, align 8, !tbaa !43
  %329 = icmp ult i32 %328, 4
  br i1 %329, label %330, label %414

330:                                              ; preds = %326
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #5
  %331 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 0
  %332 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %333 = load i32, ptr %332, align 8, !tbaa !43
  %334 = zext i32 %333 to i64
  %335 = getelementptr inbounds [4 x ptr], ptr %331, i64 0, i64 %334
  %336 = load ptr, ptr %335, align 8, !tbaa !5
  %337 = getelementptr inbounds i8, ptr %49, i64 32
  %338 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %337, i32 0, i32 0
  %339 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %340 = load i32, ptr %339, align 8, !tbaa !43
  %341 = zext i32 %340 to i64
  %342 = getelementptr inbounds [5 x ptr], ptr %338, i64 0, i64 %341
  %343 = load ptr, ptr %342, align 8, !tbaa !5
  %344 = ptrtoint ptr %336 to i64
  %345 = ptrtoint ptr %343 to i64
  %346 = sub i64 %344, %345
  store i64 %346, ptr %41, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #5
  %347 = load ptr, ptr %14, align 8, !tbaa !5
  %348 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %349 = load i32, ptr %348, align 8, !tbaa !43
  %350 = zext i32 %349 to i64
  %351 = getelementptr inbounds ptr, ptr %347, i64 %350
  %352 = load ptr, ptr %351, align 8, !tbaa !5
  %353 = getelementptr inbounds i8, ptr %49, i64 32
  %354 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %353, i32 0, i32 0
  %355 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %356 = load i32, ptr %355, align 8, !tbaa !43
  %357 = zext i32 %356 to i64
  %358 = getelementptr inbounds [5 x ptr], ptr %354, i64 0, i64 %357
  %359 = load ptr, ptr %358, align 8, !tbaa !5
  %360 = load i64, ptr %41, align 8, !tbaa !21
  %361 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %352, ptr noundef %359, i64 noundef %360) #5
  store i32 %361, ptr %42, align 4, !tbaa !9
  %362 = load i32, ptr %42, align 4, !tbaa !9
  %363 = icmp ne i32 %362, 0
  br i1 %363, label %364, label %366

364:                                              ; preds = %330
  %365 = load i32, ptr %42, align 4, !tbaa !9
  store i32 %365, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %367

366:                                              ; preds = %330
  store i32 0, ptr %19, align 4
  br label %367

367:                                              ; preds = %366, %364
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #5
  %368 = load i32, ptr %19, align 4
  switch i32 %368, label %411 [
    i32 0, label %369
  ]

369:                                              ; preds = %367
  %370 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %371 = load i32, ptr %370, align 8, !tbaa !43
  %372 = icmp eq i32 %371, 3
  br i1 %372, label %373, label %377

373:                                              ; preds = %369
  %374 = load i64, ptr %41, align 8, !tbaa !21
  %375 = load i64, ptr %31, align 8, !tbaa !11
  %376 = add i64 %375, %374
  store i64 %376, ptr %31, align 8, !tbaa !11
  br label %377

377:                                              ; preds = %373, %369
  %378 = getelementptr inbounds i8, ptr %49, i64 32
  %379 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %378, i32 0, i32 0
  %380 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %381 = load i32, ptr %380, align 8, !tbaa !43
  %382 = zext i32 %381 to i64
  %383 = getelementptr inbounds [5 x ptr], ptr %379, i64 0, i64 %382
  %384 = load ptr, ptr %383, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 0
  %386 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %387 = load i32, ptr %386, align 8, !tbaa !43
  %388 = zext i32 %387 to i64
  %389 = getelementptr inbounds [4 x ptr], ptr %385, i64 0, i64 %388
  store ptr %384, ptr %389, align 8, !tbaa !5
  %390 = getelementptr inbounds i8, ptr %49, i64 32
  %391 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %390, i32 0, i32 0
  %392 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %393 = load i32, ptr %392, align 8, !tbaa !43
  %394 = zext i32 %393 to i64
  %395 = getelementptr inbounds [5 x ptr], ptr %391, i64 0, i64 %394
  %396 = load ptr, ptr %395, align 8, !tbaa !5
  %397 = getelementptr inbounds i8, ptr %49, i64 32
  %398 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %397, i32 0, i32 1
  %399 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %400 = load i32, ptr %399, align 8, !tbaa !43
  %401 = zext i32 %400 to i64
  %402 = getelementptr inbounds [5 x i32], ptr %398, i64 0, i64 %401
  %403 = load i32, ptr %402, align 4, !tbaa !9
  %404 = zext i32 %403 to i64
  %405 = getelementptr inbounds i8, ptr %396, i64 %404
  %406 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 1
  %407 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %408 = load i32, ptr %407, align 8, !tbaa !43
  %409 = zext i32 %408 to i64
  %410 = getelementptr inbounds [4 x ptr], ptr %406, i64 0, i64 %409
  store ptr %405, ptr %410, align 8, !tbaa !5
  store i32 0, ptr %19, align 4
  br label %411

411:                                              ; preds = %377, %367
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #5
  %412 = load i32, ptr %19, align 4
  switch i32 %412, label %594 [
    i32 0, label %413
  ]

413:                                              ; preds = %411
  br label %503

414:                                              ; preds = %326
  %415 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 4
  %416 = load i32, ptr %415, align 8, !tbaa !43
  %417 = icmp ne i32 %416, 4
  br i1 %417, label %418, label %419

418:                                              ; preds = %414
  store i32 -2147467259, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %594

419:                                              ; preds = %414
  store i8 1, ptr %32, align 1, !tbaa !35
  %420 = load i64, ptr %27, align 8, !tbaa !21
  %421 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  %422 = load ptr, ptr %421, align 8, !tbaa !15
  %423 = getelementptr inbounds i8, ptr %49, i64 32
  %424 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %423, i32 0, i32 0
  %425 = getelementptr inbounds [5 x ptr], ptr %424, i64 0, i64 4
  %426 = load ptr, ptr %425, align 8, !tbaa !5
  %427 = ptrtoint ptr %422 to i64
  %428 = ptrtoint ptr %426 to i64
  %429 = sub i64 %427, %428
  %430 = icmp ne i64 %420, %429
  br i1 %430, label %431, label %439

431:                                              ; preds = %419
  %432 = getelementptr inbounds i8, ptr %49, i64 32
  %433 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %432, i32 0, i32 0
  %434 = getelementptr inbounds [5 x ptr], ptr %433, i64 0, i64 4
  %435 = load ptr, ptr %434, align 8, !tbaa !5
  %436 = load i64, ptr %27, align 8, !tbaa !21
  %437 = getelementptr inbounds i8, ptr %435, i64 %436
  %438 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  store ptr %437, ptr %438, align 8, !tbaa !18
  br label %153, !llvm.loop !44

439:                                              ; preds = %419
  %440 = load i8, ptr %35, align 1, !tbaa !35, !range !37, !noundef !38
  %441 = trunc i8 %440 to i1
  br i1 %441, label %442, label %443

442:                                              ; preds = %439
  br label %153, !llvm.loop !44

443:                                              ; preds = %439
  store i64 0, ptr %27, align 8, !tbaa !21
  %444 = getelementptr inbounds i8, ptr %49, i64 32
  %445 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %444, i32 0, i32 0
  %446 = getelementptr inbounds [5 x ptr], ptr %445, i64 0, i64 4
  %447 = load ptr, ptr %446, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 2
  store ptr %447, ptr %448, align 8, !tbaa !15
  %449 = getelementptr inbounds i8, ptr %49, i64 32
  %450 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %449, i32 0, i32 0
  %451 = getelementptr inbounds [5 x ptr], ptr %450, i64 0, i64 4
  %452 = load ptr, ptr %451, align 8, !tbaa !5
  %453 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  store ptr %452, ptr %453, align 8, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #5
  %454 = getelementptr inbounds i8, ptr %49, i64 32
  %455 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %454, i32 0, i32 1
  %456 = getelementptr inbounds [5 x i32], ptr %455, i64 0, i64 4
  %457 = load i32, ptr %456, align 8, !tbaa !9
  store i32 %457, ptr %43, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #5
  %458 = load ptr, ptr %11, align 8, !tbaa !5
  %459 = getelementptr inbounds ptr, ptr %458, i64 0
  %460 = load ptr, ptr %459, align 8, !tbaa !5
  %461 = getelementptr inbounds i8, ptr %49, i64 32
  %462 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %461, i32 0, i32 0
  %463 = getelementptr inbounds [5 x ptr], ptr %462, i64 0, i64 4
  %464 = load ptr, ptr %463, align 8, !tbaa !5
  %465 = load i32, ptr %43, align 4, !tbaa !9
  %466 = load ptr, ptr %460, align 8, !tbaa !13
  %467 = getelementptr inbounds ptr, ptr %466, i64 5
  %468 = load ptr, ptr %467, align 8
  %469 = invoke noundef i32 %468(ptr noundef nonnull align 8 dereferenceable(8) %460, ptr noundef %464, i32 noundef %465, ptr noundef %43)
          to label %470 unwind label %475

470:                                              ; preds = %443
  store i32 %469, ptr %44, align 4, !tbaa !9
  %471 = load i32, ptr %44, align 4, !tbaa !9
  %472 = icmp ne i32 %471, 0
  br i1 %472, label %473, label %479

473:                                              ; preds = %470
  %474 = load i32, ptr %44, align 4, !tbaa !9
  store i32 %474, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %480

475:                                              ; preds = %443
  %476 = landingpad { ptr, i32 }
          cleanup
  %477 = extractvalue { ptr, i32 } %476, 0
  store ptr %477, ptr %23, align 8
  %478 = extractvalue { ptr, i32 } %476, 1
  store i32 %478, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #5
  br label %595

479:                                              ; preds = %470
  store i32 0, ptr %19, align 4
  br label %480

480:                                              ; preds = %479, %473
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #5
  %481 = load i32, ptr %19, align 4
  switch i32 %481, label %499 [
    i32 0, label %482
  ]

482:                                              ; preds = %480
  %483 = load i32, ptr %43, align 4, !tbaa !9
  %484 = icmp eq i32 %483, 0
  br i1 %484, label %485, label %486

485:                                              ; preds = %482
  store i8 1, ptr %35, align 1, !tbaa !35
  store i32 6, ptr %19, align 4
  br label %499, !llvm.loop !44

486:                                              ; preds = %482
  %487 = load i32, ptr %43, align 4, !tbaa !9
  %488 = zext i32 %487 to i64
  store i64 %488, ptr %27, align 8, !tbaa !21
  %489 = load i64, ptr %27, align 8, !tbaa !21
  %490 = load i64, ptr %29, align 8, !tbaa !11
  %491 = add i64 %490, %489
  store i64 %491, ptr %29, align 8, !tbaa !11
  %492 = getelementptr inbounds i8, ptr %49, i64 32
  %493 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %492, i32 0, i32 0
  %494 = getelementptr inbounds [5 x ptr], ptr %493, i64 0, i64 4
  %495 = load ptr, ptr %494, align 8, !tbaa !5
  %496 = load i64, ptr %27, align 8, !tbaa !21
  %497 = getelementptr inbounds i8, ptr %495, i64 %496
  %498 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 3
  store ptr %497, ptr %498, align 8, !tbaa !18
  store i32 0, ptr %19, align 4
  br label %499

499:                                              ; preds = %486, %485, %480
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #5
  %500 = load i32, ptr %19, align 4
  switch i32 %500, label %594 [
    i32 0, label %501
    i32 6, label %153
  ]

501:                                              ; preds = %499
  br label %502

502:                                              ; preds = %501
  br label %503

503:                                              ; preds = %502, %413
  %504 = load ptr, ptr %17, align 8, !tbaa !5
  %505 = icmp ne ptr %504, null
  br i1 %505, label %506, label %547

506:                                              ; preds = %503
  %507 = load i64, ptr %30, align 8, !tbaa !11
  %508 = load i64, ptr %28, align 8, !tbaa !11
  %509 = sub i64 %507, %508
  %510 = icmp uge i64 %509, 1048576
  br i1 %510, label %511, label %547

511:                                              ; preds = %506
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #5
  %512 = load i64, ptr %30, align 8, !tbaa !11
  %513 = load i64, ptr %31, align 8, !tbaa !11
  %514 = add i64 %512, %513
  %515 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 0
  %516 = getelementptr inbounds [4 x ptr], ptr %515, i64 0, i64 3
  %517 = load ptr, ptr %516, align 8, !tbaa !5
  %518 = getelementptr inbounds i8, ptr %517, i64 %514
  %519 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 0
  %520 = getelementptr inbounds [4 x ptr], ptr %519, i64 0, i64 3
  %521 = load ptr, ptr %520, align 8, !tbaa !5
  %522 = ptrtoint ptr %518 to i64
  %523 = ptrtoint ptr %521 to i64
  %524 = sub i64 %522, %523
  store i64 %524, ptr %45, align 8, !tbaa !11
  %525 = load i64, ptr %30, align 8, !tbaa !11
  store i64 %525, ptr %28, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #5
  %526 = load ptr, ptr %17, align 8, !tbaa !5
  %527 = load ptr, ptr %526, align 8, !tbaa !13
  %528 = getelementptr inbounds ptr, ptr %527, i64 5
  %529 = load ptr, ptr %528, align 8
  %530 = invoke noundef i32 %529(ptr noundef nonnull align 8 dereferenceable(8) %526, ptr noundef %30, ptr noundef %45)
          to label %531 unwind label %536

531:                                              ; preds = %511
  store i32 %530, ptr %46, align 4, !tbaa !9
  %532 = load i32, ptr %46, align 4, !tbaa !9
  %533 = icmp ne i32 %532, 0
  br i1 %533, label %534, label %540

534:                                              ; preds = %531
  %535 = load i32, ptr %46, align 4, !tbaa !9
  store i32 %535, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %541

536:                                              ; preds = %511
  %537 = landingpad { ptr, i32 }
          cleanup
  %538 = extractvalue { ptr, i32 } %537, 0
  store ptr %538, ptr %23, align 8
  %539 = extractvalue { ptr, i32 } %537, 1
  store i32 %539, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #5
  br label %595

540:                                              ; preds = %531
  store i32 0, ptr %19, align 4
  br label %541

541:                                              ; preds = %540, %534
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #5
  %542 = load i32, ptr %19, align 4
  switch i32 %542, label %544 [
    i32 0, label %543
  ]

543:                                              ; preds = %541
  store i32 0, ptr %19, align 4
  br label %544

544:                                              ; preds = %543, %541
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #5
  %545 = load i32, ptr %19, align 4
  switch i32 %545, label %594 [
    i32 0, label %546
  ]

546:                                              ; preds = %544
  br label %547

547:                                              ; preds = %546, %506, %503
  br label %153, !llvm.loop !44

548:                                              ; preds = %325
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #5
  store i32 0, ptr %47, align 4, !tbaa !9
  br label %549

549:                                              ; preds = %588, %548
  %550 = load i32, ptr %47, align 4, !tbaa !9
  %551 = icmp slt i32 %550, 4
  br i1 %551, label %553, label %552

552:                                              ; preds = %549
  store i32 9, ptr %19, align 4
  br label %591

553:                                              ; preds = %549
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #5
  %554 = load ptr, ptr %14, align 8, !tbaa !5
  %555 = load i32, ptr %47, align 4, !tbaa !9
  %556 = sext i32 %555 to i64
  %557 = getelementptr inbounds ptr, ptr %554, i64 %556
  %558 = load ptr, ptr %557, align 8, !tbaa !5
  %559 = getelementptr inbounds i8, ptr %49, i64 32
  %560 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %559, i32 0, i32 0
  %561 = load i32, ptr %47, align 4, !tbaa !9
  %562 = sext i32 %561 to i64
  %563 = getelementptr inbounds [5 x ptr], ptr %560, i64 0, i64 %562
  %564 = load ptr, ptr %563, align 8, !tbaa !5
  %565 = getelementptr inbounds %struct.CBcj2Enc, ptr %25, i32 0, i32 0
  %566 = load i32, ptr %47, align 4, !tbaa !9
  %567 = sext i32 %566 to i64
  %568 = getelementptr inbounds [4 x ptr], ptr %565, i64 0, i64 %567
  %569 = load ptr, ptr %568, align 8, !tbaa !5
  %570 = getelementptr inbounds i8, ptr %49, i64 32
  %571 = getelementptr inbounds %"class.NCompress::NBcj2::CBaseCoder", ptr %570, i32 0, i32 0
  %572 = load i32, ptr %47, align 4, !tbaa !9
  %573 = sext i32 %572 to i64
  %574 = getelementptr inbounds [5 x ptr], ptr %571, i64 0, i64 %573
  %575 = load ptr, ptr %574, align 8, !tbaa !5
  %576 = ptrtoint ptr %569 to i64
  %577 = ptrtoint ptr %575 to i64
  %578 = sub i64 %576, %577
  %579 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %558, ptr noundef %564, i64 noundef %578) #5
  store i32 %579, ptr %48, align 4, !tbaa !9
  %580 = load i32, ptr %48, align 4, !tbaa !9
  %581 = icmp ne i32 %580, 0
  br i1 %581, label %582, label %584

582:                                              ; preds = %553
  %583 = load i32, ptr %48, align 4, !tbaa !9
  store i32 %583, ptr %9, align 4
  store i32 1, ptr %19, align 4
  br label %585

584:                                              ; preds = %553
  store i32 0, ptr %19, align 4
  br label %585

585:                                              ; preds = %584, %582
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #5
  %586 = load i32, ptr %19, align 4
  switch i32 %586, label %591 [
    i32 0, label %587
  ]

587:                                              ; preds = %585
  br label %588

588:                                              ; preds = %587
  %589 = load i32, ptr %47, align 4, !tbaa !9
  %590 = add nsw i32 %589, 1
  store i32 %590, ptr %47, align 4, !tbaa !9
  br label %549, !llvm.loop !45

591:                                              ; preds = %585, %552
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #5
  %592 = load i32, ptr %19, align 4
  switch i32 %592, label %594 [
    i32 9, label %593
  ]

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

594:                                              ; preds = %593, %591, %544, %499, %418, %411, %279
  call void @llvm.lifetime.end.p0(i64 1, ptr %35) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 664, ptr %25) #5
  call void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeED2Ev(ptr noundef nonnull align 8 dereferenceable(8) %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  br label %598

595:                                              ; preds = %536, %475, %213, %209
  call void @llvm.lifetime.end.p0(i64 1, ptr %35) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %32) #5
  br label %596

596:                                              ; preds = %595, %205
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 664, ptr %25) #5
  br label %597

597:                                              ; preds = %596, %108
  call void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeED2Ev(ptr noundef nonnull align 8 dereferenceable(8) %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  br label %600

598:                                              ; preds = %594, %64, %55
  %599 = load i32, ptr %9, align 4
  ret i32 %599

600:                                              ; preds = %597
  %601 = load ptr, ptr %23, align 8
  %602 = load i32, ptr %24, align 4
  %603 = insertvalue { ptr, i32 } poison, ptr %601, 0
  %604 = insertvalue { ptr, i32 } %603, i32 %602, 1
  resume { ptr, i32 } %604

605:                                              ; preds = %64
  unreachable
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEC2Ev(ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEadEv(ptr noundef nonnull align 8 dereferenceable(8)) #2 align 2

declare void @Bcj2Enc_Init(ptr noundef) #3

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEcvPS0_Ev(ptr noundef nonnull align 8 dereferenceable(8)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEptEv(ptr noundef nonnull align 8 dereferenceable(8)) #2 align 2

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

declare void @Bcj2Enc_Encode(ptr noundef) #3

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeED2Ev(ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #2 align 2

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 = { mustprogress 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 #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 "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 #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, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"long long", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"vtable pointer", !8, i64 0}
!15 = !{!16, !6, i64 64}
!16 = !{!"_ZTS8CBcj2Enc", !7, i64 0, !7, i64 32, !6, i64 64, !6, i64 72, !10, i64 80, !17, i64 84, !7, i64 88, !7, i64 89, !10, i64 92, !12, i64 96, !12, i64 104, !10, i64 112, !10, i64 116, !10, i64 120, !10, i64 124, !10, i64 128, !10, i64 132, !7, i64 136, !10, i64 144, !7, i64 148}
!17 = !{!"_ZTS19EBcj2Enc_FinishMode", !7, i64 0}
!18 = !{!16, !6, i64 72}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!22, !22, i64 0}
!22 = !{!"long", !7, i64 0}
!23 = !{!16, !10, i64 116}
!24 = !{!16, !10, i64 120}
!25 = !{!26, !10, i64 112}
!26 = !{!"_ZTSN9NCompress5NBcj28CEncoderE", !27, i64 0, !29, i64 8, !30, i64 16, !31, i64 24, !32, i64 32, !10, i64 112}
!27 = !{!"_ZTS15ICompressCoder2", !28, i64 0}
!28 = !{!"_ZTS8IUnknown"}
!29 = !{!"_ZTS27ICompressSetCoderProperties", !28, i64 0}
!30 = !{!"_ZTS19ICompressSetBufSize", !28, i64 0}
!31 = !{!"_ZTS13CMyUnknownImp", !10, i64 0}
!32 = !{!"_ZTSN9NCompress5NBcj210CBaseCoderE", !7, i64 0, !7, i64 40, !7, i64 60}
!33 = !{!16, !10, i64 124}
!34 = !{!16, !17, i64 84}
!35 = !{!36, !36, i64 0}
!36 = !{!"bool", !7, i64 0}
!37 = !{i8 0, i8 2}
!38 = !{}
!39 = distinct !{!39, !20}
!40 = !{!16, !10, i64 112}
!41 = !{!16, !10, i64 132}
!42 = !{!16, !10, i64 144}
!43 = !{!16, !10, i64 80}
!44 = distinct !{!44, !20}
!45 = distinct !{!45, !20}


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

%struct.GUID = type { i32, i16, i16, [8 x i8] }
%class.CMyComPtr = type { ptr }
%struct.CBcj2Enc = type { [4 x ptr], [4 x ptr], ptr, ptr, i32, i32, i8, i8, i32, i64, i64, i32, i32, i32, i32, i32, i32, [8 x i8], i32, [258 x i16] }

@IID_ICompressGetSubStreamSize = external global %struct.GUID, align 4

; 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

declare i32 @__gxx_personality_v0(...)

; 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: mustprogress uwtable
define dso_local noundef i32 @_ZN9NCompress5NBcj28CEncoder8CodeRealEPKP19ISequentialInStreamPKPKyjPKP20ISequentialOutStreamS9_jP21ICompressProgressInfo(ptr noundef nonnull align 8 dereferenceable(116) %0, ptr nocapture noundef readonly %1, ptr noundef readonly %2, i32 noundef %3, ptr nocapture noundef readonly %4, ptr nocapture noundef readnone %5, i32 noundef %6, ptr noundef %7) local_unnamed_addr #1 align 2 personality ptr @__gxx_personality_v0 {
  %9 = alloca %class.CMyComPtr, align 8
  %10 = alloca %struct.CBcj2Enc, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i32, align 4
  %14 = alloca i64, align 8
  %15 = icmp ne i32 %3, 1
  %16 = icmp ne i32 %6, 4
  %or.cond = or i1 %15, %16
  br i1 %or.cond, label %279, label %17

17:                                               ; preds = %8
  %18 = getelementptr inbounds i8, ptr %0, i64 32
  %19 = tail call noundef i32 @_ZN9NCompress5NBcj210CBaseCoder5AllocEb(ptr noundef nonnull align 8 dereferenceable(80) %18, i1 noundef zeroext true)
  %.not.not = icmp eq i32 %19, 0
  br i1 %.not.not, label %20, label %279

20:                                               ; preds = %17
  %.not161 = icmp eq ptr %2, null
  br i1 %.not161, label %27, label %21

21:                                               ; preds = %20
  %22 = load ptr, ptr %2, align 8, !tbaa !5
  %.not162 = icmp eq ptr %22, null
  br i1 %.not162, label %27, label %23

23:                                               ; preds = %21
  %24 = load i64, ptr %22, align 8, !tbaa !9
  %25 = icmp ult i64 %24, 2147483649
  %26 = trunc nuw i64 %24 to i32
  %spec.select = select i1 %25, i32 %26, i32 0
  br label %27

27:                                               ; preds = %23, %21, %20
  %.1111 = phi i32 [ %spec.select, %23 ], [ 0, %21 ], [ 0, %20 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #6
  call void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %9)
  %28 = load ptr, ptr %1, align 8, !tbaa !5
  %29 = call noundef ptr @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEadEv(ptr noundef nonnull align 8 dereferenceable(8) %9)
  %30 = load ptr, ptr %28, align 8, !tbaa !11
  %31 = load ptr, ptr %30, align 8
  %32 = invoke noundef i32 %31(ptr noundef nonnull align 8 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(16) @IID_ICompressGetSubStreamSize, ptr noundef %29)
          to label %33 unwind label %65

33:                                               ; preds = %27
  call void @llvm.lifetime.start.p0(i64 664, ptr nonnull %10) #6
  %34 = getelementptr inbounds i8, ptr %0, i64 64
  %35 = load ptr, ptr %34, align 8, !tbaa !5
  %36 = getelementptr inbounds i8, ptr %10, i64 64
  store ptr %35, ptr %36, align 8, !tbaa !13
  %37 = getelementptr inbounds i8, ptr %10, i64 72
  store ptr %35, ptr %37, align 8, !tbaa !17
  %38 = getelementptr inbounds i8, ptr %0, i64 72
  %39 = getelementptr inbounds i8, ptr %10, i64 32
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(32) %10, ptr noundef nonnull align 8 dereferenceable(32) %18, i64 32, i1 false), !tbaa !5
  %40 = load ptr, ptr %18, align 8, !tbaa !5
  %41 = load i32, ptr %38, align 8, !tbaa !18
  %42 = zext i32 %41 to i64
  %43 = getelementptr inbounds i8, ptr %40, i64 %42
  store ptr %43, ptr %39, align 8, !tbaa !5
  %44 = getelementptr inbounds i8, ptr %0, i64 40
  %45 = load ptr, ptr %44, align 8, !tbaa !5
  %46 = getelementptr inbounds i8, ptr %0, i64 76
  %47 = load i32, ptr %46, align 4, !tbaa !18
  %48 = zext i32 %47 to i64
  %49 = getelementptr inbounds i8, ptr %45, i64 %48
  %50 = getelementptr inbounds i8, ptr %10, i64 40
  store ptr %49, ptr %50, align 8, !tbaa !5
  %51 = getelementptr inbounds i8, ptr %0, i64 48
  %52 = load ptr, ptr %51, align 8, !tbaa !5
  %53 = getelementptr inbounds i8, ptr %0, i64 80
  %54 = load i32, ptr %53, align 8, !tbaa !18
  %55 = zext i32 %54 to i64
  %56 = getelementptr inbounds i8, ptr %52, i64 %55
  %57 = getelementptr inbounds i8, ptr %10, i64 48
  store ptr %56, ptr %57, align 8, !tbaa !5
  %58 = getelementptr inbounds i8, ptr %0, i64 56
  %59 = load ptr, ptr %58, align 8, !tbaa !5
  %60 = getelementptr inbounds i8, ptr %0, i64 84
  %61 = load i32, ptr %60, align 4, !tbaa !18
  %62 = zext i32 %61 to i64
  %63 = getelementptr inbounds i8, ptr %59, i64 %62
  %64 = getelementptr inbounds i8, ptr %10, i64 56
  store ptr %63, ptr %64, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #6
  store i64 0, ptr %11, align 8, !tbaa !9
  invoke void @Bcj2Enc_Init(ptr noundef nonnull %10)
          to label %67 unwind label %115

65:                                               ; preds = %27
  %66 = landingpad { ptr, i32 }
          cleanup
  br label %278

67:                                               ; preds = %33
  %68 = getelementptr inbounds i8, ptr %10, i64 116
  store i32 0, ptr %68, align 4, !tbaa !19
  %69 = getelementptr inbounds i8, ptr %10, i64 120
  store i32 %.1111, ptr %69, align 8, !tbaa !20
  %70 = getelementptr inbounds i8, ptr %0, i64 112
  %71 = load i32, ptr %70, align 8, !tbaa !21
  %72 = getelementptr inbounds i8, ptr %10, i64 124
  store i32 %71, ptr %72, align 4, !tbaa !29
  %73 = getelementptr inbounds i8, ptr %10, i64 84
  store i32 0, ptr %73, align 4, !tbaa !30
  %74 = getelementptr inbounds i8, ptr %10, i64 112
  %75 = getelementptr inbounds i8, ptr %10, i64 132
  %76 = getelementptr inbounds i8, ptr %10, i64 144
  %77 = getelementptr inbounds i8, ptr %10, i64 80
  %78 = getelementptr inbounds i8, ptr %0, i64 88
  %.not170 = icmp eq ptr %7, null
  %79 = getelementptr inbounds i8, ptr %10, i64 24
  br label %.outer.outer

.outer.outer:                                     ; preds = %248, %67
  %.0143.ph.ph = phi i64 [ %.3146, %248 ], [ 0, %67 ]
  %.0140.ph.ph = phi i1 [ %.2142, %248 ], [ false, %67 ]
  %.0135.ph.ph = phi i64 [ %.4139, %248 ], [ 0, %67 ]
  %.0130.ph.ph = phi i64 [ %.4134, %248 ], [ 0, %67 ]
  %.0127.ph.ph = phi i8 [ %.0127.ph222, %248 ], [ 0, %67 ]
  %.0124.ph.ph = phi i64 [ %.2126, %248 ], [ 0, %67 ]
  %.0122.ph.ph = phi i64 [ %234, %248 ], [ 0, %67 ]
  %.0119.ph.ph = phi i64 [ %.2121, %248 ], [ 0, %67 ]
  br label %.outer

.outer:                                           ; preds = %.outer.backedge, %.outer.outer
  %.0143.ph = phi i64 [ %.0143.ph.ph, %.outer.outer ], [ %.3146, %.outer.backedge ]
  %.0140.ph = phi i1 [ %.0140.ph.ph, %.outer.outer ], [ %.2142, %.outer.backedge ]
  %.0135.ph = phi i64 [ %.0135.ph.ph, %.outer.outer ], [ %.4139, %.outer.backedge ]
  %.0130.ph = phi i64 [ %.0130.ph.ph, %.outer.outer ], [ %.4134, %.outer.backedge ]
  %.0127.ph = phi i8 [ %.0127.ph.ph, %.outer.outer ], [ %.0127.ph222, %.outer.backedge ]
  %.0124.ph = phi i64 [ %.0124.ph.ph, %.outer.outer ], [ %.2126, %.outer.backedge ]
  %.0119.ph = phi i64 [ %.0119.ph.ph, %.outer.outer ], [ %.2121, %.outer.backedge ]
  br label %.outer218

.outer218:                                        ; preds = %.outer, %231
  %.0140.ph219 = phi i1 [ %.0140.ph, %.outer ], [ true, %231 ]
  %.0135.ph220 = phi i64 [ %.0135.ph, %.outer ], [ %.4139, %231 ]
  %.0130.ph221 = phi i64 [ %.0130.ph, %.outer ], [ %.4134, %231 ]
  %.0127.ph222 = phi i8 [ %.0127.ph, %.outer ], [ 1, %231 ]
  %.0119.ph225 = phi i64 [ %.0119.ph, %.outer ], [ 0, %231 ]
  %80 = trunc nuw i8 %.0127.ph222 to i1
  br label %.backedge

.backedge:                                        ; preds = %.backedge.backedge, %.outer218
  %.0140 = phi i1 [ %.0140.ph219, %.outer218 ], [ true, %.backedge.backedge ]
  %.0135 = phi i64 [ %.0135.ph220, %.outer218 ], [ %.4139, %.backedge.backedge ]
  %.0130 = phi i64 [ %.0130.ph221, %.outer218 ], [ %.4134, %.backedge.backedge ]
  br i1 %.0140, label %81, label %146

81:                                               ; preds = %.backedge
  %82 = call noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEcvPS0_Ev(ptr noundef nonnull align 8 dereferenceable(8) %9)
  %.not163 = icmp eq ptr %82, null
  br i1 %.not163, label %146, label %83

83:                                               ; preds = %81
  store i32 0, ptr %68, align 4, !tbaa !19
  store i32 %.1111, ptr %69, align 8, !tbaa !20
  store i32 0, ptr %73, align 4, !tbaa !30
  br i1 %80, label %.split, label %.split.us

.split.us:                                        ; preds = %83, %97
  %.1136.us = phi i64 [ %98, %97 ], [ %.0135, %83 ]
  %.1131.us = phi i64 [ %92, %97 ], [ %.0130, %83 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #6
  store i64 0, ptr %12, align 8, !tbaa !9
  %84 = call noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEptEv(ptr noundef nonnull align 8 dereferenceable(8) %9)
  %85 = load ptr, ptr %84, align 8, !tbaa !11
  %86 = getelementptr inbounds i8, ptr %85, i64 40
  %87 = load ptr, ptr %86, align 8
  %88 = invoke noundef i32 %87(ptr noundef nonnull align 8 dereferenceable(8) %84, i64 noundef %.1136.us, ptr noundef nonnull %12)
          to label %89 unwind label %.loopexit214.split.us

89:                                               ; preds = %.split.us
  switch i32 %88, label %.thread193 [
    i32 0, label %90
    i32 1, label %.thread186
    i32 -2147467263, label %.split311.us
  ]

90:                                               ; preds = %89
  %91 = load i64, ptr %12, align 8, !tbaa !9
  %92 = add i64 %91, %.1131.us
  %93 = icmp ult i64 %92, %.0124.ph
  %94 = load i64, ptr %11, align 8, !tbaa !9
  br i1 %93, label %.thread.us, label %.split315.thread

.split315.thread:                                 ; preds = %90
  %95 = load ptr, ptr %34, align 8, !tbaa !5
  %96 = getelementptr inbounds i8, ptr %95, i64 %.0119.ph225
  store ptr %96, ptr %37, align 8, !tbaa !17
  br label %134

.thread.us:                                       ; preds = %90
  %.not164180.us = icmp ugt i64 %92, %94
  br i1 %.not164180.us, label %.thread183, label %97

97:                                               ; preds = %.thread.us
  %98 = add i64 %.1136.us, 1
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #6
  br label %.split.us

.loopexit214.split.us:                            ; preds = %.split.us
  %lpad.loopexit.us = landingpad { ptr, i32 }
          cleanup
  br label %.loopexit214

.split:                                           ; preds = %83, %144
  %.1136 = phi i64 [ %145, %144 ], [ %.0135, %83 ]
  %.1131 = phi i64 [ %107, %144 ], [ %.0130, %83 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #6
  store i64 0, ptr %12, align 8, !tbaa !9
  %99 = call noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEptEv(ptr noundef nonnull align 8 dereferenceable(8) %9)
  %100 = load ptr, ptr %99, align 8, !tbaa !11
  %101 = getelementptr inbounds i8, ptr %100, i64 40
  %102 = load ptr, ptr %101, align 8
  %103 = invoke noundef i32 %102(ptr noundef nonnull align 8 dereferenceable(8) %99, i64 noundef %.1136, ptr noundef nonnull %12)
          to label %104 unwind label %.loopexit214.split

104:                                              ; preds = %.split
  switch i32 %103, label %.thread193 [
    i32 0, label %105
    i32 1, label %.thread186
    i32 -2147467263, label %.split311.us
  ]

105:                                              ; preds = %104
  %106 = load i64, ptr %12, align 8, !tbaa !9
  %107 = add i64 %106, %.1131
  %108 = icmp ult i64 %107, %.0124.ph
  br i1 %108, label %.thread, label %109

109:                                              ; preds = %105
  %110 = icmp ule i64 %107, %.0124.ph
  %111 = load i64, ptr %11, align 8, !tbaa !9
  %.not164 = icmp ule i64 %107, %111
  %brmerge.not = select i1 %.not164, i1 %110, i1 false
  br i1 %brmerge.not, label %144, label %.split315

.thread:                                          ; preds = %105
  %112 = load i64, ptr %11, align 8, !tbaa !9
  %.not164180 = icmp ugt i64 %107, %112
  br i1 %.not164180, label %.thread183, label %144

.thread183:                                       ; preds = %.thread.us, %.thread
  %.us-phi322 = phi i64 [ %112, %.thread ], [ %94, %.thread.us ]
  %.us-phi323 = phi i64 [ %106, %.thread ], [ %91, %.thread.us ]
  %.us-phi324 = phi i64 [ %107, %.thread ], [ %92, %.thread.us ]
  %.us-phi325 = phi i64 [ %.1136, %.thread ], [ %.1136.us, %.thread.us ]
  %.us-phi326 = phi i64 [ %.1131, %.thread ], [ %.1131.us, %.thread.us ]
  %113 = load ptr, ptr %34, align 8, !tbaa !5
  %114 = getelementptr inbounds i8, ptr %113, i64 %.0119.ph225
  br label %121

115:                                              ; preds = %33
  %116 = landingpad { ptr, i32 }
          cleanup
  br label %277

117:                                              ; preds = %160
  %118 = landingpad { ptr, i32 }
          cleanup
  br label %277

.loopexit214.split:                               ; preds = %.split
  %lpad.loopexit = landingpad { ptr, i32 }
          cleanup
  br label %.loopexit214

.loopexit.split-lp:                               ; preds = %.split311.us
  %lpad.loopexit.split-lp = landingpad { ptr, i32 }
          cleanup
  br label %.loopexit214

.loopexit214:                                     ; preds = %.loopexit214.split, %.loopexit214.split.us, %.loopexit.split-lp
  %lpad.phi = phi { ptr, i32 } [ %lpad.loopexit.split-lp, %.loopexit.split-lp ], [ %lpad.loopexit, %.loopexit214.split ], [ %lpad.loopexit.us, %.loopexit214.split.us ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #6
  br label %277

.split315:                                        ; preds = %109
  %119 = load ptr, ptr %34, align 8, !tbaa !5
  %120 = getelementptr inbounds i8, ptr %119, i64 %.0119.ph225
  store ptr %120, ptr %37, align 8, !tbaa !17
  br i1 %110, label %121, label %134

121:                                              ; preds = %.thread183, %.split315
  %122 = phi i64 [ %.us-phi323, %.thread183 ], [ %106, %.split315 ]
  %123 = phi i64 [ %.us-phi324, %.thread183 ], [ %107, %.split315 ]
  %.1136248 = phi i64 [ %.us-phi325, %.thread183 ], [ %.1136, %.split315 ]
  %.1131240 = phi i64 [ %.us-phi326, %.thread183 ], [ %.1131, %.split315 ]
  %124 = phi ptr [ %114, %.thread183 ], [ %120, %.split315 ]
  %125 = phi i64 [ %.us-phi322, %.thread183 ], [ %111, %.split315 ]
  %126 = sub i64 %.0124.ph, %123
  %127 = load ptr, ptr %36, align 8, !tbaa !13
  %128 = ptrtoint ptr %124 to i64
  %129 = ptrtoint ptr %127 to i64
  %130 = sub i64 %128, %129
  %.not165 = icmp ult i64 %130, %126
  br i1 %.not165, label %.thread193, label %131

131:                                              ; preds = %121
  %132 = sub i64 0, %126
  %133 = getelementptr inbounds i8, ptr %124, i64 %132
  store ptr %133, ptr %37, align 8, !tbaa !17
  store i32 1, ptr %73, align 4, !tbaa !30
  br label %134

134:                                              ; preds = %.split315.thread, %131, %.split315
  %135 = phi i64 [ %122, %131 ], [ %106, %.split315 ], [ %91, %.split315.thread ]
  %.1136247 = phi i64 [ %.1136248, %131 ], [ %.1136, %.split315 ], [ %.1136.us, %.split315.thread ]
  %.1131239 = phi i64 [ %.1131240, %131 ], [ %.1131, %.split315 ], [ %.1131.us, %.split315.thread ]
  %136 = phi i64 [ %125, %131 ], [ %111, %.split315 ], [ %94, %.split315.thread ]
  %137 = icmp ult i64 %135, 2147483649
  br i1 %137, label %138, label %.thread186

138:                                              ; preds = %134
  %139 = load i32, ptr %74, align 8, !tbaa !31
  %140 = sub i64 %.1131239, %136
  %141 = trunc i64 %140 to i32
  %142 = add i32 %139, %141
  store i32 %142, ptr %68, align 4, !tbaa !19
  %143 = trunc nuw i64 %135 to i32
  store i32 %143, ptr %69, align 8, !tbaa !20
  br label %.thread186

.split311.us:                                     ; preds = %89, %104
  %.us-phi312 = phi i64 [ %.1136, %104 ], [ %.1136.us, %89 ]
  %.us-phi313 = phi i64 [ %.1131, %104 ], [ %.1131.us, %89 ]
  invoke void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeE7ReleaseEv(ptr noundef nonnull align 8 dereferenceable(8) %9)
          to label %.thread186 unwind label %.loopexit.split-lp

.thread186:                                       ; preds = %89, %104, %138, %134, %.split311.us
  %.1136246 = phi i64 [ %.1136247, %138 ], [ %.1136247, %134 ], [ %.us-phi312, %.split311.us ], [ %.1136, %104 ], [ %.1136.us, %89 ]
  %.1131238 = phi i64 [ %.1131239, %138 ], [ %.1131239, %134 ], [ %.us-phi313, %.split311.us ], [ %.1131, %104 ], [ %.1131.us, %89 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #6
  br label %146

.thread193:                                       ; preds = %121, %89, %104
  %.6.ph192 = phi i32 [ %103, %104 ], [ %88, %89 ], [ -2147467259, %121 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #6
  br label %.loopexit

144:                                              ; preds = %109, %.thread
  %145 = add i64 %.1136, 1
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #6
  br label %.split

146:                                              ; preds = %.thread186, %81, %.backedge
  %.1141 = phi i1 [ true, %81 ], [ false, %.backedge ], [ false, %.thread186 ]
  %.4139 = phi i64 [ %.0135, %81 ], [ %.0135, %.backedge ], [ %.1136246, %.thread186 ]
  %.4134 = phi i64 [ %.0130, %81 ], [ %.0130, %.backedge ], [ %.1131238, %.thread186 ]
  br i1 %80, label %147, label %160

147:                                              ; preds = %146
  %148 = load i64, ptr %11, align 8, !tbaa !9
  %149 = sub i64 %.0124.ph, %148
  %150 = load ptr, ptr %37, align 8, !tbaa !17
  %151 = load ptr, ptr %36, align 8, !tbaa !13
  %152 = ptrtoint ptr %150 to i64
  %153 = ptrtoint ptr %151 to i64
  %154 = sub i64 %152, %153
  %155 = load i32, ptr %75, align 4, !tbaa !32
  %156 = zext i32 %155 to i64
  %157 = add i64 %154, %156
  %158 = icmp eq i64 %149, %157
  br i1 %158, label %159, label %160

159:                                              ; preds = %147
  store i32 2, ptr %73, align 4, !tbaa !30
  br label %160

160:                                              ; preds = %159, %147, %146
  invoke void @Bcj2Enc_Encode(ptr noundef nonnull %10)
          to label %161 unwind label %117

161:                                              ; preds = %160
  %162 = load ptr, ptr %36, align 8, !tbaa !13
  %163 = load ptr, ptr %34, align 8, !tbaa !5
  %164 = ptrtoint ptr %162 to i64
  %165 = ptrtoint ptr %163 to i64
  %166 = load i32, ptr %75, align 4, !tbaa !32
  %167 = zext i32 %166 to i64
  %168 = add i64 %.0124.ph, %164
  %169 = add i64 %.0119.ph225, %165
  %170 = add i64 %169, %167
  %171 = sub i64 %168, %170
  store i64 %171, ptr %11, align 8, !tbaa !9
  %172 = load i32, ptr %76, align 8, !tbaa !33
  %173 = icmp eq i32 %172, 5
  br i1 %173, label %.preheader.preheader, label %181

.preheader.preheader:                             ; preds = %161
  %174 = load ptr, ptr %4, align 8, !tbaa !5
  %175 = load ptr, ptr %18, align 8, !tbaa !5
  %176 = load ptr, ptr %10, align 8, !tbaa !5
  %177 = ptrtoint ptr %176 to i64
  %178 = ptrtoint ptr %175 to i64
  %179 = sub i64 %177, %178
  %180 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %174, ptr noundef %175, i64 noundef %179) #6
  %.not175 = icmp eq i32 %180, 0
  br i1 %.not175, label %.preheader.1, label %.loopexit

181:                                              ; preds = %161
  %182 = load i32, ptr %77, align 8, !tbaa !34
  %183 = icmp ult i32 %182, 4
  br i1 %183, label %184, label %208

184:                                              ; preds = %181
  %185 = zext nneg i32 %182 to i64
  %186 = getelementptr inbounds [4 x ptr], ptr %10, i64 0, i64 %185
  %187 = load ptr, ptr %186, align 8, !tbaa !5
  %188 = getelementptr inbounds [5 x ptr], ptr %18, i64 0, i64 %185
  %189 = load ptr, ptr %188, align 8, !tbaa !5
  %190 = ptrtoint ptr %187 to i64
  %191 = ptrtoint ptr %189 to i64
  %192 = sub i64 %190, %191
  %193 = getelementptr inbounds ptr, ptr %4, i64 %185
  %194 = load ptr, ptr %193, align 8, !tbaa !5
  %195 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %194, ptr noundef %189, i64 noundef %192) #6
  %.not169 = icmp eq i32 %195, 0
  br i1 %.not169, label %.thread198, label %.loopexit

.thread198:                                       ; preds = %184
  %196 = load i32, ptr %77, align 8, !tbaa !34
  %197 = icmp eq i32 %196, 3
  %198 = select i1 %197, i64 %192, i64 0
  %spec.select177 = add i64 %198, %.0143.ph
  %199 = zext i32 %196 to i64
  %200 = getelementptr inbounds [5 x ptr], ptr %18, i64 0, i64 %199
  %201 = load ptr, ptr %200, align 8, !tbaa !5
  %202 = getelementptr inbounds [4 x ptr], ptr %10, i64 0, i64 %199
  store ptr %201, ptr %202, align 8, !tbaa !5
  %203 = getelementptr inbounds [5 x i32], ptr %38, i64 0, i64 %199
  %204 = load i32, ptr %203, align 4, !tbaa !18
  %205 = zext i32 %204 to i64
  %206 = getelementptr inbounds i8, ptr %201, i64 %205
  %207 = getelementptr inbounds [4 x ptr], ptr %39, i64 0, i64 %199
  store ptr %206, ptr %207, align 8, !tbaa !5
  br label %232

208:                                              ; preds = %181
  %.not166 = icmp eq i32 %182, 4
  br i1 %.not166, label %209, label %.loopexit

209:                                              ; preds = %208
  %210 = sub i64 %164, %165
  %.not167 = icmp eq i64 %.0119.ph225, %210
  br i1 %.not167, label %213, label %211

211:                                              ; preds = %209
  %212 = getelementptr inbounds i8, ptr %163, i64 %.0119.ph225
  store ptr %212, ptr %37, align 8, !tbaa !17
  br label %.backedge.backedge

.backedge.backedge:                               ; preds = %211, %213
  br label %.backedge, !llvm.loop !35

213:                                              ; preds = %209
  br i1 %80, label %.backedge.backedge, label %214

214:                                              ; preds = %213
  store ptr %163, ptr %36, align 8, !tbaa !13
  store ptr %163, ptr %37, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #6
  %215 = load i32, ptr %78, align 8, !tbaa !18
  store i32 %215, ptr %13, align 4, !tbaa !18
  %216 = load ptr, ptr %1, align 8, !tbaa !5
  %217 = load ptr, ptr %216, align 8, !tbaa !11
  %218 = getelementptr inbounds i8, ptr %217, i64 40
  %219 = load ptr, ptr %218, align 8
  %220 = invoke noundef i32 %219(ptr noundef nonnull align 8 dereferenceable(8) %216, ptr noundef %163, i32 noundef %215, ptr noundef nonnull %13)
          to label %221 unwind label %222

221:                                              ; preds = %214
  %.not168 = icmp eq i32 %220, 0
  br i1 %.not168, label %224, label %.thread200

.thread200:                                       ; preds = %221
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #6
  br label %.loopexit

222:                                              ; preds = %214
  %223 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #6
  br label %277

224:                                              ; preds = %221
  %225 = load i32, ptr %13, align 4, !tbaa !18
  %226 = icmp eq i32 %225, 0
  br i1 %226, label %231, label %.thread205, !llvm.loop !35

.thread205:                                       ; preds = %224
  %227 = zext i32 %225 to i64
  %228 = add i64 %.0124.ph, %227
  %229 = load ptr, ptr %34, align 8, !tbaa !5
  %230 = getelementptr inbounds i8, ptr %229, i64 %227
  store ptr %230, ptr %37, align 8, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #6
  br label %232

231:                                              ; preds = %224
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #6
  br label %.outer218

232:                                              ; preds = %.thread205, %.thread198
  %.3146 = phi i64 [ %spec.select177, %.thread198 ], [ %.0143.ph, %.thread205 ]
  %.2142 = phi i1 [ %.1141, %.thread198 ], [ true, %.thread205 ]
  %.2126 = phi i64 [ %.0124.ph, %.thread198 ], [ %228, %.thread205 ]
  %.2121 = phi i64 [ %.0119.ph225, %.thread198 ], [ %227, %.thread205 ]
  br i1 %.not170, label %.outer.backedge, label %233

233:                                              ; preds = %232
  %234 = load i64, ptr %11, align 8, !tbaa !9
  %235 = sub i64 %234, %.0122.ph.ph
  %236 = icmp ugt i64 %235, 1048575
  br i1 %236, label %237, label %.outer.backedge

.outer.backedge:                                  ; preds = %233, %232
  br label %.outer, !llvm.loop !35

237:                                              ; preds = %233
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #6
  %238 = load ptr, ptr %79, align 8, !tbaa !5
  %239 = getelementptr i8, ptr %238, i64 %234
  %240 = getelementptr i8, ptr %239, i64 %.3146
  %241 = ptrtoint ptr %240 to i64
  %242 = ptrtoint ptr %238 to i64
  %243 = sub i64 %241, %242
  store i64 %243, ptr %14, align 8, !tbaa !9
  %244 = load ptr, ptr %7, align 8, !tbaa !11
  %245 = getelementptr inbounds i8, ptr %244, i64 40
  %246 = load ptr, ptr %245, align 8
  %247 = invoke noundef i32 %246(ptr noundef nonnull align 8 dereferenceable(8) %7, ptr noundef nonnull %11, ptr noundef nonnull %14)
          to label %248 unwind label %249

248:                                              ; preds = %237
  %.not174 = icmp eq i32 %247, 0
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #6
  br i1 %.not174, label %.outer.outer, label %.loopexit, !llvm.loop !35

249:                                              ; preds = %237
  %250 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #6
  br label %277

.preheader.1:                                     ; preds = %.preheader.preheader
  %251 = getelementptr inbounds i8, ptr %4, i64 8
  %252 = load ptr, ptr %251, align 8, !tbaa !5
  %253 = load ptr, ptr %44, align 8, !tbaa !5
  %254 = getelementptr inbounds i8, ptr %10, i64 8
  %255 = load ptr, ptr %254, align 8, !tbaa !5
  %256 = ptrtoint ptr %255 to i64
  %257 = ptrtoint ptr %253 to i64
  %258 = sub i64 %256, %257
  %259 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %252, ptr noundef %253, i64 noundef %258) #6
  %.not175.1 = icmp eq i32 %259, 0
  br i1 %.not175.1, label %.preheader.2, label %.loopexit

.preheader.2:                                     ; preds = %.preheader.1
  %260 = getelementptr inbounds i8, ptr %4, i64 16
  %261 = load ptr, ptr %260, align 8, !tbaa !5
  %262 = load ptr, ptr %51, align 8, !tbaa !5
  %263 = getelementptr inbounds i8, ptr %10, i64 16
  %264 = load ptr, ptr %263, align 8, !tbaa !5
  %265 = ptrtoint ptr %264 to i64
  %266 = ptrtoint ptr %262 to i64
  %267 = sub i64 %265, %266
  %268 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %261, ptr noundef %262, i64 noundef %267) #6
  %.not175.2 = icmp eq i32 %268, 0
  br i1 %.not175.2, label %.preheader.3, label %.loopexit

.preheader.3:                                     ; preds = %.preheader.2
  %269 = getelementptr inbounds i8, ptr %4, i64 24
  %270 = load ptr, ptr %269, align 8, !tbaa !5
  %271 = load ptr, ptr %58, align 8, !tbaa !5
  %272 = load ptr, ptr %79, align 8, !tbaa !5
  %273 = ptrtoint ptr %272 to i64
  %274 = ptrtoint ptr %271 to i64
  %275 = sub i64 %273, %274
  %276 = call noundef i32 @_Z11WriteStreamP20ISequentialOutStreamPKvm(ptr noundef %270, ptr noundef %271, i64 noundef %275) #6
  br label %.loopexit

.loopexit:                                        ; preds = %184, %248, %208, %.preheader.3, %.preheader.preheader, %.preheader.1, %.preheader.2, %.thread200, %.thread193
  %.16 = phi i32 [ %.6.ph192, %.thread193 ], [ %220, %.thread200 ], [ %180, %.preheader.preheader ], [ %259, %.preheader.1 ], [ %268, %.preheader.2 ], [ %276, %.preheader.3 ], [ -2147467259, %208 ], [ %195, %184 ], [ %247, %248 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 664, ptr nonnull %10) #6
  call void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeED2Ev(ptr noundef nonnull align 8 dereferenceable(8) %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #6
  br label %279

277:                                              ; preds = %117, %.loopexit214, %222, %249, %115
  %.pn.pn = phi { ptr, i32 } [ %116, %115 ], [ %250, %249 ], [ %223, %222 ], [ %118, %117 ], [ %lpad.phi, %.loopexit214 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 664, ptr nonnull %10) #6
  br label %278

278:                                              ; preds = %277, %65
  %.pn.pn.pn = phi { ptr, i32 } [ %.pn.pn, %277 ], [ %66, %65 ]
  call void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeED2Ev(ptr noundef nonnull align 8 dereferenceable(8) %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #6
  resume { ptr, i32 } %.pn.pn.pn

279:                                              ; preds = %17, %8, %.loopexit
  %.17 = phi i32 [ %19, %17 ], [ %.16, %.loopexit ], [ -2147024809, %8 ]
  ret i32 %.17
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEC2Ev(ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZN9CMyComPtrI25ICompressGetSubStreamSizeEadEv(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #2 align 2

declare void @Bcj2Enc_Init(ptr noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEcvPS0_Ev(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK9CMyComPtrI25ICompressGetSubStreamSizeEptEv(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #2 align 2

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

declare void @Bcj2Enc_Encode(ptr noundef) local_unnamed_addr #3

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN9CMyComPtrI25ICompressGetSubStreamSizeED2Ev(ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #2 align 2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #5

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 = { mustprogress 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 #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 "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 #5 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { 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 = !{!"long long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"vtable pointer", !8, i64 0}
!13 = !{!14, !6, i64 64}
!14 = !{!"_ZTS8CBcj2Enc", !7, i64 0, !7, i64 32, !6, i64 64, !6, i64 72, !15, i64 80, !16, i64 84, !7, i64 88, !7, i64 89, !15, i64 92, !10, i64 96, !10, i64 104, !15, i64 112, !15, i64 116, !15, i64 120, !15, i64 124, !15, i64 128, !15, i64 132, !7, i64 136, !15, i64 144, !7, i64 148}
!15 = !{!"int", !7, i64 0}
!16 = !{!"_ZTS19EBcj2Enc_FinishMode", !7, i64 0}
!17 = !{!14, !6, i64 72}
!18 = !{!15, !15, i64 0}
!19 = !{!14, !15, i64 116}
!20 = !{!14, !15, i64 120}
!21 = !{!22, !15, i64 112}
!22 = !{!"_ZTSN9NCompress5NBcj28CEncoderE", !23, i64 0, !25, i64 8, !26, i64 16, !27, i64 24, !28, i64 32, !15, i64 112}
!23 = !{!"_ZTS15ICompressCoder2", !24, i64 0}
!24 = !{!"_ZTS8IUnknown"}
!25 = !{!"_ZTS27ICompressSetCoderProperties", !24, i64 0}
!26 = !{!"_ZTS19ICompressSetBufSize", !24, i64 0}
!27 = !{!"_ZTS13CMyUnknownImp", !15, i64 0}
!28 = !{!"_ZTSN9NCompress5NBcj210CBaseCoderE", !7, i64 0, !7, i64 40, !7, i64 60}
!29 = !{!14, !15, i64 124}
!30 = !{!14, !16, i64 84}
!31 = !{!14, !15, i64 112}
!32 = !{!14, !15, i64 132}
!33 = !{!14, !15, i64 144}
!34 = !{!14, !15, i64 80}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}


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