Skip to content

Commit 4d45412

Browse files
committed
remove Macros implementing overloads for min and max. Implement overloads using templates instead. Add new tests.
1 parent af5abd9 commit 4d45412

File tree

6 files changed

+119
-39
lines changed

6 files changed

+119
-39
lines changed

clang/lib/Headers/hlsl/hlsl_alias_intrinsics.h

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,6 @@ namespace hlsl {
3535
#define _HLSL_16BIT_AVAILABILITY_STAGE(environment, version, stage)
3636
#endif
3737

38-
#define GEN_VEC_SCALAR_OVERLOADS(FUNC_NAME, BASE_TYPE, AVAIL) \
39-
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##2, AVAIL) \
40-
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##3, AVAIL) \
41-
GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, BASE_TYPE##4, AVAIL)
42-
43-
#define GEN_BOTH_OVERLOADS(FUNC_NAME, BASE_TYPE, VECTOR_TYPE, AVAIL) \
44-
IF_TRUE_##AVAIL( \
45-
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
46-
FUNC_NAME(VECTOR_TYPE p0, BASE_TYPE p1) { \
47-
return __builtin_elementwise_##FUNC_NAME(p0, (VECTOR_TYPE)p1); \
48-
} \
49-
IF_TRUE_##AVAIL( \
50-
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)) constexpr VECTOR_TYPE \
51-
FUNC_NAME(BASE_TYPE p0, VECTOR_TYPE p1) { \
52-
return __builtin_elementwise_##FUNC_NAME((VECTOR_TYPE)p0, p1); \
53-
}
54-
55-
#define IF_TRUE_0(EXPR)
56-
#define IF_TRUE_1(EXPR) EXPR
57-
5838
//===----------------------------------------------------------------------===//
5939
// abs builtins
6040
//===----------------------------------------------------------------------===//
@@ -1563,7 +1543,6 @@ half3 max(half3, half3);
15631543
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
15641544
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15651545
half4 max(half4, half4);
1566-
GEN_VEC_SCALAR_OVERLOADS(max, half, 1)
15671546

15681547
#ifdef __HLSL_ENABLE_16_BIT
15691548
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1578,7 +1557,6 @@ int16_t3 max(int16_t3, int16_t3);
15781557
_HLSL_AVAILABILITY(shadermodel, 6.2)
15791558
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15801559
int16_t4 max(int16_t4, int16_t4);
1581-
GEN_VEC_SCALAR_OVERLOADS(max, int16_t, 1)
15821560

15831561
_HLSL_AVAILABILITY(shadermodel, 6.2)
15841562
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1592,7 +1570,6 @@ uint16_t3 max(uint16_t3, uint16_t3);
15921570
_HLSL_AVAILABILITY(shadermodel, 6.2)
15931571
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
15941572
uint16_t4 max(uint16_t4, uint16_t4);
1595-
GEN_VEC_SCALAR_OVERLOADS(max, uint16_t, 1)
15961573
#endif
15971574

15981575
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
@@ -1603,7 +1580,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16031580
int3 max(int3, int3);
16041581
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16051582
int4 max(int4, int4);
1606-
GEN_VEC_SCALAR_OVERLOADS(max, int, 0)
16071583

16081584
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16091585
uint max(uint, uint);
@@ -1613,7 +1589,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16131589
uint3 max(uint3, uint3);
16141590
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16151591
uint4 max(uint4, uint4);
1616-
GEN_VEC_SCALAR_OVERLOADS(max, uint, 0)
16171592

16181593
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16191594
int64_t max(int64_t, int64_t);
@@ -1623,7 +1598,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16231598
int64_t3 max(int64_t3, int64_t3);
16241599
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16251600
int64_t4 max(int64_t4, int64_t4);
1626-
GEN_VEC_SCALAR_OVERLOADS(max, int64_t, 0)
16271601

16281602
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16291603
uint64_t max(uint64_t, uint64_t);
@@ -1633,7 +1607,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16331607
uint64_t3 max(uint64_t3, uint64_t3);
16341608
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16351609
uint64_t4 max(uint64_t4, uint64_t4);
1636-
GEN_VEC_SCALAR_OVERLOADS(max, uint64_t, 0)
16371610

16381611
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16391612
float max(float, float);
@@ -1643,7 +1616,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16431616
float3 max(float3, float3);
16441617
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16451618
float4 max(float4, float4);
1646-
GEN_VEC_SCALAR_OVERLOADS(max, float, 0)
16471619

16481620
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16491621
double max(double, double);
@@ -1653,7 +1625,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16531625
double3 max(double3, double3);
16541626
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_max)
16551627
double4 max(double4, double4);
1656-
GEN_VEC_SCALAR_OVERLOADS(max, double, 0)
16571628

16581629
//===----------------------------------------------------------------------===//
16591630
// min builtins
@@ -1676,7 +1647,6 @@ half3 min(half3, half3);
16761647
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
16771648
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
16781649
half4 min(half4, half4);
1679-
GEN_VEC_SCALAR_OVERLOADS(min, half, 1)
16801650

16811651
#ifdef __HLSL_ENABLE_16_BIT
16821652
_HLSL_AVAILABILITY(shadermodel, 6.2)
@@ -1691,7 +1661,6 @@ int16_t3 min(int16_t3, int16_t3);
16911661
_HLSL_AVAILABILITY(shadermodel, 6.2)
16921662
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
16931663
int16_t4 min(int16_t4, int16_t4);
1694-
GEN_VEC_SCALAR_OVERLOADS(min, int16_t, 1)
16951664

16961665
_HLSL_AVAILABILITY(shadermodel, 6.2)
16971666
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1705,7 +1674,6 @@ uint16_t3 min(uint16_t3, uint16_t3);
17051674
_HLSL_AVAILABILITY(shadermodel, 6.2)
17061675
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17071676
uint16_t4 min(uint16_t4, uint16_t4);
1708-
GEN_VEC_SCALAR_OVERLOADS(min, uint16_t, 1)
17091677
#endif
17101678

17111679
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
@@ -1716,7 +1684,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17161684
int3 min(int3, int3);
17171685
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17181686
int4 min(int4, int4);
1719-
GEN_VEC_SCALAR_OVERLOADS(min, int, 0)
17201687

17211688
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17221689
uint min(uint, uint);
@@ -1726,7 +1693,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17261693
uint3 min(uint3, uint3);
17271694
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17281695
uint4 min(uint4, uint4);
1729-
GEN_VEC_SCALAR_OVERLOADS(min, uint, 0)
17301696

17311697
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17321698
float min(float, float);
@@ -1736,7 +1702,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17361702
float3 min(float3, float3);
17371703
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17381704
float4 min(float4, float4);
1739-
GEN_VEC_SCALAR_OVERLOADS(min, float, 0)
17401705

17411706
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17421707
int64_t min(int64_t, int64_t);
@@ -1746,7 +1711,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17461711
int64_t3 min(int64_t3, int64_t3);
17471712
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17481713
int64_t4 min(int64_t4, int64_t4);
1749-
GEN_VEC_SCALAR_OVERLOADS(min, int64_t, 0)
17501714

17511715
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17521716
uint64_t min(uint64_t, uint64_t);
@@ -1756,7 +1720,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17561720
uint64_t3 min(uint64_t3, uint64_t3);
17571721
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17581722
uint64_t4 min(uint64_t4, uint64_t4);
1759-
GEN_VEC_SCALAR_OVERLOADS(min, uint64_t, 0)
17601723

17611724
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17621725
double min(double, double);
@@ -1766,7 +1729,6 @@ _HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17661729
double3 min(double3, double3);
17671730
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_min)
17681731
double4 min(double4, double4);
1769-
GEN_VEC_SCALAR_OVERLOADS(min, double, 0)
17701732

17711733
//===----------------------------------------------------------------------===//
17721734
// normalize builtins

clang/lib/Headers/hlsl/hlsl_compat_overloads.h

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--- hlsl_compat_overloads.h - Extra HLSL overloads for intrinsics --===//
1+
//===--- hlsl_compat_overloads.h - Extra HLSL overloads for intrinsics ----===//
22
//
33
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44
// See https://llvm.org/LICENSE.txt for license information.
@@ -54,5 +54,67 @@ clamp(U p0, V p1, W p2) {
5454
return clamp(p0, (U)p1, (U)p2);
5555
}
5656

57+
//===----------------------------------------------------------------------===//
58+
// max builtin overloads
59+
//===----------------------------------------------------------------------===//
60+
61+
template <typename T, typename U, uint N>
62+
constexpr __detail::enable_if_t<
63+
__detail::is_arithmetic<U>::Value && (N > 1 && N <= 4), vector<T, N>>
64+
max(vector<T, N> p0, U p1) {
65+
return max(p0, (vector<T, N>)p1);
66+
}
67+
68+
template <typename T, typename U, uint N>
69+
constexpr __detail::enable_if_t<
70+
__detail::is_arithmetic<U>::Value && (N > 1 && N <= 4), vector<T, N>>
71+
max(U p0, vector<T, N> p1) {
72+
return max((vector<T, N>)p0, p1);
73+
}
74+
75+
template <typename T, typename R, uint N>
76+
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
77+
max(vector<T, N> p0, vector<R, N> p1) {
78+
return max(p0, (vector<T, N>)p1);
79+
}
80+
81+
template <typename U, typename V>
82+
constexpr __detail::enable_if_t<
83+
__detail::is_arithmetic<U>::Value && __detail::is_arithmetic<V>::Value, U>
84+
max(U p0, V p1) {
85+
return max(p0, (U)p1);
86+
}
87+
88+
//===----------------------------------------------------------------------===//
89+
// min builtin overloads
90+
//===----------------------------------------------------------------------===//
91+
92+
template <typename T, typename U, uint N>
93+
constexpr __detail::enable_if_t<
94+
__detail::is_arithmetic<U>::Value && (N > 1 && N <= 4), vector<T, N>>
95+
min(vector<T, N> p0, U p1) {
96+
return min(p0, (vector<T, N>)p1);
97+
}
98+
99+
template <typename T, typename U, uint N>
100+
constexpr __detail::enable_if_t<
101+
__detail::is_arithmetic<U>::Value && (N > 1 && N <= 4), vector<T, N>>
102+
min(U p0, vector<T, N> p1) {
103+
return min((vector<T, N>)p0, p1);
104+
}
105+
106+
template <typename T, typename R, uint N>
107+
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
108+
min(vector<T, N> p0, vector<R, N> p1) {
109+
return min(p0, (vector<T, N>)p1);
110+
}
111+
112+
template <typename U, typename V>
113+
constexpr __detail::enable_if_t<
114+
__detail::is_arithmetic<U>::Value && __detail::is_arithmetic<V>::Value, U>
115+
min(U p0, V p1) {
116+
return min(p0, (U)p1);
117+
}
118+
57119
} // namespace hlsl
58120
#endif // _HLSL_COMPAT_OVERLOADS_H_

clang/test/CodeGenHLSL/builtins/max.hlsl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,19 @@ double4 test_max_double4_mismatch(double4 p0, double p1) { return max(p0, p1); }
163163
// CHECK-LABEL: define noundef nofpclass(nan inf) <4 x double> {{.*}}test_max_double4_mismatch2
164164
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x double> @llvm.maxnum.v4f64
165165
double4 test_max_double4_mismatch2(double4 p0, double p1) { return max(p1, p0); }
166+
167+
// CHECK-LABEL: define noundef <2 x i32> {{.*}}test_overloads1
168+
// CHECK: call <2 x i32> @llvm.smax.v2i32
169+
int2 test_overloads1(int2 p0, float p1) { return max(p0, p1); }
170+
171+
// CHECK-LABEL: define noundef <2 x i32> {{.*}}test_overloads2
172+
// CHECK: call <2 x i32> @llvm.smax.v2i32
173+
int2 test_overloads2(int2 p0, float p1) { return max(p1, p0); }
174+
175+
// CHECK-LABEL: define noundef nofpclass(nan inf) <3 x float> {{.*}}test_overloads3
176+
// CHECK: call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.maxnum.v3f32
177+
float3 test_overloads3(float3 p0, int3 p1) { return max(p0, p1); }
178+
179+
// CHECK-LABEL: define noundef nofpclass(nan inf) double {{.*}}test_overloads4
180+
// CHECK: call reassoc nnan ninf nsz arcp afn double @llvm.maxnum.f64(
181+
double test_overloads4(double p0, int p1) { return max(p0, p1); }

clang/test/CodeGenHLSL/builtins/min.hlsl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,19 @@ double4 test_min_double4_mismatch(double4 p0, double p1) { return min(p0, p1); }
163163
// CHECK-LABEL: define noundef nofpclass(nan inf) <4 x double> {{.*}}test_min_double4_mismatch2
164164
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x double> @llvm.minnum.v4f64
165165
double4 test_min_double4_mismatch2(double4 p0, double p1) { return min(p1, p0); }
166+
167+
// CHECK-LABEL: define noundef <2 x i32> {{.*}}test_overloads1
168+
// CHECK: call <2 x i32> @llvm.smin.v2i32
169+
int2 test_overloads1(int2 p0, float p1) { return min(p0, p1); }
170+
171+
// CHECK-LABEL: define noundef <2 x i32> {{.*}}test_overloads2
172+
// CHECK: call <2 x i32> @llvm.smin.v2i32
173+
int2 test_overloads2(int2 p0, float p1) { return min(p1, p0); }
174+
175+
// CHECK-LABEL: define noundef nofpclass(nan inf) <3 x float> {{.*}}test_overloads3
176+
// CHECK: call reassoc nnan ninf nsz arcp afn <3 x float> @llvm.minnum.v3f32
177+
float3 test_overloads3(float3 p0, int3 p1) { return min(p0, p1); }
178+
179+
// CHECK-LABEL: define noundef nofpclass(nan inf) double {{.*}}test_overloads4
180+
// CHECK: call reassoc nnan ninf nsz arcp afn double @llvm.minnum.f64(
181+
double test_overloads4(double p0, int p1) { return min(p0, p1); }
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=half
2+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=half3
3+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=int16_t
4+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=int16_t3
5+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=uint16_t
6+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=uint16_t3
7+
8+
// check we error on 16 bit type if shader model is too old
9+
// CHECK: '-enable-16bit-types' option requires target HLSL Version >= 2018 and shader model >= 6.2, but HLSL Version is 'hlsl202x' and shader model is '6.0'
10+
TEST_TYPE test_error(TEST_TYPE p0, int p1) {
11+
return max(p0, p1);
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=half
2+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=half3
3+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=int16_t
4+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=int16_t3
5+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=uint16_t
6+
// RUN: not %clang_dxc -enable-16bit-types -T cs_6_0 -HV 202x %s 2>&1 | FileCheck %s -DTEST_TYPE=uint16_t3
7+
8+
// check we error on 16 bit type if shader model is too old
9+
// CHECK: '-enable-16bit-types' option requires target HLSL Version >= 2018 and shader model >= 6.2, but HLSL Version is 'hlsl202x' and shader model is '6.0'
10+
TEST_TYPE test_error(TEST_TYPE p0, int p1) {
11+
return min(p0, p1);
12+
}

0 commit comments

Comments
 (0)