diff options
Diffstat (limited to 'contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp | 81 |
1 files changed, 51 insertions, 30 deletions
diff --git a/contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp b/contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp index af2e8576af2e..b7240f01300c 100644 --- a/contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp @@ -91,8 +91,11 @@ StringRef llvm::getEnumName(MVT::SimpleValueType T) { case MVT::v256i1: return "MVT::v256i1"; case MVT::v512i1: return "MVT::v512i1"; case MVT::v1024i1: return "MVT::v1024i1"; + case MVT::v2048i1: return "MVT::v2048i1"; case MVT::v128i2: return "MVT::v128i2"; + case MVT::v256i2: return "MVT::v256i2"; case MVT::v64i4: return "MVT::v64i4"; + case MVT::v128i4: return "MVT::v128i4"; case MVT::v1i8: return "MVT::v1i8"; case MVT::v2i8: return "MVT::v2i8"; case MVT::v4i8: return "MVT::v4i8"; @@ -123,6 +126,10 @@ StringRef llvm::getEnumName(MVT::SimpleValueType T) { case MVT::v6i32: return "MVT::v6i32"; case MVT::v7i32: return "MVT::v7i32"; case MVT::v8i32: return "MVT::v8i32"; + case MVT::v9i32: return "MVT::v9i32"; + case MVT::v10i32: return "MVT::v10i32"; + case MVT::v11i32: return "MVT::v11i32"; + case MVT::v12i32: return "MVT::v12i32"; case MVT::v16i32: return "MVT::v16i32"; case MVT::v32i32: return "MVT::v32i32"; case MVT::v64i32: return "MVT::v64i32"; @@ -169,6 +176,10 @@ StringRef llvm::getEnumName(MVT::SimpleValueType T) { case MVT::v6f32: return "MVT::v6f32"; case MVT::v7f32: return "MVT::v7f32"; case MVT::v8f32: return "MVT::v8f32"; + case MVT::v9f32: return "MVT::v9f32"; + case MVT::v10f32: return "MVT::v10f32"; + case MVT::v11f32: return "MVT::v11f32"; + case MVT::v12f32: return "MVT::v12f32"; case MVT::v16f32: return "MVT::v16f32"; case MVT::v32f32: return "MVT::v32f32"; case MVT::v64f32: return "MVT::v64f32"; @@ -358,11 +369,9 @@ CodeGenRegBank &CodeGenTarget::getRegBank() const { return *RegBank; } -Optional<CodeGenRegisterClass *> -CodeGenTarget::getSuperRegForSubReg(const ValueTypeByHwMode &ValueTy, - CodeGenRegBank &RegBank, - const CodeGenSubRegIndex *SubIdx, - bool MustBeAllocatable) const { +std::optional<CodeGenRegisterClass *> CodeGenTarget::getSuperRegForSubReg( + const ValueTypeByHwMode &ValueTy, CodeGenRegBank &RegBank, + const CodeGenSubRegIndex *SubIdx, bool MustBeAllocatable) const { std::vector<CodeGenRegisterClass *> Candidates; auto &RegClasses = RegBank.getRegClasses(); @@ -389,7 +398,7 @@ CodeGenTarget::getSuperRegForSubReg(const ValueTypeByHwMode &ValueTy, // If we didn't find anything, we're done. if (Candidates.empty()) - return None; + return std::nullopt; // Find and return the largest of our candidate classes. llvm::stable_sort(Candidates, [&](const CodeGenRegisterClass *A, @@ -482,7 +491,7 @@ static const char *FixedInstrs[] = { nullptr}; unsigned CodeGenTarget::getNumFixedInstructions() { - return array_lengthof(FixedInstrs) - 1; + return std::size(FixedInstrs) - 1; } /// Return all of the instructions defined by the target, ordered by @@ -665,7 +674,6 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R, TheDef = R; std::string DefName = std::string(R->getName()); ArrayRef<SMLoc> DefLoc = R->getLoc(); - ModRef = ReadWriteMem; Properties = 0; isOverloaded = false; isCommutative = false; @@ -823,7 +831,8 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R, Properties = parseSDPatternOperatorProperties(R); // Sort the argument attributes for later benefit. - llvm::sort(ArgumentAttributes); + for (auto &Attrs : ArgumentAttributes) + llvm::sort(Attrs); } void CodeGenIntrinsic::setDefaultProperties( @@ -838,26 +847,25 @@ void CodeGenIntrinsic::setDefaultProperties( void CodeGenIntrinsic::setProperty(Record *R) { if (R->getName() == "IntrNoMem") - ModRef = NoMem; + ME = MemoryEffects::none(); else if (R->getName() == "IntrReadMem") { - if (!(ModRef & MR_Ref)) + if (ME.onlyWritesMemory()) PrintFatalError(TheDef->getLoc(), Twine("IntrReadMem cannot be used after IntrNoMem or " "IntrWriteMem. Default is ReadWrite")); - ModRef = ModRefBehavior(ModRef & ~MR_Mod); + ME &= MemoryEffects::readOnly(); } else if (R->getName() == "IntrWriteMem") { - if (!(ModRef & MR_Mod)) + if (ME.onlyReadsMemory()) PrintFatalError(TheDef->getLoc(), Twine("IntrWriteMem cannot be used after IntrNoMem or " "IntrReadMem. Default is ReadWrite")); - ModRef = ModRefBehavior(ModRef & ~MR_Ref); + ME &= MemoryEffects::writeOnly(); } else if (R->getName() == "IntrArgMemOnly") - ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_ArgMem); + ME &= MemoryEffects::argMemOnly(); else if (R->getName() == "IntrInaccessibleMemOnly") - ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_InaccessibleMem); + ME &= MemoryEffects::inaccessibleMemOnly(); else if (R->getName() == "IntrInaccessibleMemOrArgMemOnly") - ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_ArgMem | - MR_InaccessibleMem); + ME &= MemoryEffects::inaccessibleOrArgMemOnly(); else if (R->getName() == "Commutative") isCommutative = true; else if (R->getName() == "Throws") @@ -886,32 +894,35 @@ void CodeGenIntrinsic::setProperty(Record *R) { hasSideEffects = true; else if (R->isSubClassOf("NoCapture")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, NoCapture, 0); + addArgAttribute(ArgNo, NoCapture); } else if (R->isSubClassOf("NoAlias")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, NoAlias, 0); + addArgAttribute(ArgNo, NoAlias); } else if (R->isSubClassOf("NoUndef")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, NoUndef, 0); + addArgAttribute(ArgNo, NoUndef); + } else if (R->isSubClassOf("NonNull")) { + unsigned ArgNo = R->getValueAsInt("ArgNo"); + addArgAttribute(ArgNo, NonNull); } else if (R->isSubClassOf("Returned")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, Returned, 0); + addArgAttribute(ArgNo, Returned); } else if (R->isSubClassOf("ReadOnly")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, ReadOnly, 0); + addArgAttribute(ArgNo, ReadOnly); } else if (R->isSubClassOf("WriteOnly")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, WriteOnly, 0); + addArgAttribute(ArgNo, WriteOnly); } else if (R->isSubClassOf("ReadNone")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, ReadNone, 0); + addArgAttribute(ArgNo, ReadNone); } else if (R->isSubClassOf("ImmArg")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); - ArgumentAttributes.emplace_back(ArgNo, ImmArg, 0); + addArgAttribute(ArgNo, ImmArg); } else if (R->isSubClassOf("Align")) { unsigned ArgNo = R->getValueAsInt("ArgNo"); uint64_t Align = R->getValueAsInt("Align"); - ArgumentAttributes.emplace_back(ArgNo, Alignment, Align); + addArgAttribute(ArgNo, Alignment, Align); } else llvm_unreachable("Unknown property!"); } @@ -925,7 +936,17 @@ bool CodeGenIntrinsic::isParamAPointer(unsigned ParamIdx) const { bool CodeGenIntrinsic::isParamImmArg(unsigned ParamIdx) const { // Convert argument index to attribute index starting from `FirstArgIndex`. - ArgAttribute Val{ParamIdx + 1, ImmArg, 0}; - return std::binary_search(ArgumentAttributes.begin(), - ArgumentAttributes.end(), Val); + ++ParamIdx; + if (ParamIdx >= ArgumentAttributes.size()) + return false; + ArgAttribute Val{ImmArg, 0}; + return std::binary_search(ArgumentAttributes[ParamIdx].begin(), + ArgumentAttributes[ParamIdx].end(), Val); +} + +void CodeGenIntrinsic::addArgAttribute(unsigned Idx, ArgAttrKind AK, + uint64_t V) { + if (Idx >= ArgumentAttributes.size()) + ArgumentAttributes.resize(Idx + 1); + ArgumentAttributes[Idx].emplace_back(AK, V); } |