Skip to content

Commit 52f4f39

Browse files
committed
tests for select intrinsic
1 parent 3e0cd3c commit 52f4f39

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
2+
// RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \
3+
// RUN: -o - | FileCheck %s --check-prefixes=CHECK
4+
5+
// CHECK: %hlsl.select = select i1
6+
// CHECK: ret i32 %hlsl.select
7+
int test_select_bool_int(bool cond0, int tVal, int fVal) { return select<int>(cond0, tVal, fVal); }
8+
9+
// CHECK: %hlsl.select = select i1
10+
// CHECK: ret <2 x i32> %hlsl.select
11+
vector<int,2> test_select_bool_vector(bool cond0, vector<int, 2> tVal, vector<int, 2> fVal) { return select<vector<int,2> >(cond0, tVal, fVal); }
12+
13+
// CHECK: %4 = extractelement <1 x i1> %extractvec, i32 0
14+
// CHECK: %5 = extractelement <1 x i32> %2, i32 0
15+
// CHECK: %6 = extractelement <1 x i32> %3, i32 0
16+
// CHECK: %7 = select i1 %4, i32 %5, i32 %6
17+
// CHECK: %8 = insertelement <1 x i32> poison, i32 %7, i32 0
18+
// CHECK: ret <1 x i32> %8
19+
vector<int,1> test_select_vector_1(vector<bool,1> cond0, vector<int,1> tVals, vector<int,1> fVals) { return select<int,1>(cond0, tVals, fVals); }
20+
21+
// CHECK: %4 = extractelement <2 x i1> %extractvec, i32 0
22+
// CHECK: %5 = extractelement <2 x i32> %2, i32 0
23+
// CHECK: %6 = extractelement <2 x i32> %3, i32 0
24+
// CHECK: %7 = select i1 %4, i32 %5, i32 %6
25+
// CHECK: %8 = insertelement <2 x i32> poison, i32 %7, i32 0
26+
// CHECK: %9 = extractelement <2 x i1> %extractvec, i32 1
27+
// CHECK: %10 = extractelement <2 x i32> %2, i32 1
28+
// CHECK: %11 = extractelement <2 x i32> %3, i32 1
29+
// CHECK: %12 = select i1 %9, i32 %10, i32 %11
30+
// CHECK: %13 = insertelement <2 x i32> %8, i32 %12, i32 1
31+
// CHECK: ret <2 x i32> %13
32+
vector<int,2> test_select_vector_2(vector<bool, 2> cond0, vector<int, 2> tVals, vector<int, 2> fVals) { return select<int,2>(cond0, tVals, fVals); }
33+
34+
// CHECK: %4 = extractelement <3 x i1> %extractvec, i32 0
35+
// CHECK: %5 = extractelement <3 x i32> %2, i32 0
36+
// CHECK: %6 = extractelement <3 x i32> %3, i32 0
37+
// CHECK: %7 = select i1 %4, i32 %5, i32 %6
38+
// CHECK: %8 = insertelement <3 x i32> poison, i32 %7, i32 0
39+
// CHECK: %9 = extractelement <3 x i1> %extractvec, i32 1
40+
// CHECK: %10 = extractelement <3 x i32> %2, i32 1
41+
// CHECK: %11 = extractelement <3 x i32> %3, i32 1
42+
// CHECK: %12 = select i1 %9, i32 %10, i32 %11
43+
// CHECK: %13 = insertelement <3 x i32> %8, i32 %12, i32 1
44+
// CHECK: %14 = extractelement <3 x i1> %extractvec, i32 2
45+
// CHECK: %15 = extractelement <3 x i32> %2, i32 2
46+
// CHECK: %16 = extractelement <3 x i32> %3, i32 2
47+
// CHECK: %17 = select i1 %14, i32 %15, i32 %16
48+
// CHECK: %18 = insertelement <3 x i32> %13, i32 %17, i32 2
49+
// CHECK: ret <3 x i32> %18
50+
vector<int,3> test_select_vector_3(vector<bool, 3> cond0, vector<int, 3> tVals, vector<int, 3> fVals) { return select<int,3>(cond0, tVals, fVals); }
51+
52+
// CHECK: %4 = extractelement <4 x i1> %extractvec, i32 0
53+
// CHECK: %5 = extractelement <4 x i32> %2, i32 0
54+
// CHECK: %6 = extractelement <4 x i32> %3, i32 0
55+
// CHECK: %7 = select i1 %4, i32 %5, i32 %6
56+
// CHECK: %8 = insertelement <4 x i32> poison, i32 %7, i32 0
57+
// CHECK: %9 = extractelement <4 x i1> %extractvec, i32 1
58+
// CHECK: %10 = extractelement <4 x i32> %2, i32 1
59+
// CHECK: %11 = extractelement <4 x i32> %3, i32 1
60+
// CHECK: %12 = select i1 %9, i32 %10, i32 %11
61+
// CHECK: %13 = insertelement <4 x i32> %8, i32 %12, i32 1
62+
// CHECK: %14 = extractelement <4 x i1> %extractvec, i32 2
63+
// CHECK: %15 = extractelement <4 x i32> %2, i32 2
64+
// CHECK: %16 = extractelement <4 x i32> %3, i32 2
65+
// CHECK: %17 = select i1 %14, i32 %15, i32 %16
66+
// CHECK: %18 = insertelement <4 x i32> %13, i32 %17, i32 2
67+
// CHECK: %19 = extractelement <4 x i1> %extractvec, i32 3
68+
// CHECK: %20 = extractelement <4 x i32> %2, i32 3
69+
// CHECK: %21 = extractelement <4 x i32> %3, i32 3
70+
// CHECK: %22 = select i1 %19, i32 %20, i32 %21
71+
// CHECK: %23 = insertelement <4 x i32> %18, i32 %22, i32 3
72+
// CHECK: ret <4 x i32> %23
73+
vector<int,4> test_select_vector_4(vector<bool, 4> cond0, vector<int, 4> tVals, vector<int, 4> fVals) { return select<int,4>(cond0, tVals, fVals); }
74+
75+
76+
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected
2+
3+
int test_no_arg() {
4+
return select();
5+
// expected-error@-1 {{no matching function for call to 'select'}}
6+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires 3 arguments, but 0 were provided}}
7+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires 3 arguments, but 0 were provided}}
8+
}
9+
10+
int test_too_few_args(bool p0) {
11+
return select(p0);
12+
// expected-error@-1 {{no matching function for call to 'select'}}
13+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires 3 arguments, but 1 was provided}}
14+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires 3 arguments, but 1 was provided}}
15+
}
16+
17+
int test_too_many_args(bool p0, int t0, int f0, int g0) {
18+
return select<int>(p0, t0, f0, g0);
19+
// expected-error@-1 {{no matching function for call to 'select'}}
20+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires 3 arguments, but 4 were provided}}
21+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: requires 3 arguments, but 4 were provided}}
22+
}
23+
24+
int test_select_first_arg_wrong_type(vector<int,1> p0, int t0, int f0) {
25+
return select(p0, t0, f0);
26+
// expected-error@-1 {{no matching function for call to 'select'}}
27+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: no known conversion from 'vector<int, 1>' (vector of 1 'int' value) to 'bool' for 1st argument}}
28+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate template ignored: could not match 'vector<T, Sz>' against 'int'}}
29+
}
30+
31+
vector<int,1> test_select_bool_vals_diff_vecs(bool p0, vector<int,1> t0, vector<int,2> f0) {
32+
return select<vector<int,1> >(p0, t0, f0);
33+
// expected-warning@-1 {{implicit conversion truncates vector: 'vector<int, 2>' (vector of 2 'int' values) to 'vector<int, 1>' (vector of 1 'int' value)}}
34+
}
35+
36+
vector<int,2> test_select_vector_vals_not_vecs(vector<bool,2> p0, int t0, int f0) {
37+
return select(p0, t0, f0);
38+
// expected-error@-1 {{no matching function for call to 'select'}}
39+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate template ignored: could not match 'vector<T, Sz>' against 'int'}}
40+
// expected-note@hlsl/hlsl_intrinsics.h:* {{candidate function template not viable: no known conversion from 'vector<bool, 2>' (vector of 2 'bool' values) to 'bool' for 1st argument}}
41+
}
42+
43+
vector<int,1> test_select_vector_vals_wrong_size(vector<bool,2> p0, vector<int,1> t0, vector<int,2> f0) {
44+
return select<int,1>(p0, t0, f0); // produce warnings
45+
// expected-warning@-1 {{implicit conversion truncates vector: 'vector<bool, 2>' (vector of 2 'bool' values) to 'vector<bool, 1>' (vector of 1 'bool' value)}}
46+
// expected-warning@-2 {{implicit conversion truncates vector: 'vector<int, 2>' (vector of 2 'int' values) to 'vector<int, 1>' (vector of 1 'int' value)}}
47+
}
48+
49+
// __builtin_hlsl_select tests
50+
int test_select_builtin_wrong_arg_count(bool p0, int t0) {
51+
return __builtin_hlsl_select(p0, t0);
52+
// expected-error@-1 {{too few arguments to function call, expected 3, have 2}}
53+
}
54+
55+
// not a bool or a vector of bool. should be 2 errors.
56+
int test_select_builtin_first_arg_wrong_type1(int p0, int t0, int f0) {
57+
return __builtin_hlsl_select(p0, t0, f0);
58+
// expected-error@-1 {{passing 'int' to parameter of incompatible type 'bool'}}
59+
// expected-error@-2 {{First argument to __builtin_hlsl_select must be of vector type}}
60+
}
61+
62+
int test_select_builtin_first_arg_wrong_type2(vector<int,1> p0, int t0, int f0) {
63+
return __builtin_hlsl_select(p0, t0, f0);
64+
// expected-error@-1 {{passing 'vector<int, 1>' (vector of 1 'int' value) to parameter of incompatible type 'bool'}}
65+
// expected-error@-2 {{First argument to __builtin_hlsl_select must be of vector type}}
66+
}
67+
68+
// if a bool last 2 args are of same type
69+
int test_select_builtin_bool_incompatible_args(bool p0, int t0, double f0) {
70+
return __builtin_hlsl_select(p0, t0, f0);
71+
// expected-error@-1 {{arguments are of different types ('int' vs 'double')}}
72+
}
73+
74+
// if a vector second arg isnt a vector
75+
vector<int,2> test_select_builtin_second_arg_not_vector(vector<bool,2> p0, int t0, vector<int,2> f0) {
76+
return __builtin_hlsl_select(p0, t0, f0);
77+
// expected-error@-1 {{Second argument to __builtin_hlsl_select must be of vector type}}
78+
}
79+
80+
// if a vector third arg isn't a vector
81+
vector<int,2> test_select_builtin_second_arg_not_vector(vector<bool,2> p0, vector<int,2> t0, int f0) {
82+
return __builtin_hlsl_select(p0, t0, f0);
83+
// expected-error@-1 {{Third argument to __builtin_hlsl_select must be of vector type}}
84+
}
85+
86+
// if vector last 2 aren't same type (so both are vectors but wrong type)
87+
vector<int,2> test_select_builtin_diff_types(vector<bool,1> p0, vector<int,1> t0, vector<float,1> f0) {
88+
return __builtin_hlsl_select(p0, t0, f0);
89+
// expected-error@-1 {{arguments are of different types ('vector<int, [...]>' vs 'vector<float, [...]>')}}
90+
}

0 commit comments

Comments
 (0)