aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp')
-rw-r--r--contrib/llvm-project/llvm/utils/TableGen/CodeGenTarget.cpp81
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);
}