#skip amdgcn-amdhsa-none-baseline-whole-llvm-debug-lld

#skip bpfeb-freestanding-none-baseline-whole-llvm-debug-lld

#skip bpfel-freestanding-none-baseline-whole-llvm-debug-lld

#skip csky-freestanding-eabi-baseline-whole-llvm-debug-lld
#skip csky-freestanding-eabihf-baseline-whole-llvm-debug-lld
#skip csky-linux-eabi-baseline-whole-llvm-debug-lld
#skip csky-linux-eabihf-baseline-whole-llvm-debug-lld
#skip csky-linux-gnueabi-baseline-whole-llvm-debug-lld
#skip csky-linux-gnueabihf-baseline-whole-llvm-debug-lld

#skip nvptx-cuda-none-baseline-whole-llvm-debug-lld
#skip nvptx-nvcl-none-baseline-whole-llvm-debug-lld

#skip nvptx64-cuda-none-baseline-whole-llvm-debug-lld
#skip nvptx64-nvcl-none-baseline-whole-llvm-debug-lld

#skip spirv32-opencl-none-baseline-whole-llvm-debug-lld
#skip spirv32-opengl-none-baseline-whole-llvm-debug-lld
#skip spirv32-vulkan-none-baseline-whole-llvm-debug-lld

#skip spirv64-amdhsa-none-baseline-whole-llvm-debug-lld
#skip spirv64-opencl-none-baseline-whole-llvm-debug-lld
#skip spirv64-vulkan-none-baseline-whole-llvm-debug-lld

#skip x86_64-linux-gnux32-baseline-whole-llvm-debug-new
#skip x86_64-linux-muslx32-baseline-whole-llvm-debug-new
#skip x86_64-linux-x32-baseline-whole-llvm-debug-new

#zig build-obj {
--name test -ofmt=llvmir -fno-lld -fno-new-linker
-Mroot=test.zig
#}

#write test.zig {
export fn entry(arr: *const [16]u8) @Vector(16, u8) {
    return arr.*;
}
#}
#update "one vector load"
#check llvm {
...
define ... @test.entry(..., ptr ... %arr) ... {
  ...
  %arr.local = alloca [16 x i8], align 1, !...
  ...
  call void @llvm.memcpy.p0.p0.isize(ptr align 1 %arr.local, ptr align 1 %arr, isize 16, i1 false), !...
  %vec = load <16 x i8>, ptr %arr.load, align 1, !...
  ...
}

...
#}

#write test.zig {
export fn entry(a: *@Vector(8, u8), b: *@Vector(8, u8), src: [*]const u8) void {
    const q: @Vector(16, u8) = src[0..16].*;
    a.* = @shuffle(u8, q, undefined, @Vector(8, i32){ 0, 1, 2, 3, 4, 5, 6, 7 });
    b.* = @shuffle(u8, q, undefined, @Vector(8, i32){ 7, 8, 9, 10, 11, 12, 13, 14 });
}
#}
#update "feeding overlapping shuffles"
#check llvm {
...
define ... void @test.entry(ptr ... %a, ptr ... %b, ptr ... %src) ... {
  ...
  %src.load = load <16 x i8>, ptr %src.local, align 1, !...
  ...
  %a.shuffle = shufflevector <16 x i8> %src.load, <16 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, !...
  store <8 x i8> %a.shuffle, ptr %a, align 8, !...
  %b.shuffle = shufflevector <16 x i8> %src.load, <16 x i8> poison, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>, !...
  store <8 x i8> %b.shuffle, ptr %b, align 8, !...
  ret void, !...
}

...
#}
