[clang][HLSL] Add GroupMemoryBarrierWithGroupSync intrinsic (#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 * [[DXIL] Add GroupMemoryBarrierWithGroupSync intrinsic #111884](https://github.com/llvm/llvm-project/pull/111884) * [[SPIRV] Add GroupMemoryBarrierWithGroupSync intrinsic #111888](https://github.com/llvm/llvm-project/pull/111888)
This commit is contained in:
parent
78e35e4c0e
commit
dd2b2b8bbb
@ -4930,6 +4930,12 @@ def HLSLClip: LangBuiltin<"HLSL_LANG"> {
|
||||
let Prototype = "void(...)";
|
||||
}
|
||||
|
||||
def HLSLGroupMemoryBarrierWithGroupSync: LangBuiltin<"HLSL_LANG"> {
|
||||
let Spellings = ["__builtin_hlsl_group_memory_barrier_with_group_sync"];
|
||||
let Attributes = [NoThrow, Const];
|
||||
let Prototype = "void()";
|
||||
}
|
||||
|
||||
// Builtins for XRay.
|
||||
def XRayCustomEvent : Builtin {
|
||||
let Spellings = ["__xray_customevent"];
|
||||
|
||||
@ -19456,6 +19456,12 @@ 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_hlsl_group_memory_barrier_with_group_sync: {
|
||||
Intrinsic::ID ID =
|
||||
CGM.getHLSLRuntime().getGroupMemoryBarrierWithGroupSyncIntrinsic();
|
||||
return EmitRuntimeCall(
|
||||
Intrinsic::getOrInsertDeclaration(&CGM.getModule(), ID));
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -103,6 +103,8 @@ public:
|
||||
|
||||
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding, handle_fromBinding)
|
||||
GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, bufferUpdateCounter)
|
||||
GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync,
|
||||
group_memory_barrier_with_group_sync)
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// End of reserved area for HLSL intrinsic getters.
|
||||
|
||||
@ -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_hlsl_group_memory_barrier_with_group_sync)
|
||||
void GroupMemoryBarrierWithGroupSync(void);
|
||||
|
||||
} // namespace hlsl
|
||||
#endif //_HLSL_HLSL_INTRINSICS_H_
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
|
||||
// RUN: dxil-pc-shadermodel6.3-library %s \
|
||||
// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \
|
||||
// RUN: -DTARGET=dx -DFNATTRS=noundef -check-prefixes=CHECK,CHECK-DXIL
|
||||
// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
|
||||
// RUN: spirv-unknown-vulkan-compute %s \
|
||||
// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \
|
||||
// RUN: -DTARGET=spv -DFNATTRS="spir_func noundef" -check-prefixes=CHECK,CHECK-SPIRV
|
||||
|
||||
// CHECK-DXIL: define void @
|
||||
// CHECK-SPIRV: define spir_func void @
|
||||
void test_GroupMemoryBarrierWithGroupSync() {
|
||||
// CHECK-DXIL: call void @llvm.[[TARGET]].group.memory.barrier.with.group.sync()
|
||||
// CHECK-SPIRV: call spir_func void @llvm.[[TARGET]].group.memory.barrier.with.group.sync()
|
||||
GroupMemoryBarrierWithGroupSync();
|
||||
}
|
||||
|
||||
// CHECK: declare void @llvm.[[TARGET]].group.memory.barrier.with.group.sync() #[[ATTRS:[0-9]+]]
|
||||
// CHECK-NOT: attributes #[[ATTRS]] = {{.+}}memory(none){{.+}}
|
||||
// CHECK: attributes #[[ATTRS]] = {
|
||||
@ -0,0 +1,6 @@
|
||||
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -emit-llvm-only -disable-llvm-passes -verify
|
||||
|
||||
void test_too_many_arg() {
|
||||
__builtin_hlsl_group_memory_barrier_with_group_sync(0);
|
||||
// expected-error@-1 {{too many arguments to function call, expected 0, have 1}}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user