Skip to content

Commit a1ef5ee

Browse files
committed
Add common utility function for continued instructions
1 parent 6888753 commit a1ef5ee

File tree

4 files changed

+45
-48
lines changed

4 files changed

+45
-48
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,31 +2113,10 @@ static bool generateSelectInst(const SPIRV::IncomingCall *Call,
21132113
static bool generateConstructInst(const SPIRV::IncomingCall *Call,
21142114
MachineIRBuilder &MIRBuilder,
21152115
SPIRVGlobalRegistry *GR) {
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-
2116+
createContinuedInstructions(MIRBuilder, SPIRV::OpCompositeConstruct, 3,
2117+
SPIRV::OpCompositeConstructContinuedINTEL,
2118+
Call->Arguments, Call->ReturnRegister,
2119+
GR->getSPIRVTypeID(Call->ReturnType));
21412120
return true;
21422121
}
21432122

@@ -2251,28 +2230,10 @@ static bool generateSpecConstantInst(const SPIRV::IncomingCall *Call,
22512230
return true;
22522231
}
22532232
case SPIRV::OpSpecConstantComposite: {
2254-
auto MIB = MIRBuilder.buildInstr(Opcode)
2255-
.addDef(Call->ReturnRegister)
2256-
.addUse(GR->getSPIRVTypeID(Call->ReturnType));
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-
}
2233+
createContinuedInstructions(MIRBuilder, Opcode, 3,
2234+
SPIRV::OpSpecConstantCompositeContinuedINTEL,
2235+
Call->Arguments, Call->ReturnRegister,
2236+
GR->getSPIRVTypeID(Call->ReturnType));
22762237
return true;
22772238
}
22782239
default:

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,4 +795,35 @@ bool isSpvIntrinsic(const Value *Arg) {
795795
return false;
796796
}
797797

798+
// Function to create continued instructions for SPV_INTEL_long_composites
799+
// extension
800+
void createContinuedInstructions(MachineIRBuilder &MIRBuilder, unsigned Opcode,
801+
unsigned MinWC, unsigned ContinuedOpcode,
802+
ArrayRef<Register> Args,
803+
Register ReturnRegister, Register TypeID) {
804+
constexpr unsigned MaxWordCount = UINT16_MAX;
805+
const size_t NumElements = Args.size();
806+
size_t MaxNumElements = MaxWordCount - MinWC;
807+
size_t SPIRVStructNumElements = NumElements;
808+
809+
if (NumElements > MaxNumElements) {
810+
// Do adjustments for continued instructions which always had only one
811+
// minumum word count.
812+
SPIRVStructNumElements = MaxNumElements;
813+
MaxNumElements = MaxWordCount - 1;
814+
}
815+
816+
auto MIB =
817+
MIRBuilder.buildInstr(Opcode).addDef(ReturnRegister).addUse(TypeID);
818+
819+
for (size_t I = 0; I < SPIRVStructNumElements; ++I)
820+
MIB.addUse(Args[I]);
821+
822+
for (size_t I = SPIRVStructNumElements; I < NumElements; I += MaxNumElements) {
823+
auto MIB = MIRBuilder.buildInstr(ContinuedOpcode);
824+
for (size_t J = I; J < std::min(I + MaxNumElements, NumElements); ++J)
825+
MIB.addUse(Args[J]);
826+
}
827+
}
828+
798829
} // namespace llvm

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,5 +441,10 @@ inline FPDecorationId demangledPostfixToDecorationId(const std::string &S) {
441441
return It == Mapping.end() ? FPDecorationId::NONE : It->second;
442442
}
443443

444+
void createContinuedInstructions(MachineIRBuilder &MIRBuilder, unsigned Opcode,
445+
unsigned MinWC, unsigned ContinuedOpcode,
446+
ArrayRef<Register> Args,
447+
Register ReturnRegister, Register TypeID);
448+
444449
} // namespace llvm
445450
#endif // LLVM_LIB_TARGET_SPIRV_SPIRVUTILS_H

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

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)