implement a simple proof-of-concept optimization for
[oota-llvm.git] / utils / TableGen / DAGISelMatcher.cpp
1 //===- DAGISelMatcher.cpp - Representation of DAG pattern matcher ---------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "DAGISelMatcher.h"
11 #include "CodeGenDAGPatterns.h"
12 #include "CodeGenTarget.h"
13 #include "Record.h"
14 #include "llvm/Support/raw_ostream.h"
15 using namespace llvm;
16
17 void MatcherNode::dump() const {
18   print(errs());
19 }
20
21 void MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
22   if (Next)
23     return Next->print(OS, indent);
24 }
25
26
27 void PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
28   OS.indent(indent) << "Push\n";
29   printNext(OS, indent+2);
30   Failure->print(OS, indent);
31 }
32
33 void RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
34   OS.indent(indent) << "Record\n";
35   printNext(OS, indent);
36 }
37
38 void RecordChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
39   OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
40   printNext(OS, indent);
41 }
42
43 void RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
44   OS.indent(indent) << "RecordMemRef\n";
45   printNext(OS, indent);
46 }
47
48 void CaptureFlagInputMatcherNode::print(raw_ostream &OS, unsigned indent) const{
49   OS.indent(indent) << "CaptureFlagInput\n";
50   printNext(OS, indent);
51 }
52
53 void MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
54   OS.indent(indent) << "MoveChild " << ChildNo << '\n';
55   printNext(OS, indent);
56 }
57
58 void MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
59   OS.indent(indent) << "MoveParent\n";
60   printNext(OS, indent);
61 }
62
63 void CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
64   OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
65   printNext(OS, indent);
66 }
67
68 void CheckPatternPredicateMatcherNode::
69 print(raw_ostream &OS, unsigned indent) const {
70   OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
71   printNext(OS, indent);
72 }
73
74 void CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
75   OS.indent(indent) << "CheckPredicate " << PredName << '\n';
76   printNext(OS, indent);
77 }
78
79 void CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
80   OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
81   printNext(OS, indent);
82 }
83
84 void CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
85   OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
86   printNext(OS, indent);
87 }
88
89 void CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
90   OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
91   printNext(OS, indent);
92 }
93
94 void CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
95   OS.indent(indent) << "CheckInteger " << Value << '\n';
96   printNext(OS, indent);
97 }
98
99 void CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
100   OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
101   printNext(OS, indent);
102 }
103
104 void CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
105   OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
106   printNext(OS, indent);
107 }
108
109 void CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
110   OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
111   printNext(OS, indent);
112 }
113
114 void CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
115   OS.indent(indent) << "CheckAndImm " << Value << '\n';
116   printNext(OS, indent);
117 }
118
119 void CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
120   OS.indent(indent) << "CheckOrImm " << Value << '\n';
121   printNext(OS, indent);
122 }
123
124 void CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
125                                               unsigned indent) const {
126   OS.indent(indent) << "CheckFoldableChainNode\n";
127   printNext(OS, indent);
128 }
129
130 void CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
131                                               unsigned indent) const {
132   OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n";
133   printNext(OS, indent);
134 }
135
136 void EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
137   OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
138   printNext(OS, indent);
139 }
140
141 void EmitStringIntegerMatcherNode::
142 print(raw_ostream &OS, unsigned indent) const {
143   OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
144   printNext(OS, indent);
145 }
146
147 void EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
148   OS.indent(indent) << "EmitRegister ";
149   if (Reg)
150     OS << Reg->getName();
151   else
152     OS << "zero_reg";
153   OS << " VT=" << VT << '\n';
154   printNext(OS, indent);
155 }
156
157 void EmitConvertToTargetMatcherNode::
158 print(raw_ostream &OS, unsigned indent) const {
159   OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
160   printNext(OS, indent);
161 }
162
163 void EmitMergeInputChainsMatcherNode::
164 print(raw_ostream &OS, unsigned indent) const {
165   OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
166   printNext(OS, indent);
167 }
168
169 void EmitCopyToRegMatcherNode::print(raw_ostream &OS, unsigned indent) const {
170   OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
171   printNext(OS, indent);
172 }
173
174 void EmitNodeXFormMatcherNode::print(raw_ostream &OS, unsigned indent) const {
175   OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
176      << " Slot=" << Slot << '\n';
177   printNext(OS, indent);
178 }
179
180
181 void EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
182   OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
183
184   for (unsigned i = 0, e = VTs.size(); i != e; ++i)
185     OS << ' ' << getEnumName(VTs[i]);
186   OS << '(';
187   for (unsigned i = 0, e = Operands.size(); i != e; ++i)
188     OS << Operands[i] << ' ';
189   OS << ")\n";
190   printNext(OS, indent);
191 }
192
193 void MarkFlagResultsMatcherNode::print(raw_ostream &OS, unsigned indent) const {
194   OS.indent(indent) << "MarkFlagResults <todo: args>\n";
195   printNext(OS, indent);
196 }
197
198 void CompleteMatchMatcherNode::print(raw_ostream &OS, unsigned indent) const {
199   OS.indent(indent) << "CompleteMatch <todo args>\n";
200   OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
201   OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
202   printNext(OS, indent);
203 }
204