1 //===- DAGISelMatcher.cpp - Representation of DAG pattern matcher ---------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "DAGISelMatcher.h"
11 #include "CodeGenDAGPatterns.h"
12 #include "CodeGenTarget.h"
14 #include "llvm/Support/raw_ostream.h"
17 void MatcherNode::dump() const {
21 void MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
23 return Next->print(OS, indent);
27 void ScopeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
28 OS.indent(indent) << "Scope\n";
29 Check->print(OS, indent+2);
30 printNext(OS, indent);
33 void RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
34 OS.indent(indent) << "Record\n";
35 printNext(OS, indent);
38 void RecordChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
39 OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
40 printNext(OS, indent);
43 void RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
44 OS.indent(indent) << "RecordMemRef\n";
45 printNext(OS, indent);
48 void CaptureFlagInputMatcherNode::print(raw_ostream &OS, unsigned indent) const{
49 OS.indent(indent) << "CaptureFlagInput\n";
50 printNext(OS, indent);
53 void MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
54 OS.indent(indent) << "MoveChild " << ChildNo << '\n';
55 printNext(OS, indent);
58 void MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
59 OS.indent(indent) << "MoveParent\n";
60 printNext(OS, indent);
63 void CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
64 OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
65 printNext(OS, indent);
68 void CheckPatternPredicateMatcherNode::
69 print(raw_ostream &OS, unsigned indent) const {
70 OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
71 printNext(OS, indent);
74 void CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
75 OS.indent(indent) << "CheckPredicate " << PredName << '\n';
76 printNext(OS, indent);
79 void CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
80 OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
81 printNext(OS, indent);
84 void CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
85 OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
86 printNext(OS, indent);
89 void CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
90 OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
91 printNext(OS, indent);
94 void CheckChildTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
95 OS.indent(indent) << "CheckChildType " << ChildNo << " "
96 << getEnumName(Type) << '\n';
97 printNext(OS, indent);
101 void CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
102 OS.indent(indent) << "CheckInteger " << Value << '\n';
103 printNext(OS, indent);
106 void CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
107 OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
108 printNext(OS, indent);
111 void CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
112 OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
113 printNext(OS, indent);
116 void CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
117 OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
118 printNext(OS, indent);
121 void CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
122 OS.indent(indent) << "CheckAndImm " << Value << '\n';
123 printNext(OS, indent);
126 void CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
127 OS.indent(indent) << "CheckOrImm " << Value << '\n';
128 printNext(OS, indent);
131 void CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
132 unsigned indent) const {
133 OS.indent(indent) << "CheckFoldableChainNode\n";
134 printNext(OS, indent);
137 void CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
138 unsigned indent) const {
139 OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n";
140 printNext(OS, indent);
143 void EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
144 OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
145 printNext(OS, indent);
148 void EmitStringIntegerMatcherNode::
149 print(raw_ostream &OS, unsigned indent) const {
150 OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
151 printNext(OS, indent);
154 void EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
155 OS.indent(indent) << "EmitRegister ";
157 OS << Reg->getName();
160 OS << " VT=" << VT << '\n';
161 printNext(OS, indent);
164 void EmitConvertToTargetMatcherNode::
165 print(raw_ostream &OS, unsigned indent) const {
166 OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
167 printNext(OS, indent);
170 void EmitMergeInputChainsMatcherNode::
171 print(raw_ostream &OS, unsigned indent) const {
172 OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
173 printNext(OS, indent);
176 void EmitCopyToRegMatcherNode::print(raw_ostream &OS, unsigned indent) const {
177 OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
178 printNext(OS, indent);
181 void EmitNodeXFormMatcherNode::print(raw_ostream &OS, unsigned indent) const {
182 OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
183 << " Slot=" << Slot << '\n';
184 printNext(OS, indent);
188 void EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
189 OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
191 for (unsigned i = 0, e = VTs.size(); i != e; ++i)
192 OS << ' ' << getEnumName(VTs[i]);
194 for (unsigned i = 0, e = Operands.size(); i != e; ++i)
195 OS << Operands[i] << ' ';
197 printNext(OS, indent);
200 void MarkFlagResultsMatcherNode::print(raw_ostream &OS, unsigned indent) const {
201 OS.indent(indent) << "MarkFlagResults <todo: args>\n";
202 printNext(OS, indent);
205 void CompleteMatchMatcherNode::print(raw_ostream &OS, unsigned indent) const {
206 OS.indent(indent) << "CompleteMatch <todo args>\n";
207 OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
208 OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
209 printNext(OS, indent);