mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Use unique_ptr to handle ownership of TreePatterns in CodeGenDAGPatterns::PatternFragments
We might be able to use unique_ptr to handle ownership of the TreePatternNodes too - looking into that next. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221928 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
365df40768
commit
bea87dad5e
@ -2263,13 +2263,6 @@ CodeGenDAGPatterns::CodeGenDAGPatterns(RecordKeeper &R) :
|
|||||||
VerifyInstructionFlags();
|
VerifyInstructionFlags();
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeGenDAGPatterns::~CodeGenDAGPatterns() {
|
|
||||||
for (pf_iterator I = PatternFragments.begin(),
|
|
||||||
E = PatternFragments.end(); I != E; ++I)
|
|
||||||
delete I->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Record *CodeGenDAGPatterns::getSDNodeNamed(const std::string &Name) const {
|
Record *CodeGenDAGPatterns::getSDNodeNamed(const std::string &Name) const {
|
||||||
Record *N = Records.getDef(Name);
|
Record *N = Records.getDef(Name);
|
||||||
if (!N || !N->isSubClassOf("SDNode")) {
|
if (!N || !N->isSubClassOf("SDNode")) {
|
||||||
@ -2331,9 +2324,9 @@ void CodeGenDAGPatterns::ParsePatternFragments(bool OutFrags) {
|
|||||||
|
|
||||||
DagInit *Tree = Fragments[i]->getValueAsDag("Fragment");
|
DagInit *Tree = Fragments[i]->getValueAsDag("Fragment");
|
||||||
TreePattern *P =
|
TreePattern *P =
|
||||||
new TreePattern(Fragments[i], Tree,
|
(PatternFragments[Fragments[i]] = llvm::make_unique<TreePattern>(
|
||||||
!Fragments[i]->isSubClassOf("OutPatFrag"), *this);
|
Fragments[i], Tree, !Fragments[i]->isSubClassOf("OutPatFrag"),
|
||||||
PatternFragments[Fragments[i]] = P;
|
*this)).get();
|
||||||
|
|
||||||
// Validate the argument list, converting it to set, to discard duplicates.
|
// Validate the argument list, converting it to set, to discard duplicates.
|
||||||
std::vector<std::string> &Args = P->getArgList();
|
std::vector<std::string> &Args = P->getArgList();
|
||||||
@ -2391,16 +2384,16 @@ void CodeGenDAGPatterns::ParsePatternFragments(bool OutFrags) {
|
|||||||
if (OutFrags != Fragments[i]->isSubClassOf("OutPatFrag"))
|
if (OutFrags != Fragments[i]->isSubClassOf("OutPatFrag"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
TreePattern *ThePat = PatternFragments[Fragments[i]];
|
TreePattern &ThePat = *PatternFragments[Fragments[i]];
|
||||||
ThePat->InlinePatternFragments();
|
ThePat.InlinePatternFragments();
|
||||||
|
|
||||||
// Infer as many types as possible. Don't worry about it if we don't infer
|
// Infer as many types as possible. Don't worry about it if we don't infer
|
||||||
// all of them, some may depend on the inputs of the pattern.
|
// all of them, some may depend on the inputs of the pattern.
|
||||||
ThePat->InferAllTypes();
|
ThePat.InferAllTypes();
|
||||||
ThePat->resetError();
|
ThePat.resetError();
|
||||||
|
|
||||||
// If debugging, print out the pattern fragment result.
|
// If debugging, print out the pattern fragment result.
|
||||||
DEBUG(ThePat->dump());
|
DEBUG(ThePat.dump());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -702,7 +702,8 @@ class CodeGenDAGPatterns {
|
|||||||
std::map<Record*, SDNodeInfo, LessRecordByID> SDNodes;
|
std::map<Record*, SDNodeInfo, LessRecordByID> SDNodes;
|
||||||
std::map<Record*, std::pair<Record*, std::string>, LessRecordByID> SDNodeXForms;
|
std::map<Record*, std::pair<Record*, std::string>, LessRecordByID> SDNodeXForms;
|
||||||
std::map<Record*, ComplexPattern, LessRecordByID> ComplexPatterns;
|
std::map<Record*, ComplexPattern, LessRecordByID> ComplexPatterns;
|
||||||
std::map<Record*, TreePattern*, LessRecordByID> PatternFragments;
|
std::map<Record *, std::unique_ptr<TreePattern>, LessRecordByID>
|
||||||
|
PatternFragments;
|
||||||
std::map<Record*, DAGDefaultOperand, LessRecordByID> DefaultOperands;
|
std::map<Record*, DAGDefaultOperand, LessRecordByID> DefaultOperands;
|
||||||
std::map<Record*, DAGInstruction, LessRecordByID> Instructions;
|
std::map<Record*, DAGInstruction, LessRecordByID> Instructions;
|
||||||
|
|
||||||
@ -716,7 +717,6 @@ class CodeGenDAGPatterns {
|
|||||||
std::vector<PatternToMatch> PatternsToMatch;
|
std::vector<PatternToMatch> PatternsToMatch;
|
||||||
public:
|
public:
|
||||||
CodeGenDAGPatterns(RecordKeeper &R);
|
CodeGenDAGPatterns(RecordKeeper &R);
|
||||||
~CodeGenDAGPatterns();
|
|
||||||
|
|
||||||
CodeGenTarget &getTargetInfo() { return Target; }
|
CodeGenTarget &getTargetInfo() { return Target; }
|
||||||
const CodeGenTarget &getTargetInfo() const { return Target; }
|
const CodeGenTarget &getTargetInfo() const { return Target; }
|
||||||
@ -778,15 +778,15 @@ public:
|
|||||||
// Pattern Fragment information.
|
// Pattern Fragment information.
|
||||||
TreePattern *getPatternFragment(Record *R) const {
|
TreePattern *getPatternFragment(Record *R) const {
|
||||||
assert(PatternFragments.count(R) && "Invalid pattern fragment request!");
|
assert(PatternFragments.count(R) && "Invalid pattern fragment request!");
|
||||||
return PatternFragments.find(R)->second;
|
return PatternFragments.find(R)->second.get();
|
||||||
}
|
}
|
||||||
TreePattern *getPatternFragmentIfRead(Record *R) const {
|
TreePattern *getPatternFragmentIfRead(Record *R) const {
|
||||||
if (!PatternFragments.count(R)) return nullptr;
|
if (!PatternFragments.count(R))
|
||||||
return PatternFragments.find(R)->second;
|
return nullptr;
|
||||||
|
return PatternFragments.find(R)->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::map<Record*, TreePattern*, LessRecordByID>::const_iterator
|
typedef decltype(PatternFragments)::const_iterator pf_iterator;
|
||||||
pf_iterator;
|
|
||||||
pf_iterator pf_begin() const { return PatternFragments.begin(); }
|
pf_iterator pf_begin() const { return PatternFragments.begin(); }
|
||||||
pf_iterator pf_end() const { return PatternFragments.end(); }
|
pf_iterator pf_end() const { return PatternFragments.end(); }
|
||||||
|
|
||||||
|
@ -630,7 +630,7 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
|||||||
|
|
||||||
for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
|
for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
|
||||||
I != E; ++I)
|
I != E; ++I)
|
||||||
PFsByName[I->first->getName()] = I->second;
|
PFsByName[I->first->getName()] = I->second.get();
|
||||||
|
|
||||||
if (!NodePredicates.empty()) {
|
if (!NodePredicates.empty()) {
|
||||||
OS << "bool CheckNodePredicate(SDNode *Node,\n";
|
OS << "bool CheckNodePredicate(SDNode *Node,\n";
|
||||||
|
Loading…
Reference in New Issue
Block a user