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