; LLVM IR from quixdb/squash :: plugins/ncompress (compress)

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

; 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 nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; 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) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @decompress(ptr noundef %0, ptr noundef %1, ptr noundef %2, i64 noundef %3) #3 {
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i64, align 8
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca i32, align 4
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i64, align 8
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca [8256 x i8], align 16
  %31 = alloca [10240 x i8], align 16
  %32 = alloca [131072 x i64], align 16
  %33 = alloca [131072 x i16], align 16
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca i64, align 8
  %39 = alloca ptr, align 8
  %40 = alloca i64, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i64 %3, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  store i64 0, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  store i64 0, ptr %27, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  store i32 16, ptr %28, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  store i32 128, ptr %29, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8256, ptr %30) #4
  call void @llvm.lifetime.start.p0(i64 10240, ptr %31) #4
  call void @llvm.lifetime.start.p0(i64 1048576, ptr %32) #4
  call void @llvm.lifetime.start.p0(i64 262144, ptr %33) #4
  store i64 0, ptr %25, align 8, !tbaa !9
  store i64 0, ptr %18, align 8, !tbaa !9
  %41 = load i64, ptr %9, align 8, !tbaa !9
  %42 = icmp ult i64 %41, 8192
  br i1 %42, label %43, label %45

43:                                               ; preds = %4
  %44 = load i64, ptr %9, align 8, !tbaa !9
  br label %46

45:                                               ; preds = %4
  br label %46

46:                                               ; preds = %45, %43
  %47 = phi i64 [ %44, %43 ], [ 8192, %45 ]
  %48 = trunc i64 %47 to i32
  store i32 %48, ptr %24, align 4, !tbaa !11
  %49 = sext i32 %48 to i64
  store i64 %49, ptr %18, align 8, !tbaa !9
  store i64 %49, ptr %27, align 8, !tbaa !9
  %50 = load i32, ptr %24, align 4, !tbaa !11
  %51 = icmp slt i32 %50, 0
  br i1 %51, label %52, label %53

52:                                               ; preds = %46
  store i32 1, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

53:                                               ; preds = %46
  %54 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 0
  %55 = load ptr, ptr %8, align 8, !tbaa !5
  %56 = load i32, ptr %24, align 4, !tbaa !11
  %57 = sext i32 %56 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %54, ptr align 1 %55, i64 %57, i1 false)
  %58 = load i64, ptr %18, align 8, !tbaa !9
  %59 = icmp ult i64 %58, 3
  br i1 %59, label %70, label %60

60:                                               ; preds = %53
  %61 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 0
  %62 = load i8, ptr %61, align 16, !tbaa !13
  %63 = zext i8 %62 to i32
  %64 = icmp ne i32 %63, 31
  br i1 %64, label %70, label %65

65:                                               ; preds = %60
  %66 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 1
  %67 = load i8, ptr %66, align 1, !tbaa !13
  %68 = zext i8 %67 to i32
  %69 = icmp ne i32 %68, 157
  br i1 %69, label %70, label %71

70:                                               ; preds = %65, %60, %53
  store i32 3, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

71:                                               ; preds = %65
  %72 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 2
  %73 = load i8, ptr %72, align 2, !tbaa !13
  %74 = zext i8 %73 to i32
  %75 = and i32 %74, 31
  store i32 %75, ptr %28, align 4, !tbaa !11
  %76 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 2
  %77 = load i8, ptr %76, align 2, !tbaa !13
  %78 = zext i8 %77 to i32
  %79 = and i32 %78, 128
  store i32 %79, ptr %29, align 4, !tbaa !11
  %80 = load i32, ptr %28, align 4, !tbaa !11
  %81 = zext i32 %80 to i64
  %82 = shl i64 1, %81
  store i64 %82, ptr %22, align 8, !tbaa !9
  %83 = load i32, ptr %28, align 4, !tbaa !11
  %84 = icmp sgt i32 %83, 16
  br i1 %84, label %85, label %86

85:                                               ; preds = %71
  store i32 3, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

86:                                               ; preds = %71
  %87 = load i64, ptr %18, align 8, !tbaa !9
  store i64 %87, ptr %25, align 8, !tbaa !9
  store i32 9, ptr %23, align 4, !tbaa !11
  store i64 511, ptr %21, align 8, !tbaa !9
  %88 = load i32, ptr %23, align 4, !tbaa !11
  %89 = shl i32 1, %88
  %90 = sub nsw i32 %89, 1
  store i32 %90, ptr %19, align 4, !tbaa !11
  store i64 -1, ptr %13, align 8, !tbaa !9
  store i32 0, ptr %12, align 4, !tbaa !11
  store i64 0, ptr %17, align 8, !tbaa !9
  store i32 24, ptr %16, align 4, !tbaa !11
  %91 = load i32, ptr %29, align 4, !tbaa !11
  %92 = icmp ne i32 %91, 0
  %93 = zext i1 %92 to i64
  %94 = select i1 %92, i32 257, i32 256
  %95 = sext i32 %94 to i64
  store i64 %95, ptr %20, align 8, !tbaa !9
  %96 = getelementptr inbounds [131072 x i16], ptr %33, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 16 %96, i8 0, i64 256, i1 false)
  store i64 255, ptr %11, align 8, !tbaa !9
  br label %97

97:                                               ; preds = %106, %86
  %98 = load i64, ptr %11, align 8, !tbaa !9
  %99 = icmp sge i64 %98, 0
  br i1 %99, label %100, label %109

100:                                              ; preds = %97
  %101 = load i64, ptr %11, align 8, !tbaa !9
  %102 = trunc i64 %101 to i8
  %103 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 0
  %104 = load i64, ptr %11, align 8, !tbaa !9
  %105 = getelementptr inbounds i8, ptr %103, i64 %104
  store i8 %102, ptr %105, align 1, !tbaa !13
  br label %106

106:                                              ; preds = %100
  %107 = load i64, ptr %11, align 8, !tbaa !9
  %108 = add nsw i64 %107, -1
  store i64 %108, ptr %11, align 8, !tbaa !9
  br label %97, !llvm.loop !14

109:                                              ; preds = %97
  br label %110

110:                                              ; preds = %438, %109
  br label %111

111:                                              ; preds = %282, %228, %110
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #4
  %112 = load i64, ptr %18, align 8, !tbaa !9
  %113 = load i32, ptr %16, align 4, !tbaa !11
  %114 = ashr i32 %113, 3
  store i32 %114, ptr %37, align 4, !tbaa !11
  %115 = sext i32 %114 to i64
  %116 = sub i64 %112, %115
  %117 = trunc i64 %116 to i32
  store i32 %117, ptr %36, align 4, !tbaa !11
  store i32 0, ptr %35, align 4, !tbaa !11
  br label %118

118:                                              ; preds = %132, %111
  %119 = load i32, ptr %35, align 4, !tbaa !11
  %120 = load i32, ptr %36, align 4, !tbaa !11
  %121 = icmp slt i32 %119, %120
  br i1 %121, label %122, label %135

122:                                              ; preds = %118
  %123 = load i32, ptr %35, align 4, !tbaa !11
  %124 = load i32, ptr %37, align 4, !tbaa !11
  %125 = add nsw i32 %123, %124
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 %126
  %128 = load i8, ptr %127, align 1, !tbaa !13
  %129 = load i32, ptr %35, align 4, !tbaa !11
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 %130
  store i8 %128, ptr %131, align 1, !tbaa !13
  br label %132

132:                                              ; preds = %122
  %133 = load i32, ptr %35, align 4, !tbaa !11
  %134 = add nsw i32 %133, 1
  store i32 %134, ptr %35, align 4, !tbaa !11
  br label %118, !llvm.loop !16

135:                                              ; preds = %118
  %136 = load i32, ptr %36, align 4, !tbaa !11
  %137 = sext i32 %136 to i64
  store i64 %137, ptr %18, align 8, !tbaa !9
  store i32 0, ptr %16, align 4, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  %138 = load i64, ptr %18, align 8, !tbaa !9
  %139 = icmp ult i64 %138, 64
  br i1 %139, label %140, label %172

140:                                              ; preds = %135
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %141 = load i64, ptr %9, align 8, !tbaa !9
  %142 = load i64, ptr %27, align 8, !tbaa !9
  %143 = sub i64 %141, %142
  store i64 %143, ptr %38, align 8, !tbaa !9
  %144 = load i64, ptr %38, align 8, !tbaa !9
  %145 = icmp ult i64 %144, 8192
  br i1 %145, label %146, label %148

146:                                              ; preds = %140
  %147 = load i64, ptr %38, align 8, !tbaa !9
  br label %149

148:                                              ; preds = %140
  br label %149

149:                                              ; preds = %148, %146
  %150 = phi i64 [ %147, %146 ], [ 8192, %148 ]
  %151 = trunc i64 %150 to i32
  store i32 %151, ptr %24, align 4, !tbaa !11
  %152 = load i32, ptr %24, align 4, !tbaa !11
  %153 = icmp ne i32 %152, 0
  br i1 %153, label %154, label %167

154:                                              ; preds = %149
  %155 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 0
  %156 = load i64, ptr %18, align 8, !tbaa !9
  %157 = getelementptr inbounds i8, ptr %155, i64 %156
  %158 = load ptr, ptr %8, align 8, !tbaa !5
  %159 = load i64, ptr %27, align 8, !tbaa !9
  %160 = getelementptr inbounds i8, ptr %158, i64 %159
  %161 = load i32, ptr %24, align 4, !tbaa !11
  %162 = sext i32 %161 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %157, ptr align 1 %160, i64 %162, i1 false)
  %163 = load i32, ptr %24, align 4, !tbaa !11
  %164 = sext i32 %163 to i64
  %165 = load i64, ptr %27, align 8, !tbaa !9
  %166 = add i64 %165, %164
  store i64 %166, ptr %27, align 8, !tbaa !9
  br label %167

167:                                              ; preds = %154, %149
  %168 = load i32, ptr %24, align 4, !tbaa !11
  %169 = sext i32 %168 to i64
  %170 = load i64, ptr %18, align 8, !tbaa !9
  %171 = add i64 %170, %169
  store i64 %171, ptr %18, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  br label %172

172:                                              ; preds = %167, %135
  %173 = load i32, ptr %24, align 4, !tbaa !11
  %174 = icmp sgt i32 %173, 0
  br i1 %174, label %175, label %183

175:                                              ; preds = %172
  %176 = load i64, ptr %18, align 8, !tbaa !9
  %177 = load i64, ptr %18, align 8, !tbaa !9
  %178 = load i32, ptr %23, align 4, !tbaa !11
  %179 = sext i32 %178 to i64
  %180 = urem i64 %177, %179
  %181 = sub i64 %176, %180
  %182 = shl i64 %181, 3
  br label %190

183:                                              ; preds = %172
  %184 = load i64, ptr %18, align 8, !tbaa !9
  %185 = shl i64 %184, 3
  %186 = load i32, ptr %23, align 4, !tbaa !11
  %187 = sub nsw i32 %186, 1
  %188 = sext i32 %187 to i64
  %189 = sub i64 %185, %188
  br label %190

190:                                              ; preds = %183, %175
  %191 = phi i64 [ %182, %175 ], [ %189, %183 ]
  %192 = trunc i64 %191 to i32
  store i32 %192, ptr %15, align 4, !tbaa !11
  br label %193

193:                                              ; preds = %431, %269, %190
  %194 = load i32, ptr %15, align 4, !tbaa !11
  %195 = load i32, ptr %16, align 4, !tbaa !11
  %196 = icmp sgt i32 %194, %195
  br i1 %196, label %197, label %433

197:                                              ; preds = %193
  %198 = load i64, ptr %20, align 8, !tbaa !9
  %199 = load i64, ptr %21, align 8, !tbaa !9
  %200 = icmp sgt i64 %198, %199
  br i1 %200, label %201, label %232

201:                                              ; preds = %197
  %202 = load i32, ptr %16, align 4, !tbaa !11
  %203 = sub nsw i32 %202, 1
  %204 = load i32, ptr %23, align 4, !tbaa !11
  %205 = shl i32 %204, 3
  %206 = load i32, ptr %16, align 4, !tbaa !11
  %207 = sub nsw i32 %206, 1
  %208 = load i32, ptr %23, align 4, !tbaa !11
  %209 = shl i32 %208, 3
  %210 = add nsw i32 %207, %209
  %211 = load i32, ptr %23, align 4, !tbaa !11
  %212 = shl i32 %211, 3
  %213 = srem i32 %210, %212
  %214 = sub nsw i32 %205, %213
  %215 = add nsw i32 %203, %214
  store i32 %215, ptr %16, align 4, !tbaa !11
  %216 = load i32, ptr %23, align 4, !tbaa !11
  %217 = add nsw i32 %216, 1
  store i32 %217, ptr %23, align 4, !tbaa !11
  %218 = load i32, ptr %23, align 4, !tbaa !11
  %219 = load i32, ptr %28, align 4, !tbaa !11
  %220 = icmp eq i32 %218, %219
  br i1 %220, label %221, label %223

221:                                              ; preds = %201
  %222 = load i64, ptr %22, align 8, !tbaa !9
  store i64 %222, ptr %21, align 8, !tbaa !9
  br label %228

223:                                              ; preds = %201
  %224 = load i32, ptr %23, align 4, !tbaa !11
  %225 = zext i32 %224 to i64
  %226 = shl i64 1, %225
  %227 = sub nsw i64 %226, 1
  store i64 %227, ptr %21, align 8, !tbaa !9
  br label %228

228:                                              ; preds = %223, %221
  %229 = load i32, ptr %23, align 4, !tbaa !11
  %230 = shl i32 1, %229
  %231 = sub nsw i32 %230, 1
  store i32 %231, ptr %19, align 4, !tbaa !11
  br label %111

232:                                              ; preds = %197
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  %233 = load i32, ptr %16, align 4, !tbaa !11
  %234 = ashr i32 %233, 3
  %235 = sext i32 %234 to i64
  %236 = getelementptr inbounds [8256 x i8], ptr %30, i64 0, i64 %235
  store ptr %236, ptr %39, align 8, !tbaa !5
  %237 = load ptr, ptr %39, align 8, !tbaa !5
  %238 = getelementptr inbounds i8, ptr %237, i64 0
  %239 = load i8, ptr %238, align 1, !tbaa !13
  %240 = zext i8 %239 to i64
  %241 = load ptr, ptr %39, align 8, !tbaa !5
  %242 = getelementptr inbounds i8, ptr %241, i64 1
  %243 = load i8, ptr %242, align 1, !tbaa !13
  %244 = zext i8 %243 to i64
  %245 = shl i64 %244, 8
  %246 = or i64 %240, %245
  %247 = load ptr, ptr %39, align 8, !tbaa !5
  %248 = getelementptr inbounds i8, ptr %247, i64 2
  %249 = load i8, ptr %248, align 1, !tbaa !13
  %250 = zext i8 %249 to i64
  %251 = shl i64 %250, 16
  %252 = or i64 %246, %251
  %253 = load i32, ptr %16, align 4, !tbaa !11
  %254 = and i32 %253, 7
  %255 = zext i32 %254 to i64
  %256 = ashr i64 %252, %255
  %257 = load i32, ptr %19, align 4, !tbaa !11
  %258 = sext i32 %257 to i64
  %259 = and i64 %256, %258
  store i64 %259, ptr %11, align 8, !tbaa !9
  %260 = load i32, ptr %23, align 4, !tbaa !11
  %261 = load i32, ptr %16, align 4, !tbaa !11
  %262 = add nsw i32 %261, %260
  store i32 %262, ptr %16, align 4, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  %263 = load i64, ptr %13, align 8, !tbaa !9
  %264 = icmp eq i64 %263, -1
  br i1 %264, label %265, label %276

265:                                              ; preds = %232
  %266 = load i64, ptr %11, align 8, !tbaa !9
  %267 = icmp sge i64 %266, 256
  br i1 %267, label %268, label %269

268:                                              ; preds = %265
  store i32 3, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

269:                                              ; preds = %265
  %270 = load i64, ptr %11, align 8, !tbaa !9
  store i64 %270, ptr %13, align 8, !tbaa !9
  %271 = trunc i64 %270 to i32
  store i32 %271, ptr %12, align 4, !tbaa !11
  %272 = trunc i32 %271 to i8
  %273 = load i64, ptr %17, align 8, !tbaa !9
  %274 = add i64 %273, 1
  store i64 %274, ptr %17, align 8, !tbaa !9
  %275 = getelementptr inbounds [10240 x i8], ptr %31, i64 0, i64 %273
  store i8 %272, ptr %275, align 1, !tbaa !13
  br label %193, !llvm.loop !17

276:                                              ; preds = %232
  %277 = load i64, ptr %11, align 8, !tbaa !9
  %278 = icmp eq i64 %277, 256
  br i1 %278, label %279, label %301

279:                                              ; preds = %276
  %280 = load i32, ptr %29, align 4, !tbaa !11
  %281 = icmp ne i32 %280, 0
  br i1 %281, label %282, label %301

282:                                              ; preds = %279
  %283 = getelementptr inbounds [131072 x i16], ptr %33, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 16 %283, i8 0, i64 256, i1 false)
  store i64 256, ptr %20, align 8, !tbaa !9
  %284 = load i32, ptr %16, align 4, !tbaa !11
  %285 = sub nsw i32 %284, 1
  %286 = load i32, ptr %23, align 4, !tbaa !11
  %287 = shl i32 %286, 3
  %288 = load i32, ptr %16, align 4, !tbaa !11
  %289 = sub nsw i32 %288, 1
  %290 = load i32, ptr %23, align 4, !tbaa !11
  %291 = shl i32 %290, 3
  %292 = add nsw i32 %289, %291
  %293 = load i32, ptr %23, align 4, !tbaa !11
  %294 = shl i32 %293, 3
  %295 = srem i32 %292, %294
  %296 = sub nsw i32 %287, %295
  %297 = add nsw i32 %285, %296
  store i32 %297, ptr %16, align 4, !tbaa !11
  store i32 9, ptr %23, align 4, !tbaa !11
  store i64 511, ptr %21, align 8, !tbaa !9
  %298 = load i32, ptr %23, align 4, !tbaa !11
  %299 = shl i32 1, %298
  %300 = sub nsw i32 %299, 1
  store i32 %300, ptr %19, align 4, !tbaa !11
  br label %111

301:                                              ; preds = %279, %276
  %302 = load i64, ptr %11, align 8, !tbaa !9
  store i64 %302, ptr %14, align 8, !tbaa !9
  %303 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 131071
  store ptr %303, ptr %10, align 8, !tbaa !5
  %304 = load i64, ptr %11, align 8, !tbaa !9
  %305 = load i64, ptr %20, align 8, !tbaa !9
  %306 = icmp sge i64 %304, %305
  br i1 %306, label %307, label %318

307:                                              ; preds = %301
  %308 = load i64, ptr %11, align 8, !tbaa !9
  %309 = load i64, ptr %20, align 8, !tbaa !9
  %310 = icmp sgt i64 %308, %309
  br i1 %310, label %311, label %312

311:                                              ; preds = %307
  store i32 3, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

312:                                              ; preds = %307
  %313 = load i32, ptr %12, align 4, !tbaa !11
  %314 = trunc i32 %313 to i8
  %315 = load ptr, ptr %10, align 8, !tbaa !5
  %316 = getelementptr inbounds i8, ptr %315, i32 -1
  store ptr %316, ptr %10, align 8, !tbaa !5
  store i8 %314, ptr %316, align 1, !tbaa !13
  %317 = load i64, ptr %13, align 8, !tbaa !9
  store i64 %317, ptr %11, align 8, !tbaa !9
  br label %318

318:                                              ; preds = %312, %301
  br label %319

319:                                              ; preds = %322, %318
  %320 = load i64, ptr %11, align 8, !tbaa !9
  %321 = icmp sge i64 %320, 256
  br i1 %321, label %322, label %333

322:                                              ; preds = %319
  %323 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 0
  %324 = load i64, ptr %11, align 8, !tbaa !9
  %325 = getelementptr inbounds i8, ptr %323, i64 %324
  %326 = load i8, ptr %325, align 1, !tbaa !13
  %327 = load ptr, ptr %10, align 8, !tbaa !5
  %328 = getelementptr inbounds i8, ptr %327, i32 -1
  store ptr %328, ptr %10, align 8, !tbaa !5
  store i8 %326, ptr %328, align 1, !tbaa !13
  %329 = load i64, ptr %11, align 8, !tbaa !9
  %330 = getelementptr inbounds [131072 x i16], ptr %33, i64 0, i64 %329
  %331 = load i16, ptr %330, align 2, !tbaa !18
  %332 = zext i16 %331 to i64
  store i64 %332, ptr %11, align 8, !tbaa !9
  br label %319, !llvm.loop !20

333:                                              ; preds = %319
  %334 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 0
  %335 = load i64, ptr %11, align 8, !tbaa !9
  %336 = getelementptr inbounds i8, ptr %334, i64 %335
  %337 = load i8, ptr %336, align 1, !tbaa !13
  %338 = zext i8 %337 to i32
  store i32 %338, ptr %12, align 4, !tbaa !11
  %339 = trunc i32 %338 to i8
  %340 = load ptr, ptr %10, align 8, !tbaa !5
  %341 = getelementptr inbounds i8, ptr %340, i32 -1
  store ptr %341, ptr %10, align 8, !tbaa !5
  store i8 %339, ptr %341, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  %342 = load i64, ptr %17, align 8, !tbaa !9
  %343 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 131071
  %344 = load ptr, ptr %10, align 8, !tbaa !5
  %345 = ptrtoint ptr %343 to i64
  %346 = ptrtoint ptr %344 to i64
  %347 = sub i64 %345, %346
  store i64 %347, ptr %40, align 8, !tbaa !9
  %348 = add i64 %342, %347
  %349 = icmp uge i64 %348, 8192
  br i1 %349, label %350, label %403

350:                                              ; preds = %333
  br label %351

351:                                              ; preds = %395, %350
  %352 = load i64, ptr %40, align 8, !tbaa !9
  %353 = load i64, ptr %17, align 8, !tbaa !9
  %354 = sub i64 8192, %353
  %355 = icmp ugt i64 %352, %354
  br i1 %355, label %356, label %359

356:                                              ; preds = %351
  %357 = load i64, ptr %17, align 8, !tbaa !9
  %358 = sub i64 8192, %357
  store i64 %358, ptr %40, align 8, !tbaa !9
  br label %359

359:                                              ; preds = %356, %351
  %360 = load i64, ptr %40, align 8, !tbaa !9
  %361 = icmp ugt i64 %360, 0
  br i1 %361, label %362, label %371

362:                                              ; preds = %359
  %363 = getelementptr inbounds [10240 x i8], ptr %31, i64 0, i64 0
  %364 = load i64, ptr %17, align 8, !tbaa !9
  %365 = getelementptr inbounds i8, ptr %363, i64 %364
  %366 = load ptr, ptr %10, align 8, !tbaa !5
  %367 = load i64, ptr %40, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %365, ptr align 1 %366, i64 %367, i1 false)
  %368 = load i64, ptr %40, align 8, !tbaa !9
  %369 = load i64, ptr %17, align 8, !tbaa !9
  %370 = add i64 %369, %368
  store i64 %370, ptr %17, align 8, !tbaa !9
  br label %371

371:                                              ; preds = %362, %359
  %372 = load i64, ptr %17, align 8, !tbaa !9
  %373 = icmp uge i64 %372, 8192
  br i1 %373, label %374, label %391

374:                                              ; preds = %371
  %375 = load i64, ptr %17, align 8, !tbaa !9
  %376 = load i64, ptr %26, align 8, !tbaa !9
  %377 = add i64 %375, %376
  %378 = load ptr, ptr %7, align 8, !tbaa !5
  %379 = load i64, ptr %378, align 8, !tbaa !9
  %380 = icmp ugt i64 %377, %379
  br i1 %380, label %381, label %382

381:                                              ; preds = %374
  store i32 2, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %413

382:                                              ; preds = %374
  %383 = load ptr, ptr %6, align 8, !tbaa !5
  %384 = load i64, ptr %26, align 8, !tbaa !9
  %385 = getelementptr inbounds i8, ptr %383, i64 %384
  %386 = getelementptr inbounds [10240 x i8], ptr %31, i64 0, i64 0
  %387 = load i64, ptr %17, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %385, ptr align 16 %386, i64 %387, i1 false)
  %388 = load i64, ptr %17, align 8, !tbaa !9
  %389 = load i64, ptr %26, align 8, !tbaa !9
  %390 = add i64 %389, %388
  store i64 %390, ptr %26, align 8, !tbaa !9
  store i64 0, ptr %17, align 8, !tbaa !9
  br label %391

391:                                              ; preds = %382, %371
  %392 = load i64, ptr %40, align 8, !tbaa !9
  %393 = load ptr, ptr %10, align 8, !tbaa !5
  %394 = getelementptr inbounds i8, ptr %393, i64 %392
  store ptr %394, ptr %10, align 8, !tbaa !5
  br label %395

395:                                              ; preds = %391
  %396 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 131071
  %397 = load ptr, ptr %10, align 8, !tbaa !5
  %398 = ptrtoint ptr %396 to i64
  %399 = ptrtoint ptr %397 to i64
  %400 = sub i64 %398, %399
  store i64 %400, ptr %40, align 8, !tbaa !9
  %401 = icmp ugt i64 %400, 0
  br i1 %401, label %351, label %402, !llvm.loop !21

402:                                              ; preds = %395
  br label %412

403:                                              ; preds = %333
  %404 = getelementptr inbounds [10240 x i8], ptr %31, i64 0, i64 0
  %405 = load i64, ptr %17, align 8, !tbaa !9
  %406 = getelementptr inbounds i8, ptr %404, i64 %405
  %407 = load ptr, ptr %10, align 8, !tbaa !5
  %408 = load i64, ptr %40, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %406, ptr align 1 %407, i64 %408, i1 false)
  %409 = load i64, ptr %40, align 8, !tbaa !9
  %410 = load i64, ptr %17, align 8, !tbaa !9
  %411 = add i64 %410, %409
  store i64 %411, ptr %17, align 8, !tbaa !9
  br label %412

412:                                              ; preds = %403, %402
  store i32 0, ptr %34, align 4
  br label %413

413:                                              ; preds = %412, %381
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  %414 = load i32, ptr %34, align 4
  switch i32 %414, label %464 [
    i32 0, label %415
  ]

415:                                              ; preds = %413
  %416 = load i64, ptr %20, align 8, !tbaa !9
  store i64 %416, ptr %11, align 8, !tbaa !9
  %417 = load i64, ptr %22, align 8, !tbaa !9
  %418 = icmp slt i64 %416, %417
  br i1 %418, label %419, label %431

419:                                              ; preds = %415
  %420 = load i64, ptr %13, align 8, !tbaa !9
  %421 = trunc i64 %420 to i16
  %422 = load i64, ptr %11, align 8, !tbaa !9
  %423 = getelementptr inbounds [131072 x i16], ptr %33, i64 0, i64 %422
  store i16 %421, ptr %423, align 2, !tbaa !18
  %424 = load i32, ptr %12, align 4, !tbaa !11
  %425 = trunc i32 %424 to i8
  %426 = getelementptr inbounds [131072 x i64], ptr %32, i64 0, i64 0
  %427 = load i64, ptr %11, align 8, !tbaa !9
  %428 = getelementptr inbounds i8, ptr %426, i64 %427
  store i8 %425, ptr %428, align 1, !tbaa !13
  %429 = load i64, ptr %11, align 8, !tbaa !9
  %430 = add nsw i64 %429, 1
  store i64 %430, ptr %20, align 8, !tbaa !9
  br label %431

431:                                              ; preds = %419, %415
  %432 = load i64, ptr %14, align 8, !tbaa !9
  store i64 %432, ptr %13, align 8, !tbaa !9
  br label %193, !llvm.loop !17

433:                                              ; preds = %193
  %434 = load i32, ptr %24, align 4, !tbaa !11
  %435 = sext i32 %434 to i64
  %436 = load i64, ptr %25, align 8, !tbaa !9
  %437 = add nsw i64 %436, %435
  store i64 %437, ptr %25, align 8, !tbaa !9
  br label %438

438:                                              ; preds = %433
  %439 = load i32, ptr %24, align 4, !tbaa !11
  %440 = icmp sgt i32 %439, 0
  br i1 %440, label %110, label %441, !llvm.loop !22

441:                                              ; preds = %438
  %442 = load i64, ptr %17, align 8, !tbaa !9
  %443 = load i64, ptr %26, align 8, !tbaa !9
  %444 = add i64 %442, %443
  %445 = load ptr, ptr %7, align 8, !tbaa !5
  %446 = load i64, ptr %445, align 8, !tbaa !9
  %447 = icmp ugt i64 %444, %446
  br i1 %447, label %448, label %449

448:                                              ; preds = %441
  store i32 2, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

449:                                              ; preds = %441
  %450 = load i64, ptr %17, align 8, !tbaa !9
  %451 = icmp ne i64 %450, 0
  br i1 %451, label %452, label %461

452:                                              ; preds = %449
  %453 = load ptr, ptr %6, align 8, !tbaa !5
  %454 = load i64, ptr %26, align 8, !tbaa !9
  %455 = getelementptr inbounds i8, ptr %453, i64 %454
  %456 = getelementptr inbounds [10240 x i8], ptr %31, i64 0, i64 0
  %457 = load i64, ptr %17, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %455, ptr align 16 %456, i64 %457, i1 false)
  %458 = load i64, ptr %17, align 8, !tbaa !9
  %459 = load i64, ptr %26, align 8, !tbaa !9
  %460 = add i64 %459, %458
  store i64 %460, ptr %26, align 8, !tbaa !9
  store i64 0, ptr %17, align 8, !tbaa !9
  br label %461

461:                                              ; preds = %452, %449
  %462 = load i64, ptr %26, align 8, !tbaa !9
  %463 = load ptr, ptr %7, align 8, !tbaa !5
  store i64 %462, ptr %463, align 8, !tbaa !9
  store i32 0, ptr %5, align 4
  store i32 1, ptr %34, align 4
  br label %464

464:                                              ; preds = %461, %448, %413, %311, %268, %85, %70, %52
  call void @llvm.lifetime.end.p0(i64 262144, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 1048576, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 10240, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 8256, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, 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
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  %465 = load i32, ptr %5, align 4
  ret i32 %465
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { 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 #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/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!7, !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !15}
!18 = !{!19, !19, i64 0}
!19 = !{!"short", !7, i64 0}
!20 = distinct !{!20, !15}
!21 = distinct !{!21, !15}
!22 = distinct !{!22, !15}


; 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 nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1

; 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 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) #2

; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable
define dso_local noundef i32 @decompress(ptr nocapture noundef writeonly %0, ptr nocapture noundef %1, ptr nocapture noundef readonly %2, i64 noundef %3) local_unnamed_addr #3 {
  %5 = alloca [8256 x i8], align 16
  %6 = alloca [10240 x i8], align 16
  %7 = alloca [131072 x i64], align 16
  %8 = alloca [131072 x i16], align 16
  call void @llvm.lifetime.start.p0(i64 8256, ptr nonnull %5) #5
  call void @llvm.lifetime.start.p0(i64 10240, ptr nonnull %6) #5
  call void @llvm.lifetime.start.p0(i64 1048576, ptr nonnull %7) #5
  call void @llvm.lifetime.start.p0(i64 262144, ptr nonnull %8) #5
  %9 = tail call i64 @llvm.umin.i64(i64 %3, i64 8192)
  %10 = trunc nuw nsw i64 %9 to i32
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %5, ptr align 1 %2, i64 %9, i1 false)
  %11 = icmp ult i64 %3, 3
  %12 = load i8, ptr %5, align 16
  %13 = icmp ne i8 %12, 31
  %or.cond = select i1 %11, i1 true, i1 %13
  %14 = getelementptr inbounds i8, ptr %5, i64 1
  %15 = load i8, ptr %14, align 1
  %16 = icmp ne i8 %15, -99
  %or.cond7 = select i1 %or.cond, i1 true, i1 %16
  br i1 %or.cond7, label %.loopexit, label %17

17:                                               ; preds = %4
  %18 = getelementptr inbounds i8, ptr %5, i64 2
  %19 = load i8, ptr %18, align 2, !tbaa !5
  %20 = and i8 %19, 31
  %21 = zext nneg i8 %20 to i32
  %22 = zext nneg i8 %20 to i64
  %23 = shl nuw nsw i64 1, %22
  %24 = icmp ugt i8 %20, 16
  br i1 %24, label %.loopexit, label %vector.ph

vector.ph:                                        ; preds = %17
  %25 = icmp slt i8 %19, 0
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %8, i8 0, i64 256, i1 false)
  %26 = getelementptr inbounds i8, ptr %7, i64 240
  store <16 x i8> <i8 -16, i8 -15, i8 -14, i8 -13, i8 -12, i8 -11, i8 -10, i8 -9, i8 -8, i8 -7, i8 -6, i8 -5, i8 -4, i8 -3, i8 -2, i8 -1>, ptr %26, align 16, !tbaa !5
  %27 = getelementptr inbounds i8, ptr %7, i64 224
  store <16 x i8> <i8 -32, i8 -31, i8 -30, i8 -29, i8 -28, i8 -27, i8 -26, i8 -25, i8 -24, i8 -23, i8 -22, i8 -21, i8 -20, i8 -19, i8 -18, i8 -17>, ptr %27, align 16, !tbaa !5
  %28 = getelementptr inbounds i8, ptr %7, i64 208
  store <16 x i8> <i8 -48, i8 -47, i8 -46, i8 -45, i8 -44, i8 -43, i8 -42, i8 -41, i8 -40, i8 -39, i8 -38, i8 -37, i8 -36, i8 -35, i8 -34, i8 -33>, ptr %28, align 16, !tbaa !5
  %29 = getelementptr inbounds i8, ptr %7, i64 192
  store <16 x i8> <i8 -64, i8 -63, i8 -62, i8 -61, i8 -60, i8 -59, i8 -58, i8 -57, i8 -56, i8 -55, i8 -54, i8 -53, i8 -52, i8 -51, i8 -50, i8 -49>, ptr %29, align 16, !tbaa !5
  %30 = getelementptr inbounds i8, ptr %7, i64 176
  store <16 x i8> <i8 -80, i8 -79, i8 -78, i8 -77, i8 -76, i8 -75, i8 -74, i8 -73, i8 -72, i8 -71, i8 -70, i8 -69, i8 -68, i8 -67, i8 -66, i8 -65>, ptr %30, align 16, !tbaa !5
  %31 = getelementptr inbounds i8, ptr %7, i64 160
  store <16 x i8> <i8 -96, i8 -95, i8 -94, i8 -93, i8 -92, i8 -91, i8 -90, i8 -89, i8 -88, i8 -87, i8 -86, i8 -85, i8 -84, i8 -83, i8 -82, i8 -81>, ptr %31, align 16, !tbaa !5
  %32 = getelementptr inbounds i8, ptr %7, i64 144
  store <16 x i8> <i8 -112, i8 -111, i8 -110, i8 -109, i8 -108, i8 -107, i8 -106, i8 -105, i8 -104, i8 -103, i8 -102, i8 -101, i8 -100, i8 -99, i8 -98, i8 -97>, ptr %32, align 16, !tbaa !5
  %33 = getelementptr inbounds i8, ptr %7, i64 128
  store <16 x i8> <i8 -128, i8 -127, i8 -126, i8 -125, i8 -124, i8 -123, i8 -122, i8 -121, i8 -120, i8 -119, i8 -118, i8 -117, i8 -116, i8 -115, i8 -114, i8 -113>, ptr %33, align 16, !tbaa !5
  %34 = getelementptr inbounds i8, ptr %7, i64 112
  store <16 x i8> <i8 112, i8 113, i8 114, i8 115, i8 116, i8 117, i8 118, i8 119, i8 120, i8 121, i8 122, i8 123, i8 124, i8 125, i8 126, i8 127>, ptr %34, align 16, !tbaa !5
  %35 = getelementptr inbounds i8, ptr %7, i64 96
  store <16 x i8> <i8 96, i8 97, i8 98, i8 99, i8 100, i8 101, i8 102, i8 103, i8 104, i8 105, i8 106, i8 107, i8 108, i8 109, i8 110, i8 111>, ptr %35, align 16, !tbaa !5
  %36 = getelementptr inbounds i8, ptr %7, i64 80
  store <16 x i8> <i8 80, i8 81, i8 82, i8 83, i8 84, i8 85, i8 86, i8 87, i8 88, i8 89, i8 90, i8 91, i8 92, i8 93, i8 94, i8 95>, ptr %36, align 16, !tbaa !5
  %37 = getelementptr inbounds i8, ptr %7, i64 64
  store <16 x i8> <i8 64, i8 65, i8 66, i8 67, i8 68, i8 69, i8 70, i8 71, i8 72, i8 73, i8 74, i8 75, i8 76, i8 77, i8 78, i8 79>, ptr %37, align 16, !tbaa !5
  %38 = getelementptr inbounds i8, ptr %7, i64 48
  store <16 x i8> <i8 48, i8 49, i8 50, i8 51, i8 52, i8 53, i8 54, i8 55, i8 56, i8 57, i8 58, i8 59, i8 60, i8 61, i8 62, i8 63>, ptr %38, align 16, !tbaa !5
  %39 = getelementptr inbounds i8, ptr %7, i64 32
  store <16 x i8> <i8 32, i8 33, i8 34, i8 35, i8 36, i8 37, i8 38, i8 39, i8 40, i8 41, i8 42, i8 43, i8 44, i8 45, i8 46, i8 47>, ptr %39, align 16, !tbaa !5
  %40 = getelementptr inbounds i8, ptr %7, i64 16
  store <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>, ptr %40, align 16, !tbaa !5
  store <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, ptr %7, align 16, !tbaa !5
  %41 = select i1 %25, i64 257, i64 256
  %42 = getelementptr inbounds i8, ptr %7, i64 1048568
  %43 = getelementptr inbounds i8, ptr %7, i64 1048567
  %44 = ptrtoint ptr %42 to i64
  br label %.backedge.outer

.backedge.outer:                                  ; preds = %.backedge.outer.backedge, %vector.ph
  %.1205.ph = phi i32 [ 24, %vector.ph ], [ %.1205.ph.be, %.backedge.outer.backedge ]
  %.1197.ph = phi i64 [ 0, %vector.ph ], [ %.1197.ph.be, %.backedge.outer.backedge ]
  %.1194.ph = phi i64 [ %9, %vector.ph ], [ %.2195, %.backedge.outer.backedge ]
  %.1192.ph = phi i32 [ 511, %vector.ph ], [ %.1192.ph.be, %.backedge.outer.backedge ]
  %.1188.ph = phi i64 [ %41, %vector.ph ], [ %.1188.ph.be, %.backedge.outer.backedge ]
  %.1185.ph = phi i64 [ 511, %vector.ph ], [ %.1185.ph.be, %.backedge.outer.backedge ]
  %.1182.ph = phi i64 [ -1, %vector.ph ], [ %.1182.ph.be, %.backedge.outer.backedge ]
  %.1180.ph = phi i32 [ 9, %vector.ph ], [ %.1180.ph.be, %.backedge.outer.backedge ]
  %.1177.ph = phi i32 [ %10, %vector.ph ], [ %.2178, %.backedge.outer.backedge ]
  %.1171.ph = phi i64 [ 0, %vector.ph ], [ %.2172.ph389, %.backedge.outer.backedge ]
  %.1167.ph = phi i64 [ %9, %vector.ph ], [ %.3169, %.backedge.outer.backedge ]
  %.1162.ph = phi i8 [ 0, %vector.ph ], [ %.1162.ph.be, %.backedge.outer.backedge ]
  %45 = add nsw i32 %.1180.ph, -1
  %46 = zext i32 %45 to i64
  %47 = sext i32 %.1180.ph to i64
  %48 = zext i32 %.1192.ph to i64
  br label %.backedge

.backedge:                                        ; preds = %.backedge.outer, %.outer._crit_edge
  %.1205 = phi i32 [ %.2206.lcssa, %.outer._crit_edge ], [ %.1205.ph, %.backedge.outer ]
  %.1197 = phi i64 [ %.2198.lcssa, %.outer._crit_edge ], [ %.1197.ph, %.backedge.outer ]
  %.1194 = phi i64 [ %.2195, %.outer._crit_edge ], [ %.1194.ph, %.backedge.outer ]
  %.1188 = phi i64 [ %.2189.ph.lcssa273, %.outer._crit_edge ], [ %.1188.ph, %.backedge.outer ]
  %.1182 = phi i64 [ %.2183.lcssa, %.outer._crit_edge ], [ %.1182.ph, %.backedge.outer ]
  %.1177 = phi i32 [ %.2178, %.outer._crit_edge ], [ %.1177.ph, %.backedge.outer ]
  %.1171 = phi i64 [ %.2172.ph.lcssa267, %.outer._crit_edge ], [ %.1171.ph, %.backedge.outer ]
  %.1167 = phi i64 [ %.3169, %.outer._crit_edge ], [ %.1167.ph, %.backedge.outer ]
  %.1162 = phi i8 [ %.2163.lcssa, %.outer._crit_edge ], [ %.1162.ph, %.backedge.outer ]
  %49 = ashr i32 %.1205, 3
  %50 = trunc i64 %.1194 to i32
  %51 = sub i32 %50, %49
  %52 = icmp sgt i32 %51, 0
  br i1 %52, label %iter.check, label %._crit_edge

iter.check:                                       ; preds = %.backedge
  %53 = sext i32 %49 to i64
  %wide.trip.count = zext nneg i32 %51 to i64
  %min.iters.check = icmp ult i32 %51, 8
  %54 = add nsw i64 %53, 31
  %diff.check = icmp ult i64 %54, 32
  %or.cond663 = select i1 %min.iters.check, i1 true, i1 %diff.check
  br i1 %or.cond663, label %.lr.ph.preheader, label %vector.main.loop.iter.check

vector.main.loop.iter.check:                      ; preds = %iter.check
  %min.iters.check650 = icmp ult i32 %51, 32
  br i1 %min.iters.check650, label %vec.epilog.ph, label %vector.ph651

vector.ph651:                                     ; preds = %vector.main.loop.iter.check
  %n.vec = and i64 %wide.trip.count, 2147483616
  br label %vector.body652

vector.body652:                                   ; preds = %vector.body652, %vector.ph651
  %index653 = phi i64 [ 0, %vector.ph651 ], [ %index.next655, %vector.body652 ]
  %55 = add nsw i64 %index653, %53
  %56 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %55
  %57 = getelementptr inbounds i8, ptr %56, i64 16
  %wide.load = load <16 x i8>, ptr %56, align 1, !tbaa !5
  %wide.load654 = load <16 x i8>, ptr %57, align 1, !tbaa !5
  %58 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %index653
  %59 = getelementptr inbounds i8, ptr %58, i64 16
  store <16 x i8> %wide.load, ptr %58, align 16, !tbaa !5
  store <16 x i8> %wide.load654, ptr %59, align 16, !tbaa !5
  %index.next655 = add nuw i64 %index653, 32
  %60 = icmp eq i64 %index.next655, %n.vec
  br i1 %60, label %middle.block647, label %vector.body652, !llvm.loop !8

middle.block647:                                  ; preds = %vector.body652
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %._crit_edge, label %vec.epilog.iter.check

vec.epilog.iter.check:                            ; preds = %middle.block647
  %n.vec.remaining = and i64 %wide.trip.count, 24
  %min.epilog.iters.check = icmp eq i64 %n.vec.remaining, 0
  br i1 %min.epilog.iters.check, label %.lr.ph.preheader, label %vec.epilog.ph

vec.epilog.ph:                                    ; preds = %vector.main.loop.iter.check, %vec.epilog.iter.check
  %vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
  %n.vec657 = and i64 %wide.trip.count, 2147483640
  br label %vec.epilog.vector.body

vec.epilog.vector.body:                           ; preds = %vec.epilog.vector.body, %vec.epilog.ph
  %index659 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next661, %vec.epilog.vector.body ]
  %61 = add nsw i64 %index659, %53
  %62 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %61
  %wide.load660 = load <8 x i8>, ptr %62, align 1, !tbaa !5
  %63 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %index659
  store <8 x i8> %wide.load660, ptr %63, align 8, !tbaa !5
  %index.next661 = add nuw i64 %index659, 8
  %64 = icmp eq i64 %index.next661, %n.vec657
  br i1 %64, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !12

vec.epilog.middle.block:                          ; preds = %vec.epilog.vector.body
  %cmp.n662 = icmp eq i64 %n.vec657, %wide.trip.count
  br i1 %cmp.n662, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %vec.epilog.middle.block, %iter.check, %vec.epilog.iter.check
  %indvars.iv.ph = phi i64 [ 0, %iter.check ], [ %n.vec, %vec.epilog.iter.check ], [ %n.vec657, %vec.epilog.middle.block ]
  %xtraiter = and i64 %wide.trip.count, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol

.lr.ph.prol:                                      ; preds = %.lr.ph.preheader, %.lr.ph.prol
  %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %.lr.ph.prol ], [ %indvars.iv.ph, %.lr.ph.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph.prol ], [ 0, %.lr.ph.preheader ]
  %65 = add nsw i64 %indvars.iv.prol, %53
  %66 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %65
  %67 = load i8, ptr %66, align 1, !tbaa !5
  %68 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %indvars.iv.prol
  store i8 %67, ptr %68, align 1, !tbaa !5
  %indvars.iv.next.prol = add nuw nsw i64 %indvars.iv.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph.prol.loopexit, label %.lr.ph.prol, !llvm.loop !13

.lr.ph.prol.loopexit:                             ; preds = %.lr.ph.prol, %.lr.ph.preheader
  %indvars.iv.unr = phi i64 [ %indvars.iv.ph, %.lr.ph.preheader ], [ %indvars.iv.next.prol, %.lr.ph.prol ]
  %69 = sub nsw i64 %indvars.iv.ph, %wide.trip.count
  %70 = icmp ugt i64 %69, -4
  br i1 %70, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.prol.loopexit, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next.3, %.lr.ph ], [ %indvars.iv.unr, %.lr.ph.prol.loopexit ]
  %71 = add nsw i64 %indvars.iv, %53
  %72 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %71
  %73 = load i8, ptr %72, align 1, !tbaa !5
  %74 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %indvars.iv
  store i8 %73, ptr %74, align 1, !tbaa !5
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %75 = add nsw i64 %indvars.iv.next, %53
  %76 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %75
  %77 = load i8, ptr %76, align 1, !tbaa !5
  %78 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %indvars.iv.next
  store i8 %77, ptr %78, align 1, !tbaa !5
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %79 = add nsw i64 %indvars.iv.next.1, %53
  %80 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %79
  %81 = load i8, ptr %80, align 1, !tbaa !5
  %82 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %indvars.iv.next.1
  store i8 %81, ptr %82, align 1, !tbaa !5
  %indvars.iv.next.2 = add nuw nsw i64 %indvars.iv, 3
  %83 = add nsw i64 %indvars.iv.next.2, %53
  %84 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %83
  %85 = load i8, ptr %84, align 1, !tbaa !5
  %86 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %indvars.iv.next.2
  store i8 %85, ptr %86, align 1, !tbaa !5
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next.3, %wide.trip.count
  br i1 %exitcond.not.3, label %._crit_edge, label %.lr.ph, !llvm.loop !15

._crit_edge:                                      ; preds = %.lr.ph.prol.loopexit, %.lr.ph, %middle.block647, %vec.epilog.middle.block, %.backedge
  %87 = sext i32 %51 to i64
  %88 = icmp ult i32 %51, 64
  br i1 %88, label %89, label %99

89:                                               ; preds = %._crit_edge
  %90 = sub i64 %3, %.1167
  %91 = call i64 @llvm.umin.i64(i64 %90, i64 8192)
  %92 = trunc nuw nsw i64 %91 to i32
  %.not = icmp eq i64 %.1167, %3
  br i1 %.not, label %97, label %93

93:                                               ; preds = %89
  %94 = getelementptr inbounds i8, ptr %5, i64 %87
  %95 = getelementptr inbounds i8, ptr %2, i64 %.1167
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %94, ptr align 1 %95, i64 %91, i1 false)
  %96 = add i64 %91, %.1167
  br label %97

97:                                               ; preds = %93, %89
  %.2168 = phi i64 [ %96, %93 ], [ %3, %89 ]
  %98 = add nuw nsw i64 %91, %87
  br label %99

99:                                               ; preds = %97, %._crit_edge
  %.2195 = phi i64 [ %98, %97 ], [ %87, %._crit_edge ]
  %.2178 = phi i32 [ %92, %97 ], [ %.1177, %._crit_edge ]
  %.3169 = phi i64 [ %.2168, %97 ], [ %.1167, %._crit_edge ]
  %100 = icmp sgt i32 %.2178, 0
  br i1 %100, label %101, label %105

101:                                              ; preds = %99
  %102 = urem i64 %.2195, %47
  %103 = sub i64 %.2195, %102
  %104 = shl i64 %103, 3
  br label %108

105:                                              ; preds = %99
  %106 = shl nsw i64 %.2195, 3
  %107 = sub nsw i64 %106, %46
  br label %108

108:                                              ; preds = %105, %101
  %109 = phi i64 [ %104, %101 ], [ %107, %105 ]
  %110 = trunc i64 %109 to i32
  %111 = icmp sgt i32 %110, 0
  br i1 %111, label %.lr.ph302, label %.outer._crit_edge

.lr.ph302:                                        ; preds = %108, %.outer
  %.2163.ph390 = phi i8 [ %182, %.outer ], [ %.1162, %108 ]
  %.2172.ph389 = phi i64 [ %.6.ph, %.outer ], [ %.1171, %108 ]
  %.2183.ph388 = phi i64 [ %.lcssa261, %.outer ], [ %.1182, %108 ]
  %.2189.ph387 = phi i64 [ %.3190, %.outer ], [ %.1188, %108 ]
  %.2198.ph386 = phi i64 [ %.7203.ph, %.outer ], [ %.1197, %108 ]
  %.2206.ph385 = phi i32 [ %.lcssa, %.outer ], [ 0, %108 ]
  %112 = icmp sgt i64 %.2189.ph387, %.1185.ph
  br i1 %112, label %.lr.ph302.split.us, label %.lr.ph302.split

.lr.ph302.split.us:                               ; preds = %.lr.ph302
  %113 = add nsw i32 %.2206.ph385, -1
  %114 = shl i32 %.1180.ph, 3
  %115 = add i32 %113, %114
  %116 = srem i32 %115, %114
  %117 = sub i32 %115, %116
  %118 = add nsw i32 %.1180.ph, 1
  %119 = icmp eq i32 %118, %21
  %120 = zext nneg i32 %118 to i64
  %notmask = shl nsw i64 -1, %120
  %121 = xor i64 %notmask, -1
  %.2186 = select i1 %119, i64 %23, i64 %121
  %notmask226 = shl nsw i32 -1, %118
  %122 = xor i32 %notmask226, -1
  br label %.backedge.outer.backedge

.backedge.outer.backedge:                         ; preds = %.lr.ph302.split.us, %162
  %.1205.ph.be = phi i32 [ %167, %162 ], [ %117, %.lr.ph302.split.us ]
  %.1197.ph.be = phi i64 [ %.2198.lcssa250, %162 ], [ %.2198.ph386, %.lr.ph302.split.us ]
  %.1192.ph.be = phi i32 [ 511, %162 ], [ %122, %.lr.ph302.split.us ]
  %.1188.ph.be = phi i64 [ 256, %162 ], [ %.2189.ph387, %.lr.ph302.split.us ]
  %.1185.ph.be = phi i64 [ 511, %162 ], [ %.2186, %.lr.ph302.split.us ]
  %.1182.ph.be = phi i64 [ %.2183.lcssa244, %162 ], [ %.2183.ph388, %.lr.ph302.split.us ]
  %.1180.ph.be = phi i32 [ 9, %162 ], [ %118, %.lr.ph302.split.us ]
  %.1162.ph.be = phi i8 [ %.2163.lcssa238, %162 ], [ %.2163.ph390, %.lr.ph302.split.us ]
  br label %.backedge.outer

.lr.ph302.split:                                  ; preds = %.lr.ph302
  %123 = ashr i32 %.2206.ph385, 3
  %124 = sext i32 %123 to i64
  %125 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %124
  %126 = load i16, ptr %125, align 1
  %127 = zext i16 %126 to i64
  %128 = getelementptr inbounds i8, ptr %125, i64 2
  %129 = load i8, ptr %128, align 1, !tbaa !5
  %130 = zext i8 %129 to i64
  %131 = shl nuw nsw i64 %130, 16
  %132 = or disjoint i64 %131, %127
  %133 = and i32 %.2206.ph385, 7
  %134 = zext nneg i32 %133 to i64
  %135 = lshr i64 %132, %134
  %136 = and i64 %135, %48
  %137 = add nsw i32 %.2206.ph385, %.1180.ph
  %138 = icmp eq i64 %.2183.ph388, -1
  br i1 %138, label %.lr.ph371, label %160

._crit_edge372:                                   ; preds = %155
  %139 = ashr i32 %137, 3
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds [8256 x i8], ptr %5, i64 0, i64 %140
  %142 = load i16, ptr %141, align 1
  %143 = zext i16 %142 to i64
  %144 = getelementptr inbounds i8, ptr %141, i64 2
  %145 = load i8, ptr %144, align 1, !tbaa !5
  %146 = zext i8 %145 to i64
  %147 = shl nuw nsw i64 %146, 16
  %148 = or disjoint i64 %147, %143
  %149 = and i32 %137, 7
  %150 = zext nneg i32 %149 to i64
  %151 = lshr i64 %148, %150
  %152 = and i64 %151, %48
  %153 = add nsw i32 %137, %.1180.ph
  br label %160

.lr.ph371:                                        ; preds = %.lr.ph302.split
  %154 = icmp ugt i64 %136, 255
  br i1 %154, label %.loopexit, label %155

155:                                              ; preds = %.lr.ph371
  %156 = trunc nuw i64 %136 to i8
  %157 = add i64 %.2198.ph386, 1
  %158 = getelementptr inbounds [10240 x i8], ptr %6, i64 0, i64 %.2198.ph386
  store i8 %156, ptr %158, align 1, !tbaa !5
  %159 = icmp slt i32 %137, %110
  br i1 %159, label %._crit_edge372, label %.outer._crit_edge, !llvm.loop !16

160:                                              ; preds = %._crit_edge372, %.lr.ph302.split
  %.lcssa261 = phi i64 [ %152, %._crit_edge372 ], [ %136, %.lr.ph302.split ]
  %.lcssa = phi i32 [ %153, %._crit_edge372 ], [ %137, %.lr.ph302.split ]
  %.2198.lcssa250 = phi i64 [ %157, %._crit_edge372 ], [ %.2198.ph386, %.lr.ph302.split ]
  %.2183.lcssa244 = phi i64 [ %136, %._crit_edge372 ], [ %.2183.ph388, %.lr.ph302.split ]
  %.2163.lcssa238 = phi i8 [ %156, %._crit_edge372 ], [ %.2163.ph390, %.lr.ph302.split ]
  %161 = icmp eq i64 %.lcssa261, 256
  %or.cond9 = and i1 %25, %161
  br i1 %or.cond9, label %162, label %168

162:                                              ; preds = %160
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(256) %8, i8 0, i64 256, i1 false)
  %163 = add nsw i32 %.lcssa, -1
  %164 = shl i32 %.1180.ph, 3
  %165 = add i32 %163, %164
  %166 = srem i32 %165, %164
  %167 = sub i32 %165, %166
  br label %.backedge.outer.backedge

168:                                              ; preds = %160
  %.not223 = icmp slt i64 %.lcssa261, %.2189.ph387
  br i1 %.not223, label %172, label %169

169:                                              ; preds = %168
  %170 = icmp sgt i64 %.lcssa261, %.2189.ph387
  br i1 %170, label %.loopexit, label %171

171:                                              ; preds = %169
  store i8 %.2163.lcssa238, ptr %43, align 1, !tbaa !5
  br label %172

172:                                              ; preds = %171, %168
  %.1159 = phi i64 [ %.2183.lcssa244, %171 ], [ %.lcssa261, %168 ]
  %.0155 = phi ptr [ %43, %171 ], [ %42, %168 ]
  %173 = icmp sgt i64 %.1159, 255
  br i1 %173, label %.lr.ph381, label %._crit_edge382

.lr.ph381:                                        ; preds = %172, %.lr.ph381
  %.1156379 = phi ptr [ %176, %.lr.ph381 ], [ %.0155, %172 ]
  %.2160378 = phi i64 [ %179, %.lr.ph381 ], [ %.1159, %172 ]
  %174 = getelementptr inbounds i8, ptr %7, i64 %.2160378
  %175 = load i8, ptr %174, align 1, !tbaa !5
  %176 = getelementptr inbounds i8, ptr %.1156379, i64 -1
  store i8 %175, ptr %176, align 1, !tbaa !5
  %177 = getelementptr inbounds [131072 x i16], ptr %8, i64 0, i64 %.2160378
  %178 = load i16, ptr %177, align 2, !tbaa !17
  %179 = zext i16 %178 to i64
  %180 = icmp ugt i16 %178, 255
  br i1 %180, label %.lr.ph381, label %._crit_edge382, !llvm.loop !19

._crit_edge382:                                   ; preds = %.lr.ph381, %172
  %.2160.lcssa = phi i64 [ %.1159, %172 ], [ %179, %.lr.ph381 ]
  %.1156.lcssa = phi ptr [ %.0155, %172 ], [ %176, %.lr.ph381 ]
  %181 = getelementptr inbounds i8, ptr %7, i64 %.2160.lcssa
  %182 = load i8, ptr %181, align 1, !tbaa !5
  %183 = getelementptr inbounds i8, ptr %.1156.lcssa, i64 -1
  store i8 %182, ptr %183, align 1, !tbaa !5
  %184 = ptrtoint ptr %183 to i64
  %185 = sub i64 %44, %184
  %186 = add i64 %185, %.2198.lcssa250
  %187 = icmp ugt i64 %186, 8191
  br i1 %187, label %.preheader, label %204

.preheader:                                       ; preds = %._crit_edge382, %200
  %.3199 = phi i64 [ %.5201, %200 ], [ %.2198.lcssa250, %._crit_edge382 ]
  %.3173 = phi i64 [ %.4174, %200 ], [ %.2172.ph389, %._crit_edge382 ]
  %.2157 = phi ptr [ %201, %200 ], [ %183, %._crit_edge382 ]
  %.0 = phi i64 [ %203, %200 ], [ %185, %._crit_edge382 ]
  %188 = sub i64 8192, %.3199
  %spec.select = call i64 @llvm.umin.i64(i64 %.0, i64 %188)
  %.not224 = icmp eq i64 %spec.select, 0
  br i1 %.not224, label %192, label %189

189:                                              ; preds = %.preheader
  %190 = getelementptr inbounds i8, ptr %6, i64 %.3199
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %190, ptr align 1 %.2157, i64 %spec.select, i1 false)
  %191 = add i64 %spec.select, %.3199
  br label %192

192:                                              ; preds = %189, %.preheader
  %.4200 = phi i64 [ %191, %189 ], [ %.3199, %.preheader ]
  %193 = icmp ugt i64 %.4200, 8191
  br i1 %193, label %194, label %200

194:                                              ; preds = %192
  %195 = add i64 %.4200, %.3173
  %196 = load i64, ptr %1, align 8, !tbaa !20
  %197 = icmp ugt i64 %195, %196
  br i1 %197, label %.loopexit, label %198

198:                                              ; preds = %194
  %199 = getelementptr inbounds i8, ptr %0, i64 %.3173
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %199, ptr nonnull align 16 %6, i64 %.4200, i1 false)
  br label %200

200:                                              ; preds = %198, %192
  %.5201 = phi i64 [ 0, %198 ], [ %.4200, %192 ]
  %.4174 = phi i64 [ %195, %198 ], [ %.3173, %192 ]
  %201 = getelementptr inbounds i8, ptr %.2157, i64 %spec.select
  %202 = ptrtoint ptr %201 to i64
  %203 = sub i64 %44, %202
  %.not225 = icmp eq i64 %203, 0
  br i1 %.not225, label %.loopexit233, label %.preheader, !llvm.loop !22

204:                                              ; preds = %._crit_edge382
  %205 = getelementptr inbounds i8, ptr %6, i64 %.2198.lcssa250
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %205, ptr nonnull align 1 %183, i64 %185, i1 false)
  br label %.loopexit233

.loopexit233:                                     ; preds = %200, %204
  %.7203.ph = phi i64 [ %186, %204 ], [ %.5201, %200 ]
  %.6.ph = phi i64 [ %.2172.ph389, %204 ], [ %.4174, %200 ]
  %206 = icmp slt i64 %.2189.ph387, %23
  br i1 %206, label %207, label %.outer

207:                                              ; preds = %.loopexit233
  %208 = trunc i64 %.2183.lcssa244 to i16
  %209 = getelementptr inbounds [131072 x i16], ptr %8, i64 0, i64 %.2189.ph387
  store i16 %208, ptr %209, align 2, !tbaa !17
  %210 = getelementptr inbounds i8, ptr %7, i64 %.2189.ph387
  store i8 %182, ptr %210, align 1, !tbaa !5
  %211 = add nsw i64 %.2189.ph387, 1
  br label %.outer

.outer:                                           ; preds = %207, %.loopexit233
  %.3190 = phi i64 [ %211, %207 ], [ %.2189.ph387, %.loopexit233 ]
  %212 = icmp slt i32 %.lcssa, %110
  br i1 %212, label %.lr.ph302, label %.outer._crit_edge, !llvm.loop !16

.outer._crit_edge:                                ; preds = %155, %.outer, %108
  %.2189.ph.lcssa273 = phi i64 [ %.1188, %108 ], [ %.3190, %.outer ], [ %.2189.ph387, %155 ]
  %.2172.ph.lcssa267 = phi i64 [ %.1171, %108 ], [ %.6.ph, %.outer ], [ %.2172.ph389, %155 ]
  %.2206.lcssa = phi i32 [ 0, %108 ], [ %.lcssa, %.outer ], [ %137, %155 ]
  %.2198.lcssa = phi i64 [ %.1197, %108 ], [ %.7203.ph, %.outer ], [ %157, %155 ]
  %.2183.lcssa = phi i64 [ %.1182, %108 ], [ %.lcssa261, %.outer ], [ %136, %155 ]
  %.2163.lcssa = phi i8 [ %.1162, %108 ], [ %182, %.outer ], [ %156, %155 ]
  br i1 %100, label %.backedge, label %213, !llvm.loop !23

213:                                              ; preds = %.outer._crit_edge
  %214 = add i64 %.2172.ph.lcssa267, %.2198.lcssa
  %215 = load i64, ptr %1, align 8, !tbaa !20
  %216 = icmp ugt i64 %214, %215
  br i1 %216, label %.loopexit, label %217

217:                                              ; preds = %213
  %.not222 = icmp eq i64 %.2198.lcssa, 0
  br i1 %.not222, label %220, label %218

218:                                              ; preds = %217
  %219 = getelementptr inbounds i8, ptr %0, i64 %.2172.ph.lcssa267
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %219, ptr nonnull align 16 %6, i64 %.2198.lcssa, i1 false)
  br label %220

220:                                              ; preds = %218, %217
  %.7 = phi i64 [ %214, %218 ], [ %.2172.ph.lcssa267, %217 ]
  store i64 %.7, ptr %1, align 8, !tbaa !20
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph371, %169, %194, %213, %17, %4, %220
  %.4 = phi i32 [ 0, %220 ], [ 3, %4 ], [ 3, %17 ], [ 2, %213 ], [ 2, %194 ], [ 3, %169 ], [ 3, %.lr.ph371 ]
  call void @llvm.lifetime.end.p0(i64 262144, ptr nonnull %8) #5
  call void @llvm.lifetime.end.p0(i64 1048576, ptr nonnull %7) #5
  call void @llvm.lifetime.end.p0(i64 10240, ptr nonnull %6) #5
  call void @llvm.lifetime.end.p0(i64 8256, ptr nonnull %5) #5
  ret i32 %.4
}

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) 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 #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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = distinct !{!8, !9, !10, !11}
!9 = !{!"llvm.loop.mustprogress"}
!10 = !{!"llvm.loop.isvectorized", i32 1}
!11 = !{!"llvm.loop.unroll.runtime.disable"}
!12 = distinct !{!12, !9, !10, !11}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.unroll.disable"}
!15 = distinct !{!15, !9, !10}
!16 = distinct !{!16, !9}
!17 = !{!18, !18, i64 0}
!18 = !{!"short", !6, i64 0}
!19 = distinct !{!19, !9}
!20 = !{!21, !21, i64 0}
!21 = !{!"long", !6, i64 0}
!22 = distinct !{!22, !9}
!23 = distinct !{!23, !9}


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