Skip to content

Commit fddf23c

Browse files
[SPIRV] Add support for the SPV_KHR_subgroup_rotate extension (#82374)
This PR adds support for the SPV_KHR_subgroup_rotate extension that enables rotating values across invocations within a subgroup: * https://github.com/KhronosGroup/SPIRV-Registry/blob/main/extensions/KHR/SPV_KHR_subgroup_rotate.asciidoc
1 parent 55558cd commit fddf23c

File tree

6 files changed

+382
-1
lines changed

6 files changed

+382
-1
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,8 @@ class GroupBuiltin<string name, Op operation> {
619619
!eq(operation, OpGroupNonUniformShuffleDown),
620620
!eq(operation, OpGroupBroadcast),
621621
!eq(operation, OpGroupNonUniformBroadcast),
622-
!eq(operation, OpGroupNonUniformBroadcastFirst));
622+
!eq(operation, OpGroupNonUniformBroadcastFirst),
623+
!eq(operation, OpGroupNonUniformRotateKHR));
623624
bit HasBoolArg = !or(!and(IsAllOrAny, !eq(IsAllEqual, false)), IsBallot, IsLogical);
624625
}
625626

@@ -877,6 +878,10 @@ defm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_logical_xors", Wo
877878
defm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_logical_xors", WorkOrSub, OpGroupNonUniformLogicalXor>;
878879
defm : DemangledGroupBuiltin<"group_clustered_reduce_logical_xor", WorkOrSub, OpGroupNonUniformLogicalXor>;
879880

881+
// cl_khr_subgroup_rotate / SPV_KHR_subgroup_rotate
882+
defm : DemangledGroupBuiltin<"group_rotate", OnlySub, OpGroupNonUniformRotateKHR>;
883+
defm : DemangledGroupBuiltin<"group_clustered_rotate", OnlySub, OpGroupNonUniformRotateKHR>;
884+
880885
// cl_khr_work_group_uniform_arithmetic / SPV_KHR_uniform_group_instructions
881886
defm : DemangledGroupBuiltin<"group_reduce_imul", OnlyWork, OpGroupIMulKHR>;
882887
defm : DemangledGroupBuiltin<"group_reduce_mulu", OnlyWork, OpGroupIMulKHR>;

llvm/lib/Target/SPIRV/SPIRVInstrInfo.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,11 @@ def OpGroupNonUniformLogicalAnd: OpGroupNUGroup<"LogicalAnd", 362>;
765765
def OpGroupNonUniformLogicalOr: OpGroupNUGroup<"LogicalOr", 363>;
766766
def OpGroupNonUniformLogicalXor: OpGroupNUGroup<"LogicalXor", 364>;
767767

768+
// SPV_KHR_subgroup_rotate
769+
def OpGroupNonUniformRotateKHR: Op<4431, (outs ID:$res),
770+
(ins TYPE:$type, ID:$scope, ID:$value, ID:$delta, variable_ops),
771+
"$res = OpGroupNonUniformRotateKHR $type $scope $value $delta">;
772+
768773
// 3.49.7, Constant-Creation Instructions
769774

770775
// - SPV_INTEL_function_pointers

llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,15 @@ void addInstrRequirements(const MachineInstr &MI,
10691069
Reqs.addCapability(SPIRV::Capability::FunctionPointersINTEL);
10701070
}
10711071
break;
1072+
case SPIRV::OpGroupNonUniformRotateKHR:
1073+
if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate))
1074+
report_fatal_error("OpGroupNonUniformRotateKHR instruction requires the "
1075+
"following SPIR-V extension: SPV_KHR_subgroup_rotate",
1076+
false);
1077+
Reqs.addExtension(SPIRV::Extension::SPV_KHR_subgroup_rotate);
1078+
Reqs.addCapability(SPIRV::Capability::GroupNonUniformRotateKHR);
1079+
Reqs.addCapability(SPIRV::Capability::GroupNonUniform);
1080+
break;
10721081
case SPIRV::OpGroupIMulKHR:
10731082
case SPIRV::OpGroupFMulKHR:
10741083
case SPIRV::OpGroupBitwiseAndKHR:

llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ cl::list<SPIRV::Extension::Extension> Extensions(
7575
"Allows to use the LinkOnceODR linkage type that is to let "
7676
"a function or global variable to be merged with other functions "
7777
"or global variables of the same name when linkage occurs."),
78+
clEnumValN(SPIRV::Extension::SPV_KHR_subgroup_rotate,
79+
"SPV_KHR_subgroup_rotate",
80+
"Adds a new instruction that enables rotating values across "
81+
"invocations within a subgroup."),
7882
clEnumValN(SPIRV::Extension::SPV_INTEL_function_pointers,
7983
"SPV_INTEL_function_pointers",
8084
"Allows translation of function pointers.")));

llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ defm BitInstructions : CapabilityOperand<6025, 0, 0, [SPV_KHR_bit_instructions],
455455
defm ExpectAssumeKHR : CapabilityOperand<5629, 0, 0, [SPV_KHR_expect_assume], []>;
456456
defm FunctionPointersINTEL : CapabilityOperand<5603, 0, 0, [SPV_INTEL_function_pointers], []>;
457457
defm IndirectReferencesINTEL : CapabilityOperand<5604, 0, 0, [SPV_INTEL_function_pointers], []>;
458+
defm GroupNonUniformRotateKHR : CapabilityOperand<6026, 0, 0, [SPV_KHR_subgroup_rotate], [GroupNonUniform]>;
458459
defm AtomicFloat32AddEXT : CapabilityOperand<6033, 0, 0, [SPV_EXT_shader_atomic_float_add], []>;
459460
defm AtomicFloat64AddEXT : CapabilityOperand<6034, 0, 0, [SPV_EXT_shader_atomic_float_add], []>;
460461
defm AtomicFloat16AddEXT : CapabilityOperand<6095, 0, 0, [SPV_EXT_shader_atomic_float16_add], []>;

0 commit comments

Comments
 (0)