summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp')
-rw-r--r--llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp73
1 files changed, 55 insertions, 18 deletions
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 9b6c2a849edc..e236d646e66f 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -173,7 +173,8 @@ using namespace InstructionSet;
namespace SPIRV {
/// Parses the name part of the demangled builtin call.
-std::string lookupBuiltinNameHelper(StringRef DemangledCall) {
+std::string lookupBuiltinNameHelper(StringRef DemangledCall,
+ FPDecorationId *DecorationId) {
const static std::string PassPrefix = "(anonymous namespace)::";
std::string BuiltinName;
// Itanium Demangler result may have "(anonymous namespace)::" prefix
@@ -231,10 +232,17 @@ std::string lookupBuiltinNameHelper(StringRef DemangledCall) {
"ReadClockKHR|SubgroupBlockReadINTEL|SubgroupImageBlockReadINTEL|"
"SubgroupImageMediaBlockReadINTEL|SubgroupImageMediaBlockWriteINTEL|"
"Convert|"
- "UConvert|SConvert|FConvert|SatConvert).*)_R.*");
+ "UConvert|SConvert|FConvert|SatConvert).*)_R[^_]*_?(\\w+)?.*");
std::smatch Match;
- if (std::regex_match(BuiltinName, Match, SpvWithR) && Match.size() > 2)
- BuiltinName = Match[1].str();
+ if (std::regex_match(BuiltinName, Match, SpvWithR) && Match.size() > 1) {
+ std::ssub_match SubMatch;
+ if (DecorationId && Match.size() > 3) {
+ SubMatch = Match[3];
+ *DecorationId = demangledPostfixToDecorationId(SubMatch.str());
+ }
+ SubMatch = Match[1];
+ BuiltinName = SubMatch.str();
+ }
return BuiltinName;
}
@@ -583,6 +591,15 @@ static Register buildScopeReg(Register CLScopeRegister,
return buildConstantIntReg32(Scope, MIRBuilder, GR);
}
+static void setRegClassIfNull(Register Reg, MachineRegisterInfo *MRI,
+ SPIRVGlobalRegistry *GR) {
+ if (MRI->getRegClassOrNull(Reg))
+ return;
+ SPIRVType *SpvType = GR->getSPIRVTypeForVReg(Reg);
+ MRI->setRegClass(Reg,
+ SpvType ? GR->getRegClass(SpvType) : &SPIRV::iIDRegClass);
+}
+
static Register buildMemSemanticsReg(Register SemanticsRegister,
Register PtrRegister, unsigned &Semantics,
MachineIRBuilder &MIRBuilder,
@@ -1160,7 +1177,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
MIRBuilder.buildInstr(TargetOpcode::G_BUILD_VECTOR).addDef(VecReg);
for (unsigned i = 1; i < Call->Arguments.size(); i++) {
MIB.addUse(Call->Arguments[i]);
- MRI->setRegClass(Call->Arguments[i], &SPIRV::iIDRegClass);
+ setRegClassIfNull(Call->Arguments[i], MRI, GR);
}
insertAssignInstr(VecReg, nullptr, VecType, GR, MIRBuilder,
MIRBuilder.getMF().getRegInfo());
@@ -1176,7 +1193,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
MIB.addImm(GroupBuiltin->GroupOperation);
if (Call->Arguments.size() > 0) {
MIB.addUse(Arg0.isValid() ? Arg0 : Call->Arguments[0]);
- MRI->setRegClass(Call->Arguments[0], &SPIRV::iIDRegClass);
+ setRegClassIfNull(Call->Arguments[0], MRI, GR);
if (VecReg.isValid())
MIB.addUse(VecReg);
else
@@ -1633,8 +1650,14 @@ static bool generateICarryBorrowInst(const SPIRV::IncomingCall *Call,
}
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
- Register ResReg = MRI->createGenericVirtualRegister(LLT::scalar(64));
- MRI->setRegClass(ResReg, &SPIRV::iIDRegClass);
+ Register ResReg = MRI->createVirtualRegister(&SPIRV::iIDRegClass);
+ if (const TargetRegisterClass *DstRC =
+ MRI->getRegClassOrNull(Call->Arguments[1])) {
+ MRI->setRegClass(ResReg, DstRC);
+ MRI->setType(ResReg, MRI->getType(Call->Arguments[1]));
+ } else {
+ MRI->setType(ResReg, LLT::scalar(64));
+ }
GR->assignSPIRVTypeToVReg(RetType, ResReg, MIRBuilder.getMF());
MIRBuilder.buildInstr(Opcode)
.addDef(ResReg)
@@ -2664,16 +2687,7 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
return false;
}
-Type *parseBuiltinCallArgumentBaseType(const StringRef DemangledCall,
- unsigned ArgIdx, LLVMContext &Ctx) {
- SmallVector<StringRef, 10> BuiltinArgsTypeStrs;
- StringRef BuiltinArgs =
- DemangledCall.slice(DemangledCall.find('(') + 1, DemangledCall.find(')'));
- BuiltinArgs.split(BuiltinArgsTypeStrs, ',', -1, false);
- if (ArgIdx >= BuiltinArgsTypeStrs.size())
- return nullptr;
- StringRef TypeStr = BuiltinArgsTypeStrs[ArgIdx].trim();
-
+Type *parseBuiltinCallArgumentType(StringRef TypeStr, LLVMContext &Ctx) {
// Parse strings representing OpenCL builtin types.
if (hasBuiltinTypePrefix(TypeStr)) {
// OpenCL builtin types in demangled call strings have the following format:
@@ -2717,6 +2731,29 @@ Type *parseBuiltinCallArgumentBaseType(const StringRef DemangledCall,
return BaseType;
}
+bool parseBuiltinTypeStr(SmallVector<StringRef, 10> &BuiltinArgsTypeStrs,
+ const StringRef DemangledCall, LLVMContext &Ctx) {
+ auto Pos1 = DemangledCall.find('(');
+ if (Pos1 == StringRef::npos)
+ return false;
+ auto Pos2 = DemangledCall.find(')');
+ if (Pos2 == StringRef::npos || Pos1 > Pos2)
+ return false;
+ DemangledCall.slice(Pos1 + 1, Pos2)
+ .split(BuiltinArgsTypeStrs, ',', -1, false);
+ return true;
+}
+
+Type *parseBuiltinCallArgumentBaseType(const StringRef DemangledCall,
+ unsigned ArgIdx, LLVMContext &Ctx) {
+ SmallVector<StringRef, 10> BuiltinArgsTypeStrs;
+ parseBuiltinTypeStr(BuiltinArgsTypeStrs, DemangledCall, Ctx);
+ if (ArgIdx >= BuiltinArgsTypeStrs.size())
+ return nullptr;
+ StringRef TypeStr = BuiltinArgsTypeStrs[ArgIdx].trim();
+ return parseBuiltinCallArgumentType(TypeStr, Ctx);
+}
+
struct BuiltinType {
StringRef Name;
uint32_t Opcode;