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