1da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===- DAGISelMatcher.cpp - Representation of DAG pattern matcher ---------===//
2da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
3da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//                     The LLVM Compiler Infrastructure
4da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
5da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file is distributed under the University of Illinois Open Source
6da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// License. See LICENSE.TXT for details.
7da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
8da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
9da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
10da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "DAGISelMatcher.h"
11da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "CodeGenDAGPatterns.h"
12da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "CodeGenTarget.h"
137c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h"
14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/raw_ostream.h"
1558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner#include "llvm/ADT/StringExtras.h"
16da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm;
17da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
182d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid Matcher::anchor() { }
192d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
20b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid Matcher::dump() const {
21a5028a64634f995630e93390c5c23374a09a450fChris Lattner  print(errs(), 0);
22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
24a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid Matcher::print(raw_ostream &OS, unsigned indent) const {
25a5028a64634f995630e93390c5c23374a09a450fChris Lattner  printImpl(OS, indent);
26bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  if (Next)
27bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    return Next->print(OS, indent);
28da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
29da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
3082781b938af4057df90b5fa4035781ddc4aa681aChris Lattnervoid Matcher::printOne(raw_ostream &OS) const {
3182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  printImpl(OS, 0);
3282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
3382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
3448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// unlinkNode - Unlink the specified node from this chain.  If Other == this,
3548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// we unlink the next pointer and return it.  Otherwise we unlink Other from
3648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// the list and return this.
3748aa5756a29a7b96850ac646d1edd806c9df4643Chris LattnerMatcher *Matcher::unlinkNode(Matcher *Other) {
3848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (this == Other)
3948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return takeNext();
40fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
4148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // Scan until we find the predecessor of Other.
4248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Matcher *Cur = this;
4348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  for (; Cur && Cur->getNext() != Other; Cur = Cur->getNext())
4448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    /*empty*/;
4548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
4648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (Cur == 0) return 0;
4748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Cur->takeNext();
4848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Cur->setNext(Other->takeNext());
4948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return this;
5048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
5148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
5248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// canMoveBefore - Return true if this matcher is the same as Other, or if
5348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// we can move this matcher past all of the nodes in-between Other and this
5448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// node.  Other must be equal to or before this.
5548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool Matcher::canMoveBefore(const Matcher *Other) const {
5648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  for (;; Other = Other->getNext()) {
5748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    assert(Other && "Other didn't come before 'this'?");
5848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    if (this == Other) return true;
5948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
6048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    // We have to be able to move this node across the Other node.
6148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    if (!canMoveBeforeNode(Other))
6248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner      return false;
6348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  }
6448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
6548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
6648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// canMoveBefore - Return true if it is safe to move the current matcher
6748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// across the specified one.
6848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool Matcher::canMoveBeforeNode(const Matcher *Other) const {
6948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can move simple predicates before record nodes.
7048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (isSimplePredicateNode())
7148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return Other->isSimplePredicateOrRecordNode();
72fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
7348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can move record nodes across simple predicates.
7448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (isSimplePredicateOrRecordNode())
7548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return isSimplePredicateNode();
76fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
7748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can't move record nodes across each other etc.
7848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return false;
7948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
8048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
8148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
82d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerScopeMatcher::~ScopeMatcher() {
83d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  for (unsigned i = 0, e = Children.size(); i != e; ++i)
84d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    delete Children[i];
85d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner}
86d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
87d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
88543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerCheckPredicateMatcher::CheckPredicateMatcher(const TreePredicateFn &pred)
89543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  : Matcher(CheckPredicate), Pred(pred.getOrigPatFragRecord()) {}
90543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
91543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerTreePredicateFn CheckPredicateMatcher::getPredicate() const {
92543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  return TreePredicateFn(Pred);
93543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner}
94543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
95543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
96543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
97d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner// printImpl methods.
98d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
99a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid ScopeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
10060df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner  OS.indent(indent) << "Scope\n";
101c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
102c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    if (getChild(i) == 0)
103c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      OS.indent(indent+1) << "NULL POINTER\n";
104c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    else
105c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      getChild(i)->print(OS, indent+2);
106c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  }
107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
109a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Record\n";
111da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
113a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
11419b5a7590b784f19875b9880ea8838c393431656Chris Lattner  OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
11519b5a7590b784f19875b9880ea8838c393431656Chris Lattner}
11619b5a7590b784f19875b9880ea8838c393431656Chris Lattner
117a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMemRefMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
1188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "RecordMemRef\n";
1198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1218950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid CaptureGlueInputMatcher::printImpl(raw_ostream &OS, unsigned indent) const{
1228950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  OS.indent(indent) << "CaptureGlueInput\n";
1238e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
125a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
126da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
127da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
129a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveParentMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
131da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
133a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
135da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
136da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
137b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid CheckPatternPredicateMatcher::
138a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
140da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
141da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
142a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
143543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  OS.indent(indent) << "CheckPredicate " << getPredicate().getFnName() << '\n';
144da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
145da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
146a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
147a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n';
148da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
149da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
150eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnervoid SwitchOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
151eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "SwitchOpcode: {\n";
152eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
153eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    OS.indent(indent) << "case " << Cases[i].first->getEnumName() << ":\n";
154eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    Cases[i].second->print(OS, indent+2);
155eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
156eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "}\n";
157eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
158eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
159eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
160a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
161084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << ", ResNo="
162084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    << ResNo << '\n';
163da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
164da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
165cfe2eab7446dedc471592fe702fefef783383171Chris Lattnervoid SwitchTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
166cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "SwitchType: {\n";
167cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
168cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    OS.indent(indent) << "case " << getEnumName(Cases[i].first) << ":\n";
169cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    Cases[i].second->print(OS, indent+2);
170cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  }
171cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "}\n";
172cfe2eab7446dedc471592fe702fefef783383171Chris Lattner}
173cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
174a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChildTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
17523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  OS.indent(indent) << "CheckChildType " << ChildNo << " "
17623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    << getEnumName(Type) << '\n';
17723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner}
17823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
17923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
180a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
182da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
184a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckCondCodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
185da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
186da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
188a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckValueTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
191da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
192a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckComplexPatMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
194da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
196a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckAndImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
197da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
198da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
199da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
200a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOrImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
201da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
202da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
203da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
204a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckFoldableChainNodeMatcher::printImpl(raw_ostream &OS,
20521390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
20621390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
207e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
2089a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
209a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
2118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
213b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitStringIntegerMatcher::
214a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
216845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
217845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
218a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitRegisterMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitRegister ";
220845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
221845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
222845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
223845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
224845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
225845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
226845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
227b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitConvertToTargetMatcher::
228a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
2308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
232b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMergeInputChainsMatcher::
233a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
2358e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
237a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitCopyToRegMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
2398e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
241a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
2438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner     << " Slot=" << Slot << '\n';
2448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
247e86097af5598e44727875f00e492d43c978239beChris Lattnervoid EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const {
248e86097af5598e44727875f00e492d43c978239beChris Lattner  OS.indent(indent);
2499a21500edc485a2c383a03fba429943f031c1398Chris Lattner  OS << (isa<MorphNodeToMatcher>(this) ? "MorphNodeTo: " : "EmitNode: ")
250e86097af5598e44727875f00e492d43c978239beChris Lattner     << OpcodeName << ": <todo flags> ";
2518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = VTs.size(); i != e; ++i)
2538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ' ' << getEnumName(VTs[i]);
2548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << '(';
2558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
2568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << Operands[i] << ' ';
2578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << ")\n";
2588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2608950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid MarkGlueResultsMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2618950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  OS.indent(indent) << "MarkGlueResults <todo: args>\n";
26202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner}
26302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
264a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CompleteMatchMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
26577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  OS.indent(indent) << "CompleteMatch <todo args>\n";
2668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
2678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
2688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
27058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner// getHashImpl Implementation.
27158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPatternPredicateMatcher::getHashImpl() const {
27358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Predicate);
27458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPredicateMatcher::getHashImpl() const {
277543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  return HashString(getPredicate().getFnName());
27858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckOpcodeMatcher::getHashImpl() const {
281a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  return HashString(Opcode.getEnumName());
28258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
28358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckCondCodeMatcher::getHashImpl() const {
28558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(CondCodeName);
28658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckValueTypeMatcher::getHashImpl() const {
28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(TypeName);
29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitStringIntegerMatcher::getHashImpl() const {
29358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Val) ^ VT;
29458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnertemplate<typename It>
29758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerstatic unsigned HashUnsigneds(It I, It E) {
29858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  unsigned Result = 0;
29958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  for (; I != E; ++I)
30058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    Result = (Result<<3) ^ *I;
30158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return Result;
30258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
30458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitMergeInputChainsMatcher::getHashImpl() const {
30558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashUnsigneds(ChainNodes.begin(), ChainNodes.end());
30658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
308eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerbool CheckOpcodeMatcher::isEqualImpl(const Matcher *M) const {
309eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  // Note: pointer equality isn't enough here, we have to check the enum names
310fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  // to ensure that the nodes are for the same opcode.
311eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  return cast<CheckOpcodeMatcher>(M)->Opcode.getEnumName() ==
312eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner          Opcode.getEnumName();
313eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
314eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
315e86097af5598e44727875f00e492d43c978239beChris Lattnerbool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const {
316e86097af5598e44727875f00e492d43c978239beChris Lattner  const EmitNodeMatcherCommon *M = cast<EmitNodeMatcherCommon>(m);
31758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return M->OpcodeName == OpcodeName && M->VTs == VTs &&
31858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->Operands == Operands && M->HasChain == HasChain &&
319036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner         M->HasInGlue == HasInGlue && M->HasOutGlue == HasOutGlue &&
320ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner         M->HasMemRefs == HasMemRefs &&
32158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->NumFixedArityOperands == NumFixedArityOperands;
32258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
324e86097af5598e44727875f00e492d43c978239beChris Lattnerunsigned EmitNodeMatcherCommon::getHashImpl() const {
32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return (HashString(OpcodeName) << 4) | Operands.size();
32658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
32858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
3292d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid EmitNodeMatcher::anchor() { }
3302d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
3312d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MorphNodeToMatcher::anchor() { }
3322d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
3338950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerunsigned MarkGlueResultsMatcher::getHashImpl() const {
3348950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  return HashUnsigneds(GlueResultNodes.begin(), GlueResultNodes.end());
33558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
33658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
33758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CompleteMatchMatcher::getHashImpl() const {
338fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  return HashUnsigneds(Results.begin(), Results.end()) ^
33958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner          ((unsigned)(intptr_t)&Pattern << 8);
34058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
34182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
34282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner// isContradictoryImpl Implementations.
34382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
34482781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerstatic bool TypesAreContradictory(MVT::SimpleValueType T1,
34582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner                                  MVT::SimpleValueType T2) {
34682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If the two types are the same, then they are the same, so they don't
34782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // contradict.
34882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == T2) return false;
349fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
35082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If either type is about iPtr, then they don't conflict unless the other
35182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // one is not a scalar integer type.
35282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == MVT::iPTR)
35382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T2).isInteger() || MVT(T2).isVector();
354fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
35582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T2 == MVT::iPTR)
35682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T1).isInteger() || MVT(T1).isVector();
357fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
35882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // Otherwise, they are two different non-iPTR types, they conflict.
35982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return true;
36082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
36182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
362225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattnerbool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
363225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) {
364225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    // One node can't have two different opcodes!
365eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Note: pointer equality isn't enough here, we have to check the enum names
366fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach    // to ensure that the nodes are for the same opcode.
367eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return COM->getOpcode().getEnumName() != getOpcode().getEnumName();
368225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
369fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
370225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // If the node has a known type, and if the type we're checking for is
371225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // different, then we know they contradict.  For example, a check for
372225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // ISD::STORE will never be true at the same time a check for Type i32 is.
373225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) {
374084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    // If checking for a result the opcode doesn't have, it can't match.
375084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    if (CT->getResNo() >= getOpcode().getNumResults())
376084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner      return true;
377fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
378084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    MVT::SimpleValueType NodeType = getOpcode().getKnownType(CT->getResNo());
379aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner    if (NodeType != MVT::Other)
380aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner      return TypesAreContradictory(NodeType, CT->getType());
381225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
382fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
383225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  return false;
384225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner}
385225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner
38682781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const {
38782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M))
38882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CT->getType());
38982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
39082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
39182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
39282781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const {
39382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckChildTypeMatcher *CC = dyn_cast<CheckChildTypeMatcher>(M)) {
39482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // If the two checks are about different nodes, we don't know if they
39582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // conflict!
39682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    if (CC->getChildNo() != getChildNo())
39782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner      return false;
398fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
39982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CC->getType());
40082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  }
40182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
40282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
403fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
404247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattnerbool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const {
405247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M))
406247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner    return CIM->getValue() != getValue();
407247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  return false;
408247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner}
40948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
41048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool CheckValueTypeMatcher::isContradictoryImpl(const Matcher *M) const {
41148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (const CheckValueTypeMatcher *CVT = dyn_cast<CheckValueTypeMatcher>(M))
41248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return CVT->getTypeName() != getTypeName();
41348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return false;
41448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
41548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
416