std::string getPredCode() const;
std::string getImmCode() const;
};
-
+
/// FIXME: TreePatternNode's can be shared in some cases (due to dag-shaped
/// patterns), and as such should be ref counted. We currently just leak all
/// Trees - The list of pattern trees which corresponds to this pattern.
/// Note that PatFrag's only have a single tree.
///
- std::vector<std::unique_ptr<TreePatternNode>> Trees;
+ std::vector<TreePatternNode*> Trees;
/// NamedNodes - This is all of the nodes that have names in the trees in this
/// pattern.
CodeGenDAGPatterns &ise);
TreePattern(Record *TheRec, DagInit *Pat, bool isInput,
CodeGenDAGPatterns &ise);
- TreePattern(Record *TheRec, std::unique_ptr<TreePatternNode> Pat,
- bool isInput, CodeGenDAGPatterns &ise);
+ TreePattern(Record *TheRec, TreePatternNode *Pat, bool isInput,
+ CodeGenDAGPatterns &ise);
/// getTrees - Return the tree patterns which corresponds to this pattern.
///
- const std::vector<std::unique_ptr<TreePatternNode>> &getTrees() const {
- return Trees;
- }
+ const std::vector<TreePatternNode*> &getTrees() const { return Trees; }
unsigned getNumTrees() const { return Trees.size(); }
- TreePatternNode *getTree(unsigned i) const { return Trees[i].get(); }
- std::unique_ptr<TreePatternNode> &getOnlyTree() {
+ TreePatternNode *getTree(unsigned i) const { return Trees[i]; }
+ TreePatternNode *getOnlyTree() const {
assert(Trees.size() == 1 && "Doesn't have exactly one pattern!");
return Trees[0];
}
/// PatFrag references.
void InlinePatternFragments() {
for (unsigned i = 0, e = Trees.size(); i != e; ++i)
- // Can leak, if InlinePatternFragments doesn't return 'this'
- Trees[i].reset(Trees[i].release()->InlinePatternFragments(*this));
+ Trees[i] = Trees[i]->InlinePatternFragments(*this);
}
/// InferAllTypes - Infer/propagate as many types throughout the expression
void dump() const;
private:
- std::unique_ptr<TreePatternNode> ParseTreePattern(Init *DI, StringRef OpName);
+ TreePatternNode *ParseTreePattern(Init *DI, StringRef OpName);
void ComputeNamedNodes();
void ComputeNamedNodes(TreePatternNode *N);
};
std::vector<Record*> Results;
std::vector<Record*> Operands;
std::vector<Record*> ImpResults;
- std::unique_ptr<TreePatternNode> ResultPattern;
-
+ TreePatternNode *ResultPattern;
public:
DAGInstruction(TreePattern *TP,
const std::vector<Record*> &results,
const std::vector<Record*> &operands,
const std::vector<Record*> &impresults)
: Pattern(TP), Results(results), Operands(operands),
- ImpResults(impresults) {}
+ ImpResults(impresults), ResultPattern(nullptr) {}
TreePattern *getPattern() const { return Pattern; }
unsigned getNumResults() const { return Results.size(); }
unsigned getNumImpResults() const { return ImpResults.size(); }
const std::vector<Record*>& getImpResults() const { return ImpResults; }
- void setResultPattern(std::unique_ptr<TreePatternNode> R) {
- ResultPattern = std::move(R);
- }
+ void setResultPattern(TreePatternNode *R) { ResultPattern = R; }
Record *getResult(unsigned RN) const {
assert(RN < Results.size());
return ImpResults[RN];
}
- TreePatternNode *getResultPattern() const { return ResultPattern.get(); }
+ TreePatternNode *getResultPattern() const { return ResultPattern; }
};
/// PatternToMatch - Used by CodeGenDAGPatterns to keep tab of patterns