summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2014-11-17 22:16:55 +0000
committerDavid Blaikie <dblaikie@gmail.com>2014-11-17 22:16:55 +0000
commit8922a17af3fa0da165c0f49273c6fb7228163edd (patch)
treeba7d1b218af6f4b296b7386217969445d3b2252b /llvm/utils/TableGen/CodeGenDAGPatterns.cpp
parent6edef20405d2f6ac190d796b215d6d288e8dc125 (diff)
downloadbcm5719-llvm-8922a17af3fa0da165c0f49273c6fb7228163edd.tar.gz
bcm5719-llvm-8922a17af3fa0da165c0f49273c6fb7228163edd.zip
Improve memory ownership/management in TableGen by unique_ptrifying TreePattern's Tree member.
The next step is to actually use unique_ptr in TreePatternNode's Children vector. That will be more intrusive, and may not work, depending on exactly how these things are handled (I have a bad suspicion things are shared more than they should be, making this more DAG than tree - but if it's really a tree, unique_ptr should suffice) llvm-svn: 222183
Diffstat (limited to 'llvm/utils/TableGen/CodeGenDAGPatterns.cpp')
-rw-r--r--llvm/utils/TableGen/CodeGenDAGPatterns.cpp70
1 files changed, 36 insertions, 34 deletions
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
index a750aa9f4ec..26f32d2026e 100644
--- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
+++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -1902,10 +1902,10 @@ TreePattern::TreePattern(Record *TheRec, DagInit *Pat, bool isInput,
Trees.push_back(ParseTreePattern(Pat, ""));
}
-TreePattern::TreePattern(Record *TheRec, TreePatternNode *Pat, bool isInput,
+TreePattern::TreePattern(Record *TheRec, std::unique_ptr<TreePatternNode> Pat, bool isInput,
CodeGenDAGPatterns &cdp) : TheRecord(TheRec), CDP(cdp),
isInputPattern(isInput), HasError(false) {
- Trees.push_back(Pat);
+ Trees.push_back(std::move(Pat));
}
void TreePattern::error(const Twine &Msg) {
@@ -1918,7 +1918,7 @@ void TreePattern::error(const Twine &Msg) {
void TreePattern::ComputeNamedNodes() {
for (unsigned i = 0, e = Trees.size(); i != e; ++i)
- ComputeNamedNodes(Trees[i]);
+ ComputeNamedNodes(Trees[i].get());
}
void TreePattern::ComputeNamedNodes(TreePatternNode *N) {
@@ -1929,8 +1929,8 @@ void TreePattern::ComputeNamedNodes(TreePatternNode *N) {
ComputeNamedNodes(N->getChild(i));
}
-
-TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
+std::unique_ptr<TreePatternNode>
+TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName) {
if (DefInit *DI = dyn_cast<DefInit>(TheInit)) {
Record *R = DI->getDef();
@@ -1944,7 +1944,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
OpName);
// Input argument?
- TreePatternNode *Res = new TreePatternNode(DI, 1);
+ auto Res = llvm::make_unique<TreePatternNode>(DI, 1);
if (R->getName() == "node" && !OpName.empty()) {
if (OpName.empty())
error("'node' argument requires a name to match with operand list");
@@ -1959,7 +1959,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
if (TheInit == UnsetInit::get()) {
if (OpName.empty())
error("'?' argument requires a name to match with operand list");
- TreePatternNode *Res = new TreePatternNode(TheInit, 1);
+ auto Res = llvm::make_unique<TreePatternNode>(TheInit, 1);
Args.push_back(OpName);
Res->setName(OpName);
return Res;
@@ -1968,7 +1968,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
if (IntInit *II = dyn_cast<IntInit>(TheInit)) {
if (!OpName.empty())
error("Constant int argument should not have a name!");
- return new TreePatternNode(II, 1);
+ return llvm::make_unique<TreePatternNode>(II, 1);
}
if (BitsInit *BI = dyn_cast<BitsInit>(TheInit)) {
@@ -1994,7 +1994,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
if (Dag->getNumArgs() != 1)
error("Type cast only takes one operand!");
- TreePatternNode *New = ParseTreePattern(Dag->getArg(0), Dag->getArgName(0));
+ auto New = ParseTreePattern(Dag->getArg(0), Dag->getArgName(0));
// Apply the type cast.
assert(New->getNumTypes() == 1 && "FIXME: Unhandled");
@@ -2044,7 +2044,8 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
// Parse all the operands.
for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i)
- Children.push_back(ParseTreePattern(Dag->getArg(i), Dag->getArgName(i)));
+ Children.push_back(
+ ParseTreePattern(Dag->getArg(i), Dag->getArgName(i)).release());
// If the operator is an intrinsic, then this is just syntactic sugar for for
// (intrinsic_* <number>, ..children..). Pick the right intrinsic node, and
@@ -2089,7 +2090,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
}
unsigned NumResults = GetNumNodeResults(Operator, CDP);
- TreePatternNode *Result = new TreePatternNode(Operator, Children, NumResults);
+ auto Result = llvm::make_unique<TreePatternNode>(Operator, Children, NumResults);
Result->setName(OpName);
if (!Dag->getName().empty()) {
@@ -2105,7 +2106,7 @@ TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
/// more type generic things and have useless type casts fold away.
///
/// This returns true if any change is made.
-static bool SimplifyTree(TreePatternNode *&N) {
+static bool SimplifyTree(std::unique_ptr<TreePatternNode> &N) {
if (N->isLeaf())
return false;
@@ -2115,7 +2116,7 @@ static bool SimplifyTree(TreePatternNode *&N) {
N->getExtType(0).isConcrete() &&
N->getExtType(0) == N->getChild(0)->getExtType(0) &&
N->getName().empty()) {
- N = N->getChild(0);
+ N.reset(N->getChild(0));
SimplifyTree(N);
return true;
}
@@ -2123,9 +2124,9 @@ static bool SimplifyTree(TreePatternNode *&N) {
// Walk all children.
bool MadeChange = false;
for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) {
- TreePatternNode *Child = N->getChild(i);
+ std::unique_ptr<TreePatternNode> Child(N->getChild(i));
MadeChange |= SimplifyTree(Child);
- N->setChild(i, Child);
+ N->setChild(i, Child.release());
}
return MadeChange;
}
@@ -2172,7 +2173,7 @@ InferAllTypes(const StringMap<SmallVector<TreePatternNode*,1> > *InNamedTypes) {
// changing the type of the input register in this case. This allows
// us to match things like:
// def : Pat<(v1i64 (bitconvert(v2i32 DPR:$src))), (v1i64 DPR:$src)>;
- if (Nodes[i] == Trees[0] && Nodes[i]->isLeaf()) {
+ if (Nodes[i] == Trees[0].get() && Nodes[i]->isLeaf()) {
DefInit *DI = dyn_cast<DefInit>(Nodes[i]->getLeafValue());
if (DI && (DI->getDef()->isSubClassOf("RegisterClass") ||
DI->getDef()->isSubClassOf("RegisterOperand")))
@@ -2924,26 +2925,27 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern(
I->error("Input operand $" + InstInputsCheck.begin()->first +
" occurs in pattern but not in operands list!");
- TreePatternNode *ResultPattern =
- new TreePatternNode(I->getRecord(), ResultNodeOperands,
- GetNumNodeResults(I->getRecord(), *this));
+ auto ResultPattern = llvm::make_unique<TreePatternNode>(
+ I->getRecord(), ResultNodeOperands,
+ GetNumNodeResults(I->getRecord(), *this));
+
// Copy fully inferred output node type to instruction result pattern.
for (unsigned i = 0; i != NumResults; ++i)
ResultPattern->setType(i, Res0Node->getExtType(i));
// Create and insert the instruction.
// FIXME: InstImpResults should not be part of DAGInstruction.
- DAGInstruction TheInst(I, Results, Operands, InstImpResults);
- DAGInsts.insert(std::make_pair(I->getRecord(), TheInst));
+ DAGInsts.insert(std::make_pair(
+ I->getRecord(), DAGInstruction(I, Results, Operands, InstImpResults)));
// Use a temporary tree pattern to infer all types and make sure that the
// constructed result is correct. This depends on the instruction already
// being inserted into the DAGInsts map.
- TreePattern Temp(I->getRecord(), ResultPattern, false, *this);
+ TreePattern Temp(I->getRecord(), std::move(ResultPattern), false, *this);
Temp.InferAllTypes(&I->getNamedNodesMap());
DAGInstruction &TheInsertedInst = DAGInsts.find(I->getRecord())->second;
- TheInsertedInst.setResultPattern(Temp.getOnlyTree());
+ TheInsertedInst.setResultPattern(std::move(Temp.getOnlyTree()));
return TheInsertedInst;
}
@@ -3375,7 +3377,7 @@ void CodeGenDAGPatterns::ParsePatterns() {
InstImpResults);
// Promote the xform function to be an explicit node if set.
- TreePatternNode *DstPattern = Result.getOnlyTree();
+ auto DstPattern = std::move(Result.getOnlyTree());
std::vector<TreePatternNode*> ResultNodeOperands;
for (unsigned ii = 0, ee = DstPattern->getNumChildren(); ii != ee; ++ii) {
TreePatternNode *OpNode = DstPattern->getChild(ii);
@@ -3387,16 +3389,16 @@ void CodeGenDAGPatterns::ParsePatterns() {
}
ResultNodeOperands.push_back(OpNode);
}
- DstPattern = Result.getOnlyTree();
- if (!DstPattern->isLeaf())
- DstPattern = new TreePatternNode(DstPattern->getOperator(),
- ResultNodeOperands,
- DstPattern->getNumTypes());
-
- for (unsigned i = 0, e = Result.getOnlyTree()->getNumTypes(); i != e; ++i)
- DstPattern->setType(i, Result.getOnlyTree()->getExtType(i));
+ if (!DstPattern->isLeaf()) {
+ auto NewPattern = llvm::make_unique<TreePatternNode>(
+ DstPattern->getOperator(), ResultNodeOperands,
+ DstPattern->getNumTypes());
+ for (unsigned i = 0, e = DstPattern->getNumTypes(); i != e; ++i)
+ NewPattern->setType(i, DstPattern->getExtType(i));
+ DstPattern = std::move(NewPattern);
+ }
- TreePattern Temp(Result.getRecord(), DstPattern, false, *this);
+ TreePattern Temp(Result.getRecord(), std::move(DstPattern), false, *this);
Temp.InferAllTypes();
@@ -3404,7 +3406,7 @@ void CodeGenDAGPatterns::ParsePatterns() {
PatternToMatch(CurPattern,
CurPattern->getValueAsListInit("Predicates"),
Pattern->getTree(0),
- Temp.getOnlyTree(), InstImpResults,
+ Temp.getOnlyTree().release(), InstImpResults,
CurPattern->getValueAsInt("AddedComplexity"),
CurPattern->getID()));
}
OpenPOWER on IntegriCloud