Skip to content

Commit 6a4198c

Browse files
committed
[SPIR-V] Support 2 more instructions from SPV_INTEL_long_composites
This change adds support for `OpSpecConstantCompositeContinuedINTEL` and `OpCompositeConstructContinuedINTEL` instructions and continues work done in llvm#126545. Specification: https://github.khronos.org/SPIRV-Registry/extensions/INTEL/SPV_INTEL_long_composites.html
1 parent 5e26fb1 commit 6a4198c

File tree

4 files changed

+65669
-4
lines changed

4 files changed

+65669
-4
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,8 +2113,32 @@ static bool generateSelectInst(const SPIRV::IncomingCall *Call,
21132113
static bool generateConstructInst(const SPIRV::IncomingCall *Call,
21142114
MachineIRBuilder &MIRBuilder,
21152115
SPIRVGlobalRegistry *GR) {
2116-
return buildOpFromWrapper(MIRBuilder, SPIRV::OpCompositeConstruct, Call,
2117-
GR->getSPIRVTypeID(Call->ReturnType));
2116+
auto MIB = MIRBuilder.buildInstr(SPIRV::OpCompositeConstruct)
2117+
.addDef(Call->ReturnRegister)
2118+
.addUse(GR->getSPIRVTypeID(Call->ReturnType));
2119+
2120+
constexpr unsigned MaxWordCount = UINT16_MAX;
2121+
const size_t NumElements = Call->Arguments.size();
2122+
size_t MaxNumElements = MaxWordCount - 3;
2123+
size_t SPIRVStructNumElements = NumElements;
2124+
2125+
if (NumElements > MaxNumElements) {
2126+
// Do adjustments for continued instructions.
2127+
SPIRVStructNumElements = MaxNumElements;
2128+
MaxNumElements = MaxWordCount - 1;
2129+
}
2130+
2131+
for (size_t I = 0; I < SPIRVStructNumElements; ++I)
2132+
MIB.addUse(Call->Arguments[I]);
2133+
2134+
for (size_t I = SPIRVStructNumElements; I < NumElements;
2135+
I += MaxNumElements) {
2136+
auto MIB = MIRBuilder.buildInstr(SPIRV::OpCompositeConstructContinuedINTEL);
2137+
for (size_t J = I; J < std::min(I + MaxNumElements, NumElements); ++J)
2138+
MIB.addUse(Call->Arguments[J]);
2139+
}
2140+
2141+
return true;
21182142
}
21192143

21202144
static bool generateCoopMatrInst(const SPIRV::IncomingCall *Call,
@@ -2230,8 +2254,25 @@ static bool generateSpecConstantInst(const SPIRV::IncomingCall *Call,
22302254
auto MIB = MIRBuilder.buildInstr(Opcode)
22312255
.addDef(Call->ReturnRegister)
22322256
.addUse(GR->getSPIRVTypeID(Call->ReturnType));
2233-
for (unsigned i = 0; i < Call->Arguments.size(); i++)
2234-
MIB.addUse(Call->Arguments[i]);
2257+
2258+
constexpr unsigned MaxWordCount = UINT16_MAX;
2259+
const size_t NumElements = Call->Arguments.size();
2260+
size_t MaxNumElements = MaxWordCount - 3;
2261+
size_t SPIRVStructNumElements = NumElements;
2262+
if (NumElements > MaxNumElements) {
2263+
SPIRVStructNumElements = MaxNumElements;
2264+
MaxNumElements = MaxWordCount - 1;
2265+
}
2266+
for (size_t I = 0; I < SPIRVStructNumElements; ++I)
2267+
MIB.addUse(Call->Arguments[I]);
2268+
2269+
for (size_t I = SPIRVStructNumElements; I < NumElements;
2270+
I += MaxNumElements) {
2271+
auto MIB =
2272+
MIRBuilder.buildInstr(SPIRV::OpSpecConstantCompositeContinuedINTEL);
2273+
for (size_t J = I; J < std::min(I + MaxNumElements, NumElements); ++J)
2274+
MIB.addUse(Call->Arguments[J]);
2275+
}
22352276
return true;
22362277
}
22372278
default:

llvm/lib/Target/SPIRV/SPIRVInstrInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ bool SPIRVInstrInfo::isSpecConstantInstr(const MachineInstr &MI) const {
5555
case SPIRV::OpSpecConstantFalse:
5656
case SPIRV::OpSpecConstant:
5757
case SPIRV::OpSpecConstantComposite:
58+
case SPIRV::OpSpecConstantCompositeContinuedINTEL:
5859
case SPIRV::OpSpecConstantOp:
5960
return true;
6061
default:

llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_long_composites/long-composite-construct.ll

Lines changed: 28 additions & 0 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_long_composites/long-spec-const-composite.ll

Lines changed: 65595 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)