-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[TableGen] Add TreePatternNode::children and use it in for loops (NFC) #119877
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-selectiondag @llvm/pr-subscribers-llvm-globalisel Author: Sergei Barannikov (s-barannikov) ChangesFull diff: https://github.com/llvm/llvm-project/pull/119877.diff 6 Files Affected:
diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
index b6b669f18cfbce..10f6590e9c7aa3 100644
--- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
@@ -1440,8 +1440,7 @@ static unsigned getPatternSize(const TreePatternNode &P,
++Size;
// Count children in the count if they are also nodes.
- for (unsigned i = 0, e = P.getNumChildren(); i != e; ++i) {
- const TreePatternNode &Child = P.getChild(i);
+ for (const TreePatternNode &Child : P.children()) {
if (!Child.isLeaf() && Child.getNumTypes()) {
const TypeSetByHwMode &T0 = Child.getExtType(0);
// At this point, all variable type sets should be simple, i.e. only
@@ -1747,8 +1746,8 @@ bool TreePatternNode::ContainsUnresolvedType(TreePattern &TP) const {
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)
- if (getChild(i).ContainsUnresolvedType(TP))
+ for (const TreePatternNode &Child : children())
+ if (Child.ContainsUnresolvedType(TP))
return true;
return false;
}
@@ -1923,9 +1922,9 @@ void TreePatternNode::print(raw_ostream &OS) const {
if (getNumChildren() != 0) {
OS << " ";
ListSeparator LS;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
+ for (const TreePatternNode &Child : children()) {
OS << LS;
- getChild(i).print(OS);
+ Child.print(OS);
}
}
OS << ")";
@@ -1998,8 +1997,8 @@ TreePatternNodePtr TreePatternNode::clone() const {
} else {
std::vector<TreePatternNodePtr> CChildren;
CChildren.reserve(Children.size());
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- CChildren.push_back(getChild(i).clone());
+ for (const TreePatternNode &Child : children())
+ CChildren.push_back(Child.clone());
New = makeIntrusiveRefCnt<TreePatternNode>(
getOperator(), std::move(CChildren), getNumTypes());
}
@@ -2018,8 +2017,8 @@ void TreePatternNode::RemoveAllTypes() {
std::fill(Types.begin(), Types.end(), TypeSetByHwMode());
if (isLeaf())
return;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- getChild(i).RemoveAllTypes();
+ for (TreePatternNode &Child : children())
+ Child.RemoveAllTypes();
}
/// SubstituteFormalArguments - Replace the formal arguments in this tree
@@ -2392,8 +2391,8 @@ bool TreePatternNode::TreeHasProperty(SDNP Property,
const CodeGenDAGPatterns &CGP) const {
if (NodeHasProperty(Property, CGP))
return true;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- if (getChild(i).TreeHasProperty(Property, CGP))
+ for (const TreePatternNode &Child : children())
+ if (Child.TreeHasProperty(Property, CGP))
return true;
return false;
}
@@ -2528,8 +2527,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
}
bool MadeChange = false;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- MadeChange |= getChild(i).ApplyTypeConstraints(TP, NotRegisters);
+ for (TreePatternNode &Child : children())
+ MadeChange |= Child.ApplyTypeConstraints(TP, NotRegisters);
MadeChange |= NI.ApplyTypeConstraints(*this, TP);
return MadeChange;
}
@@ -2679,8 +2678,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
return false;
}
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- MadeChange |= getChild(i).ApplyTypeConstraints(TP, NotRegisters);
+ for (TreePatternNode &Child : children())
+ MadeChange |= Child.ApplyTypeConstraints(TP, NotRegisters);
return MadeChange;
}
@@ -2703,8 +2702,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
MadeChange |= UpdateNodeType(0, VVT, TP);
}
- for (unsigned i = 0; i < getNumChildren(); ++i)
- MadeChange |= getChild(i).ApplyTypeConstraints(TP, NotRegisters);
+ for (TreePatternNode &Child : children())
+ MadeChange |= Child.ApplyTypeConstraints(TP, NotRegisters);
return MadeChange;
}
@@ -2724,7 +2723,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
/// OnlyOnRHSOfCommutative - Return true if this value is only allowed on the
/// RHS of a commutative operation, not the on LHS.
-static bool OnlyOnRHSOfCommutative(TreePatternNode &N) {
+static bool OnlyOnRHSOfCommutative(const TreePatternNode &N) {
if (!N.isLeaf() && N.getOperator()->getName() == "imm")
return true;
if (N.isLeaf() && isa<IntInit>(N.getLeafValue()))
@@ -2740,12 +2739,12 @@ static bool OnlyOnRHSOfCommutative(TreePatternNode &N) {
/// that can never possibly work), and to prevent the pattern permuter from
/// generating stuff that is useless.
bool TreePatternNode::canPatternMatch(std::string &Reason,
- const CodeGenDAGPatterns &CDP) {
+ const CodeGenDAGPatterns &CDP) const {
if (isLeaf())
return true;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- if (!getChild(i).canPatternMatch(Reason, CDP))
+ for (const TreePatternNode &Child : children())
+ if (!Child.canPatternMatch(Reason, CDP))
return false;
// If this is an intrinsic, handle cases that would make it not match. For
@@ -2822,8 +2821,8 @@ void TreePattern::ComputeNamedNodes(TreePatternNode &N) {
if (!N.getName().empty())
NamedNodes[N.getName()].push_back(&N);
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- ComputeNamedNodes(N.getChild(i));
+ for (TreePatternNode &Child : N.children())
+ ComputeNamedNodes(Child);
}
TreePatternNodePtr TreePattern::ParseTreePattern(const Init *TheInit,
@@ -3595,8 +3594,8 @@ class InstAnalyzer {
}
// Analyze children.
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- AnalyzeNode(N.getChild(i));
+ for (const TreePatternNode &Child : N.children())
+ AnalyzeNode(Child);
// Notice properties of the node.
if (N.NodeHasProperty(SDNPMayStore, CDP))
@@ -3730,8 +3729,8 @@ static void getInstructionsInTree(TreePatternNode &Tree,
return;
if (Tree.getOperator()->isSubClassOf("Instruction"))
Instrs.push_back(Tree.getOperator());
- for (unsigned i = 0, e = Tree.getNumChildren(); i != e; ++i)
- getInstructionsInTree(Tree.getChild(i), Instrs);
+ for (TreePatternNode &Child : Tree.children())
+ getInstructionsInTree(Child, Instrs);
}
/// Check the class of a pattern leaf node against the instruction operand it
@@ -4010,8 +4009,8 @@ static void FindNames(TreePatternNode &P,
}
if (!P.isLeaf()) {
- for (unsigned i = 0, e = P.getNumChildren(); i != e; ++i)
- FindNames(P.getChild(i), Names, PatternTop);
+ for (TreePatternNode &Child : P.children())
+ FindNames(Child, Names, PatternTop);
}
}
@@ -4195,8 +4194,8 @@ static bool ForceArbitraryInstResultType(TreePatternNode &N, TreePattern &TP) {
return false;
// Analyze children.
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- if (ForceArbitraryInstResultType(N.getChild(i), TP))
+ for (TreePatternNode &Child : N.children())
+ if (ForceArbitraryInstResultType(Child, TP))
return true;
if (!N.getOperator()->isSubClassOf("Instruction"))
@@ -4378,8 +4377,8 @@ static void collectModes(std::set<unsigned> &Modes, const TreePatternNode &N) {
for (const auto &I : VTS)
Modes.insert(I.first);
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- collectModes(Modes, N.getChild(i));
+ for (const TreePatternNode &Child : N.children())
+ collectModes(Modes, Child);
}
void CodeGenDAGPatterns::ExpandHwModeBasedTypes() {
@@ -4464,8 +4463,8 @@ static void FindDepVarsOf(TreePatternNode &N, DepVarMap &DepMap) {
if (N.hasName() && isa<DefInit>(N.getLeafValue()))
DepMap[N.getName()]++;
} else {
- for (size_t i = 0, e = N.getNumChildren(); i != e; ++i)
- FindDepVarsOf(N.getChild(i), DepMap);
+ for (TreePatternNode &Child : N.children())
+ FindDepVarsOf(Child, DepMap);
}
}
diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h
index f85753ff5ac80b..f8c39172938256 100644
--- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h
+++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h
@@ -722,6 +722,18 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
return cast<const Record *>(OperatorOrVal);
}
+ using child_iterator = pointee_iterator<decltype(Children)::iterator>;
+ using child_const_iterator =
+ pointee_iterator<decltype(Children)::const_iterator>;
+
+ iterator_range<child_iterator> children() {
+ return make_pointee_range(Children);
+ }
+
+ iterator_range<child_const_iterator> children() const {
+ return make_pointee_range(Children);
+ }
+
unsigned getNumChildren() const { return Children.size(); }
const TreePatternNode &getChild(unsigned N) const {
return *Children[N].get();
@@ -855,7 +867,8 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
/// canPatternMatch - If it is impossible for this pattern to match on this
/// target, fill in Reason and return false. Otherwise, return true.
- bool canPatternMatch(std::string &Reason, const CodeGenDAGPatterns &CDP);
+ bool canPatternMatch(std::string &Reason,
+ const CodeGenDAGPatterns &CDP) const;
};
inline raw_ostream &operator<<(raw_ostream &OS, const TreePatternNode &TPN) {
diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp
index 3d39ee148373fd..6d6d72eb70a5b8 100644
--- a/llvm/utils/TableGen/DAGISelEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelEmitter.cpp
@@ -42,7 +42,7 @@ class DAGISelEmitter {
/// Compute the number of instructions for this pattern.
/// This is a temporary hack. We should really include the instruction
/// latencies in this calculation.
-static unsigned getResultPatternCost(TreePatternNode &P,
+static unsigned getResultPatternCost(const TreePatternNode &P,
const CodeGenDAGPatterns &CGP) {
if (P.isLeaf())
return 0;
@@ -55,14 +55,14 @@ static unsigned getResultPatternCost(TreePatternNode &P,
if (II.usesCustomInserter)
Cost += 10;
}
- for (unsigned I = 0, E = P.getNumChildren(); I != E; ++I)
- Cost += getResultPatternCost(P.getChild(I), CGP);
+ for (const TreePatternNode &Child : P.children())
+ Cost += getResultPatternCost(Child, CGP);
return Cost;
}
/// getResultPatternCodeSize - Compute the code size of instructions for this
/// pattern.
-static unsigned getResultPatternSize(TreePatternNode &P,
+static unsigned getResultPatternSize(const TreePatternNode &P,
const CodeGenDAGPatterns &CGP) {
if (P.isLeaf())
return 0;
@@ -72,8 +72,8 @@ static unsigned getResultPatternSize(TreePatternNode &P,
if (Op->isSubClassOf("Instruction")) {
Cost += Op->getValueAsInt("CodeSize");
}
- for (unsigned I = 0, E = P.getNumChildren(); I != E; ++I)
- Cost += getResultPatternSize(P.getChild(I), CGP);
+ for (const TreePatternNode &Child : P.children())
+ Cost += getResultPatternSize(Child, CGP);
return Cost;
}
diff --git a/llvm/utils/TableGen/DAGISelMatcherGen.cpp b/llvm/utils/TableGen/DAGISelMatcherGen.cpp
index a3569bc1770b20..dd05f4df0d7236 100644
--- a/llvm/utils/TableGen/DAGISelMatcherGen.cpp
+++ b/llvm/utils/TableGen/DAGISelMatcherGen.cpp
@@ -307,9 +307,9 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode &N,
// "MY_PAT:op1:op2". We should already have validated that the uses are
// consistent.
std::string PatternName = std::string(N.getOperator()->getName());
- for (unsigned i = 0; i < N.getNumChildren(); ++i) {
+ for (const TreePatternNode &Child : N.children()) {
PatternName += ":";
- PatternName += N.getChild(i).getName();
+ PatternName += Child.getName();
}
if (recordUniqueNode(PatternName)) {
@@ -588,9 +588,9 @@ bool MatcherGen::EmitMatcherCode(unsigned Variant) {
NamedComplexPatternOperands[N.getName()] = NextRecordedOperandNo + 1;
} else {
unsigned CurOp = NextRecordedOperandNo;
- for (unsigned i = 0; i < N.getNumChildren(); ++i) {
- NamedComplexPatternOperands[N.getChild(i).getName()] = CurOp + 1;
- CurOp += N.getChild(i).getNumMIResults(CGP);
+ for (const TreePatternNode &Child : N.children()) {
+ NamedComplexPatternOperands[Child.getName()] = CurOp + 1;
+ CurOp += Child.getNumMIResults(CGP);
}
}
@@ -771,8 +771,8 @@ static unsigned numNodesThatMayLoadOrStore(const TreePatternNode &N,
if (mayInstNodeLoadOrStore(N, CGP))
++Count;
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- Count += numNodesThatMayLoadOrStore(N.getChild(i), CGP);
+ for (const TreePatternNode &Child : N.children())
+ Count += numNodesThatMayLoadOrStore(Child, CGP);
return Count;
}
diff --git a/llvm/utils/TableGen/FastISelEmitter.cpp b/llvm/utils/TableGen/FastISelEmitter.cpp
index 58d2ecc3aaebc2..f60c63c212d619 100644
--- a/llvm/utils/TableGen/FastISelEmitter.cpp
+++ b/llvm/utils/TableGen/FastISelEmitter.cpp
@@ -218,9 +218,7 @@ struct OperandsSignature {
const CodeGenRegisterClass *DstRC = nullptr;
- for (unsigned i = 0, e = InstPatNode.getNumChildren(); i != e; ++i) {
- TreePatternNode &Op = InstPatNode.getChild(i);
-
+ for (const TreePatternNode &Op : InstPatNode.children()) {
// Handle imm operands specially.
if (!Op.isLeaf() && Op.getOperator()->getName() == "imm") {
unsigned PredNo = 0;
@@ -431,8 +429,8 @@ static std::string getLegalCName(std::string OpName) {
FastISelMap::FastISelMap(StringRef instns) : InstNS(instns) {}
-static std::string PhyRegForNode(TreePatternNode &Op,
- const CodeGenTarget &Target) {
+static std::string PhysRegForNode(const TreePatternNode &Op,
+ const CodeGenTarget &Target) {
std::string PhysReg;
if (!Op.isLeaf())
@@ -478,8 +476,7 @@ void FastISelMap::collectPatterns(const CodeGenDAGPatterns &CGP) {
// For now, ignore multi-instruction patterns.
bool MultiInsts = false;
- for (unsigned i = 0, e = Dst.getNumChildren(); i != e; ++i) {
- TreePatternNode &ChildOp = Dst.getChild(i);
+ for (const TreePatternNode &ChildOp : Dst.children()) {
if (ChildOp.isLeaf())
continue;
if (ChildOp.getOperator()->isSubClassOf("Instruction")) {
@@ -555,12 +552,11 @@ void FastISelMap::collectPatterns(const CodeGenDAGPatterns &CGP) {
// the mapping from the src to dst patterns is simple.
bool FoundNonSimplePattern = false;
unsigned DstIndex = 0;
- for (unsigned i = 0, e = InstPatNode.getNumChildren(); i != e; ++i) {
- std::string PhysReg = PhyRegForNode(InstPatNode.getChild(i), Target);
+ for (const TreePatternNode &SrcChild : InstPatNode.children()) {
+ std::string PhysReg = PhysRegForNode(SrcChild, Target);
if (PhysReg.empty()) {
if (DstIndex >= Dst.getNumChildren() ||
- Dst.getChild(DstIndex).getName() !=
- InstPatNode.getChild(i).getName()) {
+ Dst.getChild(DstIndex).getName() != SrcChild.getName()) {
FoundNonSimplePattern = true;
break;
}
diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp
index a3344718cb3626..2259253ab48a00 100644
--- a/llvm/utils/TableGen/GlobalISelEmitter.cpp
+++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp
@@ -974,9 +974,9 @@ Error GlobalISelEmitter::importChildMatcher(
// The "name" of a non-leaf complex pattern (MY_PAT $op1, $op2) is
// "MY_PAT:op1:op2" and the ones with same "name" represent same operand.
std::string PatternName = std::string(SrcChild.getOperator()->getName());
- for (unsigned I = 0; I < SrcChild.getNumChildren(); ++I) {
+ for (const TreePatternNode &Child : SrcChild.children()) {
PatternName += ":";
- PatternName += SrcChild.getChild(I).getName();
+ PatternName += Child.getName();
}
SrcChildName = PatternName;
}
@@ -1348,11 +1348,12 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
// Handle the case where the MVT/register class is omitted in the dest pattern
// but MVT exists in the source pattern.
if (isa<UnsetInit>(DstChild.getLeafValue())) {
- for (unsigned NumOp = 0; NumOp < Src.getNumChildren(); NumOp++)
- if (Src.getChild(NumOp).getName() == DstChild.getName()) {
- DstMIBuilder.addRenderer<CopyRenderer>(Src.getChild(NumOp).getName());
+ for (const TreePatternNode &SrcChild : Src.children()) {
+ if (SrcChild.getName() == DstChild.getName()) {
+ DstMIBuilder.addRenderer<CopyRenderer>(SrcChild.getName());
return InsertPt;
}
+ }
}
return failedImport("Dst pattern child is an unsupported kind");
}
|
@llvm/pr-subscribers-tablegen Author: Sergei Barannikov (s-barannikov) ChangesFull diff: https://github.com/llvm/llvm-project/pull/119877.diff 6 Files Affected:
diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
index b6b669f18cfbce..10f6590e9c7aa3 100644
--- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
@@ -1440,8 +1440,7 @@ static unsigned getPatternSize(const TreePatternNode &P,
++Size;
// Count children in the count if they are also nodes.
- for (unsigned i = 0, e = P.getNumChildren(); i != e; ++i) {
- const TreePatternNode &Child = P.getChild(i);
+ for (const TreePatternNode &Child : P.children()) {
if (!Child.isLeaf() && Child.getNumTypes()) {
const TypeSetByHwMode &T0 = Child.getExtType(0);
// At this point, all variable type sets should be simple, i.e. only
@@ -1747,8 +1746,8 @@ bool TreePatternNode::ContainsUnresolvedType(TreePattern &TP) const {
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)
- if (getChild(i).ContainsUnresolvedType(TP))
+ for (const TreePatternNode &Child : children())
+ if (Child.ContainsUnresolvedType(TP))
return true;
return false;
}
@@ -1923,9 +1922,9 @@ void TreePatternNode::print(raw_ostream &OS) const {
if (getNumChildren() != 0) {
OS << " ";
ListSeparator LS;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
+ for (const TreePatternNode &Child : children()) {
OS << LS;
- getChild(i).print(OS);
+ Child.print(OS);
}
}
OS << ")";
@@ -1998,8 +1997,8 @@ TreePatternNodePtr TreePatternNode::clone() const {
} else {
std::vector<TreePatternNodePtr> CChildren;
CChildren.reserve(Children.size());
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- CChildren.push_back(getChild(i).clone());
+ for (const TreePatternNode &Child : children())
+ CChildren.push_back(Child.clone());
New = makeIntrusiveRefCnt<TreePatternNode>(
getOperator(), std::move(CChildren), getNumTypes());
}
@@ -2018,8 +2017,8 @@ void TreePatternNode::RemoveAllTypes() {
std::fill(Types.begin(), Types.end(), TypeSetByHwMode());
if (isLeaf())
return;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- getChild(i).RemoveAllTypes();
+ for (TreePatternNode &Child : children())
+ Child.RemoveAllTypes();
}
/// SubstituteFormalArguments - Replace the formal arguments in this tree
@@ -2392,8 +2391,8 @@ bool TreePatternNode::TreeHasProperty(SDNP Property,
const CodeGenDAGPatterns &CGP) const {
if (NodeHasProperty(Property, CGP))
return true;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- if (getChild(i).TreeHasProperty(Property, CGP))
+ for (const TreePatternNode &Child : children())
+ if (Child.TreeHasProperty(Property, CGP))
return true;
return false;
}
@@ -2528,8 +2527,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
}
bool MadeChange = false;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- MadeChange |= getChild(i).ApplyTypeConstraints(TP, NotRegisters);
+ for (TreePatternNode &Child : children())
+ MadeChange |= Child.ApplyTypeConstraints(TP, NotRegisters);
MadeChange |= NI.ApplyTypeConstraints(*this, TP);
return MadeChange;
}
@@ -2679,8 +2678,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
return false;
}
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- MadeChange |= getChild(i).ApplyTypeConstraints(TP, NotRegisters);
+ for (TreePatternNode &Child : children())
+ MadeChange |= Child.ApplyTypeConstraints(TP, NotRegisters);
return MadeChange;
}
@@ -2703,8 +2702,8 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
MadeChange |= UpdateNodeType(0, VVT, TP);
}
- for (unsigned i = 0; i < getNumChildren(); ++i)
- MadeChange |= getChild(i).ApplyTypeConstraints(TP, NotRegisters);
+ for (TreePatternNode &Child : children())
+ MadeChange |= Child.ApplyTypeConstraints(TP, NotRegisters);
return MadeChange;
}
@@ -2724,7 +2723,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
/// OnlyOnRHSOfCommutative - Return true if this value is only allowed on the
/// RHS of a commutative operation, not the on LHS.
-static bool OnlyOnRHSOfCommutative(TreePatternNode &N) {
+static bool OnlyOnRHSOfCommutative(const TreePatternNode &N) {
if (!N.isLeaf() && N.getOperator()->getName() == "imm")
return true;
if (N.isLeaf() && isa<IntInit>(N.getLeafValue()))
@@ -2740,12 +2739,12 @@ static bool OnlyOnRHSOfCommutative(TreePatternNode &N) {
/// that can never possibly work), and to prevent the pattern permuter from
/// generating stuff that is useless.
bool TreePatternNode::canPatternMatch(std::string &Reason,
- const CodeGenDAGPatterns &CDP) {
+ const CodeGenDAGPatterns &CDP) const {
if (isLeaf())
return true;
- for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
- if (!getChild(i).canPatternMatch(Reason, CDP))
+ for (const TreePatternNode &Child : children())
+ if (!Child.canPatternMatch(Reason, CDP))
return false;
// If this is an intrinsic, handle cases that would make it not match. For
@@ -2822,8 +2821,8 @@ void TreePattern::ComputeNamedNodes(TreePatternNode &N) {
if (!N.getName().empty())
NamedNodes[N.getName()].push_back(&N);
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- ComputeNamedNodes(N.getChild(i));
+ for (TreePatternNode &Child : N.children())
+ ComputeNamedNodes(Child);
}
TreePatternNodePtr TreePattern::ParseTreePattern(const Init *TheInit,
@@ -3595,8 +3594,8 @@ class InstAnalyzer {
}
// Analyze children.
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- AnalyzeNode(N.getChild(i));
+ for (const TreePatternNode &Child : N.children())
+ AnalyzeNode(Child);
// Notice properties of the node.
if (N.NodeHasProperty(SDNPMayStore, CDP))
@@ -3730,8 +3729,8 @@ static void getInstructionsInTree(TreePatternNode &Tree,
return;
if (Tree.getOperator()->isSubClassOf("Instruction"))
Instrs.push_back(Tree.getOperator());
- for (unsigned i = 0, e = Tree.getNumChildren(); i != e; ++i)
- getInstructionsInTree(Tree.getChild(i), Instrs);
+ for (TreePatternNode &Child : Tree.children())
+ getInstructionsInTree(Child, Instrs);
}
/// Check the class of a pattern leaf node against the instruction operand it
@@ -4010,8 +4009,8 @@ static void FindNames(TreePatternNode &P,
}
if (!P.isLeaf()) {
- for (unsigned i = 0, e = P.getNumChildren(); i != e; ++i)
- FindNames(P.getChild(i), Names, PatternTop);
+ for (TreePatternNode &Child : P.children())
+ FindNames(Child, Names, PatternTop);
}
}
@@ -4195,8 +4194,8 @@ static bool ForceArbitraryInstResultType(TreePatternNode &N, TreePattern &TP) {
return false;
// Analyze children.
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- if (ForceArbitraryInstResultType(N.getChild(i), TP))
+ for (TreePatternNode &Child : N.children())
+ if (ForceArbitraryInstResultType(Child, TP))
return true;
if (!N.getOperator()->isSubClassOf("Instruction"))
@@ -4378,8 +4377,8 @@ static void collectModes(std::set<unsigned> &Modes, const TreePatternNode &N) {
for (const auto &I : VTS)
Modes.insert(I.first);
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- collectModes(Modes, N.getChild(i));
+ for (const TreePatternNode &Child : N.children())
+ collectModes(Modes, Child);
}
void CodeGenDAGPatterns::ExpandHwModeBasedTypes() {
@@ -4464,8 +4463,8 @@ static void FindDepVarsOf(TreePatternNode &N, DepVarMap &DepMap) {
if (N.hasName() && isa<DefInit>(N.getLeafValue()))
DepMap[N.getName()]++;
} else {
- for (size_t i = 0, e = N.getNumChildren(); i != e; ++i)
- FindDepVarsOf(N.getChild(i), DepMap);
+ for (TreePatternNode &Child : N.children())
+ FindDepVarsOf(Child, DepMap);
}
}
diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h
index f85753ff5ac80b..f8c39172938256 100644
--- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h
+++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.h
@@ -722,6 +722,18 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
return cast<const Record *>(OperatorOrVal);
}
+ using child_iterator = pointee_iterator<decltype(Children)::iterator>;
+ using child_const_iterator =
+ pointee_iterator<decltype(Children)::const_iterator>;
+
+ iterator_range<child_iterator> children() {
+ return make_pointee_range(Children);
+ }
+
+ iterator_range<child_const_iterator> children() const {
+ return make_pointee_range(Children);
+ }
+
unsigned getNumChildren() const { return Children.size(); }
const TreePatternNode &getChild(unsigned N) const {
return *Children[N].get();
@@ -855,7 +867,8 @@ class TreePatternNode : public RefCountedBase<TreePatternNode> {
/// canPatternMatch - If it is impossible for this pattern to match on this
/// target, fill in Reason and return false. Otherwise, return true.
- bool canPatternMatch(std::string &Reason, const CodeGenDAGPatterns &CDP);
+ bool canPatternMatch(std::string &Reason,
+ const CodeGenDAGPatterns &CDP) const;
};
inline raw_ostream &operator<<(raw_ostream &OS, const TreePatternNode &TPN) {
diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp
index 3d39ee148373fd..6d6d72eb70a5b8 100644
--- a/llvm/utils/TableGen/DAGISelEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelEmitter.cpp
@@ -42,7 +42,7 @@ class DAGISelEmitter {
/// Compute the number of instructions for this pattern.
/// This is a temporary hack. We should really include the instruction
/// latencies in this calculation.
-static unsigned getResultPatternCost(TreePatternNode &P,
+static unsigned getResultPatternCost(const TreePatternNode &P,
const CodeGenDAGPatterns &CGP) {
if (P.isLeaf())
return 0;
@@ -55,14 +55,14 @@ static unsigned getResultPatternCost(TreePatternNode &P,
if (II.usesCustomInserter)
Cost += 10;
}
- for (unsigned I = 0, E = P.getNumChildren(); I != E; ++I)
- Cost += getResultPatternCost(P.getChild(I), CGP);
+ for (const TreePatternNode &Child : P.children())
+ Cost += getResultPatternCost(Child, CGP);
return Cost;
}
/// getResultPatternCodeSize - Compute the code size of instructions for this
/// pattern.
-static unsigned getResultPatternSize(TreePatternNode &P,
+static unsigned getResultPatternSize(const TreePatternNode &P,
const CodeGenDAGPatterns &CGP) {
if (P.isLeaf())
return 0;
@@ -72,8 +72,8 @@ static unsigned getResultPatternSize(TreePatternNode &P,
if (Op->isSubClassOf("Instruction")) {
Cost += Op->getValueAsInt("CodeSize");
}
- for (unsigned I = 0, E = P.getNumChildren(); I != E; ++I)
- Cost += getResultPatternSize(P.getChild(I), CGP);
+ for (const TreePatternNode &Child : P.children())
+ Cost += getResultPatternSize(Child, CGP);
return Cost;
}
diff --git a/llvm/utils/TableGen/DAGISelMatcherGen.cpp b/llvm/utils/TableGen/DAGISelMatcherGen.cpp
index a3569bc1770b20..dd05f4df0d7236 100644
--- a/llvm/utils/TableGen/DAGISelMatcherGen.cpp
+++ b/llvm/utils/TableGen/DAGISelMatcherGen.cpp
@@ -307,9 +307,9 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode &N,
// "MY_PAT:op1:op2". We should already have validated that the uses are
// consistent.
std::string PatternName = std::string(N.getOperator()->getName());
- for (unsigned i = 0; i < N.getNumChildren(); ++i) {
+ for (const TreePatternNode &Child : N.children()) {
PatternName += ":";
- PatternName += N.getChild(i).getName();
+ PatternName += Child.getName();
}
if (recordUniqueNode(PatternName)) {
@@ -588,9 +588,9 @@ bool MatcherGen::EmitMatcherCode(unsigned Variant) {
NamedComplexPatternOperands[N.getName()] = NextRecordedOperandNo + 1;
} else {
unsigned CurOp = NextRecordedOperandNo;
- for (unsigned i = 0; i < N.getNumChildren(); ++i) {
- NamedComplexPatternOperands[N.getChild(i).getName()] = CurOp + 1;
- CurOp += N.getChild(i).getNumMIResults(CGP);
+ for (const TreePatternNode &Child : N.children()) {
+ NamedComplexPatternOperands[Child.getName()] = CurOp + 1;
+ CurOp += Child.getNumMIResults(CGP);
}
}
@@ -771,8 +771,8 @@ static unsigned numNodesThatMayLoadOrStore(const TreePatternNode &N,
if (mayInstNodeLoadOrStore(N, CGP))
++Count;
- for (unsigned i = 0, e = N.getNumChildren(); i != e; ++i)
- Count += numNodesThatMayLoadOrStore(N.getChild(i), CGP);
+ for (const TreePatternNode &Child : N.children())
+ Count += numNodesThatMayLoadOrStore(Child, CGP);
return Count;
}
diff --git a/llvm/utils/TableGen/FastISelEmitter.cpp b/llvm/utils/TableGen/FastISelEmitter.cpp
index 58d2ecc3aaebc2..f60c63c212d619 100644
--- a/llvm/utils/TableGen/FastISelEmitter.cpp
+++ b/llvm/utils/TableGen/FastISelEmitter.cpp
@@ -218,9 +218,7 @@ struct OperandsSignature {
const CodeGenRegisterClass *DstRC = nullptr;
- for (unsigned i = 0, e = InstPatNode.getNumChildren(); i != e; ++i) {
- TreePatternNode &Op = InstPatNode.getChild(i);
-
+ for (const TreePatternNode &Op : InstPatNode.children()) {
// Handle imm operands specially.
if (!Op.isLeaf() && Op.getOperator()->getName() == "imm") {
unsigned PredNo = 0;
@@ -431,8 +429,8 @@ static std::string getLegalCName(std::string OpName) {
FastISelMap::FastISelMap(StringRef instns) : InstNS(instns) {}
-static std::string PhyRegForNode(TreePatternNode &Op,
- const CodeGenTarget &Target) {
+static std::string PhysRegForNode(const TreePatternNode &Op,
+ const CodeGenTarget &Target) {
std::string PhysReg;
if (!Op.isLeaf())
@@ -478,8 +476,7 @@ void FastISelMap::collectPatterns(const CodeGenDAGPatterns &CGP) {
// For now, ignore multi-instruction patterns.
bool MultiInsts = false;
- for (unsigned i = 0, e = Dst.getNumChildren(); i != e; ++i) {
- TreePatternNode &ChildOp = Dst.getChild(i);
+ for (const TreePatternNode &ChildOp : Dst.children()) {
if (ChildOp.isLeaf())
continue;
if (ChildOp.getOperator()->isSubClassOf("Instruction")) {
@@ -555,12 +552,11 @@ void FastISelMap::collectPatterns(const CodeGenDAGPatterns &CGP) {
// the mapping from the src to dst patterns is simple.
bool FoundNonSimplePattern = false;
unsigned DstIndex = 0;
- for (unsigned i = 0, e = InstPatNode.getNumChildren(); i != e; ++i) {
- std::string PhysReg = PhyRegForNode(InstPatNode.getChild(i), Target);
+ for (const TreePatternNode &SrcChild : InstPatNode.children()) {
+ std::string PhysReg = PhysRegForNode(SrcChild, Target);
if (PhysReg.empty()) {
if (DstIndex >= Dst.getNumChildren() ||
- Dst.getChild(DstIndex).getName() !=
- InstPatNode.getChild(i).getName()) {
+ Dst.getChild(DstIndex).getName() != SrcChild.getName()) {
FoundNonSimplePattern = true;
break;
}
diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp
index a3344718cb3626..2259253ab48a00 100644
--- a/llvm/utils/TableGen/GlobalISelEmitter.cpp
+++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp
@@ -974,9 +974,9 @@ Error GlobalISelEmitter::importChildMatcher(
// The "name" of a non-leaf complex pattern (MY_PAT $op1, $op2) is
// "MY_PAT:op1:op2" and the ones with same "name" represent same operand.
std::string PatternName = std::string(SrcChild.getOperator()->getName());
- for (unsigned I = 0; I < SrcChild.getNumChildren(); ++I) {
+ for (const TreePatternNode &Child : SrcChild.children()) {
PatternName += ":";
- PatternName += SrcChild.getChild(I).getName();
+ PatternName += Child.getName();
}
SrcChildName = PatternName;
}
@@ -1348,11 +1348,12 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
// Handle the case where the MVT/register class is omitted in the dest pattern
// but MVT exists in the source pattern.
if (isa<UnsetInit>(DstChild.getLeafValue())) {
- for (unsigned NumOp = 0; NumOp < Src.getNumChildren(); NumOp++)
- if (Src.getChild(NumOp).getName() == DstChild.getName()) {
- DstMIBuilder.addRenderer<CopyRenderer>(Src.getChild(NumOp).getName());
+ for (const TreePatternNode &SrcChild : Src.children()) {
+ if (SrcChild.getName() == DstChild.getName()) {
+ DstMIBuilder.addRenderer<CopyRenderer>(SrcChild.getName());
return InsertPt;
}
+ }
}
return failedImport("Dst pattern child is an unsupported kind");
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
No description provided.