22; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %}
33
44@.str = private unnamed_addr constant [4 x i8 ] c "In3\00 " , align 1
5- @.str.2 = private unnamed_addr constant [5 x i8 ] c "Out3\00 " , align 1
5+ @.str.2 = private unnamed_addr constant [5 x i8 ] c "Out4\00 " , align 1
6+ @.str.3 = private unnamed_addr constant [5 x i8 ] c "Out3\00 " , align 1
67
7- ; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(readwrite, inaccessiblemem: none)
8- define void @main () local_unnamed_addr #0 {
9- ; CHECK: %[[#INT32:]] = OpTypeInt 32 0
10- ; CHECK: %[[#INT4:]] = OpTypeVector %[[#INT32]] 4
11- ; CHECK: %[[#FLOAT:]] = OpTypeFloat 32
12- ; CHECK: %[[#FLOAT4:]] = OpTypeVector %[[#FLOAT]] 4
8+
9+ ; CHECK-DAG: %[[#INT32:]] = OpTypeInt 32 0
10+ ; CHECK-DAG: %[[#INT4:]] = OpTypeVector %[[#INT32]] 4
11+ ; CHECK-DAG: %[[#FLOAT:]] = OpTypeFloat 32
12+ ; CHECK-DAG: %[[#FLOAT4:]] = OpTypeVector %[[#FLOAT]] 4
13+ ; CHECK-DAG: %[[#INT3:]] = OpTypeVector %[[#INT32]] 3
14+ ; CHECK-DAG: %[[#UNDEF_INT4:]] = OpUndef %[[#INT4]]
15+
16+ define void @case1 () local_unnamed_addr {
1317 ; CHECK: %[[#BUFFER_LOAD:]] = OpLoad %[[#FLOAT4]] %{{[0-9]+}} Aligned 16
1418 ; CHECK: %[[#CAST_LOAD:]] = OpBitcast %[[#INT4]] %[[#BUFFER_LOAD]]
1519 ; CHECK: %[[#VEC_SHUFFLE:]] = OpVectorShuffle %[[#INT4]] %[[#CAST_LOAD]] %[[#CAST_LOAD]] 0 1 2 3
@@ -22,4 +26,17 @@ define void @main() local_unnamed_addr #0 {
2226 ret void
2327}
2428
25- attributes #0 = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(readwrite, inaccessiblemem: none) "approx-func-fp-math" ="true" "frame-pointer" ="all" "hlsl.numthreads" ="1,1,1" "hlsl.shader" ="compute" "no-infs-fp-math" ="true" "no-nans-fp-math" ="true" "no-signed-zeros-fp-math" ="true" "no-trapping-math" ="true" "stack-protector-buffer-size" ="8" }
29+ define void @case2 () local_unnamed_addr {
30+ ; CHECK: %[[#BUFFER_LOAD:]] = OpLoad %[[#FLOAT4]] %{{[0-9]+}} Aligned 16
31+ ; CHECK: %[[#CAST_LOAD:]] = OpBitcast %[[#INT4]] %[[#BUFFER_LOAD]]
32+ ; CHECK: %[[#VEC_SHUFFLE:]] = OpVectorShuffle %[[#INT4]] %[[#CAST_LOAD]] %[[#CAST_LOAD]] 0 1 2 3
33+ ; CHECK: %[[#VEC_TRUNCATE:]] = OpVectorShuffle %[[#INT3]] %[[#VEC_SHUFFLE]] %[[#UNDEF_INT4]] 0 1 2
34+ %1 = tail call target ("spirv.VulkanBuffer" , [0 x <4 x float >], 12 , 0 ) @llvm.spv.resource.handlefrombinding.tspirv.VulkanBuffer_a0v4f32_12_0t (i32 0 , i32 2 , i32 1 , i32 0 , i1 false , ptr nonnull @.str )
35+ %2 = tail call target ("spirv.VulkanBuffer" , [0 x <3 x i32 >], 12 , 1 ) @llvm.spv.resource.handlefrombinding.tspirv.VulkanBuffer_a0v3i32_12_1t (i32 0 , i32 5 , i32 1 , i32 0 , i1 false , ptr nonnull @.str.3 )
36+ %3 = tail call noundef align 16 dereferenceable (16 ) ptr addrspace (11 ) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0v4f32_12_0t (target ("spirv.VulkanBuffer" , [0 x <4 x float >], 12 , 0 ) %1 , i32 0 )
37+ %4 = load <4 x i32 >, ptr addrspace (11 ) %3 , align 16
38+ %5 = shufflevector <4 x i32 > %4 , <4 x i32 > poison, <3 x i32 > <i32 0 , i32 1 , i32 2 >
39+ %6 = tail call noundef align 16 dereferenceable (16 ) ptr addrspace (11 ) @llvm.spv.resource.getpointer.p11.tspirv.VulkanBuffer_a0v3i32_12_1t (target ("spirv.VulkanBuffer" , [0 x <3 x i32 >], 12 , 1 ) %2 , i32 0 )
40+ store <3 x i32 > %5 , ptr addrspace (11 ) %6 , align 16
41+ ret void
42+ }
0 commit comments