Skip to content

Commit f50b420

Browse files
committed
Add tests
1 parent f1caae0 commit f50b420

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK-DAG: OpName %[[#test_int32_double_conversion:]] "test_int32_double_conversion"
5+
; CHECK-DAG: %[[#int:]] = OpTypeInt 32 0
6+
; CHECK-DAG: %[[#v4i32:]] = OpTypeVector %[[#int]] 4
7+
; CHECK-DAG: %[[#double:]] = OpTypeFloat 64
8+
; CHECK-DAG: %[[#v4f64:]] = OpTypeVector %[[#double]] 4
9+
; CHECK-DAG: %[[#v2i32:]] = OpTypeVector %[[#int]] 2
10+
; CHECK-DAG: %[[#ptr_private_v4i32:]] = OpTypePointer Private %[[#v4i32]]
11+
; CHECK-DAG: %[[#ptr_private_v4f64:]] = OpTypePointer Private %[[#v4f64]]
12+
; CHECK-DAG: %[[#global_double:]] = OpVariable %[[#ptr_private_v4f64]] Private
13+
14+
@G_16 = internal addrspace(10) global [16 x i32] zeroinitializer
15+
@G_4_double = internal addrspace(10) global <4 x double> zeroinitializer
16+
@G_4_int = internal addrspace(10) global <4 x i32> zeroinitializer
17+
18+
19+
; This is the way matrices will be represented in HLSL. The memory type will be
20+
; an array, but it will be loaded as a vector.
21+
; TODO: Legalization for loads and stores of long vectors is not implemented yet. │
22+
;define spir_func void @test_load_store_global() { │
23+
;entry: │
24+
; %0 = load <16 x i32>, ptr addrspace(10) @G_16, align 64 │
25+
; store <16 x i32> %0, ptr addrspace(10) @G_16, align 64 │
26+
; ret void │
27+
;}
28+
29+
; This is the code pattern that can be generated from the `asuint` and `asdouble`
30+
; HLSL intrinsics.
31+
32+
; TODO: This cods not the best because instruction selection is not folding an
33+
; extract from other intstruction. That needs to be handled.
34+
define spir_func void @test_int32_double_conversion() {
35+
; CHECK: %[[#test_int32_double_conversion]] = OpFunction
36+
entry:
37+
; CHECK: %[[#LOAD:]] = OpLoad %[[#v4f64]] %[[#global_double]]
38+
; CHECK: %[[#VEC_SHUF1:]] = OpVectorShuffle %{{[a-zA-Z0-9_]+}} %[[#LOAD]] %{{[a-zA-Z0-9_]+}} 0 1
39+
; CHECK: %[[#VEC_SHUF2:]] = OpVectorShuffle %{{[a-zA-Z0-9_]+}} %[[#LOAD]] %{{[a-zA-Z0-9_]+}} 2 3
40+
; CHECK: %[[#BITCAST1:]] = OpBitcast %[[#v4i32]] %[[#VEC_SHUF1]]
41+
; CHECK: %[[#BITCAST2:]] = OpBitcast %[[#v4i32]] %[[#VEC_SHUF2]]
42+
; CHECK: %[[#EXTRACT1:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 0
43+
; CHECK: %[[#EXTRACT2:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 2
44+
; CHECK: %[[#EXTRACT3:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 0
45+
; CHECK: %[[#EXTRACT4:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 2
46+
; CHECK: %[[#CONSTRUCT1:]] = OpCompositeConstruct %[[#v4i32]] %[[#EXTRACT1]] %[[#EXTRACT2]] %[[#EXTRACT3]] %[[#EXTRACT4]]
47+
; CHECK: %[[#EXTRACT5:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 1
48+
; CHECK: %[[#EXTRACT6:]] = OpCompositeExtract %[[#int]] %[[#BITCAST1]] 3
49+
; CHECK: %[[#EXTRACT7:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 1
50+
; CHECK: %[[#EXTRACT8:]] = OpCompositeExtract %[[#int]] %[[#BITCAST2]] 3
51+
; CHECK: %[[#CONSTRUCT2:]] = OpCompositeConstruct %[[#v4i32]] %[[#EXTRACT5]] %[[#EXTRACT6]] %[[#EXTRACT7]] %[[#EXTRACT8]]
52+
; CHECK: %[[#EXTRACT9:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 0
53+
; CHECK: %[[#EXTRACT10:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 0
54+
; CHECK: %[[#EXTRACT11:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 1
55+
; CHECK: %[[#EXTRACT12:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 1
56+
; CHECK: %[[#EXTRACT13:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 2
57+
; CHECK: %[[#EXTRACT14:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 2
58+
; CHECK: %[[#EXTRACT15:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT1]] 3
59+
; CHECK: %[[#EXTRACT16:]] = OpCompositeExtract %[[#int]] %[[#CONSTRUCT2]] 3
60+
; CHECK: %[[#CONSTRUCT3:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT9]] %[[#EXTRACT10]]
61+
; CHECK: %[[#CONSTRUCT4:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT11]] %[[#EXTRACT12]]
62+
; CHECK: %[[#CONSTRUCT5:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT13]] %[[#EXTRACT14]]
63+
; CHECK: %[[#CONSTRUCT6:]] = OpCompositeConstruct %[[#v2i32]] %[[#EXTRACT15]] %[[#EXTRACT16]]
64+
; CHECK: %[[#BITCAST3:]] = OpBitcast %[[#double]] %[[#CONSTRUCT3]]
65+
; CHECK: %[[#BITCAST4:]] = OpBitcast %[[#double]] %[[#CONSTRUCT4]]
66+
; CHECK: %[[#BITCAST5:]] = OpBitcast %[[#double]] %[[#CONSTRUCT5]]
67+
; CHECK: %[[#BITCAST6:]] = OpBitcast %[[#double]] %[[#CONSTRUCT6]]
68+
; CHECK: %[[#CONSTRUCT7:]] = OpCompositeConstruct %[[#v4f64]] %[[#BITCAST3]] %[[#BITCAST4]] %[[#BITCAST5]] %[[#BITCAST6]]
69+
; CHECK: OpStore %[[#global_double]] %[[#CONSTRUCT7]] Aligned 32
70+
71+
%0 = load <8 x i32>, ptr addrspace(10) @G_4_double
72+
%1 = shufflevector <8 x i32> %0, <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
73+
%2 = shufflevector <8 x i32> %0, <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
74+
%3 = shufflevector <4 x i32> %1, <4 x i32> %2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
75+
store <8 x i32> %3, ptr addrspace(10) @G_4_double
76+
ret void
77+
}
78+
79+
; Add a main function to make it a valid module for spirv-val
80+
define void @main() #1 {
81+
ret void
82+
}
83+
84+
attributes #1 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }

0 commit comments

Comments
 (0)