diff options
| author | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
|---|---|---|
| committer | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
| commit | 38500d63e14ce340236840f60d356cdefb56a52c (patch) | |
| tree | 17edbec446ce9b50d2f215a483b83afb293a635d /llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | |
| parent | 1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff) | |
| parent | 27f30029741ecf023baece7b3dde1ff9011ffefc (diff) | |
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp')
| -rw-r--r-- | llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 73 |
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; |
