diff options
author | Florian Hahn <florian.hahn@arm.com> | 2018-06-08 09:54:04 +0000 |
---|---|---|
committer | Florian Hahn <florian.hahn@arm.com> | 2018-06-08 09:54:04 +0000 |
commit | 84e6ef00dc96cedda96959f3e03852d2336c7b8c (patch) | |
tree | f2dd15e7dcff57a8870fe1cb5be9d027ce94f7d4 /llvm/utils | |
parent | e018b36cea1e921c24d41f6e651fcba1dee1cf6d (diff) | |
download | bcm5719-llvm-84e6ef00dc96cedda96959f3e03852d2336c7b8c.tar.gz bcm5719-llvm-84e6ef00dc96cedda96959f3e03852d2336c7b8c.zip |
[TableGen] Make DAGInstruction own Pattern to avoid leaking it.
Reviewers: dsanders, craig.topper, stoklund, nhaehnle
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D47525
llvm-svn: 334275
Diffstat (limited to 'llvm/utils')
-rw-r--r-- | llvm/utils/TableGen/CodeGenDAGPatterns.cpp | 16 | ||||
-rw-r--r-- | llvm/utils/TableGen/CodeGenDAGPatterns.h | 8 |
2 files changed, 13 insertions, 11 deletions
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index 3394afca6e2..0a571bd8628 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -3423,7 +3423,7 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern( assert(!DAGInsts.count(CGI.TheDef) && "Instruction already parsed!"); // Parse the instruction. - TreePattern *I = new TreePattern(CGI.TheDef, Pat, true, *this); + auto I = llvm::make_unique<TreePattern>(CGI.TheDef, Pat, true, *this); // Inline pattern fragments into it. I->InlinePatternFragments(); @@ -3461,7 +3461,7 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern( } // Find inputs and outputs, and verify the structure of the uses/defs. - FindPatternInputsAndOutputs(I, Pat, InstInputs, InstResults, + FindPatternInputsAndOutputs(I.get(), Pat, InstInputs, InstResults, InstImpResults); } @@ -3572,16 +3572,18 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern( // 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)); + TreePattern *InstPattern = I.get(); + DAGInstruction TheInst(std::move(I), Results, Operands, InstImpResults); + DAGInsts.emplace(InstPattern->getRecord(), std::move(TheInst)); // 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); - Temp.InferAllTypes(&I->getNamedNodesMap()); + TreePattern Temp(InstPattern->getRecord(), ResultPattern, false, *this); + Temp.InferAllTypes(&InstPattern->getNamedNodesMap()); - DAGInstruction &TheInsertedInst = DAGInsts.find(I->getRecord())->second; + DAGInstruction &TheInsertedInst = + DAGInsts.find(InstPattern->getRecord())->second; TheInsertedInst.setResultPattern(Temp.getOnlyTree()); return TheInsertedInst; diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.h b/llvm/utils/TableGen/CodeGenDAGPatterns.h index 9fcd5412106..f029b213e0a 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.h +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.h @@ -907,21 +907,21 @@ struct DAGDefaultOperand { }; class DAGInstruction { - TreePattern *Pattern; + std::unique_ptr<TreePattern> Pattern; std::vector<Record*> Results; std::vector<Record*> Operands; std::vector<Record*> ImpResults; TreePatternNodePtr ResultPattern; public: - DAGInstruction(TreePattern *TP, + DAGInstruction(std::unique_ptr<TreePattern> &&TP, const std::vector<Record*> &results, const std::vector<Record*> &operands, const std::vector<Record*> &impresults) - : Pattern(TP), Results(results), Operands(operands), + : Pattern(std::move(TP)), Results(results), Operands(operands), ImpResults(impresults), ResultPattern(nullptr) {} - TreePattern *getPattern() const { return Pattern; } + TreePattern *getPattern() const { return Pattern.get(); } unsigned getNumResults() const { return Results.size(); } unsigned getNumOperands() const { return Operands.size(); } unsigned getNumImpResults() const { return ImpResults.size(); } |