; LLVM IR from intel/qpl :: sources/core-sw/src/filtering (qplc_unpack_8u)

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

%union.qplc_bit_byte_pool64_t = type { i64 }
%union.qplc_bit_byte_pool32_t = type { i32 }

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

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

; Function Attrs: nounwind uwtable
define dso_local void @px_qplc_unpack_4u8u(ptr noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %3) #1 {
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca i32, align 4
  %11 = alloca i8, align 1
  %12 = alloca i8, align 1
  %13 = alloca i32, align 4
  %14 = alloca %union.qplc_bit_byte_pool64_t, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i64, align 8
  %17 = alloca %union.qplc_bit_byte_pool64_t, align 8
  %18 = alloca ptr, align 8
  %19 = alloca i64, align 8
  %20 = alloca %union.qplc_bit_byte_pool32_t, align 4
  %21 = alloca ptr, align 8
  %22 = alloca i32, align 4
  %23 = alloca i8, align 1
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i32 %1, ptr %6, align 4, !tbaa !9
  store i32 %2, ptr %7, align 4, !tbaa !9
  store ptr %3, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #2
  store i64 1085102592571150095, ptr %9, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #2
  store i32 0, ptr %10, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #2
  store i8 15, ptr %11, align 1, !tbaa !13
  %24 = load i32, ptr %7, align 4, !tbaa !9
  %25 = icmp ult i32 0, %24
  br i1 %25, label %26, label %64

26:                                               ; preds = %4
  call void @llvm.lifetime.start.p0(i64 1, ptr %12) #2
  %27 = load ptr, ptr %5, align 8, !tbaa !5
  %28 = load i8, ptr %27, align 1, !tbaa !13
  %29 = zext i8 %28 to i32
  %30 = load i32, ptr %7, align 4, !tbaa !9
  %31 = ashr i32 %29, %30
  %32 = trunc i32 %31 to i8
  store i8 %32, ptr %12, align 1, !tbaa !13
  %33 = load ptr, ptr %5, align 8, !tbaa !5
  %34 = getelementptr inbounds i8, ptr %33, i32 1
  store ptr %34, ptr %5, align 8, !tbaa !5
  br label %35

35:                                               ; preds = %59, %26
  %36 = load i32, ptr %7, align 4, !tbaa !9
  %37 = icmp ugt i32 8, %36
  br i1 %37, label %38, label %60

38:                                               ; preds = %35
  %39 = load i8, ptr %12, align 1, !tbaa !13
  %40 = zext i8 %39 to i32
  %41 = load i8, ptr %11, align 1, !tbaa !13
  %42 = zext i8 %41 to i32
  %43 = and i32 %40, %42
  %44 = trunc i32 %43 to i8
  %45 = load ptr, ptr %8, align 8, !tbaa !5
  store i8 %44, ptr %45, align 1, !tbaa !13
  %46 = load ptr, ptr %8, align 8, !tbaa !5
  %47 = getelementptr inbounds i8, ptr %46, i32 1
  store ptr %47, ptr %8, align 8, !tbaa !5
  %48 = load i8, ptr %12, align 1, !tbaa !13
  %49 = zext i8 %48 to i32
  %50 = ashr i32 %49, 4
  %51 = trunc i32 %50 to i8
  store i8 %51, ptr %12, align 1, !tbaa !13
  %52 = load i32, ptr %7, align 4, !tbaa !9
  %53 = add i32 %52, 4
  store i32 %53, ptr %7, align 4, !tbaa !9
  %54 = load i32, ptr %6, align 4, !tbaa !9
  %55 = add i32 %54, -1
  store i32 %55, ptr %6, align 4, !tbaa !9
  %56 = load i32, ptr %6, align 4, !tbaa !9
  %57 = icmp eq i32 0, %56
  br i1 %57, label %58, label %59

58:                                               ; preds = %38
  store i32 1, ptr %13, align 4
  br label %61

59:                                               ; preds = %38
  br label %35, !llvm.loop !14

60:                                               ; preds = %35
  store i32 0, ptr %13, align 4
  br label %61

61:                                               ; preds = %60, %58
  call void @llvm.lifetime.end.p0(i64 1, ptr %12) #2
  %62 = load i32, ptr %13, align 4
  switch i32 %62, label %421 [
    i32 0, label %63
  ]

63:                                               ; preds = %61
  br label %64

64:                                               ; preds = %63, %4
  br label %65

65:                                               ; preds = %68, %64
  %66 = load i32, ptr %6, align 4, !tbaa !9
  %67 = icmp ugt i32 %66, 32
  br i1 %67, label %68, label %226

68:                                               ; preds = %65
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #2
  %69 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %69, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #2
  %70 = load ptr, ptr %15, align 8, !tbaa !5
  %71 = load i64, ptr %70, align 8, !tbaa !11
  store i64 %71, ptr %16, align 8, !tbaa !11
  %72 = load i64, ptr %16, align 8, !tbaa !11
  %73 = load i64, ptr %9, align 8, !tbaa !11
  %74 = and i64 %72, %73
  store i64 %74, ptr %14, align 8, !tbaa !13
  %75 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 0
  %76 = load i8, ptr %75, align 8, !tbaa !13
  %77 = load ptr, ptr %8, align 8, !tbaa !5
  %78 = getelementptr inbounds i8, ptr %77, i64 0
  store i8 %76, ptr %78, align 1, !tbaa !13
  %79 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 1
  %80 = load i8, ptr %79, align 1, !tbaa !13
  %81 = load ptr, ptr %8, align 8, !tbaa !5
  %82 = getelementptr inbounds i8, ptr %81, i64 2
  store i8 %80, ptr %82, align 1, !tbaa !13
  %83 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 2
  %84 = load i8, ptr %83, align 2, !tbaa !13
  %85 = load ptr, ptr %8, align 8, !tbaa !5
  %86 = getelementptr inbounds i8, ptr %85, i64 4
  store i8 %84, ptr %86, align 1, !tbaa !13
  %87 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 3
  %88 = load i8, ptr %87, align 1, !tbaa !13
  %89 = load ptr, ptr %8, align 8, !tbaa !5
  %90 = getelementptr inbounds i8, ptr %89, i64 6
  store i8 %88, ptr %90, align 1, !tbaa !13
  %91 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 4
  %92 = load i8, ptr %91, align 4, !tbaa !13
  %93 = load ptr, ptr %8, align 8, !tbaa !5
  %94 = getelementptr inbounds i8, ptr %93, i64 8
  store i8 %92, ptr %94, align 1, !tbaa !13
  %95 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 5
  %96 = load i8, ptr %95, align 1, !tbaa !13
  %97 = load ptr, ptr %8, align 8, !tbaa !5
  %98 = getelementptr inbounds i8, ptr %97, i64 10
  store i8 %96, ptr %98, align 1, !tbaa !13
  %99 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 6
  %100 = load i8, ptr %99, align 2, !tbaa !13
  %101 = load ptr, ptr %8, align 8, !tbaa !5
  %102 = getelementptr inbounds i8, ptr %101, i64 12
  store i8 %100, ptr %102, align 1, !tbaa !13
  %103 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 7
  %104 = load i8, ptr %103, align 1, !tbaa !13
  %105 = load ptr, ptr %8, align 8, !tbaa !5
  %106 = getelementptr inbounds i8, ptr %105, i64 14
  store i8 %104, ptr %106, align 1, !tbaa !13
  %107 = load i64, ptr %16, align 8, !tbaa !11
  %108 = lshr i64 %107, 4
  %109 = load i64, ptr %9, align 8, !tbaa !11
  %110 = and i64 %108, %109
  store i64 %110, ptr %14, align 8, !tbaa !13
  %111 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 0
  %112 = load i8, ptr %111, align 8, !tbaa !13
  %113 = load ptr, ptr %8, align 8, !tbaa !5
  %114 = getelementptr inbounds i8, ptr %113, i64 1
  store i8 %112, ptr %114, align 1, !tbaa !13
  %115 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 1
  %116 = load i8, ptr %115, align 1, !tbaa !13
  %117 = load ptr, ptr %8, align 8, !tbaa !5
  %118 = getelementptr inbounds i8, ptr %117, i64 3
  store i8 %116, ptr %118, align 1, !tbaa !13
  %119 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 2
  %120 = load i8, ptr %119, align 2, !tbaa !13
  %121 = load ptr, ptr %8, align 8, !tbaa !5
  %122 = getelementptr inbounds i8, ptr %121, i64 5
  store i8 %120, ptr %122, align 1, !tbaa !13
  %123 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 3
  %124 = load i8, ptr %123, align 1, !tbaa !13
  %125 = load ptr, ptr %8, align 8, !tbaa !5
  %126 = getelementptr inbounds i8, ptr %125, i64 7
  store i8 %124, ptr %126, align 1, !tbaa !13
  %127 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 4
  %128 = load i8, ptr %127, align 4, !tbaa !13
  %129 = load ptr, ptr %8, align 8, !tbaa !5
  %130 = getelementptr inbounds i8, ptr %129, i64 9
  store i8 %128, ptr %130, align 1, !tbaa !13
  %131 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 5
  %132 = load i8, ptr %131, align 1, !tbaa !13
  %133 = load ptr, ptr %8, align 8, !tbaa !5
  %134 = getelementptr inbounds i8, ptr %133, i64 11
  store i8 %132, ptr %134, align 1, !tbaa !13
  %135 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 6
  %136 = load i8, ptr %135, align 2, !tbaa !13
  %137 = load ptr, ptr %8, align 8, !tbaa !5
  %138 = getelementptr inbounds i8, ptr %137, i64 13
  store i8 %136, ptr %138, align 1, !tbaa !13
  %139 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 7
  %140 = load i8, ptr %139, align 1, !tbaa !13
  %141 = load ptr, ptr %8, align 8, !tbaa !5
  %142 = getelementptr inbounds i8, ptr %141, i64 15
  store i8 %140, ptr %142, align 1, !tbaa !13
  %143 = load ptr, ptr %15, align 8, !tbaa !5
  %144 = getelementptr inbounds i64, ptr %143, i32 1
  store ptr %144, ptr %15, align 8, !tbaa !5
  %145 = load ptr, ptr %8, align 8, !tbaa !5
  %146 = getelementptr inbounds i8, ptr %145, i64 16
  store ptr %146, ptr %8, align 8, !tbaa !5
  %147 = load ptr, ptr %15, align 8, !tbaa !5
  %148 = load i64, ptr %147, align 8, !tbaa !11
  store i64 %148, ptr %16, align 8, !tbaa !11
  %149 = load i64, ptr %16, align 8, !tbaa !11
  %150 = load i64, ptr %9, align 8, !tbaa !11
  %151 = and i64 %149, %150
  store i64 %151, ptr %14, align 8, !tbaa !13
  %152 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 0
  %153 = load i8, ptr %152, align 8, !tbaa !13
  %154 = load ptr, ptr %8, align 8, !tbaa !5
  %155 = getelementptr inbounds i8, ptr %154, i64 0
  store i8 %153, ptr %155, align 1, !tbaa !13
  %156 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 1
  %157 = load i8, ptr %156, align 1, !tbaa !13
  %158 = load ptr, ptr %8, align 8, !tbaa !5
  %159 = getelementptr inbounds i8, ptr %158, i64 2
  store i8 %157, ptr %159, align 1, !tbaa !13
  %160 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 2
  %161 = load i8, ptr %160, align 2, !tbaa !13
  %162 = load ptr, ptr %8, align 8, !tbaa !5
  %163 = getelementptr inbounds i8, ptr %162, i64 4
  store i8 %161, ptr %163, align 1, !tbaa !13
  %164 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 3
  %165 = load i8, ptr %164, align 1, !tbaa !13
  %166 = load ptr, ptr %8, align 8, !tbaa !5
  %167 = getelementptr inbounds i8, ptr %166, i64 6
  store i8 %165, ptr %167, align 1, !tbaa !13
  %168 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 4
  %169 = load i8, ptr %168, align 4, !tbaa !13
  %170 = load ptr, ptr %8, align 8, !tbaa !5
  %171 = getelementptr inbounds i8, ptr %170, i64 8
  store i8 %169, ptr %171, align 1, !tbaa !13
  %172 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 5
  %173 = load i8, ptr %172, align 1, !tbaa !13
  %174 = load ptr, ptr %8, align 8, !tbaa !5
  %175 = getelementptr inbounds i8, ptr %174, i64 10
  store i8 %173, ptr %175, align 1, !tbaa !13
  %176 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 6
  %177 = load i8, ptr %176, align 2, !tbaa !13
  %178 = load ptr, ptr %8, align 8, !tbaa !5
  %179 = getelementptr inbounds i8, ptr %178, i64 12
  store i8 %177, ptr %179, align 1, !tbaa !13
  %180 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 7
  %181 = load i8, ptr %180, align 1, !tbaa !13
  %182 = load ptr, ptr %8, align 8, !tbaa !5
  %183 = getelementptr inbounds i8, ptr %182, i64 14
  store i8 %181, ptr %183, align 1, !tbaa !13
  %184 = load i64, ptr %16, align 8, !tbaa !11
  %185 = lshr i64 %184, 4
  %186 = load i64, ptr %9, align 8, !tbaa !11
  %187 = and i64 %185, %186
  store i64 %187, ptr %14, align 8, !tbaa !13
  %188 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 0
  %189 = load i8, ptr %188, align 8, !tbaa !13
  %190 = load ptr, ptr %8, align 8, !tbaa !5
  %191 = getelementptr inbounds i8, ptr %190, i64 1
  store i8 %189, ptr %191, align 1, !tbaa !13
  %192 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 1
  %193 = load i8, ptr %192, align 1, !tbaa !13
  %194 = load ptr, ptr %8, align 8, !tbaa !5
  %195 = getelementptr inbounds i8, ptr %194, i64 3
  store i8 %193, ptr %195, align 1, !tbaa !13
  %196 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 2
  %197 = load i8, ptr %196, align 2, !tbaa !13
  %198 = load ptr, ptr %8, align 8, !tbaa !5
  %199 = getelementptr inbounds i8, ptr %198, i64 5
  store i8 %197, ptr %199, align 1, !tbaa !13
  %200 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 3
  %201 = load i8, ptr %200, align 1, !tbaa !13
  %202 = load ptr, ptr %8, align 8, !tbaa !5
  %203 = getelementptr inbounds i8, ptr %202, i64 7
  store i8 %201, ptr %203, align 1, !tbaa !13
  %204 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 4
  %205 = load i8, ptr %204, align 4, !tbaa !13
  %206 = load ptr, ptr %8, align 8, !tbaa !5
  %207 = getelementptr inbounds i8, ptr %206, i64 9
  store i8 %205, ptr %207, align 1, !tbaa !13
  %208 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 5
  %209 = load i8, ptr %208, align 1, !tbaa !13
  %210 = load ptr, ptr %8, align 8, !tbaa !5
  %211 = getelementptr inbounds i8, ptr %210, i64 11
  store i8 %209, ptr %211, align 1, !tbaa !13
  %212 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 6
  %213 = load i8, ptr %212, align 2, !tbaa !13
  %214 = load ptr, ptr %8, align 8, !tbaa !5
  %215 = getelementptr inbounds i8, ptr %214, i64 13
  store i8 %213, ptr %215, align 1, !tbaa !13
  %216 = getelementptr inbounds [8 x i8], ptr %14, i64 0, i64 7
  %217 = load i8, ptr %216, align 1, !tbaa !13
  %218 = load ptr, ptr %8, align 8, !tbaa !5
  %219 = getelementptr inbounds i8, ptr %218, i64 15
  store i8 %217, ptr %219, align 1, !tbaa !13
  %220 = load i32, ptr %6, align 4, !tbaa !9
  %221 = sub i32 %220, 32
  store i32 %221, ptr %6, align 4, !tbaa !9
  %222 = load ptr, ptr %8, align 8, !tbaa !5
  %223 = getelementptr inbounds i8, ptr %222, i64 16
  store ptr %223, ptr %8, align 8, !tbaa !5
  %224 = load ptr, ptr %5, align 8, !tbaa !5
  %225 = getelementptr inbounds i8, ptr %224, i64 16
  store ptr %225, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #2
  br label %65, !llvm.loop !16

226:                                              ; preds = %65
  %227 = load i32, ptr %6, align 4, !tbaa !9
  %228 = icmp ugt i32 %227, 16
  br i1 %228, label %229, label %310

229:                                              ; preds = %226
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #2
  %230 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %230, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #2
  %231 = load ptr, ptr %18, align 8, !tbaa !5
  %232 = load i64, ptr %231, align 8, !tbaa !11
  store i64 %232, ptr %19, align 8, !tbaa !11
  %233 = load i64, ptr %19, align 8, !tbaa !11
  %234 = load i64, ptr %9, align 8, !tbaa !11
  %235 = and i64 %233, %234
  store i64 %235, ptr %17, align 8, !tbaa !13
  %236 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 0
  %237 = load i8, ptr %236, align 8, !tbaa !13
  %238 = load ptr, ptr %8, align 8, !tbaa !5
  %239 = getelementptr inbounds i8, ptr %238, i64 0
  store i8 %237, ptr %239, align 1, !tbaa !13
  %240 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 1
  %241 = load i8, ptr %240, align 1, !tbaa !13
  %242 = load ptr, ptr %8, align 8, !tbaa !5
  %243 = getelementptr inbounds i8, ptr %242, i64 2
  store i8 %241, ptr %243, align 1, !tbaa !13
  %244 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 2
  %245 = load i8, ptr %244, align 2, !tbaa !13
  %246 = load ptr, ptr %8, align 8, !tbaa !5
  %247 = getelementptr inbounds i8, ptr %246, i64 4
  store i8 %245, ptr %247, align 1, !tbaa !13
  %248 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 3
  %249 = load i8, ptr %248, align 1, !tbaa !13
  %250 = load ptr, ptr %8, align 8, !tbaa !5
  %251 = getelementptr inbounds i8, ptr %250, i64 6
  store i8 %249, ptr %251, align 1, !tbaa !13
  %252 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 4
  %253 = load i8, ptr %252, align 4, !tbaa !13
  %254 = load ptr, ptr %8, align 8, !tbaa !5
  %255 = getelementptr inbounds i8, ptr %254, i64 8
  store i8 %253, ptr %255, align 1, !tbaa !13
  %256 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 5
  %257 = load i8, ptr %256, align 1, !tbaa !13
  %258 = load ptr, ptr %8, align 8, !tbaa !5
  %259 = getelementptr inbounds i8, ptr %258, i64 10
  store i8 %257, ptr %259, align 1, !tbaa !13
  %260 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 6
  %261 = load i8, ptr %260, align 2, !tbaa !13
  %262 = load ptr, ptr %8, align 8, !tbaa !5
  %263 = getelementptr inbounds i8, ptr %262, i64 12
  store i8 %261, ptr %263, align 1, !tbaa !13
  %264 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 7
  %265 = load i8, ptr %264, align 1, !tbaa !13
  %266 = load ptr, ptr %8, align 8, !tbaa !5
  %267 = getelementptr inbounds i8, ptr %266, i64 14
  store i8 %265, ptr %267, align 1, !tbaa !13
  %268 = load i64, ptr %19, align 8, !tbaa !11
  %269 = lshr i64 %268, 4
  %270 = load i64, ptr %9, align 8, !tbaa !11
  %271 = and i64 %269, %270
  store i64 %271, ptr %17, align 8, !tbaa !13
  %272 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 0
  %273 = load i8, ptr %272, align 8, !tbaa !13
  %274 = load ptr, ptr %8, align 8, !tbaa !5
  %275 = getelementptr inbounds i8, ptr %274, i64 1
  store i8 %273, ptr %275, align 1, !tbaa !13
  %276 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 1
  %277 = load i8, ptr %276, align 1, !tbaa !13
  %278 = load ptr, ptr %8, align 8, !tbaa !5
  %279 = getelementptr inbounds i8, ptr %278, i64 3
  store i8 %277, ptr %279, align 1, !tbaa !13
  %280 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 2
  %281 = load i8, ptr %280, align 2, !tbaa !13
  %282 = load ptr, ptr %8, align 8, !tbaa !5
  %283 = getelementptr inbounds i8, ptr %282, i64 5
  store i8 %281, ptr %283, align 1, !tbaa !13
  %284 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 3
  %285 = load i8, ptr %284, align 1, !tbaa !13
  %286 = load ptr, ptr %8, align 8, !tbaa !5
  %287 = getelementptr inbounds i8, ptr %286, i64 7
  store i8 %285, ptr %287, align 1, !tbaa !13
  %288 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 4
  %289 = load i8, ptr %288, align 4, !tbaa !13
  %290 = load ptr, ptr %8, align 8, !tbaa !5
  %291 = getelementptr inbounds i8, ptr %290, i64 9
  store i8 %289, ptr %291, align 1, !tbaa !13
  %292 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 5
  %293 = load i8, ptr %292, align 1, !tbaa !13
  %294 = load ptr, ptr %8, align 8, !tbaa !5
  %295 = getelementptr inbounds i8, ptr %294, i64 11
  store i8 %293, ptr %295, align 1, !tbaa !13
  %296 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 6
  %297 = load i8, ptr %296, align 2, !tbaa !13
  %298 = load ptr, ptr %8, align 8, !tbaa !5
  %299 = getelementptr inbounds i8, ptr %298, i64 13
  store i8 %297, ptr %299, align 1, !tbaa !13
  %300 = getelementptr inbounds [8 x i8], ptr %17, i64 0, i64 7
  %301 = load i8, ptr %300, align 1, !tbaa !13
  %302 = load ptr, ptr %8, align 8, !tbaa !5
  %303 = getelementptr inbounds i8, ptr %302, i64 15
  store i8 %301, ptr %303, align 1, !tbaa !13
  %304 = load ptr, ptr %8, align 8, !tbaa !5
  %305 = getelementptr inbounds i8, ptr %304, i64 16
  store ptr %305, ptr %8, align 8, !tbaa !5
  %306 = load i32, ptr %6, align 4, !tbaa !9
  %307 = sub i32 %306, 16
  store i32 %307, ptr %6, align 4, !tbaa !9
  %308 = load ptr, ptr %5, align 8, !tbaa !5
  %309 = getelementptr inbounds i8, ptr %308, i64 8
  store ptr %309, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #2
  br label %310

310:                                              ; preds = %229, %226
  %311 = load i32, ptr %6, align 4, !tbaa !9
  %312 = icmp ugt i32 %311, 8
  br i1 %312, label %313, label %364

313:                                              ; preds = %310
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #2
  %314 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %314, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #2
  %315 = load ptr, ptr %21, align 8, !tbaa !5
  %316 = load i32, ptr %315, align 4, !tbaa !9
  store i32 %316, ptr %22, align 4, !tbaa !9
  %317 = load i32, ptr %22, align 4, !tbaa !9
  %318 = load i64, ptr %9, align 8, !tbaa !11
  %319 = trunc i64 %318 to i32
  %320 = and i32 %317, %319
  store i32 %320, ptr %20, align 4, !tbaa !13
  %321 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 0
  %322 = load i8, ptr %321, align 4, !tbaa !13
  %323 = load ptr, ptr %8, align 8, !tbaa !5
  %324 = getelementptr inbounds i8, ptr %323, i64 0
  store i8 %322, ptr %324, align 1, !tbaa !13
  %325 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 1
  %326 = load i8, ptr %325, align 1, !tbaa !13
  %327 = load ptr, ptr %8, align 8, !tbaa !5
  %328 = getelementptr inbounds i8, ptr %327, i64 2
  store i8 %326, ptr %328, align 1, !tbaa !13
  %329 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 2
  %330 = load i8, ptr %329, align 2, !tbaa !13
  %331 = load ptr, ptr %8, align 8, !tbaa !5
  %332 = getelementptr inbounds i8, ptr %331, i64 4
  store i8 %330, ptr %332, align 1, !tbaa !13
  %333 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 3
  %334 = load i8, ptr %333, align 1, !tbaa !13
  %335 = load ptr, ptr %8, align 8, !tbaa !5
  %336 = getelementptr inbounds i8, ptr %335, i64 6
  store i8 %334, ptr %336, align 1, !tbaa !13
  %337 = load i32, ptr %22, align 4, !tbaa !9
  %338 = lshr i32 %337, 4
  %339 = load i64, ptr %9, align 8, !tbaa !11
  %340 = trunc i64 %339 to i32
  %341 = and i32 %338, %340
  store i32 %341, ptr %20, align 4, !tbaa !13
  %342 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 0
  %343 = load i8, ptr %342, align 4, !tbaa !13
  %344 = load ptr, ptr %8, align 8, !tbaa !5
  %345 = getelementptr inbounds i8, ptr %344, i64 1
  store i8 %343, ptr %345, align 1, !tbaa !13
  %346 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 1
  %347 = load i8, ptr %346, align 1, !tbaa !13
  %348 = load ptr, ptr %8, align 8, !tbaa !5
  %349 = getelementptr inbounds i8, ptr %348, i64 3
  store i8 %347, ptr %349, align 1, !tbaa !13
  %350 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 2
  %351 = load i8, ptr %350, align 2, !tbaa !13
  %352 = load ptr, ptr %8, align 8, !tbaa !5
  %353 = getelementptr inbounds i8, ptr %352, i64 5
  store i8 %351, ptr %353, align 1, !tbaa !13
  %354 = getelementptr inbounds [4 x i8], ptr %20, i64 0, i64 3
  %355 = load i8, ptr %354, align 1, !tbaa !13
  %356 = load ptr, ptr %8, align 8, !tbaa !5
  %357 = getelementptr inbounds i8, ptr %356, i64 7
  store i8 %355, ptr %357, align 1, !tbaa !13
  %358 = load ptr, ptr %5, align 8, !tbaa !5
  %359 = getelementptr inbounds i8, ptr %358, i64 4
  store ptr %359, ptr %5, align 8, !tbaa !5
  %360 = load ptr, ptr %8, align 8, !tbaa !5
  %361 = getelementptr inbounds i8, ptr %360, i64 8
  store ptr %361, ptr %8, align 8, !tbaa !5
  %362 = load i32, ptr %6, align 4, !tbaa !9
  %363 = sub i32 %362, 8
  store i32 %363, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #2
  br label %364

364:                                              ; preds = %313, %310
  call void @llvm.lifetime.start.p0(i64 1, ptr %23) #2
  %365 = load ptr, ptr %5, align 8, !tbaa !5
  %366 = load i8, ptr %365, align 1, !tbaa !13
  store i8 %366, ptr %23, align 1, !tbaa !13
  store i32 0, ptr %10, align 4, !tbaa !9
  br label %367

367:                                              ; preds = %370, %364
  %368 = load i32, ptr %6, align 4, !tbaa !9
  %369 = icmp uge i32 %368, 2
  br i1 %369, label %370, label %404

370:                                              ; preds = %367
  %371 = load ptr, ptr %5, align 8, !tbaa !5
  %372 = load i8, ptr %371, align 1, !tbaa !13
  store i8 %372, ptr %23, align 1, !tbaa !13
  %373 = load i8, ptr %23, align 1, !tbaa !13
  %374 = zext i8 %373 to i32
  %375 = load i8, ptr %11, align 1, !tbaa !13
  %376 = zext i8 %375 to i32
  %377 = and i32 %374, %376
  %378 = trunc i32 %377 to i8
  %379 = load ptr, ptr %8, align 8, !tbaa !5
  %380 = load i32, ptr %10, align 4, !tbaa !9
  %381 = zext i32 %380 to i64
  %382 = getelementptr inbounds i8, ptr %379, i64 %381
  store i8 %378, ptr %382, align 1, !tbaa !13
  %383 = load i8, ptr %23, align 1, !tbaa !13
  %384 = zext i8 %383 to i32
  %385 = ashr i32 %384, 4
  %386 = trunc i32 %385 to i8
  store i8 %386, ptr %23, align 1, !tbaa !13
  %387 = load i8, ptr %23, align 1, !tbaa !13
  %388 = zext i8 %387 to i32
  %389 = load i8, ptr %11, align 1, !tbaa !13
  %390 = zext i8 %389 to i32
  %391 = and i32 %388, %390
  %392 = trunc i32 %391 to i8
  %393 = load ptr, ptr %8, align 8, !tbaa !5
  %394 = load i32, ptr %10, align 4, !tbaa !9
  %395 = add i32 %394, 1
  %396 = zext i32 %395 to i64
  %397 = getelementptr inbounds i8, ptr %393, i64 %396
  store i8 %392, ptr %397, align 1, !tbaa !13
  %398 = load ptr, ptr %5, align 8, !tbaa !5
  %399 = getelementptr inbounds i8, ptr %398, i32 1
  store ptr %399, ptr %5, align 8, !tbaa !5
  %400 = load i32, ptr %6, align 4, !tbaa !9
  %401 = sub i32 %400, 2
  store i32 %401, ptr %6, align 4, !tbaa !9
  %402 = load i32, ptr %10, align 4, !tbaa !9
  %403 = add i32 %402, 2
  store i32 %403, ptr %10, align 4, !tbaa !9
  br label %367, !llvm.loop !17

404:                                              ; preds = %367
  %405 = load i32, ptr %6, align 4, !tbaa !9
  %406 = icmp ugt i32 %405, 0
  br i1 %406, label %407, label %420

407:                                              ; preds = %404
  %408 = load ptr, ptr %5, align 8, !tbaa !5
  %409 = load i8, ptr %408, align 1, !tbaa !13
  store i8 %409, ptr %23, align 1, !tbaa !13
  %410 = load i8, ptr %23, align 1, !tbaa !13
  %411 = zext i8 %410 to i32
  %412 = load i8, ptr %11, align 1, !tbaa !13
  %413 = zext i8 %412 to i32
  %414 = and i32 %411, %413
  %415 = trunc i32 %414 to i8
  %416 = load ptr, ptr %8, align 8, !tbaa !5
  %417 = load i32, ptr %10, align 4, !tbaa !9
  %418 = zext i32 %417 to i64
  %419 = getelementptr inbounds i8, ptr %416, i64 %418
  store i8 %415, ptr %419, align 1, !tbaa !13
  br label %420

420:                                              ; preds = %407, %404
  call void @llvm.lifetime.end.p0(i64 1, ptr %23) #2
  store i32 0, ptr %13, align 4
  br label %421

421:                                              ; preds = %420, %61
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #2
  %422 = load i32, ptr %13, align 4
  switch i32 %422, label %424 [
    i32 0, label %423
    i32 1, label %423
  ]

423:                                              ; preds = %421, %421
  ret void

424:                                              ; preds = %421
  unreachable
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!7, !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !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: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable
define dso_local void @px_qplc_unpack_4u8u(ptr nocapture noundef readonly %0, i32 noundef %1, i32 noundef %2, ptr noundef writeonly %3) local_unnamed_addr #0 {
  %.not = icmp eq i32 %2, 0
  br i1 %.not, label %.thread, label %5

5:                                                ; preds = %4
  %6 = load i8, ptr %0, align 1, !tbaa !5
  %7 = zext i8 %6 to i32
  %8 = lshr i32 %7, %2
  %9 = getelementptr inbounds i8, ptr %0, i64 1
  %10 = icmp ugt i32 %2, 7
  br i1 %10, label %.thread, label %11

11:                                               ; preds = %5
  %12 = trunc nuw i32 %8 to i8
  %13 = and i8 %12, 15
  store i8 %13, ptr %3, align 1, !tbaa !5
  %14 = getelementptr inbounds i8, ptr %3, i64 1
  %15 = add i32 %1, -1
  %16 = icmp eq i32 %15, 0
  br i1 %16, label %.loopexit, label %17, !llvm.loop !8

17:                                               ; preds = %11
  %18 = icmp ugt i32 %2, 3
  br i1 %18, label %.thread, label %19

19:                                               ; preds = %17
  %20 = trunc nuw i32 %8 to i8
  %21 = lshr i8 %20, 4
  store i8 %21, ptr %14, align 1, !tbaa !5
  %22 = add i32 %1, -2
  %23 = icmp eq i32 %22, 0
  br i1 %23, label %.loopexit, label %24, !llvm.loop !8

24:                                               ; preds = %19
  %25 = getelementptr inbounds i8, ptr %3, i64 2
  br label %.thread

.thread:                                          ; preds = %5, %17, %24, %4
  %.2246 = phi ptr [ %3, %4 ], [ %3, %5 ], [ %14, %17 ], [ %25, %24 ]
  %.2240 = phi i32 [ %1, %4 ], [ %1, %5 ], [ %15, %17 ], [ %22, %24 ]
  %.0 = phi ptr [ %0, %4 ], [ %9, %24 ], [ %9, %17 ], [ %9, %5 ]
  %26 = icmp ugt i32 %.2240, 32
  br i1 %26, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.thread, %.lr.ph
  %.1262 = phi ptr [ %69, %.lr.ph ], [ %.0, %.thread ]
  %.3241261 = phi i32 [ %67, %.lr.ph ], [ %.2240, %.thread ]
  %.3247260 = phi ptr [ %68, %.lr.ph ], [ %.2246, %.thread ]
  %27 = load i64, ptr %.1262, align 8, !tbaa !10
  %28 = and i64 %27, 1085102592571150095
  %.sroa.054.0.extract.trunc = trunc i64 %28 to i8
  %.sroa.1061.0.extract.shift = lshr i64 %28, 8
  %.sroa.1061.0.extract.trunc = trunc i64 %.sroa.1061.0.extract.shift to i8
  %.sroa.1471.0.extract.shift = lshr i64 %28, 16
  %.sroa.1471.0.extract.trunc = trunc i64 %.sroa.1471.0.extract.shift to i8
  %.sroa.1881.0.extract.shift = lshr i64 %28, 24
  %.sroa.1881.0.extract.trunc = trunc i64 %.sroa.1881.0.extract.shift to i8
  %.sroa.22.0.extract.shift = lshr i64 %28, 32
  %.sroa.22.0.extract.trunc = trunc i64 %.sroa.22.0.extract.shift to i8
  %.sroa.26.0.extract.shift = lshr i64 %28, 40
  %.sroa.26.0.extract.trunc = trunc i64 %.sroa.26.0.extract.shift to i8
  %.sroa.30.0.extract.shift = lshr i64 %28, 48
  %.sroa.30.0.extract.trunc = trunc i64 %.sroa.30.0.extract.shift to i8
  %.sroa.34.0.extract.shift = lshr i64 %28, 56
  %.sroa.34.0.extract.trunc = trunc nuw nsw i64 %.sroa.34.0.extract.shift to i8
  store i8 %.sroa.054.0.extract.trunc, ptr %.3247260, align 1, !tbaa !5
  %29 = getelementptr inbounds i8, ptr %.3247260, i64 2
  store i8 %.sroa.1061.0.extract.trunc, ptr %29, align 1, !tbaa !5
  %30 = getelementptr inbounds i8, ptr %.3247260, i64 4
  store i8 %.sroa.1471.0.extract.trunc, ptr %30, align 1, !tbaa !5
  %31 = getelementptr inbounds i8, ptr %.3247260, i64 6
  store i8 %.sroa.1881.0.extract.trunc, ptr %31, align 1, !tbaa !5
  %32 = getelementptr inbounds i8, ptr %.3247260, i64 8
  store i8 %.sroa.22.0.extract.trunc, ptr %32, align 1, !tbaa !5
  %33 = getelementptr inbounds i8, ptr %.3247260, i64 10
  store i8 %.sroa.26.0.extract.trunc, ptr %33, align 1, !tbaa !5
  %34 = getelementptr inbounds i8, ptr %.3247260, i64 12
  store i8 %.sroa.30.0.extract.trunc, ptr %34, align 1, !tbaa !5
  %35 = getelementptr inbounds i8, ptr %.3247260, i64 14
  store i8 %.sroa.34.0.extract.trunc, ptr %35, align 1, !tbaa !5
  %36 = lshr i64 %27, 4
  %37 = and i64 %36, 1085102592571150095
  %.sroa.054.0.extract.trunc58 = trunc i64 %37 to i8
  %.sroa.1061.0.extract.shift62 = lshr i64 %37, 8
  %.sroa.1061.0.extract.trunc63 = trunc i64 %.sroa.1061.0.extract.shift62 to i8
  %.sroa.1471.0.extract.shift72 = lshr i64 %37, 16
  %.sroa.1471.0.extract.trunc73 = trunc i64 %.sroa.1471.0.extract.shift72 to i8
  %.sroa.1881.0.extract.shift82 = lshr i64 %37, 24
  %.sroa.1881.0.extract.trunc83 = trunc i64 %.sroa.1881.0.extract.shift82 to i8
  %.sroa.22.0.extract.shift91 = lshr i64 %37, 32
  %.sroa.22.0.extract.trunc92 = trunc i64 %.sroa.22.0.extract.shift91 to i8
  %.sroa.26.0.extract.shift100 = lshr i64 %37, 40
  %.sroa.26.0.extract.trunc101 = trunc i64 %.sroa.26.0.extract.shift100 to i8
  %.sroa.30.0.extract.shift109 = lshr i64 %37, 48
  %.sroa.30.0.extract.trunc110 = trunc i64 %.sroa.30.0.extract.shift109 to i8
  %.sroa.34.0.extract.shift118 = lshr i64 %27, 60
  %.sroa.34.0.extract.trunc119 = trunc nuw nsw i64 %.sroa.34.0.extract.shift118 to i8
  %38 = getelementptr inbounds i8, ptr %.3247260, i64 1
  store i8 %.sroa.054.0.extract.trunc58, ptr %38, align 1, !tbaa !5
  %39 = getelementptr inbounds i8, ptr %.3247260, i64 3
  store i8 %.sroa.1061.0.extract.trunc63, ptr %39, align 1, !tbaa !5
  %40 = getelementptr inbounds i8, ptr %.3247260, i64 5
  store i8 %.sroa.1471.0.extract.trunc73, ptr %40, align 1, !tbaa !5
  %41 = getelementptr inbounds i8, ptr %.3247260, i64 7
  store i8 %.sroa.1881.0.extract.trunc83, ptr %41, align 1, !tbaa !5
  %42 = getelementptr inbounds i8, ptr %.3247260, i64 9
  store i8 %.sroa.22.0.extract.trunc92, ptr %42, align 1, !tbaa !5
  %43 = getelementptr inbounds i8, ptr %.3247260, i64 11
  store i8 %.sroa.26.0.extract.trunc101, ptr %43, align 1, !tbaa !5
  %44 = getelementptr inbounds i8, ptr %.3247260, i64 13
  store i8 %.sroa.30.0.extract.trunc110, ptr %44, align 1, !tbaa !5
  %45 = getelementptr inbounds i8, ptr %.3247260, i64 15
  store i8 %.sroa.34.0.extract.trunc119, ptr %45, align 1, !tbaa !5
  %46 = getelementptr inbounds i8, ptr %.1262, i64 8
  %47 = getelementptr inbounds i8, ptr %.3247260, i64 16
  %48 = load i64, ptr %46, align 8, !tbaa !10
  %49 = and i64 %48, 1085102592571150095
  %.sroa.054.0.extract.trunc59 = trunc i64 %49 to i8
  %.sroa.1061.0.extract.shift64 = lshr i64 %49, 8
  %.sroa.1061.0.extract.trunc65 = trunc i64 %.sroa.1061.0.extract.shift64 to i8
  %.sroa.1471.0.extract.shift74 = lshr i64 %49, 16
  %.sroa.1471.0.extract.trunc75 = trunc i64 %.sroa.1471.0.extract.shift74 to i8
  %.sroa.1881.0.extract.shift84 = lshr i64 %49, 24
  %.sroa.1881.0.extract.trunc85 = trunc i64 %.sroa.1881.0.extract.shift84 to i8
  %.sroa.22.0.extract.shift93 = lshr i64 %49, 32
  %.sroa.22.0.extract.trunc94 = trunc i64 %.sroa.22.0.extract.shift93 to i8
  %.sroa.26.0.extract.shift102 = lshr i64 %49, 40
  %.sroa.26.0.extract.trunc103 = trunc i64 %.sroa.26.0.extract.shift102 to i8
  %.sroa.30.0.extract.shift111 = lshr i64 %49, 48
  %.sroa.30.0.extract.trunc112 = trunc i64 %.sroa.30.0.extract.shift111 to i8
  %.sroa.34.0.extract.shift120 = lshr i64 %49, 56
  %.sroa.34.0.extract.trunc121 = trunc nuw nsw i64 %.sroa.34.0.extract.shift120 to i8
  store i8 %.sroa.054.0.extract.trunc59, ptr %47, align 1, !tbaa !5
  %50 = getelementptr inbounds i8, ptr %.3247260, i64 18
  store i8 %.sroa.1061.0.extract.trunc65, ptr %50, align 1, !tbaa !5
  %51 = getelementptr inbounds i8, ptr %.3247260, i64 20
  store i8 %.sroa.1471.0.extract.trunc75, ptr %51, align 1, !tbaa !5
  %52 = getelementptr inbounds i8, ptr %.3247260, i64 22
  store i8 %.sroa.1881.0.extract.trunc85, ptr %52, align 1, !tbaa !5
  %53 = getelementptr inbounds i8, ptr %.3247260, i64 24
  store i8 %.sroa.22.0.extract.trunc94, ptr %53, align 1, !tbaa !5
  %54 = getelementptr inbounds i8, ptr %.3247260, i64 26
  store i8 %.sroa.26.0.extract.trunc103, ptr %54, align 1, !tbaa !5
  %55 = getelementptr inbounds i8, ptr %.3247260, i64 28
  store i8 %.sroa.30.0.extract.trunc112, ptr %55, align 1, !tbaa !5
  %56 = getelementptr inbounds i8, ptr %.3247260, i64 30
  store i8 %.sroa.34.0.extract.trunc121, ptr %56, align 1, !tbaa !5
  %57 = lshr i64 %48, 4
  %58 = and i64 %57, 1085102592571150095
  %.sroa.054.0.extract.trunc60 = trunc i64 %58 to i8
  %.sroa.1061.0.extract.shift66 = lshr i64 %58, 8
  %.sroa.1061.0.extract.trunc67 = trunc i64 %.sroa.1061.0.extract.shift66 to i8
  %.sroa.1471.0.extract.shift76 = lshr i64 %58, 16
  %.sroa.1471.0.extract.trunc77 = trunc i64 %.sroa.1471.0.extract.shift76 to i8
  %.sroa.1881.0.extract.shift86 = lshr i64 %58, 24
  %.sroa.1881.0.extract.trunc87 = trunc i64 %.sroa.1881.0.extract.shift86 to i8
  %.sroa.22.0.extract.shift95 = lshr i64 %58, 32
  %.sroa.22.0.extract.trunc96 = trunc i64 %.sroa.22.0.extract.shift95 to i8
  %.sroa.26.0.extract.shift104 = lshr i64 %58, 40
  %.sroa.26.0.extract.trunc105 = trunc i64 %.sroa.26.0.extract.shift104 to i8
  %.sroa.30.0.extract.shift113 = lshr i64 %58, 48
  %.sroa.30.0.extract.trunc114 = trunc i64 %.sroa.30.0.extract.shift113 to i8
  %.sroa.34.0.extract.shift122 = lshr i64 %48, 60
  %.sroa.34.0.extract.trunc123 = trunc nuw nsw i64 %.sroa.34.0.extract.shift122 to i8
  %59 = getelementptr inbounds i8, ptr %.3247260, i64 17
  store i8 %.sroa.054.0.extract.trunc60, ptr %59, align 1, !tbaa !5
  %60 = getelementptr inbounds i8, ptr %.3247260, i64 19
  store i8 %.sroa.1061.0.extract.trunc67, ptr %60, align 1, !tbaa !5
  %61 = getelementptr inbounds i8, ptr %.3247260, i64 21
  store i8 %.sroa.1471.0.extract.trunc77, ptr %61, align 1, !tbaa !5
  %62 = getelementptr inbounds i8, ptr %.3247260, i64 23
  store i8 %.sroa.1881.0.extract.trunc87, ptr %62, align 1, !tbaa !5
  %63 = getelementptr inbounds i8, ptr %.3247260, i64 25
  store i8 %.sroa.22.0.extract.trunc96, ptr %63, align 1, !tbaa !5
  %64 = getelementptr inbounds i8, ptr %.3247260, i64 27
  store i8 %.sroa.26.0.extract.trunc105, ptr %64, align 1, !tbaa !5
  %65 = getelementptr inbounds i8, ptr %.3247260, i64 29
  store i8 %.sroa.30.0.extract.trunc114, ptr %65, align 1, !tbaa !5
  %66 = getelementptr inbounds i8, ptr %.3247260, i64 31
  store i8 %.sroa.34.0.extract.trunc123, ptr %66, align 1, !tbaa !5
  %67 = add i32 %.3241261, -32
  %68 = getelementptr inbounds i8, ptr %.3247260, i64 32
  %69 = getelementptr inbounds i8, ptr %.1262, i64 16
  %70 = icmp ugt i32 %67, 32
  br i1 %70, label %.lr.ph, label %._crit_edge, !llvm.loop !12

._crit_edge:                                      ; preds = %.lr.ph, %.thread
  %.3247.lcssa = phi ptr [ %.2246, %.thread ], [ %68, %.lr.ph ]
  %.3241.lcssa = phi i32 [ %.2240, %.thread ], [ %67, %.lr.ph ]
  %.1.lcssa = phi ptr [ %.0, %.thread ], [ %69, %.lr.ph ]
  %71 = icmp ugt i32 %.3241.lcssa, 16
  br i1 %71, label %72, label %95

72:                                               ; preds = %._crit_edge
  %73 = load i64, ptr %.1.lcssa, align 8, !tbaa !10
  %74 = and i64 %73, 1085102592571150095
  %.sroa.020.0.extract.trunc = trunc i64 %74 to i8
  %.sroa.623.0.extract.shift = lshr i64 %74, 8
  %.sroa.623.0.extract.trunc = trunc i64 %.sroa.623.0.extract.shift to i8
  %.sroa.827.0.extract.shift = lshr i64 %74, 16
  %.sroa.827.0.extract.trunc = trunc i64 %.sroa.827.0.extract.shift to i8
  %.sroa.1031.0.extract.shift = lshr i64 %74, 24
  %.sroa.1031.0.extract.trunc = trunc i64 %.sroa.1031.0.extract.shift to i8
  %.sroa.12.0.extract.shift = lshr i64 %74, 32
  %.sroa.12.0.extract.trunc = trunc i64 %.sroa.12.0.extract.shift to i8
  %.sroa.14.0.extract.shift = lshr i64 %74, 40
  %.sroa.14.0.extract.trunc = trunc i64 %.sroa.14.0.extract.shift to i8
  %.sroa.16.0.extract.shift = lshr i64 %74, 48
  %.sroa.16.0.extract.trunc = trunc i64 %.sroa.16.0.extract.shift to i8
  %.sroa.18.0.extract.shift = lshr i64 %74, 56
  %.sroa.18.0.extract.trunc = trunc nuw nsw i64 %.sroa.18.0.extract.shift to i8
  store i8 %.sroa.020.0.extract.trunc, ptr %.3247.lcssa, align 1, !tbaa !5
  %75 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 2
  store i8 %.sroa.623.0.extract.trunc, ptr %75, align 1, !tbaa !5
  %76 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 4
  store i8 %.sroa.827.0.extract.trunc, ptr %76, align 1, !tbaa !5
  %77 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 6
  store i8 %.sroa.1031.0.extract.trunc, ptr %77, align 1, !tbaa !5
  %78 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 8
  store i8 %.sroa.12.0.extract.trunc, ptr %78, align 1, !tbaa !5
  %79 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 10
  store i8 %.sroa.14.0.extract.trunc, ptr %79, align 1, !tbaa !5
  %80 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 12
  store i8 %.sroa.16.0.extract.trunc, ptr %80, align 1, !tbaa !5
  %81 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 14
  store i8 %.sroa.18.0.extract.trunc, ptr %81, align 1, !tbaa !5
  %82 = lshr i64 %73, 4
  %83 = and i64 %82, 1085102592571150095
  %.sroa.020.0.extract.trunc22 = trunc i64 %83 to i8
  %.sroa.623.0.extract.shift24 = lshr i64 %83, 8
  %.sroa.623.0.extract.trunc25 = trunc i64 %.sroa.623.0.extract.shift24 to i8
  %.sroa.827.0.extract.shift28 = lshr i64 %83, 16
  %.sroa.827.0.extract.trunc29 = trunc i64 %.sroa.827.0.extract.shift28 to i8
  %.sroa.1031.0.extract.shift32 = lshr i64 %83, 24
  %.sroa.1031.0.extract.trunc33 = trunc i64 %.sroa.1031.0.extract.shift32 to i8
  %.sroa.12.0.extract.shift35 = lshr i64 %83, 32
  %.sroa.12.0.extract.trunc36 = trunc i64 %.sroa.12.0.extract.shift35 to i8
  %.sroa.14.0.extract.shift38 = lshr i64 %83, 40
  %.sroa.14.0.extract.trunc39 = trunc i64 %.sroa.14.0.extract.shift38 to i8
  %.sroa.16.0.extract.shift41 = lshr i64 %83, 48
  %.sroa.16.0.extract.trunc42 = trunc i64 %.sroa.16.0.extract.shift41 to i8
  %.sroa.18.0.extract.shift44 = lshr i64 %73, 60
  %.sroa.18.0.extract.trunc45 = trunc nuw nsw i64 %.sroa.18.0.extract.shift44 to i8
  %84 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 1
  store i8 %.sroa.020.0.extract.trunc22, ptr %84, align 1, !tbaa !5
  %85 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 3
  store i8 %.sroa.623.0.extract.trunc25, ptr %85, align 1, !tbaa !5
  %86 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 5
  store i8 %.sroa.827.0.extract.trunc29, ptr %86, align 1, !tbaa !5
  %87 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 7
  store i8 %.sroa.1031.0.extract.trunc33, ptr %87, align 1, !tbaa !5
  %88 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 9
  store i8 %.sroa.12.0.extract.trunc36, ptr %88, align 1, !tbaa !5
  %89 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 11
  store i8 %.sroa.14.0.extract.trunc39, ptr %89, align 1, !tbaa !5
  %90 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 13
  store i8 %.sroa.16.0.extract.trunc42, ptr %90, align 1, !tbaa !5
  %91 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 15
  store i8 %.sroa.18.0.extract.trunc45, ptr %91, align 1, !tbaa !5
  %92 = getelementptr inbounds i8, ptr %.3247.lcssa, i64 16
  %93 = add nsw i32 %.3241.lcssa, -16
  %94 = getelementptr inbounds i8, ptr %.1.lcssa, i64 8
  br label %95

95:                                               ; preds = %72, %._crit_edge
  %.4248 = phi ptr [ %92, %72 ], [ %.3247.lcssa, %._crit_edge ]
  %.4242 = phi i32 [ %93, %72 ], [ %.3241.lcssa, %._crit_edge ]
  %.2 = phi ptr [ %94, %72 ], [ %.1.lcssa, %._crit_edge ]
  %96 = icmp ugt i32 %.4242, 8
  br i1 %96, label %97, label %112

97:                                               ; preds = %95
  %98 = load i32, ptr %.2, align 4, !tbaa !13
  %99 = and i32 %98, 252645135
  %.sroa.0.0.extract.trunc = trunc i32 %99 to i8
  %.sroa.6.0.extract.shift = lshr i32 %99, 8
  %.sroa.6.0.extract.trunc = trunc i32 %.sroa.6.0.extract.shift to i8
  %.sroa.8.0.extract.shift = lshr i32 %99, 16
  %.sroa.8.0.extract.trunc = trunc i32 %.sroa.8.0.extract.shift to i8
  %.sroa.10.0.extract.shift = lshr i32 %99, 24
  %.sroa.10.0.extract.trunc = trunc nuw nsw i32 %.sroa.10.0.extract.shift to i8
  store i8 %.sroa.0.0.extract.trunc, ptr %.4248, align 1, !tbaa !5
  %100 = getelementptr inbounds i8, ptr %.4248, i64 2
  store i8 %.sroa.6.0.extract.trunc, ptr %100, align 1, !tbaa !5
  %101 = getelementptr inbounds i8, ptr %.4248, i64 4
  store i8 %.sroa.8.0.extract.trunc, ptr %101, align 1, !tbaa !5
  %102 = getelementptr inbounds i8, ptr %.4248, i64 6
  store i8 %.sroa.10.0.extract.trunc, ptr %102, align 1, !tbaa !5
  %103 = lshr i32 %98, 4
  %104 = and i32 %103, 252645135
  %.sroa.0.0.extract.trunc7 = trunc i32 %104 to i8
  %.sroa.6.0.extract.shift8 = lshr i32 %104, 8
  %.sroa.6.0.extract.trunc9 = trunc i32 %.sroa.6.0.extract.shift8 to i8
  %.sroa.8.0.extract.shift11 = lshr i32 %104, 16
  %.sroa.8.0.extract.trunc12 = trunc i32 %.sroa.8.0.extract.shift11 to i8
  %.sroa.10.0.extract.shift14 = lshr i32 %98, 28
  %.sroa.10.0.extract.trunc15 = trunc nuw nsw i32 %.sroa.10.0.extract.shift14 to i8
  %105 = getelementptr inbounds i8, ptr %.4248, i64 1
  store i8 %.sroa.0.0.extract.trunc7, ptr %105, align 1, !tbaa !5
  %106 = getelementptr inbounds i8, ptr %.4248, i64 3
  store i8 %.sroa.6.0.extract.trunc9, ptr %106, align 1, !tbaa !5
  %107 = getelementptr inbounds i8, ptr %.4248, i64 5
  store i8 %.sroa.8.0.extract.trunc12, ptr %107, align 1, !tbaa !5
  %108 = getelementptr inbounds i8, ptr %.4248, i64 7
  store i8 %.sroa.10.0.extract.trunc15, ptr %108, align 1, !tbaa !5
  %109 = getelementptr inbounds i8, ptr %.2, i64 4
  %110 = getelementptr inbounds i8, ptr %.4248, i64 8
  %111 = add nsw i32 %.4242, -8
  br label %112

112:                                              ; preds = %97, %95
  %.5249 = phi ptr [ %110, %97 ], [ %.4248, %95 ]
  %.5 = phi i32 [ %111, %97 ], [ %.4242, %95 ]
  %.3 = phi ptr [ %109, %97 ], [ %.2, %95 ]
  %113 = icmp ugt i32 %.5, 1
  br i1 %113, label %.lr.ph269.preheader, label %._crit_edge270

.lr.ph269.preheader:                              ; preds = %112
  %114 = and i32 %.5, -2
  %115 = add i32 %.5, -2
  %116 = lshr i32 %115, 1
  %narrow = add nuw i32 %116, 1
  %117 = zext i32 %narrow to i64
  %min.iters.check = icmp ult i32 %115, 30
  br i1 %min.iters.check, label %.lr.ph269.preheader305, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph269.preheader
  %118 = add i32 %.5, -2
  %119 = lshr i32 %118, 1
  %120 = zext nneg i32 %119 to i64
  %121 = shl nuw nsw i64 %120, 1
  %122 = add nuw nsw i64 %121, 2
  %scevgep = getelementptr i8, ptr %.5249, i64 %122
  %123 = add nuw nsw i64 %120, 1
  %scevgep295 = getelementptr i8, ptr %.3, i64 %123
  %bound0 = icmp ult ptr %.5249, %scevgep295
  %bound1 = icmp ult ptr %.3, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph269.preheader305, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %117, 4294967280
  %ind.end = shl nuw nsw i64 %n.vec, 1
  %ind.end296 = getelementptr i8, ptr %.3, i64 %n.vec
  %.cast = trunc nuw i64 %n.vec to i32
  %124 = shl i32 %.cast, 1
  %ind.end298 = sub i32 %.5, %124
  %invariant.gep = getelementptr i8, ptr %.5249, i64 -1
  %invariant.gep318 = getelementptr i8, ptr %.5249, i64 -1
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = shl i64 %index, 1
  %next.gep = getelementptr i8, ptr %.3, i64 %index
  %125 = getelementptr i8, ptr %next.gep, i64 8
  %wide.load = load <8 x i8>, ptr %next.gep, align 1, !tbaa !5, !alias.scope !15
  %wide.load303 = load <8 x i8>, ptr %125, align 1, !tbaa !5, !alias.scope !15
  %126 = and <8 x i8> %wide.load, <i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15>
  %127 = and <8 x i8> %wide.load303, <i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15>
  %128 = lshr <8 x i8> %wide.load, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
  %129 = lshr <8 x i8> %wide.load303, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
  %130 = or disjoint i64 %offset.idx, 1
  %131 = or disjoint i64 %offset.idx, 17
  %gep = getelementptr i8, ptr %invariant.gep, i64 %130
  %gep319 = getelementptr i8, ptr %invariant.gep318, i64 %131
  %interleaved.vec = shufflevector <8 x i8> %126, <8 x i8> %128, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
  store <16 x i8> %interleaved.vec, ptr %gep, align 1, !tbaa !5
  %interleaved.vec304 = shufflevector <8 x i8> %127, <8 x i8> %129, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
  store <16 x i8> %interleaved.vec304, ptr %gep319, align 1, !tbaa !5
  %index.next = add nuw i64 %index, 16
  %132 = icmp eq i64 %index.next, %n.vec
  br i1 %132, label %middle.block, label %vector.body, !llvm.loop !18

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %117
  br i1 %cmp.n, label %._crit_edge270.loopexit, label %.lr.ph269.preheader305

.lr.ph269.preheader305:                           ; preds = %middle.block, %vector.memcheck, %.lr.ph269.preheader
  %indvars.iv.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph269.preheader ], [ %ind.end, %middle.block ]
  %.4267.ph = phi ptr [ %.3, %vector.memcheck ], [ %.3, %.lr.ph269.preheader ], [ %ind.end296, %middle.block ]
  %.6266.ph = phi i32 [ %.5, %vector.memcheck ], [ %.5, %.lr.ph269.preheader ], [ %ind.end298, %middle.block ]
  br label %.lr.ph269

.lr.ph269:                                        ; preds = %.lr.ph269.preheader305, %.lr.ph269
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph269 ], [ %indvars.iv.ph, %.lr.ph269.preheader305 ]
  %.4267 = phi ptr [ %139, %.lr.ph269 ], [ %.4267.ph, %.lr.ph269.preheader305 ]
  %.6266 = phi i32 [ %140, %.lr.ph269 ], [ %.6266.ph, %.lr.ph269.preheader305 ]
  %133 = load i8, ptr %.4267, align 1, !tbaa !5
  %134 = and i8 %133, 15
  %135 = getelementptr inbounds i8, ptr %.5249, i64 %indvars.iv
  store i8 %134, ptr %135, align 1, !tbaa !5
  %136 = lshr i8 %133, 4
  %137 = or disjoint i64 %indvars.iv, 1
  %138 = getelementptr inbounds i8, ptr %.5249, i64 %137
  store i8 %136, ptr %138, align 1, !tbaa !5
  %139 = getelementptr inbounds i8, ptr %.4267, i64 1
  %140 = add nsw i32 %.6266, -2
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
  %141 = icmp ugt i32 %140, 1
  br i1 %141, label %.lr.ph269, label %._crit_edge270.loopexit, !llvm.loop !21

._crit_edge270.loopexit:                          ; preds = %.lr.ph269, %middle.block
  %.lcssa289 = phi ptr [ %ind.end296, %middle.block ], [ %139, %.lr.ph269 ]
  %.lcssa = phi i32 [ %ind.end298, %middle.block ], [ %140, %.lr.ph269 ]
  %142 = zext i32 %114 to i64
  br label %._crit_edge270

._crit_edge270:                                   ; preds = %._crit_edge270.loopexit, %112
  %.0250.lcssa = phi i64 [ 0, %112 ], [ %142, %._crit_edge270.loopexit ]
  %.6.lcssa = phi i32 [ %.5, %112 ], [ %.lcssa, %._crit_edge270.loopexit ]
  %.4.lcssa = phi ptr [ %.3, %112 ], [ %.lcssa289, %._crit_edge270.loopexit ]
  %.not274 = icmp eq i32 %.6.lcssa, 0
  br i1 %.not274, label %.loopexit, label %143

143:                                              ; preds = %._crit_edge270
  %144 = load i8, ptr %.4.lcssa, align 1, !tbaa !5
  %145 = and i8 %144, 15
  %146 = getelementptr inbounds i8, ptr %.5249, i64 %.0250.lcssa
  store i8 %145, ptr %146, align 1, !tbaa !5
  br label %.loopexit

.loopexit:                                        ; preds = %11, %19, %._crit_edge270, %143
  ret void
}

attributes #0 = { 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" }

!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}
!9 = !{!"llvm.loop.mustprogress"}
!10 = !{!11, !11, i64 0}
!11 = !{!"long", !6, i64 0}
!12 = distinct !{!12, !9}
!13 = !{!14, !14, i64 0}
!14 = !{!"int", !6, i64 0}
!15 = !{!16}
!16 = distinct !{!16, !17}
!17 = distinct !{!17, !"LVerDomain"}
!18 = distinct !{!18, !9, !19, !20}
!19 = !{!"llvm.loop.isvectorized", i32 1}
!20 = !{!"llvm.loop.unroll.runtime.disable"}
!21 = distinct !{!21, !9, !19}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,SCCPPass,SROAPass,SimplifyCFGPass