Skip to content

Commit 32f1015

Browse files
committed
review comments:
- remove use of arbitrary type template to match the `gen_intrin_main` definition of any scalar or vector with a valid component type of bool and numeric types - correct type check to not allow a vector of ints
1 parent 5a2c594 commit 32f1015

File tree

4 files changed

+84
-6
lines changed

4 files changed

+84
-6
lines changed

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2015,12 +2015,85 @@ _HLSL_AVAILABILITY(shadermodel, 6.0)
20152015
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_is_first_lane)
20162016
__attribute__((convergent)) bool WaveIsFirstLane();
20172017

2018+
//===----------------------------------------------------------------------===//
2019+
// WaveReadLaneAt builtins
2020+
//===----------------------------------------------------------------------===//
2021+
20182022
// \brief Returns the value of the expression for the given lane index within
20192023
// the specified wave.
2020-
template <typename T>
2024+
2025+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2026+
__attribute__((convergent)) bool WaveReadLaneAt(bool, int32_t);
2027+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2028+
__attribute__((convergent)) bool2 WaveReadLaneAt(bool2, int32_t);
2029+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2030+
__attribute__((convergent)) bool3 WaveReadLaneAt(bool3, int32_t);
2031+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2032+
__attribute__((convergent)) bool4 WaveReadLaneAt(bool4, int32_t);
2033+
2034+
#ifdef __HLSL_ENABLE_16_BIT
20212035
_HLSL_AVAILABILITY(shadermodel, 6.0)
20222036
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2023-
__attribute__((convergent)) T WaveReadLaneAt(T, int32_t);
2037+
__attribute__((convergent)) int16_t WaveReadLaneAt(int16_t, int32_t);
2038+
_HLSL_AVAILABILITY(shadermodel, 6.0)
2039+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2040+
__attribute__((convergent)) int16_t2 WaveReadLaneAt(int16_t2, int32_t);
2041+
_HLSL_AVAILABILITY(shadermodel, 6.0)
2042+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2043+
__attribute__((convergent)) int16_t3 WaveReadLaneAt(int16_t3, int32_t);
2044+
_HLSL_AVAILABILITY(shadermodel, 6.0)
2045+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2046+
__attribute__((convergent)) int16_t4 WaveReadLaneAt(int16_t4, int32_t);
2047+
#endif
2048+
2049+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.0)
2050+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2051+
__attribute__((convergent)) half WaveReadLaneAt(half, int32_t);
2052+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.0)
2053+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2054+
__attribute__((convergent)) half2 WaveReadLaneAt(half2, int32_t);
2055+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.0)
2056+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2057+
__attribute__((convergent)) half3 WaveReadLaneAt(half3, int32_t);
2058+
_HLSL_16BIT_AVAILABILITY(shadermodel, 6.0)
2059+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2060+
__attribute__((convergent)) half4 WaveReadLaneAt(half4, int32_t);
2061+
2062+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2063+
__attribute__((convergent)) int WaveReadLaneAt(int, int32_t);
2064+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2065+
__attribute__((convergent)) int2 WaveReadLaneAt(int2, int32_t);
2066+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2067+
__attribute__((convergent)) int3 WaveReadLaneAt(int3, int32_t);
2068+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2069+
__attribute__((convergent)) int4 WaveReadLaneAt(int4, int32_t);
2070+
2071+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2072+
__attribute__((convergent)) float WaveReadLaneAt(float, int32_t);
2073+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2074+
__attribute__((convergent)) float2 WaveReadLaneAt(float2, int32_t);
2075+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2076+
__attribute__((convergent)) float3 WaveReadLaneAt(float3, int32_t);
2077+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2078+
__attribute__((convergent)) float4 WaveReadLaneAt(float4, int32_t);
2079+
2080+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2081+
__attribute__((convergent)) int64_t WaveReadLaneAt(int64_t, int32_t);
2082+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2083+
__attribute__((convergent)) int64_t2 WaveReadLaneAt(int64_t2, int32_t);
2084+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2085+
__attribute__((convergent)) int64_t3 WaveReadLaneAt(int64_t3, int32_t);
2086+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2087+
__attribute__((convergent)) int64_t4 WaveReadLaneAt(int64_t4, int32_t);
2088+
2089+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2090+
__attribute__((convergent)) double WaveReadLaneAt(double, int32_t);
2091+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2092+
__attribute__((convergent)) double2 WaveReadLaneAt(double2, int32_t);
2093+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2094+
__attribute__((convergent)) double3 WaveReadLaneAt(double3, int32_t);
2095+
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_read_lane_at)
2096+
__attribute__((convergent)) double4 WaveReadLaneAt(double4, int32_t);
20242097

20252098
//===----------------------------------------------------------------------===//
20262099
// sign builtins

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1963,7 +1963,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
19631963
// Ensure index parameter type can be interpreted as a uint
19641964
ExprResult Index = TheCall->getArg(1);
19651965
QualType ArgTyIndex = Index.get()->getType();
1966-
if (!ArgTyIndex->hasIntegerRepresentation()) {
1966+
if (!ArgTyIndex->isIntegerType()) {
19671967
SemaRef.Diag(TheCall->getArg(1)->getBeginLoc(),
19681968
diag::err_typecheck_convert_incompatible)
19691969
<< ArgTyIndex << SemaRef.Context.UnsignedIntTy << 1 << 0 << 0;

clang/test/SemaHLSL/BuiltIns/WaveReadLaneAt-errors.hlsl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ float3 test_index_type_check(float3 p0, double idx) {
1919
return __builtin_hlsl_wave_read_lane_at(p0, idx);
2020
// expected-error@-1 {{passing 'double' to parameter of incompatible type 'unsigned int'}}
2121
}
22+
23+
float3 test_index_type_check(float3 p0, int3 idxs) {
24+
return __builtin_hlsl_wave_read_lane_at(p0, idxs);
25+
// expected-error@-1 {{passing 'int3' (aka 'vector<int, 3>') to parameter of incompatible type 'unsigned int'}}
26+
}

llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveReadLaneAt.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ entry:
2424
ret void
2525
}
2626

27-
declare float @__hlsl_waveReadLaneAt.f32(float, i32)
28-
declare i32 @__hlsl_waveReadLaneAt.i32(i32, i32)
29-
declare <4 x i1> @__hlsl_waveReadLaneAt.v4i1(<4 x i1>, i32)
27+
declare float @llvm.spv.waveReadLaneAt.f32(float, i32)
28+
declare i32 @llvm.spv.waveReadLaneAt.i32(i32, i32)
29+
declare <4 x i1> @llvm.spv.waveReadLaneAt.v4i1(<4 x i1>, i32)

0 commit comments

Comments
 (0)