[clang] [clang][HLSL] Add radians intrinsic (PR #110802)
https://github.com/adam-yang created https://github.com/llvm/llvm-project/pull/110802 partially fixes #99151 ### Changes * Implemented `radians` clang builtin * Linked `radians` clang builtin with `hlsl_intrinsics.h` * Added sema checks for `radians` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp` * Add codegen for `radians` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp` * Add codegen tests to `clang/test/CodeGenHLSL/builtins/radians.hlsl` * Add sema tests to `clang/test/SemaHLSL/BuiltIns/radians-errors.hlsl` ### Related PRs * [[DXIL] Add radians intrinsic #110616](https://github.com/llvm/llvm-project/pull/110616) * [[SPIRV] Add radians intrinsic #110800](https://github.com/llvm/llvm-project/pull/110800) >From be88a591ed220714b21b73e34406bfcdb866ac17 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Wed, 2 Oct 2024 01:21:19 -0700 Subject: [PATCH] Added radians to clang --- clang/include/clang/Basic/Builtins.td | 6 +++ clang/lib/CodeGen/CGBuiltin.cpp | 8 +++ clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 30 +++ clang/lib/Sema/SemaHLSL.cpp | 1 + clang/test/CodeGenHLSL/builtins/radians.hlsl | 54 +++ .../SemaHLSL/BuiltIns/radians-errors.hlsl | 27 ++ 7 files changed, 127 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/radians.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/radians-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 8090119e512fbb..09b130e0def0d7 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4788,6 +4788,12 @@ def HLSLStep: LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLRadians : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_radians"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index d739597de4c855..6c24c66a81e73c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18852,6 +18852,14 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { retType, CGM.getHLSLRuntime().getSignIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.sign"); } + case Builtin::BI__builtin_hlsl_elementwise_radians: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("radians operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType=*/Op0->getType(), CGM.getHLSLRuntime().getRadiansIntrinsic(), +ArrayRef{Op0}, nullptr, "hlsl.radians"); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index a8aabca7348ffb..c807a3216ec9ee 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -82,6 +82,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(Saturate, saturate) GENERATE_HLSL_INTRINSIC_FUNCTION(Sign, sign) GENERATE_HLSL_INTRINSIC_FUNCTION(Step, step) + GENERATE_HLSL_INTRINSIC_FUNCTION(Radians, radians) GENERATE_HLSL_INTRINSIC_FUNCTION(ThreadId, thread_id) GENERATE_HLSL_INTRINSIC_FUNCTION(FDot, fdot) GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 810a16d75f0228..81b297723da3f5 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2086,5 +2086,35 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int3 sign(double3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int4 sign(double4); + +//===--===// +// radians builtins +//===--===// + +/// \fn T radians(T Val) +/// \brief Converts the specified value from degrees to radians. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half radians(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half2 radians(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half3 radians(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half4 radians(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float radians(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float2 radians(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float3 radians(float3); +_HLSL_BUILTIN_ALIAS(__builtin
[clang] [clang][HLSL] Add radians intrinsic (PR #111883)
https://github.com/adam-yang created https://github.com/llvm/llvm-project/pull/111883 partially fixes #70103 ### Changes * Implemented `GroupMemoryBarrierWithGroupSync` clang builtin * Linked `GroupMemoryBarrierWithGroupSync` clang builtin with `hlsl_intrinsics.h` * Added sema checks for `GroupMemoryBarrierWithGroupSync` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp` * Add codegen for `GroupMemoryBarrierWithGroupSync` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp` * Add codegen tests to `clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl` * Add sema tests to `clang/test/SemaHLSL/BuiltIns/GroupMemoryBarrierWithGroupSync-errors.hlsl` ### Related PRs >From 0f97b92617dcadd78362f24f3ef0719c19f6f3f6 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Thu, 10 Oct 2024 10:20:37 -0700 Subject: [PATCH 1/2] Added the intrinsic to clang --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 4 clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 12 ++ clang/lib/Sema/SemaHLSL.cpp | 5 + ...roupMemoryBarrierWithGroupSync-errors.hlsl | 6 + .../GroupMemoryBarrierWithGroupSync.hlsl | 22 +++ 7 files changed, 56 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 9ebee81fcb0d3d..96fea17badfe9e 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4830,6 +4830,12 @@ def HLSLRadians : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_group_memory_barrier_with_group_sync"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 57705f2d2d0423..45890019ee2a64 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18901,6 +18901,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { CGM.getHLSLRuntime().getRadiansIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.radians"); } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +Intrinsic::ID ID = CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic(); +return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 05ff325216f55b..1e095cedf58731 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -89,6 +89,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) GENERATE_HLSL_INTRINSIC_FUNCTION(UDot, udot) GENERATE_HLSL_INTRINSIC_FUNCTION(WaveIsFirstLane, wave_is_first_lane) + GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, groupMemoryBarrierWithGroupSync) //===--===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index f39a68ba847e98..637df8924e2468 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2168,5 +2168,17 @@ float3 radians(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) float4 radians(float4); +//===--===// +// GroupMemoryBarrierWithGroupSync builtins +//===--===// + +/// \fn void GroupMemoryBarrierWithGroupSync(void) +/// \brief Blocks execution of all threads in a group until all group shared +/// accesses have been completed and all threads in the group have reached this +/// call. + +_HLSL_BUILTIN_ALIAS(__builtin_group_memory_barrier_with_group_sync) +void GroupMemoryBarrierWithGroupSync(void); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d2d2df829e7b11..30480f8f57c12d 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2018,6 +2018,11 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) + return true; +break; + } } return false; } diff --git a/clang/test/CodeGenHLSL/buil
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang ready_for_review https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/111883 >From 0f97b92617dcadd78362f24f3ef0719c19f6f3f6 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Thu, 10 Oct 2024 10:20:37 -0700 Subject: [PATCH 1/3] Added the intrinsic to clang --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 4 clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 12 ++ clang/lib/Sema/SemaHLSL.cpp | 5 + ...roupMemoryBarrierWithGroupSync-errors.hlsl | 6 + .../GroupMemoryBarrierWithGroupSync.hlsl | 22 +++ 7 files changed, 56 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 9ebee81fcb0d3d..96fea17badfe9e 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4830,6 +4830,12 @@ def HLSLRadians : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_group_memory_barrier_with_group_sync"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 57705f2d2d0423..45890019ee2a64 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18901,6 +18901,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { CGM.getHLSLRuntime().getRadiansIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.radians"); } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +Intrinsic::ID ID = CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic(); +return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 05ff325216f55b..1e095cedf58731 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -89,6 +89,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) GENERATE_HLSL_INTRINSIC_FUNCTION(UDot, udot) GENERATE_HLSL_INTRINSIC_FUNCTION(WaveIsFirstLane, wave_is_first_lane) + GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, groupMemoryBarrierWithGroupSync) //===--===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index f39a68ba847e98..637df8924e2468 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2168,5 +2168,17 @@ float3 radians(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) float4 radians(float4); +//===--===// +// GroupMemoryBarrierWithGroupSync builtins +//===--===// + +/// \fn void GroupMemoryBarrierWithGroupSync(void) +/// \brief Blocks execution of all threads in a group until all group shared +/// accesses have been completed and all threads in the group have reached this +/// call. + +_HLSL_BUILTIN_ALIAS(__builtin_group_memory_barrier_with_group_sync) +void GroupMemoryBarrierWithGroupSync(void); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d2d2df829e7b11..30480f8f57c12d 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2018,6 +2018,11 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) + return true; +break; + } } return false; } diff --git a/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl new file mode 100644 index 00..9ffc1ebce1c909 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected + +void test_too_many_arg() { + __builtin_group_memory_barrier_with_group_sync(0); + // expected-error@-1 {{too many argume
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add radians intrinsic (PR #110802)
https://github.com/adam-yang ready_for_review https://github.com/llvm/llvm-project/pull/110802 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add radians intrinsic (PR #110802)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/110802 >From be88a591ed220714b21b73e34406bfcdb866ac17 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Wed, 2 Oct 2024 01:21:19 -0700 Subject: [PATCH 1/2] Added radians to clang --- clang/include/clang/Basic/Builtins.td | 6 +++ clang/lib/CodeGen/CGBuiltin.cpp | 8 +++ clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 30 +++ clang/lib/Sema/SemaHLSL.cpp | 1 + clang/test/CodeGenHLSL/builtins/radians.hlsl | 54 +++ .../SemaHLSL/BuiltIns/radians-errors.hlsl | 27 ++ 7 files changed, 127 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/radians.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/radians-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 8090119e512fbb..09b130e0def0d7 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4788,6 +4788,12 @@ def HLSLStep: LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLRadians : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_radians"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index d739597de4c855..6c24c66a81e73c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18852,6 +18852,14 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { retType, CGM.getHLSLRuntime().getSignIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.sign"); } + case Builtin::BI__builtin_hlsl_elementwise_radians: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("radians operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType=*/Op0->getType(), CGM.getHLSLRuntime().getRadiansIntrinsic(), +ArrayRef{Op0}, nullptr, "hlsl.radians"); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index a8aabca7348ffb..c807a3216ec9ee 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -82,6 +82,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(Saturate, saturate) GENERATE_HLSL_INTRINSIC_FUNCTION(Sign, sign) GENERATE_HLSL_INTRINSIC_FUNCTION(Step, step) + GENERATE_HLSL_INTRINSIC_FUNCTION(Radians, radians) GENERATE_HLSL_INTRINSIC_FUNCTION(ThreadId, thread_id) GENERATE_HLSL_INTRINSIC_FUNCTION(FDot, fdot) GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 810a16d75f0228..81b297723da3f5 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2086,5 +2086,35 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int3 sign(double3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int4 sign(double4); + +//===--===// +// radians builtins +//===--===// + +/// \fn T radians(T Val) +/// \brief Converts the specified value from degrees to radians. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half radians(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half2 radians(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half3 radians(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half4 radians(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float radians(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float2 radians(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float3 radians(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float4 radians(float4); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 43cc6c81ae5cb0..c0326cf280cf3f 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1861,6 +1861,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_elementwise_radians: case Builtin::BI__builtin_hlsl_elementwise_rsqrt: case Builtin::BI__builtin_hlsl_elementwise_frac: { if (CheckFloatOrHalfRepresentations
[clang] [clang][HLSL] Add radians intrinsic (PR #110802)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/110802 >From 30c96a73cc07aa8203f12157475b81eb947951fe Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Wed, 2 Oct 2024 01:21:19 -0700 Subject: [PATCH 1/4] Added radians to clang --- clang/include/clang/Basic/Builtins.td | 6 +++ clang/lib/CodeGen/CGBuiltin.cpp | 8 +++ clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 30 +++ clang/lib/Sema/SemaHLSL.cpp | 1 + clang/test/CodeGenHLSL/builtins/radians.hlsl | 54 +++ .../SemaHLSL/BuiltIns/radians-errors.hlsl | 27 ++ 7 files changed, 127 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/radians.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/radians-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index a726a0ef4b4bd2..9ebee81fcb0d3d 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4824,6 +4824,12 @@ def HLSLStep: LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLRadians : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_radians"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 43700ea9dd3cfd..ebb9dcfd933aa6 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18892,6 +18892,14 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { retType, CGM.getHLSLRuntime().getSignIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.sign"); } + case Builtin::BI__builtin_hlsl_elementwise_radians: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("radians operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType=*/Op0->getType(), CGM.getHLSLRuntime().getRadiansIntrinsic(), +ArrayRef{Op0}, nullptr, "hlsl.radians"); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 6722d2c7c50a2b..05ff325216f55b 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -83,6 +83,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(Saturate, saturate) GENERATE_HLSL_INTRINSIC_FUNCTION(Sign, sign) GENERATE_HLSL_INTRINSIC_FUNCTION(Step, step) + GENERATE_HLSL_INTRINSIC_FUNCTION(Radians, radians) GENERATE_HLSL_INTRINSIC_FUNCTION(ThreadId, thread_id) GENERATE_HLSL_INTRINSIC_FUNCTION(FDot, fdot) GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index c3ecfc7c90d433..f39a68ba847e98 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2138,5 +2138,35 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int3 sign(double3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int4 sign(double4); + +//===--===// +// radians builtins +//===--===// + +/// \fn T radians(T Val) +/// \brief Converts the specified value from degrees to radians. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half radians(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half2 radians(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half3 radians(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half4 radians(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float radians(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float2 radians(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float3 radians(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float4 radians(float4); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index fbcba201a351a6..d2d2df829e7b11 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1896,6 +1896,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_elementwise_radians: case Builtin::BI__builtin_hlsl_elementwise_rsqrt: case Builtin::BI__builtin_hlsl_elementwise_frac: { if (CheckFloatOrHalfRepresentations
[clang] [clang][HLSL] Add radians intrinsic (PR #110802)
adam-yang wrote: @farzonl This is also ready for merging if there's no further feedback. https://github.com/llvm/llvm-project/pull/110802 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
https://github.com/adam-yang created https://github.com/llvm/llvm-project/pull/113394 Fixes #88052 - Added the following intrinsics: - `int_spv_uclamp` - `int_spv_sclamp` - `int_spv_fclamp` - Update the clamp.hlsl unit tests to include SPIRV - Added the SPIRV specific tests >From 8cf5032a5580b97c4c4965e577374f627fbe0643 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:35:45 -0700 Subject: [PATCH 1/3] Added the intrinsics and modified the clang test --- clang/lib/CodeGen/CGBuiltin.cpp | 25 ++- clang/test/CodeGenHLSL/builtins/clamp.hlsl| 174 +- llvm/include/llvm/IR/IntrinsicsSPIRV.td | 3 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 6 + 4 files changed, 122 insertions(+), 86 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1ad950798c2118..1087537ae4ee29 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18665,10 +18665,27 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, if (auto *VecTy = Ty->getAs()) Ty = VecTy->getElementType(); IsUnsigned = Ty->isUnsignedIntegerType(); -return Builder.CreateIntrinsic( -/*ReturnType=*/OpX->getType(), -IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, -ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +switch (CGM.getTarget().getTriple().getArch()) { +case llvm::Triple::dxil: { + return Builder.CreateIntrinsic( + /*ReturnType=*/OpX->getType(), + IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, + ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +} break; +case llvm::Triple::spirv: { + Intrinsic::ID Intr = Intrinsic::spv_sclamp; + if (Ty->isFloatingType()) { +Intr = Intrinsic::spv_fclamp; + } else if (IsUnsigned) { +Intr = Intrinsic::spv_uclamp; + } + return Builder.CreateIntrinsic(OpX->getType(), Intr, + ArrayRef{OpX, OpMin, OpMax}, + nullptr, "spv.clamp"); +} break; +default: + llvm_unreachable("Intrinsic clamp not supported by target architecture"); +} } case Builtin::BI__builtin_hlsl_cross: { Value *Op0 = EmitScalarExpr(E->getArg(0)); diff --git a/clang/test/CodeGenHLSL/builtins/clamp.hlsl b/clang/test/CodeGenHLSL/builtins/clamp.hlsl index af8f6b9733a071..806e786ae70931 100644 --- a/clang/test/CodeGenHLSL/builtins/clamp.hlsl +++ b/clang/test/CodeGenHLSL/builtins/clamp.hlsl @@ -1,133 +1,143 @@ // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" #ifdef __HLSL_ENABLE_16_BIT -// NATIVE_HALF-LABEL: define noundef i16 @_Z16test_clamp_short -// NATIVE_HALF: call i16 @llvm.dx.clamp.i16( +// NATIVE_HALF: define [[FNATTR]] i16 @_Z16test_clamp_short +// NATIVE_HALF: call i16 @llvm.[[SCLAMP]].i16( int16_t test_clamp_short(int16_t p0, int16_t p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <2 x i16> @_Z17test_clamp_short2 -// NATIVE_HALF: call <2 x i16> @llvm.dx.clamp.v2i16( +// NATIVE_HALF: define [[FNATTR]] <2 x i16> @_Z17test_clamp_short2 +// NATIVE_HALF: call <2 x i16> @llvm.[[SCLAMP]].v2i16( int16_t2 test_clamp_short2(int16_t2 p0, int16_t2 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <3 x i16> @_Z17test_clamp_short3 -// NATIVE_HALF: call <3 x i16> @llvm.dx.clamp.v3i16 +// NATIVE_HALF: define [[FNATTR]] <3 x i16> @_Z17test_clamp_short3 +// NATIVE_HALF: call <3 x i16> @llvm.[[SCLAMP]].v3i16 int16_t3 test_clamp_short3(int16_t3 p0, int16_t3 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LA
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/113394 >From 8cf5032a5580b97c4c4965e577374f627fbe0643 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:35:45 -0700 Subject: [PATCH 1/4] Added the intrinsics and modified the clang test --- clang/lib/CodeGen/CGBuiltin.cpp | 25 ++- clang/test/CodeGenHLSL/builtins/clamp.hlsl| 174 +- llvm/include/llvm/IR/IntrinsicsSPIRV.td | 3 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 6 + 4 files changed, 122 insertions(+), 86 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1ad950798c2118..1087537ae4ee29 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18665,10 +18665,27 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, if (auto *VecTy = Ty->getAs()) Ty = VecTy->getElementType(); IsUnsigned = Ty->isUnsignedIntegerType(); -return Builder.CreateIntrinsic( -/*ReturnType=*/OpX->getType(), -IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, -ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +switch (CGM.getTarget().getTriple().getArch()) { +case llvm::Triple::dxil: { + return Builder.CreateIntrinsic( + /*ReturnType=*/OpX->getType(), + IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, + ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +} break; +case llvm::Triple::spirv: { + Intrinsic::ID Intr = Intrinsic::spv_sclamp; + if (Ty->isFloatingType()) { +Intr = Intrinsic::spv_fclamp; + } else if (IsUnsigned) { +Intr = Intrinsic::spv_uclamp; + } + return Builder.CreateIntrinsic(OpX->getType(), Intr, + ArrayRef{OpX, OpMin, OpMax}, + nullptr, "spv.clamp"); +} break; +default: + llvm_unreachable("Intrinsic clamp not supported by target architecture"); +} } case Builtin::BI__builtin_hlsl_cross: { Value *Op0 = EmitScalarExpr(E->getArg(0)); diff --git a/clang/test/CodeGenHLSL/builtins/clamp.hlsl b/clang/test/CodeGenHLSL/builtins/clamp.hlsl index af8f6b9733a071..806e786ae70931 100644 --- a/clang/test/CodeGenHLSL/builtins/clamp.hlsl +++ b/clang/test/CodeGenHLSL/builtins/clamp.hlsl @@ -1,133 +1,143 @@ // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" #ifdef __HLSL_ENABLE_16_BIT -// NATIVE_HALF-LABEL: define noundef i16 @_Z16test_clamp_short -// NATIVE_HALF: call i16 @llvm.dx.clamp.i16( +// NATIVE_HALF: define [[FNATTR]] i16 @_Z16test_clamp_short +// NATIVE_HALF: call i16 @llvm.[[SCLAMP]].i16( int16_t test_clamp_short(int16_t p0, int16_t p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <2 x i16> @_Z17test_clamp_short2 -// NATIVE_HALF: call <2 x i16> @llvm.dx.clamp.v2i16( +// NATIVE_HALF: define [[FNATTR]] <2 x i16> @_Z17test_clamp_short2 +// NATIVE_HALF: call <2 x i16> @llvm.[[SCLAMP]].v2i16( int16_t2 test_clamp_short2(int16_t2 p0, int16_t2 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <3 x i16> @_Z17test_clamp_short3 -// NATIVE_HALF: call <3 x i16> @llvm.dx.clamp.v3i16 +// NATIVE_HALF: define [[FNATTR]] <3 x i16> @_Z17test_clamp_short3 +// NATIVE_HALF: call <3 x i16> @llvm.[[SCLAMP]].v3i16 int16_t3 test_clamp_short3(int16_t3 p0, int16_t3 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <4 x i16> @_Z17test_clamp_short4 -// NATIVE_HALF: call <4 x i16> @llvm.dx.clamp.v4i16 +// NATIVE_HALF: define [[FNATTR]] <4 x i16> @_Z17test_clamp_short4 +// NATIVE_HALF: call <
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
https://github.com/adam-yang ready_for_review https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -83,12 +83,210 @@ entry: ret i64 %0 } -declare half @llvm.dx.clamp.f16(half, half, half) -declare float @llvm.dx.clamp.f32(float, float, float) -declare double @llvm.dx.clamp.f64(double, double, double) -declare i16 @llvm.dx.clamp.i16(i16, i16, i16) -declare i32 @llvm.dx.clamp.i32(i32, i32, i32) -declare i64 @llvm.dx.clamp.i64(i64, i64, i64) +declare half @llvm.dx.nclamp.f16(half, half, half) adam-yang wrote: Done. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/113394 >From 8cf5032a5580b97c4c4965e577374f627fbe0643 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:35:45 -0700 Subject: [PATCH 1/5] Added the intrinsics and modified the clang test --- clang/lib/CodeGen/CGBuiltin.cpp | 25 ++- clang/test/CodeGenHLSL/builtins/clamp.hlsl| 174 +- llvm/include/llvm/IR/IntrinsicsSPIRV.td | 3 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 6 + 4 files changed, 122 insertions(+), 86 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1ad950798c2118..1087537ae4ee29 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18665,10 +18665,27 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, if (auto *VecTy = Ty->getAs()) Ty = VecTy->getElementType(); IsUnsigned = Ty->isUnsignedIntegerType(); -return Builder.CreateIntrinsic( -/*ReturnType=*/OpX->getType(), -IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, -ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +switch (CGM.getTarget().getTriple().getArch()) { +case llvm::Triple::dxil: { + return Builder.CreateIntrinsic( + /*ReturnType=*/OpX->getType(), + IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, + ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +} break; +case llvm::Triple::spirv: { + Intrinsic::ID Intr = Intrinsic::spv_sclamp; + if (Ty->isFloatingType()) { +Intr = Intrinsic::spv_fclamp; + } else if (IsUnsigned) { +Intr = Intrinsic::spv_uclamp; + } + return Builder.CreateIntrinsic(OpX->getType(), Intr, + ArrayRef{OpX, OpMin, OpMax}, + nullptr, "spv.clamp"); +} break; +default: + llvm_unreachable("Intrinsic clamp not supported by target architecture"); +} } case Builtin::BI__builtin_hlsl_cross: { Value *Op0 = EmitScalarExpr(E->getArg(0)); diff --git a/clang/test/CodeGenHLSL/builtins/clamp.hlsl b/clang/test/CodeGenHLSL/builtins/clamp.hlsl index af8f6b9733a071..806e786ae70931 100644 --- a/clang/test/CodeGenHLSL/builtins/clamp.hlsl +++ b/clang/test/CodeGenHLSL/builtins/clamp.hlsl @@ -1,133 +1,143 @@ // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" #ifdef __HLSL_ENABLE_16_BIT -// NATIVE_HALF-LABEL: define noundef i16 @_Z16test_clamp_short -// NATIVE_HALF: call i16 @llvm.dx.clamp.i16( +// NATIVE_HALF: define [[FNATTR]] i16 @_Z16test_clamp_short +// NATIVE_HALF: call i16 @llvm.[[SCLAMP]].i16( int16_t test_clamp_short(int16_t p0, int16_t p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <2 x i16> @_Z17test_clamp_short2 -// NATIVE_HALF: call <2 x i16> @llvm.dx.clamp.v2i16( +// NATIVE_HALF: define [[FNATTR]] <2 x i16> @_Z17test_clamp_short2 +// NATIVE_HALF: call <2 x i16> @llvm.[[SCLAMP]].v2i16( int16_t2 test_clamp_short2(int16_t2 p0, int16_t2 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <3 x i16> @_Z17test_clamp_short3 -// NATIVE_HALF: call <3 x i16> @llvm.dx.clamp.v3i16 +// NATIVE_HALF: define [[FNATTR]] <3 x i16> @_Z17test_clamp_short3 +// NATIVE_HALF: call <3 x i16> @llvm.[[SCLAMP]].v3i16 int16_t3 test_clamp_short3(int16_t3 p0, int16_t3 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <4 x i16> @_Z17test_clamp_short4 -// NATIVE_HALF: call <4 x i16> @llvm.dx.clamp.v4i16 +// NATIVE_HALF: define [[FNATTR]] <4 x i16> @_Z17test_clamp_short4 +// NATIVE_HALF: call <
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -0,0 +1,130 @@ +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} adam-yang wrote: I'm just following what was done in DX; there's clamp and clamp-vec. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/113394 >From 8cf5032a5580b97c4c4965e577374f627fbe0643 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:35:45 -0700 Subject: [PATCH 1/6] Added the intrinsics and modified the clang test --- clang/lib/CodeGen/CGBuiltin.cpp | 25 ++- clang/test/CodeGenHLSL/builtins/clamp.hlsl| 174 +- llvm/include/llvm/IR/IntrinsicsSPIRV.td | 3 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 6 + 4 files changed, 122 insertions(+), 86 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1ad950798c2118..1087537ae4ee29 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18665,10 +18665,27 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, if (auto *VecTy = Ty->getAs()) Ty = VecTy->getElementType(); IsUnsigned = Ty->isUnsignedIntegerType(); -return Builder.CreateIntrinsic( -/*ReturnType=*/OpX->getType(), -IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, -ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +switch (CGM.getTarget().getTriple().getArch()) { +case llvm::Triple::dxil: { + return Builder.CreateIntrinsic( + /*ReturnType=*/OpX->getType(), + IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, + ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +} break; +case llvm::Triple::spirv: { + Intrinsic::ID Intr = Intrinsic::spv_sclamp; + if (Ty->isFloatingType()) { +Intr = Intrinsic::spv_fclamp; + } else if (IsUnsigned) { +Intr = Intrinsic::spv_uclamp; + } + return Builder.CreateIntrinsic(OpX->getType(), Intr, + ArrayRef{OpX, OpMin, OpMax}, + nullptr, "spv.clamp"); +} break; +default: + llvm_unreachable("Intrinsic clamp not supported by target architecture"); +} } case Builtin::BI__builtin_hlsl_cross: { Value *Op0 = EmitScalarExpr(E->getArg(0)); diff --git a/clang/test/CodeGenHLSL/builtins/clamp.hlsl b/clang/test/CodeGenHLSL/builtins/clamp.hlsl index af8f6b9733a071..806e786ae70931 100644 --- a/clang/test/CodeGenHLSL/builtins/clamp.hlsl +++ b/clang/test/CodeGenHLSL/builtins/clamp.hlsl @@ -1,133 +1,143 @@ // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" +// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute %s \ +// RUN: -emit-llvm -disable-llvm-passes -o - | \ +// RUN: FileCheck %s --check-prefixes=CHECK,NO_HALF \ +// RUN: -DSCLAMP="spv.sclamp" -DUCLAMP="spv.uclamp" -DFCLAMP="spv.fclamp" -DFNATTR="spir_func noundef" #ifdef __HLSL_ENABLE_16_BIT -// NATIVE_HALF-LABEL: define noundef i16 @_Z16test_clamp_short -// NATIVE_HALF: call i16 @llvm.dx.clamp.i16( +// NATIVE_HALF: define [[FNATTR]] i16 @_Z16test_clamp_short +// NATIVE_HALF: call i16 @llvm.[[SCLAMP]].i16( int16_t test_clamp_short(int16_t p0, int16_t p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <2 x i16> @_Z17test_clamp_short2 -// NATIVE_HALF: call <2 x i16> @llvm.dx.clamp.v2i16( +// NATIVE_HALF: define [[FNATTR]] <2 x i16> @_Z17test_clamp_short2 +// NATIVE_HALF: call <2 x i16> @llvm.[[SCLAMP]].v2i16( int16_t2 test_clamp_short2(int16_t2 p0, int16_t2 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <3 x i16> @_Z17test_clamp_short3 -// NATIVE_HALF: call <3 x i16> @llvm.dx.clamp.v3i16 +// NATIVE_HALF: define [[FNATTR]] <3 x i16> @_Z17test_clamp_short3 +// NATIVE_HALF: call <3 x i16> @llvm.[[SCLAMP]].v3i16 int16_t3 test_clamp_short3(int16_t3 p0, int16_t3 p1) { return clamp(p0, p1,p1); } -// NATIVE_HALF-LABEL: define noundef <4 x i16> @_Z17test_clamp_short4 -// NATIVE_HALF: call <4 x i16> @llvm.dx.clamp.v4i16 +// NATIVE_HALF: define [[FNATTR]] <4 x i16> @_Z17test_clamp_short4 +// NATIVE_HALF: call <
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -18661,14 +18661,30 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, Value *OpMax = EmitScalarExpr(E->getArg(2)); QualType Ty = E->getArg(0)->getType(); -bool IsUnsigned = false; if (auto *VecTy = Ty->getAs()) Ty = VecTy->getElementType(); -IsUnsigned = Ty->isUnsignedIntegerType(); -return Builder.CreateIntrinsic( -/*ReturnType=*/OpX->getType(), -IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, -ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +bool IsUnsigned = Ty->isUnsignedIntegerType(); +switch (CGM.getTarget().getTriple().getArch()) { +case llvm::Triple::dxil: { + return Builder.CreateIntrinsic( + /*ReturnType=*/OpX->getType(), + IsUnsigned ? Intrinsic::dx_uclamp : Intrinsic::dx_clamp, + ArrayRef{OpX, OpMin, OpMax}, nullptr, "dx.clamp"); +} break; +case llvm::Triple::spirv: { adam-yang wrote: This is all fixed, the two sides now match nicely. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -2559,6 +2559,12 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg, } break; case Intrinsic::spv_saturate: return selectSaturate(ResVReg, ResType, I); + case Intrinsic::spv_fclamp: +return selectExtInst(ResVReg, ResType, I, CL::fclamp, GL::FClamp); adam-yang wrote: Anyways, it's now doing the right thing and tests verify it. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -40,8 +40,9 @@ def int_dx_cast_handle : Intrinsic<[llvm_any_ty], [llvm_any_ty]>; def int_dx_all : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_any_ty], [IntrNoMem]>; def int_dx_any : DefaultAttrsIntrinsic<[llvm_i1_ty], [llvm_any_ty], [IntrNoMem]>; -def int_dx_clamp : DefaultAttrsIntrinsic<[llvm_any_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; def int_dx_uclamp : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; +def int_dx_sclamp : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; +def int_dx_nclamp : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>; adam-yang wrote: They are now updated along with getting rid of clamp-vec.ll https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -0,0 +1,130 @@ +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %} adam-yang wrote: clamp-vec is now gone. The vector test cases in DirectX clamp.ll now also go through scalarizing and lowering all the way to DXIL ops. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -2559,6 +2559,12 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg, } break; case Intrinsic::spv_saturate: return selectSaturate(ResVReg, ResType, I); + case Intrinsic::spv_fclamp: +return selectExtInst(ResVReg, ResType, I, CL::fclamp, GL::FClamp); adam-yang wrote: looks like `CL::nclamp` doesn't exist, but `CL::fclamp` actually has the same behaviour as `GL::NClamp`: in fmin/fmax, if one of the args is NaN, it returns the other argument. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
@@ -1,133 +1,143 @@ // RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ // RUN: -fnative-half-type -emit-llvm -disable-llvm-passes -o - | \ -// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF +// RUN: FileCheck %s --check-prefixes=CHECK,NATIVE_HALF \ +// RUN: -DSCLAMP="dx.clamp" -DUCLAMP="dx.uclamp" -DFCLAMP="dx.clamp" -DFNATTR="noundef" adam-yang wrote: Fixed. https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add radians intrinsic (PR #110802)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/110802 >From 08f0b8a10f3e5292fe2f91946392141c9239ec2c Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Wed, 2 Oct 2024 01:21:19 -0700 Subject: [PATCH 1/4] Added radians to clang --- clang/include/clang/Basic/Builtins.td | 6 +++ clang/lib/CodeGen/CGBuiltin.cpp | 8 +++ clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 30 +++ clang/lib/Sema/SemaHLSL.cpp | 1 + clang/test/CodeGenHLSL/builtins/radians.hlsl | 54 +++ .../SemaHLSL/BuiltIns/radians-errors.hlsl | 27 ++ 7 files changed, 127 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/radians.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/radians-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 5b504666365b32..38064e32a3f655 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4818,6 +4818,12 @@ def HLSLStep: LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLRadians : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_radians"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c864714182e019..02de763ecd3f52 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18877,6 +18877,14 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { retType, CGM.getHLSLRuntime().getSignIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.sign"); } + case Builtin::BI__builtin_hlsl_elementwise_radians: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("radians operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType=*/Op0->getType(), CGM.getHLSLRuntime().getRadiansIntrinsic(), +ArrayRef{Op0}, nullptr, "hlsl.radians"); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index a8aabca7348ffb..c807a3216ec9ee 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -82,6 +82,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(Saturate, saturate) GENERATE_HLSL_INTRINSIC_FUNCTION(Sign, sign) GENERATE_HLSL_INTRINSIC_FUNCTION(Step, step) + GENERATE_HLSL_INTRINSIC_FUNCTION(Radians, radians) GENERATE_HLSL_INTRINSIC_FUNCTION(ThreadId, thread_id) GENERATE_HLSL_INTRINSIC_FUNCTION(FDot, fdot) GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index d28f204e352de5..6393a16bc423c0 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2116,5 +2116,35 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int3 sign(double3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) int4 sign(double4); + +//===--===// +// radians builtins +//===--===// + +/// \fn T radians(T Val) +/// \brief Converts the specified value from degrees to radians. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half radians(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half2 radians(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half3 radians(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +half4 radians(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float radians(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float2 radians(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float3 radians(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) +float4 radians(float4); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 5eda22f560c9d2..ef2721221a4e21 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1861,6 +1861,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_elementwise_radians: case Builtin::BI__builtin_hlsl_elementwise_rsqrt: case Builtin::BI__builtin_hlsl_elementwise_frac: { if (CheckFloatOrHalfRepresentations
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/111883 >From 0f97b92617dcadd78362f24f3ef0719c19f6f3f6 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Thu, 10 Oct 2024 10:20:37 -0700 Subject: [PATCH 1/6] Added the intrinsic to clang --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 4 clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 12 ++ clang/lib/Sema/SemaHLSL.cpp | 5 + ...roupMemoryBarrierWithGroupSync-errors.hlsl | 6 + .../GroupMemoryBarrierWithGroupSync.hlsl | 22 +++ 7 files changed, 56 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 9ebee81fcb0d3d..96fea17badfe9e 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4830,6 +4830,12 @@ def HLSLRadians : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_group_memory_barrier_with_group_sync"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 57705f2d2d0423..45890019ee2a64 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18901,6 +18901,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { CGM.getHLSLRuntime().getRadiansIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.radians"); } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +Intrinsic::ID ID = CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic(); +return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 05ff325216f55b..1e095cedf58731 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -89,6 +89,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) GENERATE_HLSL_INTRINSIC_FUNCTION(UDot, udot) GENERATE_HLSL_INTRINSIC_FUNCTION(WaveIsFirstLane, wave_is_first_lane) + GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, groupMemoryBarrierWithGroupSync) //===--===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index f39a68ba847e98..637df8924e2468 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2168,5 +2168,17 @@ float3 radians(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) float4 radians(float4); +//===--===// +// GroupMemoryBarrierWithGroupSync builtins +//===--===// + +/// \fn void GroupMemoryBarrierWithGroupSync(void) +/// \brief Blocks execution of all threads in a group until all group shared +/// accesses have been completed and all threads in the group have reached this +/// call. + +_HLSL_BUILTIN_ALIAS(__builtin_group_memory_barrier_with_group_sync) +void GroupMemoryBarrierWithGroupSync(void); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d2d2df829e7b11..30480f8f57c12d 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2018,6 +2018,11 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) + return true; +break; + } } return false; } diff --git a/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl new file mode 100644 index 00..9ffc1ebce1c909 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected + +void test_too_many_arg() { + __builtin_group_memory_barrier_with_group_sync(0); + // expected-error@-1 {{too many argume
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
@@ -2018,6 +2018,11 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) adam-yang wrote: Verified that removing this check the error still works. https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
@@ -2018,6 +2018,11 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) adam-yang wrote: The reason is `checkArgCount` actually expects there to be at least one arg. I opted to just call a different function rather than modifying `checkArgCount`. https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/111883 >From 0f97b92617dcadd78362f24f3ef0719c19f6f3f6 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Thu, 10 Oct 2024 10:20:37 -0700 Subject: [PATCH 1/5] Added the intrinsic to clang --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 4 clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 12 ++ clang/lib/Sema/SemaHLSL.cpp | 5 + ...roupMemoryBarrierWithGroupSync-errors.hlsl | 6 + .../GroupMemoryBarrierWithGroupSync.hlsl | 22 +++ 7 files changed, 56 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 9ebee81fcb0d3d..96fea17badfe9e 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4830,6 +4830,12 @@ def HLSLRadians : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_group_memory_barrier_with_group_sync"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 57705f2d2d0423..45890019ee2a64 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18901,6 +18901,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { CGM.getHLSLRuntime().getRadiansIntrinsic(), ArrayRef{Op0}, nullptr, "hlsl.radians"); } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +Intrinsic::ID ID = CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic(); +return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 05ff325216f55b..1e095cedf58731 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -89,6 +89,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(SDot, sdot) GENERATE_HLSL_INTRINSIC_FUNCTION(UDot, udot) GENERATE_HLSL_INTRINSIC_FUNCTION(WaveIsFirstLane, wave_is_first_lane) + GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, groupMemoryBarrierWithGroupSync) //===--===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index f39a68ba847e98..637df8924e2468 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2168,5 +2168,17 @@ float3 radians(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) float4 radians(float4); +//===--===// +// GroupMemoryBarrierWithGroupSync builtins +//===--===// + +/// \fn void GroupMemoryBarrierWithGroupSync(void) +/// \brief Blocks execution of all threads in a group until all group shared +/// accesses have been completed and all threads in the group have reached this +/// call. + +_HLSL_BUILTIN_ALIAS(__builtin_group_memory_barrier_with_group_sync) +void GroupMemoryBarrierWithGroupSync(void); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index d2d2df829e7b11..30480f8f57c12d 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2018,6 +2018,11 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) + return true; +break; + } } return false; } diff --git a/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl new file mode 100644 index 00..9ffc1ebce1c909 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected + +void test_too_many_arg() { + __builtin_group_memory_barrier_with_group_sync(0); + // expected-error@-1 {{too many argume
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
@@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected adam-yang wrote: It's removed now. https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV] Added clamp intrinsic (PR #113394)
https://github.com/adam-yang closed https://github.com/llvm/llvm-project/pull/113394 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/111883 >From b7d329a60d6de140df9d7a2484e7a998c3a7b532 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Thu, 10 Oct 2024 10:20:37 -0700 Subject: [PATCH 1/7] Added the intrinsic to clang --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 4 clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 12 ++ clang/lib/Sema/SemaHLSL.cpp | 4 ...roupMemoryBarrierWithGroupSync-errors.hlsl | 6 + .../GroupMemoryBarrierWithGroupSync.hlsl | 22 +++ 7 files changed, 55 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index db5cd73fba8ad1..dcde6b005c9c3e 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4924,6 +4924,12 @@ def HLSLClip: LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_group_memory_barrier_with_group_sync"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index cb9c23b8e0a0d0..3b6ba23a85a010 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19446,6 +19446,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { assert(E->getArg(0)->getType()->hasFloatingRepresentation() && "clip operands types mismatch"); return handleHlslClip(E, this); + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +Intrinsic::ID ID = CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic(); +return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 854214d6bc0677..767baa441e25a2 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -103,6 +103,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding, handle_fromBinding) GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, bufferUpdateCounter) + GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, groupMemoryBarrierWithGroupSync) //===--===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index a3e0b5c65a6f52..aacf3ed31ef64b 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2481,5 +2481,17 @@ float3 radians(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) float4 radians(float4); +//===--===// +// GroupMemoryBarrierWithGroupSync builtins +//===--===// + +/// \fn void GroupMemoryBarrierWithGroupSync(void) +/// \brief Blocks execution of all threads in a group until all group shared +/// accesses have been completed and all threads in the group have reached this +/// call. + +_HLSL_BUILTIN_ALIAS(__builtin_group_memory_barrier_with_group_sync) +void GroupMemoryBarrierWithGroupSync(void); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 8b2f24a8e4be0a..154f39f716bff7 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2239,6 +2239,10 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { << 1; return true; } + } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) + return true; break; } } diff --git a/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl new file mode 100644 index 00..9ffc1ebce1c909 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected + +void test_too_many_arg() { + __builtin_group_memory_barrier_with_group_sync(0); + // expected-err
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/111883 >From b7d329a60d6de140df9d7a2484e7a998c3a7b532 Mon Sep 17 00:00:00 2001 From: Adam Yang Date: Thu, 10 Oct 2024 10:20:37 -0700 Subject: [PATCH 1/8] Added the intrinsic to clang --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 4 clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 12 ++ clang/lib/Sema/SemaHLSL.cpp | 4 ...roupMemoryBarrierWithGroupSync-errors.hlsl | 6 + .../GroupMemoryBarrierWithGroupSync.hlsl | 22 +++ 7 files changed, 55 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl create mode 100644 clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index db5cd73fba8ad1..dcde6b005c9c3e 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4924,6 +4924,12 @@ def HLSLClip: LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_group_memory_barrier_with_group_sync"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index cb9c23b8e0a0d0..3b6ba23a85a010 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19446,6 +19446,10 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { assert(E->getArg(0)->getType()->hasFloatingRepresentation() && "clip operands types mismatch"); return handleHlslClip(E, this); + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +Intrinsic::ID ID = CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic(); +return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 854214d6bc0677..767baa441e25a2 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -103,6 +103,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding, handle_fromBinding) GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, bufferUpdateCounter) + GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync, groupMemoryBarrierWithGroupSync) //===--===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index a3e0b5c65a6f52..aacf3ed31ef64b 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -2481,5 +2481,17 @@ float3 radians(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_radians) float4 radians(float4); +//===--===// +// GroupMemoryBarrierWithGroupSync builtins +//===--===// + +/// \fn void GroupMemoryBarrierWithGroupSync(void) +/// \brief Blocks execution of all threads in a group until all group shared +/// accesses have been completed and all threads in the group have reached this +/// call. + +_HLSL_BUILTIN_ALIAS(__builtin_group_memory_barrier_with_group_sync) +void GroupMemoryBarrierWithGroupSync(void); + } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 8b2f24a8e4be0a..154f39f716bff7 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2239,6 +2239,10 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { << 1; return true; } + } + case Builtin::BI__builtin_group_memory_barrier_with_group_sync: { +if (SemaRef.checkArgCountAtMost(TheCall, 0)) + return true; break; } } diff --git a/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl new file mode 100644 index 00..9ffc1ebce1c909 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/GroupMemoryBarrierWithGroupSync-errors.hlsl @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected + +void test_too_many_arg() { + __builtin_group_memory_barrier_with_group_sync(0); + // expected-err
[clang] [clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (PR #111883)
https://github.com/adam-yang closed https://github.com/llvm/llvm-project/pull/111883 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From e97cf4d2158fff06e7a541da73c442a9daadc8f5 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/2] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index e2c3d3c535571c..bf8d7241e4b7bc 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 8020be6c57bcfb..e431d686b11f7b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 7588f8427cdd38..2fa044c0439e66 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19053,6 +19053,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19362,6 +19379,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang ready_for_review https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
adam-yang wrote: Originally based on https://github.com/llvm/llvm-project/pull/112400. https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From aa2c7eda19f3a89112e0f6eb8630cef58d833abb Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/2] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index e2c3d3c535571c..bf8d7241e4b7bc 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 2137cb713164ad..17ebc54ba485d2 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 497a0b3952af8c..d4db04bad50726 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19117,6 +19117,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19426,6 +19443,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang created https://github.com/llvm/llvm-project/pull/118580 - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes >From e97cf4d2158fff06e7a541da73c442a9daadc8f5 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index e2c3d3c535571c..bf8d7241e4b7bc 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 8020be6c57bcfb..e431d686b11f7b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 7588f8427cdd38..2fa044c0439e66 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19053,6 +19053,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnV
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From d435e26eb327b4d6c1e3530586b97372292ce214 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/2] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 32a09e2ceb3857..5d825eba1ab7f4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f185a98720f5b9..d33c760fd214ca 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c2e983eebebc10..68f52ff2c36190 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19126,6 +19126,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19435,6 +19452,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From d435e26eb327b4d6c1e3530586b97372292ce214 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/5] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 32a09e2ceb3857..5d825eba1ab7f4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f185a98720f5b9..d33c760fd214ca 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c2e983eebebc10..68f52ff2c36190 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19126,6 +19126,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19435,6 +19452,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
@@ -9272,6 +9272,8 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< adam-yang wrote: Merged `err_typecheck_expect_scalar_or_vector_not_type` and `err_typecheck_expect_any_scalar_or_vector` by putting ` where a scalar or vector is required` behind a `%select`. https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From d435e26eb327b4d6c1e3530586b97372292ce214 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/5] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 32a09e2ceb3857..5d825eba1ab7f4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f185a98720f5b9..d33c760fd214ca 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c2e983eebebc10..68f52ff2c36190 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19126,6 +19126,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19435,6 +19452,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From d435e26eb327b4d6c1e3530586b97372292ce214 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/4] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 32a09e2ceb3857..5d825eba1ab7f4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f185a98720f5b9..d33c760fd214ca 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c2e983eebebc10..68f52ff2c36190 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19126,6 +19126,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19435,6 +19452,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
@@ -1843,6 +1843,23 @@ static bool CheckAnyScalarOrVector(Sema *S, CallExpr *TheCall, return false; } +static bool CheckNotBoolType(Sema *S, CallExpr *TheCall, unsigned ArgIndex) { adam-yang wrote: Addressed both these comments. https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From d435e26eb327b4d6c1e3530586b97372292ce214 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/3] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 32a09e2ceb3857..5d825eba1ab7f4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4774,6 +4774,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f185a98720f5b9..d33c760fd214ca 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9272,6 +9272,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index c2e983eebebc10..68f52ff2c36190 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19126,6 +19126,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19435,6 +19452,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang edited https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From f98e5113bc83cae2118552466288a874d5e5d63d Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/8] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 468c16050e2bf0..12b96672ce466f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4793,6 +4793,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index d4e897868f1a9a..e74efd560fd329 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9287,6 +9287,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index ca03fb665d423d..8770c8f4953fce 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19186,6 +19186,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19505,6 +19522,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From f98e5113bc83cae2118552466288a874d5e5d63d Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/7] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 468c16050e2bf0..12b96672ce466f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4793,6 +4793,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index d4e897868f1a9a..e74efd560fd329 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9287,6 +9287,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index ca03fb665d423d..8770c8f4953fce 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19186,6 +19186,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19505,6 +19522,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From 9a1ad541ec6e2fbd72bd88727a5910da39a5b840 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/6] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 468c16050e2bf0..12b96672ce466f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4793,6 +4793,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index ab2d6237c1cab8..d6295e31d2548e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9287,6 +9287,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 573be932f8b1aa..2f754f595041ed 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19198,6 +19198,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19517,6 +19534,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/123428 >From 9a0cf138d99ebc9ae18db054b4d8eaa34e8174a8 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:44 -0800 Subject: [PATCH 1/3] Added WaveActiveMax --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 36 + clang/lib/Sema/SemaHLSL.cpp | 1 + .../CodeGenHLSL/builtins/WaveActiveMax.hlsl | 46 ++ .../BuiltIns/WaveActiveMax-errors.hlsl| 29 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/lib/Target/DirectX/DXIL.td | 6 + .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 33 llvm/test/CodeGen/DirectX/WaveActiveMax.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveMax.ll| 55 +++ 12 files changed, 361 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveMax.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveMax-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveMax.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveMax.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index bbf4886b5cf053..a7f17ec4c8ef8f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveMax : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_max"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_active_sum"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index b80833fd91884d..57d8eec24a5a0b 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19203,6 +19203,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::spv_wave_reduce_umax; +return llvm::Intrinsic::spv_wave_reduce_max; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_reduce_umax; +return llvm::Intrinsic::dx_wave_reduce_max; + } + default: +llvm_unreachable("Intrinsic WaveActiveMax" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19532,6 +19551,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { /*AssumeConvergent=*/true), ArrayRef{OpExpr}, "hlsl.wave.active.sum"); } + case Builtin::BI__builtin_hlsl_wave_active_max: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +OpExpr->getType(), ArrayRef{OpExpr->getType()}, false); +Intrinsic::ID IID = getWaveActiveMaxIntrinsic( +getTarget().getTriple().getArch(), CGM.getHLSLRuntime(), +E->getArg(0)->getType()); + +// Get overloaded name +std::string Name = +Intrinsic::getName(IID, ArrayRef{OpExpr->getType()}, &CGM.getModule()); +return EmitRuntimeCall(CGM.CreateRuntimeFunction(FT, Name, {}, + /*Local=*/false, + /*AssumeConvergent=*/true), + ArrayRef{OpExpr}, "hlsl.wave.active.max"); + } case Builtin::BI__builtin_hlsl_wave_get_lane_index: { // We don't define a SPIR-V intrinsic, instead it is a SPIR-V built-in // defined in SPIRVBuiltins.td. So instead we manually get the matching name diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 5001883003ee2d..fd7435caeb000e 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2183,6 +2183,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_wave_active_max: case Builtin::BI__builtin_h
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
@@ -0,0 +1,55 @@ +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-vulkan-unknown %s -o - | FileCheck %s +; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-vulkan-unknown %s -o - -filetype=obj | spirv-val %} + +; Test lowering to spir-v backend for various types and scalar/vector + adam-yang wrote: Done. https://github.com/llvm/llvm-project/pull/123428 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
@@ -2132,6 +2135,33 @@ bool SPIRVInstructionSelector::selectWaveActiveCountBits( return Result; } +bool SPIRVInstructionSelector::selectWaveReduceMax(Register ResVReg, + const SPIRVType *ResType, + MachineInstr &I, + bool IsUnsigned) const { + assert(I.getNumOperands() == 3); + assert(I.getOperand(2).isReg()); + MachineBasicBlock &BB = *I.getParent(); + Register InputRegister = I.getOperand(2).getReg(); + SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister); + + if (!InputType) +report_fatal_error("Input Type could not be determined."); + + SPIRVType *IntTy = GR.getOrCreateSPIRVIntegerType(32, I, TII); + // Retreive the operation to use based on input type + bool IsFloatTy = GR.isScalarOrVectorOfType(InputRegister, SPIRV::OpTypeFloat); + auto IntegerOpcodeType = + IsUnsigned ? SPIRV::OpGroupNonUniformUMax : SPIRV::OpGroupNonUniformSMax; + auto Opcode = IsFloatTy ? SPIRV::OpGroupNonUniformFMax : IntegerOpcodeType; + return BuildMI(BB, I, I.getDebugLoc(), TII.get(Opcode)) + .addDef(ResVReg) + .addUse(GR.getSPIRVTypeID(ResType)) + .addUse(GR.getOrCreateConstInt(SPIRV::Scope::Subgroup, I, IntTy, TII)) + .addImm(SPIRV::GroupOperation::Reduce) + .addUse(I.getOperand(2).getReg()); adam-yang wrote: Added. https://github.com/llvm/llvm-project/pull/123428 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/123428 >From 9a0cf138d99ebc9ae18db054b4d8eaa34e8174a8 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:44 -0800 Subject: [PATCH 1/4] Added WaveActiveMax --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 36 + clang/lib/Sema/SemaHLSL.cpp | 1 + .../CodeGenHLSL/builtins/WaveActiveMax.hlsl | 46 ++ .../BuiltIns/WaveActiveMax-errors.hlsl| 29 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/lib/Target/DirectX/DXIL.td | 6 + .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 33 llvm/test/CodeGen/DirectX/WaveActiveMax.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveMax.ll| 55 +++ 12 files changed, 361 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveMax.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveMax-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveMax.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveMax.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index bbf4886b5cf053..a7f17ec4c8ef8f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveMax : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_max"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_active_sum"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index b80833fd91884d..57d8eec24a5a0b 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19203,6 +19203,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::spv_wave_reduce_umax; +return llvm::Intrinsic::spv_wave_reduce_max; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_reduce_umax; +return llvm::Intrinsic::dx_wave_reduce_max; + } + default: +llvm_unreachable("Intrinsic WaveActiveMax" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19532,6 +19551,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { /*AssumeConvergent=*/true), ArrayRef{OpExpr}, "hlsl.wave.active.sum"); } + case Builtin::BI__builtin_hlsl_wave_active_max: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +OpExpr->getType(), ArrayRef{OpExpr->getType()}, false); +Intrinsic::ID IID = getWaveActiveMaxIntrinsic( +getTarget().getTriple().getArch(), CGM.getHLSLRuntime(), +E->getArg(0)->getType()); + +// Get overloaded name +std::string Name = +Intrinsic::getName(IID, ArrayRef{OpExpr->getType()}, &CGM.getModule()); +return EmitRuntimeCall(CGM.CreateRuntimeFunction(FT, Name, {}, + /*Local=*/false, + /*AssumeConvergent=*/true), + ArrayRef{OpExpr}, "hlsl.wave.active.max"); + } case Builtin::BI__builtin_hlsl_wave_get_lane_index: { // We don't define a SPIR-V intrinsic, instead it is a SPIR-V built-in // defined in SPIRVBuiltins.td. So instead we manually get the matching name diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 5001883003ee2d..fd7435caeb000e 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2183,6 +2183,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_wave_active_max: case Builtin::BI__builtin_h
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
@@ -0,0 +1,143 @@ +; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library < %s | FileCheck %s + +; Test that for scalar values, WaveActiveMax maps down to the DirectX op + +define noundef half @wave_active_max_half(half noundef %expr) { +entry: +; CHECK: call half @dx.op.waveActiveOp.f16(i32 119, half %expr, i8 3, i8 0) adam-yang wrote: Right now waveActiveOp is marked with `memory(none)`. With dxcompiler, there's no memory related attribute. Maybe we should update the DxilOP attribute to match that. https://github.com/llvm/llvm-project/pull/123428 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/123428 >From 055412fd8d01d796ca070fafeca4375fd442986a Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:44 -0800 Subject: [PATCH 1/5] Added WaveActiveMax --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 36 + clang/lib/Sema/SemaHLSL.cpp | 1 + .../CodeGenHLSL/builtins/WaveActiveMax.hlsl | 46 ++ .../BuiltIns/WaveActiveMax-errors.hlsl| 29 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/lib/Target/DirectX/DXIL.td | 10 ++ .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 33 llvm/test/CodeGen/DirectX/WaveActiveMax.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveMax.ll| 55 +++ 12 files changed, 365 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveMax.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveMax-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveMax.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveMax.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 60c360d4a9e075..29939242596ba4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveMax : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_max"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_active_sum"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 26bdc5e36e..94c5a2fa4fda40 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19098,6 +19098,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::spv_wave_reduce_umax; +return llvm::Intrinsic::spv_wave_reduce_max; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_reduce_umax; +return llvm::Intrinsic::dx_wave_reduce_max; + } + default: +llvm_unreachable("Intrinsic WaveActiveMax" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19427,6 +19446,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { /*AssumeConvergent=*/true), ArrayRef{OpExpr}, "hlsl.wave.active.sum"); } + case Builtin::BI__builtin_hlsl_wave_active_max: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +OpExpr->getType(), ArrayRef{OpExpr->getType()}, false); +Intrinsic::ID IID = getWaveActiveMaxIntrinsic( +getTarget().getTriple().getArch(), CGM.getHLSLRuntime(), +E->getArg(0)->getType()); + +// Get overloaded name +std::string Name = +Intrinsic::getName(IID, ArrayRef{OpExpr->getType()}, &CGM.getModule()); +return EmitRuntimeCall(CGM.CreateRuntimeFunction(FT, Name, {}, + /*Local=*/false, + /*AssumeConvergent=*/true), + ArrayRef{OpExpr}, "hlsl.wave.active.max"); + } case Builtin::BI__builtin_hlsl_wave_get_lane_index: { // We don't define a SPIR-V intrinsic, instead it is a SPIR-V built-in // defined in SPIRVBuiltins.td. So instead we manually get the matching name diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index f26469e6a2f1d7..5c58ac1f9167ee 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2422,6 +2422,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_wave_active_max: case Builtin::BI__builtin_
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
https://github.com/adam-yang created https://github.com/llvm/llvm-project/pull/123428 ```- add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passespendent pr merges. ``` Resolves #99170 >From 9a0cf138d99ebc9ae18db054b4d8eaa34e8174a8 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:44 -0800 Subject: [PATCH] Added WaveActiveMax --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 36 + clang/lib/Sema/SemaHLSL.cpp | 1 + .../CodeGenHLSL/builtins/WaveActiveMax.hlsl | 46 ++ .../BuiltIns/WaveActiveMax-errors.hlsl| 29 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/lib/Target/DirectX/DXIL.td | 6 + .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 33 llvm/test/CodeGen/DirectX/WaveActiveMax.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveMax.ll| 55 +++ 12 files changed, 361 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveMax.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveMax-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveMax.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveMax.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index bbf4886b5cf053..a7f17ec4c8ef8f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveMax : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_max"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_active_sum"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index b80833fd91884d..57d8eec24a5a0b 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19203,6 +19203,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::spv_wave_reduce_umax; +return llvm::Intrinsic::spv_wave_reduce_max; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_reduce_umax; +return llvm::Intrinsic::dx_wave_reduce_max; + } + default: +llvm_unreachable("Intrinsic WaveActiveMax" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19532,6 +19551,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { /*AssumeConvergent=*/true), ArrayRef{OpExpr}, "hlsl.wave.active.sum"); } + case Builtin::BI__builtin_hlsl_wave_active_max: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +OpExpr->getType(), ArrayRef{OpExpr->getType()}, false); +Intrinsic::ID IID = getWaveActiveMaxIntrinsic( +getTarget().getTriple().getArch(), CGM.getHLSLRuntime(), +E->getArg(0)->getType()); + +// Get overloaded name +std::string Name = +Intrinsic::getName(IID, ArrayRef{OpExpr->getType()}, &CGM.getModule()); +return EmitRuntimeCall(CGM.CreateRuntimeFunction(FT, Name, {}, + /*Local=*/false, + /*AssumeConvergent=*/true), + ArrayRef{OpExpr}, "hlsl.wave.active.max"); + } case Builtin::BI__builtin_hlsl_wave_get_lane_index: { // We don't define a SPIR-V intrinsic, ins
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
@@ -19203,6 +19203,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, adam-yang wrote: I gave it a bit of try, it's kind of just shuffling things around and not really making things any easier to read. I think it okay as is. https://github.com/llvm/llvm-project/pull/123428 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/123428 >From cedd93faaa75c343fda7a21ecf813249cf08609a Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:44 -0800 Subject: [PATCH 1/6] Added WaveActiveMax --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 36 + clang/lib/Sema/SemaHLSL.cpp | 1 + .../CodeGenHLSL/builtins/WaveActiveMax.hlsl | 46 ++ .../BuiltIns/WaveActiveMax-errors.hlsl| 29 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/lib/Target/DirectX/DXIL.td | 10 ++ .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 33 llvm/test/CodeGen/DirectX/WaveActiveMax.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveMax.ll| 55 +++ 12 files changed, 365 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveMax.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveMax-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveMax.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveMax.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 60c360d4a9e075..29939242596ba4 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveMax : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_max"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_active_sum"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 9ae133421d8dac..27dfab11c5531c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19295,6 +19295,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::spv_wave_reduce_umax; +return llvm::Intrinsic::spv_wave_reduce_max; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_reduce_umax; +return llvm::Intrinsic::dx_wave_reduce_max; + } + default: +llvm_unreachable("Intrinsic WaveActiveMax" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19624,6 +19643,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { /*AssumeConvergent=*/true), ArrayRef{OpExpr}, "hlsl.wave.active.sum"); } + case Builtin::BI__builtin_hlsl_wave_active_max: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +OpExpr->getType(), ArrayRef{OpExpr->getType()}, false); +Intrinsic::ID IID = getWaveActiveMaxIntrinsic( +getTarget().getTriple().getArch(), CGM.getHLSLRuntime(), +E->getArg(0)->getType()); + +// Get overloaded name +std::string Name = +Intrinsic::getName(IID, ArrayRef{OpExpr->getType()}, &CGM.getModule()); +return EmitRuntimeCall(CGM.CreateRuntimeFunction(FT, Name, {}, + /*Local=*/false, + /*AssumeConvergent=*/true), + ArrayRef{OpExpr}, "hlsl.wave.active.max"); + } case Builtin::BI__builtin_hlsl_wave_get_lane_index: { // We don't define a SPIR-V intrinsic, instead it is a SPIR-V built-in // defined in SPIRVBuiltins.td. So instead we manually get the matching name diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index aa99b44958eafd..d748c10455289b 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2430,6 +2430,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_wave_active_max: case Builtin::BI__builtin_
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveMax` intrinsic (PR #123428)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/123428 >From 9a0cf138d99ebc9ae18db054b4d8eaa34e8174a8 Mon Sep 17 00:00:00 2001 From: Adam Yang <31109344+adam-y...@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:14:44 -0800 Subject: [PATCH 1/2] Added WaveActiveMax --- clang/include/clang/Basic/Builtins.td | 6 + clang/lib/CodeGen/CGBuiltin.cpp | 36 + clang/lib/Sema/SemaHLSL.cpp | 1 + .../CodeGenHLSL/builtins/WaveActiveMax.hlsl | 46 ++ .../BuiltIns/WaveActiveMax-errors.hlsl| 29 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 2 + llvm/lib/Target/DirectX/DXIL.td | 6 + .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 33 llvm/test/CodeGen/DirectX/WaveActiveMax.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveMax.ll| 55 +++ 12 files changed, 361 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveMax.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveMax-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveMax.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveMax.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index bbf4886b5cf053..a7f17ec4c8ef8f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveMax : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_max"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_active_sum"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index b80833fd91884d..57d8eec24a5a0b 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19203,6 +19203,25 @@ static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, } } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveMaxIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::spv_wave_reduce_umax; +return llvm::Intrinsic::spv_wave_reduce_max; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_reduce_umax; +return llvm::Intrinsic::dx_wave_reduce_max; + } + default: +llvm_unreachable("Intrinsic WaveActiveMax" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19532,6 +19551,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { /*AssumeConvergent=*/true), ArrayRef{OpExpr}, "hlsl.wave.active.sum"); } + case Builtin::BI__builtin_hlsl_wave_active_max: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +OpExpr->getType(), ArrayRef{OpExpr->getType()}, false); +Intrinsic::ID IID = getWaveActiveMaxIntrinsic( +getTarget().getTriple().getArch(), CGM.getHLSLRuntime(), +E->getArg(0)->getType()); + +// Get overloaded name +std::string Name = +Intrinsic::getName(IID, ArrayRef{OpExpr->getType()}, &CGM.getModule()); +return EmitRuntimeCall(CGM.CreateRuntimeFunction(FT, Name, {}, + /*Local=*/false, + /*AssumeConvergent=*/true), + ArrayRef{OpExpr}, "hlsl.wave.active.max"); + } case Builtin::BI__builtin_hlsl_wave_get_lane_index: { // We don't define a SPIR-V intrinsic, instead it is a SPIR-V built-in // defined in SPIRVBuiltins.td. So instead we manually get the matching name diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 5001883003ee2d..fd7435caeb000e 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2183,6 +2183,7 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { TheCall->setType(ArgTyA); break; } + case Builtin::BI__builtin_hlsl_wave_active_max: case Builtin::BI__builtin_h
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From 9498523511a53c43b6282500fed2659e12ddd752 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/7] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index ea22690ce4f5cc..ec8e2420469011 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4795,6 +4795,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 8be4f946dce1cc..56d882efdc9ace 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9299,6 +9299,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1b25d365932c30..503fcc07eb33c1 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19186,6 +19186,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19491,6 +19508,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang closed https://github.com/llvm/llvm-project/pull/118580 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic (PR #118580)
https://github.com/adam-yang updated https://github.com/llvm/llvm-project/pull/118580 >From 9a1ad541ec6e2fbd72bd88727a5910da39a5b840 Mon Sep 17 00:00:00 2001 From: Finn Plummer Date: Fri, 18 Oct 2024 10:49:18 -0700 Subject: [PATCH 1/5] [HLSL][SPIRV][DXIL] Implement `WaveActiveSum` intrinsic - add clang builtin to Builtins.td - link builtin in hlsl_intrinsics - add codegen for spirv intrinsic and two directx intrinsics to retain signedness information of the operands in CGBuiltin.cpp - add semantic analysis in SemaHLSL.cpp - add lowering of spirv intrinsic to spirv backend in SPIRVInstructionSelector.cpp - add lowering of directx intrinsics to WaveActiveOp dxil op in DXIL.td - add test cases to illustrate passes --- clang/include/clang/Basic/Builtins.td | 6 + .../clang/Basic/DiagnosticSemaKinds.td| 3 + clang/lib/CodeGen/CGBuiltin.cpp | 34 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 99 clang/lib/Sema/SemaHLSL.cpp | 31 .../CodeGenHLSL/builtins/WaveActiveSum.hlsl | 45 ++ .../BuiltIns/WaveActiveSum-errors.hlsl| 28 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + llvm/include/llvm/IR/IntrinsicsSPIRV.td | 1 + llvm/lib/Target/DirectX/DXIL.td | 26 .../DirectX/DirectXTargetTransformInfo.cpp| 2 + .../Target/SPIRV/SPIRVInstructionSelector.cpp | 30 llvm/test/CodeGen/DirectX/WaveActiveSum.ll| 143 ++ .../SPIRV/hlsl-intrinsics/WaveActiveSum.ll| 41 + 14 files changed, 491 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/WaveActiveSum.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/WaveActiveSum-errors.hlsl create mode 100644 llvm/test/CodeGen/DirectX/WaveActiveSum.ll create mode 100644 llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WaveActiveSum.ll diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 468c16050e2bf0..12b96672ce466f 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4793,6 +4793,12 @@ def HLSLWaveActiveCountBits : LangBuiltin<"HLSL_LANG"> { let Prototype = "unsigned int(bool)"; } +def HLSLWaveActiveSum : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_wave_active_sum"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void (...)"; +} + def HLSLWaveGetLaneIndex : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_wave_get_lane_index"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index ab2d6237c1cab8..d6295e31d2548e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9287,6 +9287,9 @@ def err_typecheck_expect_scalar_or_vector : Error< "a vector of such type is required">; def err_typecheck_expect_any_scalar_or_vector : Error< "invalid operand of type %0 where a scalar or vector is required">; +def err_typecheck_expect_scalar_or_vector_not_type : Error< + "invalid operand of type %0 where %1 or " + "a vector of such type is not allowed">; def err_typecheck_expect_flt_or_vector : Error< "invalid operand of type %0 where floating, complex or " "a vector of such types is required">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 573be932f8b1aa..2f754f595041ed 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19198,6 +19198,23 @@ static Intrinsic::ID getFirstBitHighIntrinsic(CGHLSLRuntime &RT, QualType QT) { return RT.getFirstBitUHighIntrinsic(); } +// Return wave active sum that corresponds to the QT scalar type +static Intrinsic::ID getWaveActiveSumIntrinsic(llvm::Triple::ArchType Arch, + CGHLSLRuntime &RT, QualType QT) { + switch (Arch) { + case llvm::Triple::spirv: +return llvm::Intrinsic::spv_wave_active_sum; + case llvm::Triple::dxil: { +if (QT->isUnsignedIntegerType()) + return llvm::Intrinsic::dx_wave_active_usum; +return llvm::Intrinsic::dx_wave_active_sum; + } + default: +llvm_unreachable("Intrinsic WaveActiveSum" + " not supported by target architecture"); + } +} + Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue) { @@ -19517,6 +19534,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID), ArrayRef{OpExpr}); } + case Builtin::BI__builtin_hlsl_wave_active_sum: { +// Due to the use of variadic arguments, explicitly retreive argument +Value *OpExpr = EmitScalarExpr(E->getArg(0)); +llvm::FunctionType *FT = llvm::FunctionType::get( +