DAGISelMatcher.cpp revision 543790673c747ab2793fc657e239ce5f78419dc0
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();
38fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
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();
70fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
7148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  // We can move record nodes across simple predicates.
7248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (isSimplePredicateOrRecordNode())
7348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return isSimplePredicateNode();
74fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
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
86543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerCheckPredicateMatcher::CheckPredicateMatcher(const TreePredicateFn &pred)
87543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  : Matcher(CheckPredicate), Pred(pred.getOrigPatFragRecord()) {}
88543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
89543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerTreePredicateFn CheckPredicateMatcher::getPredicate() const {
90543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  return TreePredicateFn(Pred);
91543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner}
92543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
93543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
94543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
95d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner// printImpl methods.
96d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
97a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid ScopeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
9860df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner  OS.indent(indent) << "Scope\n";
99c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
100c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    if (getChild(i) == 0)
101c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      OS.indent(indent+1) << "NULL POINTER\n";
102c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    else
103c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      getChild(i)->print(OS, indent+2);
104c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  }
105da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
106da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
107a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Record\n";
109da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
111a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
11219b5a7590b784f19875b9880ea8838c393431656Chris Lattner  OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
11319b5a7590b784f19875b9880ea8838c393431656Chris Lattner}
11419b5a7590b784f19875b9880ea8838c393431656Chris Lattner
115a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMemRefMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
1168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "RecordMemRef\n";
1178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1198950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid CaptureGlueInputMatcher::printImpl(raw_ostream &OS, unsigned indent) const{
1208950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  OS.indent(indent) << "CaptureGlueInput\n";
1218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1228e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
123a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
124da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
125da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
126da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
127a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveParentMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
129da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
131a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
133da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
135b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid CheckPatternPredicateMatcher::
136a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
138da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
140a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
141543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  OS.indent(indent) << "CheckPredicate " << getPredicate().getFnName() << '\n';
142da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
143da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
144a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
145a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n';
146da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
147da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
148eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnervoid SwitchOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
149eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "SwitchOpcode: {\n";
150eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
151eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    OS.indent(indent) << "case " << Cases[i].first->getEnumName() << ":\n";
152eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    Cases[i].second->print(OS, indent+2);
153eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
154eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "}\n";
155eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
156eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
157eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
158a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
159084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << ", ResNo="
160084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    << ResNo << '\n';
161da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
162da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
163cfe2eab7446dedc471592fe702fefef783383171Chris Lattnervoid SwitchTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
164cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "SwitchType: {\n";
165cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
166cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    OS.indent(indent) << "case " << getEnumName(Cases[i].first) << ":\n";
167cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    Cases[i].second->print(OS, indent+2);
168cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  }
169cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "}\n";
170cfe2eab7446dedc471592fe702fefef783383171Chris Lattner}
171cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
172a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChildTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
17323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  OS.indent(indent) << "CheckChildType " << ChildNo << " "
17423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    << getEnumName(Type) << '\n';
17523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner}
17623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
17723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
178a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
179da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
180da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
182a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckCondCodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
184da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
185da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
186a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckValueTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
188da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
190a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckComplexPatMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
191da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
192da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
194a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckAndImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
196da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
197da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
198a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOrImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
199da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
200da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
201da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
202a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckFoldableChainNodeMatcher::printImpl(raw_ostream &OS,
20321390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
20421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
205e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
2069a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
207a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
2098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
211b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitStringIntegerMatcher::
212a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
214845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
215845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
216a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitRegisterMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitRegister ";
218845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
219845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
220845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
221845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
222845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
223845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
224845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
225b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitConvertToTargetMatcher::
226a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
2288e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
230b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMergeInputChainsMatcher::
231a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
2338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
235a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitCopyToRegMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
2378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
239a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
2418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner     << " Slot=" << Slot << '\n';
2428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
245e86097af5598e44727875f00e492d43c978239beChris Lattnervoid EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const {
246e86097af5598e44727875f00e492d43c978239beChris Lattner  OS.indent(indent);
2479a21500edc485a2c383a03fba429943f031c1398Chris Lattner  OS << (isa<MorphNodeToMatcher>(this) ? "MorphNodeTo: " : "EmitNode: ")
248e86097af5598e44727875f00e492d43c978239beChris Lattner     << OpcodeName << ": <todo flags> ";
2498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = VTs.size(); i != e; ++i)
2518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ' ' << getEnumName(VTs[i]);
2528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << '(';
2538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
2548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << Operands[i] << ' ';
2558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << ")\n";
2568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2588950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid MarkGlueResultsMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2598950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  OS.indent(indent) << "MarkGlueResults <todo: args>\n";
26002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner}
26102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
262a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CompleteMatchMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
26377f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  OS.indent(indent) << "CompleteMatch <todo args>\n";
2648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
2658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
2668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
26858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner// getHashImpl Implementation.
26958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPatternPredicateMatcher::getHashImpl() const {
27158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Predicate);
27258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPredicateMatcher::getHashImpl() const {
275543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  return HashString(getPredicate().getFnName());
27658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
27758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
27858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckOpcodeMatcher::getHashImpl() const {
279a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  return HashString(Opcode.getEnumName());
28058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
28158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckCondCodeMatcher::getHashImpl() const {
28358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(CondCodeName);
28458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
28558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
28658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckValueTypeMatcher::getHashImpl() const {
28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(TypeName);
28858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitStringIntegerMatcher::getHashImpl() const {
29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Val) ^ VT;
29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnertemplate<typename It>
29558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerstatic unsigned HashUnsigneds(It I, It E) {
29658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  unsigned Result = 0;
29758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  for (; I != E; ++I)
29858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    Result = (Result<<3) ^ *I;
29958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return Result;
30058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
30258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitMergeInputChainsMatcher::getHashImpl() const {
30358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashUnsigneds(ChainNodes.begin(), ChainNodes.end());
30458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
306eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerbool CheckOpcodeMatcher::isEqualImpl(const Matcher *M) const {
307eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  // Note: pointer equality isn't enough here, we have to check the enum names
308fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  // to ensure that the nodes are for the same opcode.
309eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  return cast<CheckOpcodeMatcher>(M)->Opcode.getEnumName() ==
310eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner          Opcode.getEnumName();
311eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
312eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
313e86097af5598e44727875f00e492d43c978239beChris Lattnerbool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const {
314e86097af5598e44727875f00e492d43c978239beChris Lattner  const EmitNodeMatcherCommon *M = cast<EmitNodeMatcherCommon>(m);
31558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return M->OpcodeName == OpcodeName && M->VTs == VTs &&
31658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->Operands == Operands && M->HasChain == HasChain &&
317036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner         M->HasInGlue == HasInGlue && M->HasOutGlue == HasOutGlue &&
318ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner         M->HasMemRefs == HasMemRefs &&
31958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->NumFixedArityOperands == NumFixedArityOperands;
32058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
322e86097af5598e44727875f00e492d43c978239beChris Lattnerunsigned EmitNodeMatcherCommon::getHashImpl() const {
32358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return (HashString(OpcodeName) << 4) | Operands.size();
32458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
32658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
3278950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerunsigned MarkGlueResultsMatcher::getHashImpl() const {
3288950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  return HashUnsigneds(GlueResultNodes.begin(), GlueResultNodes.end());
32958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
33058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
33158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CompleteMatchMatcher::getHashImpl() const {
332fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  return HashUnsigneds(Results.begin(), Results.end()) ^
33358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner          ((unsigned)(intptr_t)&Pattern << 8);
33458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
33582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
33682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner// isContradictoryImpl Implementations.
33782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
33882781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerstatic bool TypesAreContradictory(MVT::SimpleValueType T1,
33982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner                                  MVT::SimpleValueType T2) {
34082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If the two types are the same, then they are the same, so they don't
34182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // contradict.
34282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == T2) return false;
343fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
34482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If either type is about iPtr, then they don't conflict unless the other
34582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // one is not a scalar integer type.
34682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == MVT::iPTR)
34782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T2).isInteger() || MVT(T2).isVector();
348fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
34982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T2 == MVT::iPTR)
35082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T1).isInteger() || MVT(T1).isVector();
351fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
35282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // Otherwise, they are two different non-iPTR types, they conflict.
35382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return true;
35482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
35582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
356225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattnerbool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
357225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) {
358225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    // One node can't have two different opcodes!
359eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Note: pointer equality isn't enough here, we have to check the enum names
360fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach    // to ensure that the nodes are for the same opcode.
361eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return COM->getOpcode().getEnumName() != getOpcode().getEnumName();
362225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
363fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
364225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // If the node has a known type, and if the type we're checking for is
365225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // different, then we know they contradict.  For example, a check for
366225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // ISD::STORE will never be true at the same time a check for Type i32 is.
367225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) {
368084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    // If checking for a result the opcode doesn't have, it can't match.
369084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    if (CT->getResNo() >= getOpcode().getNumResults())
370084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner      return true;
371fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
372084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    MVT::SimpleValueType NodeType = getOpcode().getKnownType(CT->getResNo());
373aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner    if (NodeType != MVT::Other)
374aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner      return TypesAreContradictory(NodeType, CT->getType());
375225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
376fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
377225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  return false;
378225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner}
379225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner
38082781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const {
38182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M))
38282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CT->getType());
38382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
38482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
38582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
38682781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const {
38782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckChildTypeMatcher *CC = dyn_cast<CheckChildTypeMatcher>(M)) {
38882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // If the two checks are about different nodes, we don't know if they
38982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // conflict!
39082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    if (CC->getChildNo() != getChildNo())
39182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner      return false;
392fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
39382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CC->getType());
39482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  }
39582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
39682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
397fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
398247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattnerbool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const {
399247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M))
400247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner    return CIM->getValue() != getValue();
401247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  return false;
402247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner}
40348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
40448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool CheckValueTypeMatcher::isContradictoryImpl(const Matcher *M) const {
40548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (const CheckValueTypeMatcher *CVT = dyn_cast<CheckValueTypeMatcher>(M))
40648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return CVT->getTypeName() != getTypeName();
40748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return false;
40848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
40948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
410