diff options
author | Tomas Matheson <tomas.matheson@arm.com> | 2023-07-08 23:51:32 +0100 |
---|---|---|
committer | Tomas Matheson <tomas.matheson@arm.com> | 2023-07-09 10:14:48 +0100 |
commit | 6d4a3e917c1e32b665e1177c92f6b90032817feb (patch) | |
tree | 5621866f85406980f2027481e879b893f7a9b43c /llvm/utils/TableGen/CodeGenDAGPatterns.cpp | |
parent | 4c66b0325905bdb367a5453574c10e535b900b5e (diff) | |
download | llvm-6d4a3e917c1e32b665e1177c92f6b90032817feb.zip llvm-6d4a3e917c1e32b665e1177c92f6b90032817feb.tar.gz llvm-6d4a3e917c1e32b665e1177c92f6b90032817feb.tar.bz2 |
Revert "[TableGen] Use heap allocated arrays instead of vectors for TreePatternNode::Types and ResultPerm. NFC"
While working on DAGISelMatcherEmitter I've hit several runtime errors
caused by accessing TreePatternNode::Types out of bounds. These were
difficult to debug because the switch from std::vector to unique_ptr
removes bounds checking.
I don't think the slight reduction in class size is worth the extra
debugging and memory safety problems, so I suggest we revert this.
This reverts commit d34125a1a825208b592cfa8f5fc3566303d691a4.
Differential Revision: https://reviews.llvm.org/D154781
Diffstat (limited to 'llvm/utils/TableGen/CodeGenDAGPatterns.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenDAGPatterns.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index 3260d02..e481f7e 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -1762,7 +1762,7 @@ bool TreePatternNode::UpdateNodeTypeFromInst(unsigned ResNo, } bool TreePatternNode::ContainsUnresolvedType(TreePattern &TP) const { - for (unsigned i = 0, e = getNumTypes(); i != e; ++i) + for (unsigned i = 0, e = Types.size(); i != e; ++i) if (!TP.getInfer().isConcrete(Types[i], true)) return true; for (unsigned i = 0, e = getNumChildren(); i != e; ++i) @@ -1772,7 +1772,7 @@ bool TreePatternNode::ContainsUnresolvedType(TreePattern &TP) const { } bool TreePatternNode::hasProperTypeByHwMode() const { - for (const TypeSetByHwMode &S : getExtTypes()) + for (const TypeSetByHwMode &S : Types) if (!S.isSimple()) return true; for (const TreePatternNodePtr &C : Children) @@ -1782,7 +1782,7 @@ bool TreePatternNode::hasProperTypeByHwMode() const { } bool TreePatternNode::hasPossibleType() const { - for (const TypeSetByHwMode &S : getExtTypes()) + for (const TypeSetByHwMode &S : Types) if (!S.isPossible()) return false; for (const TreePatternNodePtr &C : Children) @@ -1792,7 +1792,7 @@ bool TreePatternNode::hasPossibleType() const { } bool TreePatternNode::setDefaultMode(unsigned Mode) { - for (TypeSetByHwMode &S : getExtTypes()) { + for (TypeSetByHwMode &S : Types) { S.makeSimple(Mode); // Check if the selected mode had a type conflict. if (S.get(DefaultMode).empty()) @@ -1932,7 +1932,7 @@ void TreePatternNode::print(raw_ostream &OS) const { else OS << '(' << getOperator()->getName(); - for (unsigned i = 0, e = getNumTypes(); i != e; ++i) { + for (unsigned i = 0, e = Types.size(); i != e; ++i) { OS << ':'; getExtType(i).writeToStream(OS); } @@ -2024,7 +2024,7 @@ TreePatternNodePtr TreePatternNode::clone() const { } New->setName(getName()); New->setNamesAsPredicateArg(getNamesAsPredicateArg()); - llvm::copy(getExtTypes(), New->getExtTypes().begin()); + New->Types = Types; New->setPredicateCalls(getPredicateCalls()); New->setGISelFlagsRecord(getGISelFlagsRecord()); New->setTransformFn(getTransformFn()); @@ -2034,7 +2034,7 @@ TreePatternNodePtr TreePatternNode::clone() const { /// RemoveAllTypes - Recursively strip all the types of this tree. void TreePatternNode::RemoveAllTypes() { // Reset to unknown type. - std::fill(getExtTypes().begin(), getExtTypes().end(), TypeSetByHwMode()); + std::fill(Types.begin(), Types.end(), TypeSetByHwMode()); if (isLeaf()) return; for (unsigned i = 0, e = getNumChildren(); i != e; ++i) getChild(i)->RemoveAllTypes(); @@ -2130,10 +2130,10 @@ void TreePatternNode::InlinePatternFragments( R->setPredicateCalls(getPredicateCalls()); R->setGISelFlagsRecord(getGISelFlagsRecord()); R->setTransformFn(getTransformFn()); - for (unsigned i = 0, e = getNumTypes(); i != e; ++i) { + for (unsigned i = 0, e = getNumTypes(); i != e; ++i) R->setType(i, getExtType(i)); + for (unsigned i = 0, e = getNumResults(); i != e; ++i) R->setResultIndex(i, getResultIndex(i)); - } // Register alternative. OutAlternatives.push_back(R); @@ -2468,7 +2468,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) { if (DefInit *DI = dyn_cast<DefInit>(getLeafValue())) { // If it's a regclass or something else known, include the type. bool MadeChange = false; - for (unsigned i = 0, e = getNumTypes(); i != e; ++i) + for (unsigned i = 0, e = Types.size(); i != e; ++i) MadeChange |= UpdateNodeType(i, getImplicitType(DI->getDef(), i, NotRegisters, !hasName(), TP), TP); @@ -2476,7 +2476,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) { } if (IntInit *II = dyn_cast<IntInit>(getLeafValue())) { - assert(getNumTypes() == 1 && "Invalid IntInit"); + assert(Types.size() == 1 && "Invalid IntInit"); // Int inits are always integers. :) bool MadeChange = TP.getInfer().EnforceInteger(Types[0]); @@ -2713,7 +2713,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) { bool MadeChange = false; if (!NotRegisters) { - assert(getNumTypes() == 1 && "ComplexPatterns only produce one result!"); + assert(Types.size() == 1 && "ComplexPatterns only produce one result!"); Record *T = CDP.getComplexPattern(getOperator()).getValueType(); const CodeGenHwModes &CGH = CDP.getTargetInfo().getHwModes(); const ValueTypeByHwMode VVT = getValueTypeByHwMode(T, CGH); |