1
1
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -O1 -o - | FileCheck %s
2
- // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-vulkan-library %s -fnative-half-type -emit-llvm -O0 -o - | FileCheck %s --check-prefix=SPIRV
2
+ // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple spirv-vulkan-library %s -fnative-half-type -emit-llvm -O1 -o - | FileCheck %s --check-prefix=SPIRV
3
3
4
4
5
5
9
9
// CHECK-NEXT: extractvalue { i32, i32 } [[VALRET]], 1
10
10
// SPIRV: define spir_func {{.*}} i32 {{.*}}test_scalar{{.*}}(double {{.*}} [[VALD:%.*]])
11
11
// SPIRV-NOT: @llvm.dx.splitdouble.i32
12
- // SPIRV: [[REG:%.*]] = load double, ptr [[VALD]].addr, align 8
13
- // SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[REG]] to <2 x i32>
12
+ // SPIRV: [[CAST:%.*]] = bitcast double [[VALD]] to <2 x i32>
14
13
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 0
15
14
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 1
16
15
uint test_scalar (double D) {
@@ -26,9 +25,7 @@ uint test_scalar(double D) {
26
25
// CHECK-NEXT: extractvalue { i32, i32 } [[VALRET]], 1
27
26
// SPIRV: define spir_func {{.*}} <1 x i32> {{.*}}test_double1{{.*}}(<1 x double> {{.*}} [[VALD:%.*]])
28
27
// SPIRV-NOT: @llvm.dx.splitdouble.i32
29
- // SPIRV: [[REG:%.*]] = load <1 x double>, ptr [[VALD]].addr, align 8
30
- // SPIRV-NEXT: [[TRUNC:%.*]] = extractelement <1 x double> %1, i64 0
31
- // SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[TRUNC]] to <2 x i32>
28
+ // SPIRV: [[CAST:%.*]] = bitcast <1 x double> [[VALD]] to <2 x i32>
32
29
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 0
33
30
// SPIRV-NEXT: extractelement <2 x i32> [[CAST]], i64 1
34
31
uint1 test_double1 (double1 D) {
@@ -43,8 +40,7 @@ uint1 test_double1(double1 D) {
43
40
// CHECK-NEXT: extractvalue { <2 x i32>, <2 x i32> } [[VALRET]], 1
44
41
// SPIRV: define spir_func {{.*}} <2 x i32> {{.*}}test_vector2{{.*}}(<2 x double> {{.*}} [[VALD:%.*]])
45
42
// SPIRV-NOT: @llvm.dx.splitdouble.i32
46
- // SPIRV: [[REG:%.*]] = load <2 x double>, ptr [[VALD]].addr, align 16
47
- // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[REG]] to <4 x i32>
43
+ // SPIRV: [[CAST1:%.*]] = bitcast <2 x double> [[VALD]] to <4 x i32>
48
44
// SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
49
45
// SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
50
46
uint2 test_vector2 (double2 D) {
@@ -59,15 +55,9 @@ uint2 test_vector2(double2 D) {
59
55
// CHECK-NEXT: extractvalue { <3 x i32>, <3 x i32> } [[VALRET]], 1
60
56
// SPIRV: define spir_func {{.*}} <3 x i32> {{.*}}test_vector3{{.*}}(<3 x double> {{.*}} [[VALD:%.*]])
61
57
// SPIRV-NOT: @llvm.dx.splitdouble.i32
62
- // SPIRV: [[REG:%.*]] = load <3 x double>, ptr [[VALD]].addr, align 32
63
- // SPIRV-NEXT: [[VALRET1:%.*]] = shufflevector <3 x double> [[REG]], <3 x double> poison, <2 x i32> <i32 0, i32 1>
64
- // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[VALRET1]] to <4 x i32>
65
- // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
66
- // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
67
- // SPIRV-NEXT: [[EXTRACT:%.*]] = extractelement <3 x double> [[REG]], i64 2
68
- // SPIRV-NEXT: [[CAST:%.*]] = bitcast double [[EXTRACT]] to <2 x i32>
69
- // SPIRV-NEXT: %[[#]] = shufflevector <2 x i32> [[SHUF1]], <2 x i32> [[CAST]], <3 x i32> <i32 0, i32 1, i32 2>
70
- // SPIRV-NEXT: %[[#]] = shufflevector <2 x i32> [[SHUF2]], <2 x i32> [[CAST]], <3 x i32> <i32 0, i32 1, i32 3>
58
+ // SPIRV: [[CAST1:%.*]] = bitcast <3 x double> [[VALD]] to <6 x i32>
59
+ // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <6 x i32> [[CAST1]], <6 x i32> poison, <3 x i32> <i32 0, i32 2, i32 4>
60
+ // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <6 x i32> [[CAST1]], <6 x i32> poison, <3 x i32> <i32 1, i32 3, i32 5>
71
61
uint3 test_vector3 (double3 D) {
72
62
uint3 A, B;
73
63
asuint (D, A, B);
@@ -80,18 +70,9 @@ uint3 test_vector3(double3 D) {
80
70
// CHECK-NEXT: extractvalue { <4 x i32>, <4 x i32> } [[VALRET]], 1
81
71
// SPIRV: define spir_func {{.*}} <4 x i32> {{.*}}test_vector4{{.*}}(<4 x double> {{.*}} [[VALD:%.*]])
82
72
// SPIRV-NOT: @llvm.dx.splitdouble.i32
83
- // SPIRV: [[REG:%.*]] = load <4 x double>, ptr [[VALD]].addr, align 32
84
- // SPIRV-NEXT: [[VALRET1:%.*]] = shufflevector <4 x double> [[REG]], <4 x double> poison, <2 x i32> <i32 0, i32 1>
85
- // SPIRV-NEXT: [[CAST1:%.*]] = bitcast <2 x double> [[VALRET1]] to <4 x i32>
86
- // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
87
- // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <4 x i32> [[CAST1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
88
- // SPIRV-NEXT: [[VALRET2:%.*]] = shufflevector <4 x double> [[REG]], <4 x double> poison, <2 x i32> <i32 2, i32 3>
89
- // SPIRV-NEXT: [[CAST2:%.*]] = bitcast <2 x double> [[VALRET2]] to <4 x i32>
90
- // SPIRV-NEXT: [[SHUF3:%.*]] = shufflevector <4 x i32> [[CAST2]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
91
- // SPIRV-NEXT: [[SHUF4:%.*]] = shufflevector <4 x i32> [[CAST2]], <4 x i32> poison, <2 x i32> <i32 1, i32 3>
92
- // SPIRV-NEXT: shufflevector <2 x i32> [[SHUF1]], <2 x i32> [[SHUF3]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
93
- // SPIRV-NEXT: shufflevector <2 x i32> [[SHUF2]], <2 x i32> [[SHUF4]], <4 x i32> <i32 0, i32 1, i32 3, i32 3>
94
-
73
+ // SPIRV: [[CAST1:%.*]] = bitcast <4 x double> [[VALD]] to <8 x i32>
74
+ // SPIRV-NEXT: [[SHUF1:%.*]] = shufflevector <8 x i32> [[CAST1]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
75
+ // SPIRV-NEXT: [[SHUF2:%.*]] = shufflevector <8 x i32> [[CAST1]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
95
76
uint4 test_vector4 (double4 D) {
96
77
uint4 A, B;
97
78
asuint (D, A, B);
0 commit comments