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"
1358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner#include "llvm/ADT/StringExtras.h"
144ffd89fa4d2788611187d1a534d2ed46adf1702cChandler Carruth#include "llvm/Support/raw_ostream.h"
154ffd89fa4d2788611187d1a534d2ed46adf1702cChandler Carruth#include "llvm/TableGen/Record.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
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Cur) return nullptr;
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
6678099d11ffffee2f01fd06fc8d0904858acd5047Craig Topper/// canMoveBeforeNode - 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
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSwitchOpcodeMatcher::~SwitchOpcodeMatcher() {
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (unsigned i = 0, e = Cases.size(); i != e; ++i)
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    delete Cases[i].second;
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSwitchTypeMatcher::~SwitchTypeMatcher() {
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (unsigned i = 0, e = Cases.size(); i != e; ++i)
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    delete Cases[i].second;
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
96d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
97543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerCheckPredicateMatcher::CheckPredicateMatcher(const TreePredicateFn &pred)
98543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  : Matcher(CheckPredicate), Pred(pred.getOrigPatFragRecord()) {}
99543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
100543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerTreePredicateFn CheckPredicateMatcher::getPredicate() const {
101543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  return TreePredicateFn(Pred);
102543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner}
103543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
104543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
105543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner
106d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner// printImpl methods.
107d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
108a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid ScopeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
10960df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner  OS.indent(indent) << "Scope\n";
110c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!getChild(i))
112c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      OS.indent(indent+1) << "NULL POINTER\n";
113c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner    else
114c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner      getChild(i)->print(OS, indent+2);
115c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  }
116da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
118a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Record\n";
120da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
121da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
122a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
12319b5a7590b784f19875b9880ea8838c393431656Chris Lattner  OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
12419b5a7590b784f19875b9880ea8838c393431656Chris Lattner}
12519b5a7590b784f19875b9880ea8838c393431656Chris Lattner
126a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMemRefMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
1278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "RecordMemRef\n";
1288e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1308950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid CaptureGlueInputMatcher::printImpl(raw_ostream &OS, unsigned indent) const{
1318950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  OS.indent(indent) << "CaptureGlueInput\n";
1328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
134a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
135da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
136da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
137da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
138a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveParentMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
140da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
141da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
142a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
143da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
144da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
145da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
146936910d9293f7118056498c75c7bca79a7fc579cCraig Toppervoid CheckChildSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
147936910d9293f7118056498c75c7bca79a7fc579cCraig Topper  OS.indent(indent) << "CheckChild" << ChildNo << "Same\n";
148936910d9293f7118056498c75c7bca79a7fc579cCraig Topper}
149936910d9293f7118056498c75c7bca79a7fc579cCraig Topper
150b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid CheckPatternPredicateMatcher::
151a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
152da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
153da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
154da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
155a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
156543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  OS.indent(indent) << "CheckPredicate " << getPredicate().getFnName() << '\n';
157da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
158da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
159a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
160a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n';
161da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
162da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
163eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnervoid SwitchOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
164eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "SwitchOpcode: {\n";
165eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
166eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    OS.indent(indent) << "case " << Cases[i].first->getEnumName() << ":\n";
167eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    Cases[i].second->print(OS, indent+2);
168eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
169eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  OS.indent(indent) << "}\n";
170eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
171eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
172eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
173a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
174084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << ", ResNo="
175084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    << ResNo << '\n';
176da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
177da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
178cfe2eab7446dedc471592fe702fefef783383171Chris Lattnervoid SwitchTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
179cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "SwitchType: {\n";
180cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  for (unsigned i = 0, e = Cases.size(); i != e; ++i) {
181cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    OS.indent(indent) << "case " << getEnumName(Cases[i].first) << ":\n";
182cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    Cases[i].second->print(OS, indent+2);
183cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  }
184cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  OS.indent(indent) << "}\n";
185cfe2eab7446dedc471592fe702fefef783383171Chris Lattner}
186cfe2eab7446dedc471592fe702fefef783383171Chris Lattner
187a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChildTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
18823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  OS.indent(indent) << "CheckChildType " << ChildNo << " "
18923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    << getEnumName(Type) << '\n';
19023cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner}
19123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
19223cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
193a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
194da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
196da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid CheckChildIntegerMatcher::printImpl(raw_ostream &OS,
19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                         unsigned indent) const {
19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  OS.indent(indent) << "CheckChildInteger " << ChildNo << " " << Value << '\n';
20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
202a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckCondCodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
203da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
204da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
205da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
206a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckValueTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
207da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
208da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
209da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
210a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckComplexPatMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
211da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
212da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
213da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
214a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckAndImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
215da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
216da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
217da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
218a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOrImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
219da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
220da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
221da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
222a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckFoldableChainNodeMatcher::printImpl(raw_ostream &OS,
22321390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
22421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
225e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
2269a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
227a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2288e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
2298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
231b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitStringIntegerMatcher::
232a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
234845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
235845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
236a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitRegisterMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitRegister ";
238845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
239845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
240845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
241845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
242845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
243845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
244845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
245b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitConvertToTargetMatcher::
246a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
2488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
250b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMergeInputChainsMatcher::
251a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const {
2528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
2538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
255a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitCopyToRegMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
2578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
259a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
2618e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner     << " Slot=" << Slot << '\n';
2628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2638e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
265e86097af5598e44727875f00e492d43c978239beChris Lattnervoid EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const {
266e86097af5598e44727875f00e492d43c978239beChris Lattner  OS.indent(indent);
2679a21500edc485a2c383a03fba429943f031c1398Chris Lattner  OS << (isa<MorphNodeToMatcher>(this) ? "MorphNodeTo: " : "EmitNode: ")
268e86097af5598e44727875f00e492d43c978239beChris Lattner     << OpcodeName << ": <todo flags> ";
2698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = VTs.size(); i != e; ++i)
2718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ' ' << getEnumName(VTs[i]);
2728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << '(';
2738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
2748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << Operands[i] << ' ';
2758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << ")\n";
2768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2788950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid MarkGlueResultsMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
2798950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  OS.indent(indent) << "MarkGlueResults <todo: args>\n";
28002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner}
28102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
282a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CompleteMatchMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
28377f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  OS.indent(indent) << "CompleteMatch <todo args>\n";
2848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
2858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
2868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
28858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner// getHashImpl Implementation.
28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPatternPredicateMatcher::getHashImpl() const {
29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Predicate);
29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPredicateMatcher::getHashImpl() const {
295543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  return HashString(getPredicate().getFnName());
29658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
29758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
29858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckOpcodeMatcher::getHashImpl() const {
299a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  return HashString(Opcode.getEnumName());
30058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
30258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckCondCodeMatcher::getHashImpl() const {
30358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(CondCodeName);
30458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
30658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckValueTypeMatcher::getHashImpl() const {
30758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(TypeName);
30858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
30958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
31058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitStringIntegerMatcher::getHashImpl() const {
31158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashString(Val) ^ VT;
31258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
31358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
31458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnertemplate<typename It>
31558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerstatic unsigned HashUnsigneds(It I, It E) {
31658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  unsigned Result = 0;
31758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  for (; I != E; ++I)
31858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    Result = (Result<<3) ^ *I;
31958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return Result;
32058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
32258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitMergeInputChainsMatcher::getHashImpl() const {
32358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return HashUnsigneds(ChainNodes.begin(), ChainNodes.end());
32458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
326eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerbool CheckOpcodeMatcher::isEqualImpl(const Matcher *M) const {
327eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  // Note: pointer equality isn't enough here, we have to check the enum names
328fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  // to ensure that the nodes are for the same opcode.
329eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  return cast<CheckOpcodeMatcher>(M)->Opcode.getEnumName() ==
330eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner          Opcode.getEnumName();
331eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}
332eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
333e86097af5598e44727875f00e492d43c978239beChris Lattnerbool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const {
334e86097af5598e44727875f00e492d43c978239beChris Lattner  const EmitNodeMatcherCommon *M = cast<EmitNodeMatcherCommon>(m);
33558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return M->OpcodeName == OpcodeName && M->VTs == VTs &&
33658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->Operands == Operands && M->HasChain == HasChain &&
337036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner         M->HasInGlue == HasInGlue && M->HasOutGlue == HasOutGlue &&
338ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner         M->HasMemRefs == HasMemRefs &&
33958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner         M->NumFixedArityOperands == NumFixedArityOperands;
34058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
34158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
342e86097af5598e44727875f00e492d43c978239beChris Lattnerunsigned EmitNodeMatcherCommon::getHashImpl() const {
34358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  return (HashString(OpcodeName) << 4) | Operands.size();
34458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
34558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
34658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
3472d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid EmitNodeMatcher::anchor() { }
3482d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
3492d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MorphNodeToMatcher::anchor() { }
3502d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
3518950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerunsigned MarkGlueResultsMatcher::getHashImpl() const {
3528950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  return HashUnsigneds(GlueResultNodes.begin(), GlueResultNodes.end());
35358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
35458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
35558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CompleteMatchMatcher::getHashImpl() const {
356fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  return HashUnsigneds(Results.begin(), Results.end()) ^
35758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner          ((unsigned)(intptr_t)&Pattern << 8);
35858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner}
35982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
36082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner// isContradictoryImpl Implementations.
36182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
36282781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerstatic bool TypesAreContradictory(MVT::SimpleValueType T1,
36382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner                                  MVT::SimpleValueType T2) {
36482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If the two types are the same, then they are the same, so they don't
36582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // contradict.
36682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == T2) return false;
367fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
36882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // If either type is about iPtr, then they don't conflict unless the other
36982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // one is not a scalar integer type.
37082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T1 == MVT::iPTR)
37182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T2).isInteger() || MVT(T2).isVector();
372fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
37382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (T2 == MVT::iPTR)
37482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return !MVT(T1).isInteger() || MVT(T1).isVector();
375fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
37682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  // Otherwise, they are two different non-iPTR types, they conflict.
37782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return true;
37882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
37982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
380225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattnerbool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
381225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) {
382225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner    // One node can't have two different opcodes!
383eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    // Note: pointer equality isn't enough here, we have to check the enum names
384fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach    // to ensure that the nodes are for the same opcode.
385eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return COM->getOpcode().getEnumName() != getOpcode().getEnumName();
386225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
387fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
388225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // If the node has a known type, and if the type we're checking for is
389225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // different, then we know they contradict.  For example, a check for
390225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  // ISD::STORE will never be true at the same time a check for Type i32 is.
391225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) {
392084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    // If checking for a result the opcode doesn't have, it can't match.
393084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    if (CT->getResNo() >= getOpcode().getNumResults())
394084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner      return true;
395fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
396084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    MVT::SimpleValueType NodeType = getOpcode().getKnownType(CT->getResNo());
397aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner    if (NodeType != MVT::Other)
398aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner      return TypesAreContradictory(NodeType, CT->getType());
399225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  }
400fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
401225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner  return false;
402225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner}
403225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner
40482781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const {
40582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M))
40682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CT->getType());
40782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
40882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
40982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
41082781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const {
41182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  if (const CheckChildTypeMatcher *CC = dyn_cast<CheckChildTypeMatcher>(M)) {
41282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // If the two checks are about different nodes, we don't know if they
41382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // conflict!
41482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    if (CC->getChildNo() != getChildNo())
41582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner      return false;
416fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
41782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return TypesAreContradictory(getType(), CC->getType());
41882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  }
41982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  return false;
42082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner}
421fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
422247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattnerbool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const {
423247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M))
424247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner    return CIM->getValue() != getValue();
425247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  return false;
426247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner}
42748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool CheckChildIntegerMatcher::isContradictoryImpl(const Matcher *M) const {
42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (const CheckChildIntegerMatcher *CCIM = dyn_cast<CheckChildIntegerMatcher>(M)) {
43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // If the two checks are about different nodes, we don't know if they
43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // conflict!
43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (CCIM->getChildNo() != getChildNo())
43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return false;
43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
43536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return CCIM->getValue() != getValue();
43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return false;
43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
44048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool CheckValueTypeMatcher::isContradictoryImpl(const Matcher *M) const {
44148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  if (const CheckValueTypeMatcher *CVT = dyn_cast<CheckValueTypeMatcher>(M))
44248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return CVT->getTypeName() != getTypeName();
44348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  return false;
44448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner}
44548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner
446