DAGISelMatcher.cpp revision aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4f
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"
13845c04273461b2a10754a1455b02916a19ea72aaChris Lattner#include "Record.h"
14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/raw_ostream.h"
1558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner#include "llvm/ADT/StringExtras.h"
16da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm;
17da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
18b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid Matcher::dump() const {
19a5028a64634f995630e93390c5c23374a09a450fChris Lattner  print(errs(), 0);
20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
22a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid Matcher::print(raw_ostream &OS, unsigned indent) const {
23a5028a64634f995630e93390c5c23374a09a450fChris Lattner  printImpl(OS, indent);
24bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  if (Next)
25bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    return Next->print(OS, indent);
26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
2882781b938af4057df90b5fa4035781ddc4aa681aChris Lattnervoid Matcher::printOne(raw_ostream &OS) const {
2982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  printImpl(OS, 0);
3082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
3182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
3248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// unlinkNode - Unlink the specified node from this chain.  If Other == this,
3348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// we unlink the next pointer and return it.  Otherwise we unlink Other from
3448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// the list and return this.
3548aa5756a29a7b96850ac646d1edd806c9df4643Chris LattnerMatcher *Matcher::unlinkNode(Matcher *Other) {
3648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (this == Other)
3748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return takeNext();
3848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
3948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // Scan until we find the predecessor of Other.
4048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Matcher *Cur = this;
4148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  for (; Cur && Cur->getNext() != Other; Cur = Cur->getNext())
4248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    /*empty*/;
4348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
4448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (Cur == 0) return 0;
4548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Cur->takeNext();
4648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Cur->setNext(Other->takeNext());
4748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return this;
4848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
4948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
5048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// canMoveBefore - Return true if this matcher is the same as Other, or if
5148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// we can move this matcher past all of the nodes in-between Other and this
5248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// node.  Other must be equal to or before this.
5348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool Matcher::canMoveBefore(const Matcher *Other) const {
5448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  for (;; Other = Other->getNext()) {
5548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    assert(Other && "Other didn't come before 'this'?");
5648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    if (this == Other) return true;
5748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
5848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    // We have to be able to move this node across the Other node.
5948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    if (!canMoveBeforeNode(Other))
6048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner      return false;
6148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  }
6248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
6348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
6448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// canMoveBefore - Return true if it is safe to move the current matcher
6548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// across the specified one.
6648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool Matcher::canMoveBeforeNode(const Matcher *Other) const {
6748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can move simple predicates before record nodes.
6848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (isSimplePredicateNode())
6948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return Other->isSimplePredicateOrRecordNode();
7048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
7148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can move record nodes across simple predicates.
7248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (isSimplePredicateOrRecordNode())
7348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return isSimplePredicateNode();
7448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
7548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can't move record nodes across each other etc.
7648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return false;
7748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
7848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
7948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
80d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerScopeMatcher::~ScopeMatcher() {
81d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  for (unsigned i = 0, e = Children.size(); i != e; ++i)
82d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    delete Children[i];
83d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner}
84d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
85d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
86d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner// printImpl methods.
87d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
88a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid ScopeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
8960df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner  OS.indent(indent) << "Scope\n";
90c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
91c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    if (getChild(i) == 0)
92c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      OS.indent(indent+1) << "NULL POINTER\n";
93c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    else
94c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      getChild(i)->print(OS, indent+2);
95c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  }
96da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
97da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
98a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
99da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Record\n";
100da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
101da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
102a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
10319b5a7590b784f19875b9880ea8838c393431656Chris Lattner  OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
10419b5a7590b784f19875b9880ea8838c393431656Chris Lattner}
10519b5a7590b784f19875b9880ea8838c393431656Chris Lattner
106a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMemRefMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
1078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "RecordMemRef\n";
1088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
110a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CaptureFlagInputMatcher::printImpl(raw_ostream &OS, unsigned indent) const{
1118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "CaptureFlagInput\n";
1128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
114a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
115da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
116da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
118a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveParentMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
120da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
121da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
122a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
123da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
124da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
125da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
126b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid CheckPatternPredicateMatcher::
127a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
129da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
131a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPredicate " << PredName << '\n';
133da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
135a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
136a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n';
137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
138da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
139eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnervoid SwitchOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
140eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "SwitchOpcode: {\n";
141eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
142eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    OS.indent(indent) << "case " << Cases[i].first->getEnumName() << ":\n";
143eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    Cases[i].second->print(OS, indent+2);
144eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
145eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "}\n";
146eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
147eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
148eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
149a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
150da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
151da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
152da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
153cfe2eab7446dedc471592fe702fefef783383171Chris Lattnervoid SwitchTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
154cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "SwitchType: {\n";
155cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
156cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    OS.indent(indent) << "case " << getEnumName(Cases[i].first) << ":\n";
157cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    Cases[i].second->print(OS, indent+2);
158cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  }
159cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "}\n";
160cfe2eab7446dedc471592fe702fefef783383171Chris Lattner}
161cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
162a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChildTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
16323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  OS.indent(indent) << "CheckChildType " << ChildNo << " "
16423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    << getEnumName(Type) << '\n';
16523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner}
16623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
16723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
168a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
169da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
170da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
171da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
172a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckCondCodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
173da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
174da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
175da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
176a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckValueTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
177da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
178da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
179da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
180a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckComplexPatMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
182da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
184a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckAndImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
185da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
186da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
188a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOrImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
191da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
192a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckFoldableChainNodeMatcher::printImpl(raw_ostream &OS,
19321390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
19421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
195e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
1969a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
197a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
1988e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
1998e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
201b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitStringIntegerMatcher::
202a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
204845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
205845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
206a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitRegisterMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitRegister ";
208845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
209845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
210845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
211845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
212845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
213845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
214845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
215b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitConvertToTargetMatcher::
216a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
2188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
220b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMergeInputChainsMatcher::
221a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
2238e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
225a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitCopyToRegMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2268e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
2278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2288e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
229a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
2318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner     << " Slot=" << Slot << '\n';
2328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
235e86097af5598e44727875f00e492d43c978239beChris Lattnervoid EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const {
236e86097af5598e44727875f00e492d43c978239beChris Lattner  OS.indent(indent);
2379a21500edc485a2c383a03fba429943f031c1398Chris Lattner  OS << (isa<MorphNodeToMatcher>(this) ? "MorphNodeTo: " : "EmitNode: ")
238e86097af5598e44727875f00e492d43c978239beChris Lattner     << OpcodeName << ": <todo flags> ";
2398e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = VTs.size(); i != e; ++i)
2418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ' ' << getEnumName(VTs[i]);
2428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << '(';
2438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
2448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << Operands[i] << ' ';
2458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << ")\n";
2468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
248a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MarkFlagResultsMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
24902f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  OS.indent(indent) << "MarkFlagResults <todo: args>\n";
25002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner}
25102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
252a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CompleteMatchMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
25377f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  OS.indent(indent) << "CompleteMatch <todo args>\n";
2548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
2558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
2568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
25858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner// getHashImpl Implementation.
25958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
26058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPatternPredicateMatcher::getHashImpl() const {
26158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Predicate);
26258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
26358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
26458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPredicateMatcher::getHashImpl() const {
26558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(PredName);
26658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
26758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
26858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckOpcodeMatcher::getHashImpl() const {
269a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  return HashString(Opcode.getEnumName());
27058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckCondCodeMatcher::getHashImpl() const {
27358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(CondCodeName);
27458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckValueTypeMatcher::getHashImpl() const {
27758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(TypeName);
27858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitStringIntegerMatcher::getHashImpl() const {
28158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Val) ^ VT;
28258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
28358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnertemplate<typename It>
28558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerstatic unsigned HashUnsigneds(It I, It E) {
28658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  unsigned Result = 0;
28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  for (; I != E; ++I)
28858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    Result = (Result<<3) ^ *I;
28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return Result;
29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitMergeInputChainsMatcher::getHashImpl() const {
29358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashUnsigneds(ChainNodes.begin(), ChainNodes.end());
29458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
296eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerbool CheckOpcodeMatcher::isEqualImpl(const Matcher *M) const {
297eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  // Note: pointer equality isn't enough here, we have to check the enum names
298eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  // to ensure that the nodes are for the same opcode.
299eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  return cast<CheckOpcodeMatcher>(M)->Opcode.getEnumName() ==
300eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner          Opcode.getEnumName();
301eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
302eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
303eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
304e86097af5598e44727875f00e492d43c978239beChris Lattnerbool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const {
305e86097af5598e44727875f00e492d43c978239beChris Lattner  const EmitNodeMatcherCommon *M = cast<EmitNodeMatcherCommon>(m);
30658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return M->OpcodeName == OpcodeName && M->VTs == VTs &&
30758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->Operands == Operands && M->HasChain == HasChain &&
308ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner         M->HasInFlag == HasInFlag && M->HasOutFlag == HasOutFlag &&
309ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner         M->HasMemRefs == HasMemRefs &&
31058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->NumFixedArityOperands == NumFixedArityOperands;
31158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
31258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
313e86097af5598e44727875f00e492d43c978239beChris Lattnerunsigned EmitNodeMatcherCommon::getHashImpl() const {
31458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return (HashString(OpcodeName) << 4) | Operands.size();
31558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
31658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
31758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
31858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned MarkFlagResultsMatcher::getHashImpl() const {
31958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashUnsigneds(FlagResultNodes.begin(), FlagResultNodes.end());
32058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
32258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CompleteMatchMatcher::getHashImpl() const {
32358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashUnsigneds(Results.begin(), Results.end()) ^
32458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner          ((unsigned)(intptr_t)&Pattern << 8);
32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
32782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner// isContradictoryImpl Implementations.
32882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
32982781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerstatic bool TypesAreContradictory(MVT::SimpleValueType T1,
33082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner                                  MVT::SimpleValueType T2) {
33182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If the two types are the same, then they are the same, so they don't
33282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // contradict.
33382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == T2) return false;
33482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
33582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If either type is about iPtr, then they don't conflict unless the other
33682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // one is not a scalar integer type.
33782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == MVT::iPTR)
33882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T2).isInteger() || MVT(T2).isVector();
33982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
34082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T2 == MVT::iPTR)
34182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T1).isInteger() || MVT(T1).isVector();
34282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
34382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // Otherwise, they are two different non-iPTR types, they conflict.
34482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return true;
34582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
34682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
347225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattnerbool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
348225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) {
349225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    // One node can't have two different opcodes!
350eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Note: pointer equality isn't enough here, we have to check the enum names
351eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // to ensure that the nodes are for the same opcode.
352eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return COM->getOpcode().getEnumName() != getOpcode().getEnumName();
353225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
354225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner
355225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // If the node has a known type, and if the type we're checking for is
356225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // different, then we know they contradict.  For example, a check for
357225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // ISD::STORE will never be true at the same time a check for Type i32 is.
358225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) {
359225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    // FIXME: What result is this referring to?
360aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner    MVT::SimpleValueType NodeType;
361225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    if (getOpcode().getNumResults() == 0)
362225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner      NodeType = MVT::isVoid;
363225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    else
364225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner      NodeType = getOpcode().getKnownType();
365aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner    if (NodeType != MVT::Other)
366aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner      return TypesAreContradictory(NodeType, CT->getType());
367225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
368225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner
369225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  return false;
370225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner}
371225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner
37282781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const {
37382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M))
37482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CT->getType());
37582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
37682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
37782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
37882781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const {
37982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckChildTypeMatcher *CC = dyn_cast<CheckChildTypeMatcher>(M)) {
38082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // If the two checks are about different nodes, we don't know if they
38182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // conflict!
38282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    if (CC->getChildNo() != getChildNo())
38382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner      return false;
38482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
38582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CC->getType());
38682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  }
38782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
38882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
38982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
390247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattnerbool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const {
391247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M))
392247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner    return CIM->getValue() != getValue();
393247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  return false;
394247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner}
39548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
39648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool CheckValueTypeMatcher::isContradictoryImpl(const Matcher *M) const {
39748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (const CheckValueTypeMatcher *CVT = dyn_cast<CheckValueTypeMatcher>(M))
39848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return CVT->getTypeName() != getTypeName();
39948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return false;
40048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
40148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
402