Skip to content

Commit defe43b

Browse files
authored
Add unsigned integer overloads for abs (llvm#128257)
This seems silly, but DXC supports unsigned integer versions of abs that are just no-ops. This adds the overloads for source compatability because apparently users actually use them... Fixes llvm#128249
1 parent 2c1df22 commit defe43b

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ int16_t3 abs(int16_t3);
5858
_HLSL_AVAILABILITY(shadermodel, 6.2)
5959
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
6060
int16_t4 abs(int16_t4);
61+
62+
_HLSL_AVAILABILITY(shadermodel, 6.2)
63+
constexpr uint16_t abs(uint16_t V) { return V; }
64+
_HLSL_AVAILABILITY(shadermodel, 6.2)
65+
constexpr uint16_t2 abs(uint16_t2 V) { return V; }
66+
_HLSL_AVAILABILITY(shadermodel, 6.2)
67+
constexpr uint16_t3 abs(uint16_t3 V) { return V; }
68+
_HLSL_AVAILABILITY(shadermodel, 6.2)
69+
constexpr uint16_t4 abs(uint16_t4 V) { return V; }
6170
#endif
6271

6372
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2)
@@ -82,6 +91,11 @@ int3 abs(int3);
8291
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
8392
int4 abs(int4);
8493

94+
constexpr uint abs(uint V) { return V; }
95+
constexpr uint2 abs(uint2 V) { return V; }
96+
constexpr uint3 abs(uint3 V) { return V; }
97+
constexpr uint4 abs(uint4 V) { return V; }
98+
8599
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
86100
float abs(float);
87101
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
@@ -100,6 +114,11 @@ int64_t3 abs(int64_t3);
100114
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
101115
int64_t4 abs(int64_t4);
102116

117+
constexpr uint64_t abs(uint64_t V) { return V; }
118+
constexpr uint64_t2 abs(uint64_t2 V) { return V; }
119+
constexpr uint64_t3 abs(uint64_t3 V) { return V; }
120+
constexpr uint64_t4 abs(uint64_t4 V) { return V; }
121+
103122
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)
104123
double abs(double);
105124
_HLSL_BUILTIN_ALIAS(__builtin_elementwise_abs)

clang/test/CodeGenHLSL/builtins/abs.hlsl

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,34 @@ int16_t3 test_abs_int16_t3(int16_t3 p0) { return abs(p0); }
2020
// NATIVE_HALF-LABEL: define noundef <4 x i16> @_Z17test_abs_int16_t4
2121
// NATIVE_HALF: call <4 x i16> @llvm.abs.v4i16(
2222
int16_t4 test_abs_int16_t4(int16_t4 p0) { return abs(p0); }
23+
24+
// NATIVE_HALF-LABEL: define {{.*}}hlsl3abs{{.*}}(i16
25+
// NATIVE_HALF: [[Alloca:%.*]] = alloca i16
26+
// NATIVE_HALF-NEXT: store i16 {{%.*}}, ptr [[Alloca]]
27+
// NATIVE_HALF-NEXT: [[Val:%.*]] = load i16, ptr [[Alloca]]
28+
// NATIVE_HALF-NEXT: ret i16 [[Val]]
29+
uint16_t test_abs_uint64_t(uint16_t p0) { return abs(p0); }
30+
31+
// NATIVE_HALF-LABEL: define {{.*}}hlsl3abs{{.*}}(<2 x i16
32+
// NATIVE_HALF: [[Alloca:%.*]] = alloca <2 x i16>
33+
// NATIVE_HALF-NEXT: store <2 x i16> {{%.*}}, ptr [[Alloca]]
34+
// NATIVE_HALF-NEXT: [[Val:%.*]] = load <2 x i16>, ptr [[Alloca]]
35+
// NATIVE_HALF-NEXT: ret <2 x i16> [[Val]]
36+
uint16_t2 test_abs_uint64_t2(uint16_t2 p0) { return abs(p0); }
37+
38+
// NATIVE_HALF-LABEL: define {{.*}}hlsl3abs{{.*}}(<3 x i16
39+
// NATIVE_HALF: [[Alloca:%.*]] = alloca <3 x i16>
40+
// NATIVE_HALF-NEXT: store <3 x i16> {{%.*}}, ptr [[Alloca]]
41+
// NATIVE_HALF-NEXT: [[Val:%.*]] = load <3 x i16>, ptr [[Alloca]]
42+
// NATIVE_HALF-NEXT: ret <3 x i16> [[Val]]
43+
uint16_t3 test_abs_uint64_t3(uint16_t3 p0) { return abs(p0); }
44+
45+
// NATIVE_HALF-LABEL: define {{.*}}hlsl3abs{{.*}}(<4 x i16
46+
// NATIVE_HALF: [[Alloca:%.*]] = alloca <4 x i16>
47+
// NATIVE_HALF-NEXT: store <4 x i16> {{%.*}}, ptr [[Alloca]]
48+
// NATIVE_HALF-NEXT: [[Val:%.*]] = load <4 x i16>, ptr [[Alloca]]
49+
// NATIVE_HALF-NEXT: ret <4 x i16> [[Val]]
50+
uint16_t4 test_abs_uint64_t4(uint16_t4 p0) { return abs(p0); }
2351
#endif // __HLSL_ENABLE_16_BIT
2452

2553
// NATIVE_HALF-LABEL: define noundef nofpclass(nan inf) half @_Z13test_abs_half
@@ -94,3 +122,60 @@ double3 test_abs_double3(double3 p0) { return abs(p0); }
94122
// CHECK-LABEL: define noundef nofpclass(nan inf) <4 x double> @_Z16test_abs_double4
95123
// CHECK: call reassoc nnan ninf nsz arcp afn <4 x double> @llvm.fabs.v4f64(
96124
double4 test_abs_double4(double4 p0) { return abs(p0); }
125+
126+
127+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(i32
128+
// CHECK: [[Alloca:%.*]] = alloca i32
129+
// CHECK-NEXT: store i32 {{%.*}}, ptr [[Alloca]]
130+
// CHECK-NEXT: [[Val:%.*]] = load i32, ptr [[Alloca]]
131+
// CHECK-NEXT: ret i32 [[Val]]
132+
uint test_abs_uint(uint p0) { return abs(p0); }
133+
134+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(<2 x i32
135+
// CHECK: [[Alloca:%.*]] = alloca <2 x i32>
136+
// CHECK-NEXT: store <2 x i32> {{%.*}}, ptr [[Alloca]]
137+
// CHECK-NEXT: [[Val:%.*]] = load <2 x i32>, ptr [[Alloca]]
138+
// CHECK-NEXT: ret <2 x i32> [[Val]]
139+
uint2 test_abs_uint2(uint2 p0) { return abs(p0); }
140+
141+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(<3 x i32
142+
// CHECK: [[Alloca:%.*]] = alloca <3 x i32>
143+
// CHECK-NEXT: store <3 x i32> {{%.*}}, ptr [[Alloca]]
144+
// CHECK-NEXT: [[Val:%.*]] = load <3 x i32>, ptr [[Alloca]]
145+
// CHECK-NEXT: ret <3 x i32> [[Val]]
146+
uint3 test_abs_uint3(uint3 p0) { return abs(p0); }
147+
148+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(<4 x i32
149+
// CHECK: [[Alloca:%.*]] = alloca <4 x i32>
150+
// CHECK-NEXT: store <4 x i32> {{%.*}}, ptr [[Alloca]]
151+
// CHECK-NEXT: [[Val:%.*]] = load <4 x i32>, ptr [[Alloca]]
152+
// CHECK-NEXT: ret <4 x i32> [[Val]]
153+
uint4 test_abs_uint4(uint4 p0) { return abs(p0); }
154+
155+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(i64
156+
// CHECK: [[Alloca:%.*]] = alloca i64
157+
// CHECK-NEXT: store i64 {{%.*}}, ptr [[Alloca]]
158+
// CHECK-NEXT: [[Val:%.*]] = load i64, ptr [[Alloca]]
159+
// CHECK-NEXT: ret i64 [[Val]]
160+
uint64_t test_abs_uint64_t(uint64_t p0) { return abs(p0); }
161+
162+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(<2 x i64
163+
// CHECK: [[Alloca:%.*]] = alloca <2 x i64>
164+
// CHECK-NEXT: store <2 x i64> {{%.*}}, ptr [[Alloca]]
165+
// CHECK-NEXT: [[Val:%.*]] = load <2 x i64>, ptr [[Alloca]]
166+
// CHECK-NEXT: ret <2 x i64> [[Val]]
167+
uint64_t2 test_abs_uint64_t2(uint64_t2 p0) { return abs(p0); }
168+
169+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(<3 x i64
170+
// CHECK: [[Alloca:%.*]] = alloca <3 x i64>
171+
// CHECK-NEXT: store <3 x i64> {{%.*}}, ptr [[Alloca]]
172+
// CHECK-NEXT: [[Val:%.*]] = load <3 x i64>, ptr [[Alloca]]
173+
// CHECK-NEXT: ret <3 x i64> [[Val]]
174+
uint64_t3 test_abs_uint64_t3(uint64_t3 p0) { return abs(p0); }
175+
176+
// CHECK-LABEL: define {{.*}}hlsl3abs{{.*}}(<4 x i64
177+
// CHECK: [[Alloca:%.*]] = alloca <4 x i64>
178+
// CHECK-NEXT: store <4 x i64> {{%.*}}, ptr [[Alloca]]
179+
// CHECK-NEXT: [[Val:%.*]] = load <4 x i64>, ptr [[Alloca]]
180+
// CHECK-NEXT: ret <4 x i64> [[Val]]
181+
uint64_t4 test_abs_uint64_t4(uint64_t4 p0) { return abs(p0); }

0 commit comments

Comments
 (0)