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" 137c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h" 14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/Support/raw_ostream.h" 1558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner#include "llvm/ADT/StringExtras.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 4648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner if (Cur == 0) return 0; 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 6648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner/// canMoveBefore - 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 87d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 88543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerCheckPredicateMatcher::CheckPredicateMatcher(const TreePredicateFn &pred) 89543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner : Matcher(CheckPredicate), Pred(pred.getOrigPatFragRecord()) {} 90543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner 91543790673c747ab2793fc657e239ce5f78419dc0Chris LattnerTreePredicateFn CheckPredicateMatcher::getPredicate() const { 92543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner return TreePredicateFn(Pred); 93543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner} 94543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner 95543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner 96543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner 97d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner// printImpl methods. 98d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 99a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid ScopeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 10060df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner OS.indent(indent) << "Scope\n"; 101c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner for (unsigned i = 0, e = getNumChildren(); i != e; ++i) { 102c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner if (getChild(i) == 0) 103c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner OS.indent(indent+1) << "NULL POINTER\n"; 104c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner else 105c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner getChild(i)->print(OS, indent+2); 106c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner } 107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 109a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "Record\n"; 111da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 113a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 11419b5a7590b784f19875b9880ea8838c393431656Chris Lattner OS.indent(indent) << "RecordChild: " << ChildNo << '\n'; 11519b5a7590b784f19875b9880ea8838c393431656Chris Lattner} 11619b5a7590b784f19875b9880ea8838c393431656Chris Lattner 117a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMemRefMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 1188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "RecordMemRef\n"; 1198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 1218950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid CaptureGlueInputMatcher::printImpl(raw_ostream &OS, unsigned indent) const{ 1228950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner OS.indent(indent) << "CaptureGlueInput\n"; 1238e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 125a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 126da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "MoveChild " << ChildNo << '\n'; 127da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 129a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveParentMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 130da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "MoveParent\n"; 131da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 132da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 133a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckSame " << MatchNumber << '\n'; 135da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 136da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 137b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid CheckPatternPredicateMatcher:: 138a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 139da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n'; 140da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 141da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 142a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 143543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner OS.indent(indent) << "CheckPredicate " << getPredicate().getFnName() << '\n'; 144da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 145da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 146a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 147a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n'; 148da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 149da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 150eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnervoid SwitchOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 151eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner OS.indent(indent) << "SwitchOpcode: {\n"; 152eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner for (unsigned i = 0, e = Cases.size(); i != e; ++i) { 153eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner OS.indent(indent) << "case " << Cases[i].first->getEnumName() << ":\n"; 154eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner Cases[i].second->print(OS, indent+2); 155eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner } 156eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner OS.indent(indent) << "}\n"; 157eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner} 158eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 159eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 160a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 161084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner OS.indent(indent) << "CheckType " << getEnumName(Type) << ", ResNo=" 162084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner << ResNo << '\n'; 163da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 164da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 165cfe2eab7446dedc471592fe702fefef783383171Chris Lattnervoid SwitchTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 166cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS.indent(indent) << "SwitchType: {\n"; 167cfe2eab7446dedc471592fe702fefef783383171Chris Lattner for (unsigned i = 0, e = Cases.size(); i != e; ++i) { 168cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS.indent(indent) << "case " << getEnumName(Cases[i].first) << ":\n"; 169cfe2eab7446dedc471592fe702fefef783383171Chris Lattner Cases[i].second->print(OS, indent+2); 170cfe2eab7446dedc471592fe702fefef783383171Chris Lattner } 171cfe2eab7446dedc471592fe702fefef783383171Chris Lattner OS.indent(indent) << "}\n"; 172cfe2eab7446dedc471592fe702fefef783383171Chris Lattner} 173cfe2eab7446dedc471592fe702fefef783383171Chris Lattner 174a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChildTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 17523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner OS.indent(indent) << "CheckChildType " << ChildNo << " " 17623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner << getEnumName(Type) << '\n'; 17723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner} 17823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner 17923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner 180a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckInteger " << Value << '\n'; 182da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 184a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckCondCodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 185da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n'; 186da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 188a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckValueTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 189da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n'; 190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 191da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 192a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckComplexPatMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n'; 194da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 196a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckAndImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 197da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckAndImm " << Value << '\n'; 198da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 199da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 200a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOrImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 201da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckOrImm " << Value << '\n'; 202da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 203da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 204a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckFoldableChainNodeMatcher::printImpl(raw_ostream &OS, 20521390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner unsigned indent) const { 20621390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner OS.indent(indent) << "CheckFoldableChainNode\n"; 207e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner} 2089a747f1305e76025df2323a03b805a284f2cde77Chris Lattner 209a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 2108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n'; 2118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 213b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitStringIntegerMatcher:: 214a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 2158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n'; 216845c04273461b2a10754a1455b02916a19ea72aaChris Lattner} 217845c04273461b2a10754a1455b02916a19ea72aaChris Lattner 218a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitRegisterMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 2198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitRegister "; 220845c04273461b2a10754a1455b02916a19ea72aaChris Lattner if (Reg) 221845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << Reg->getName(); 222845c04273461b2a10754a1455b02916a19ea72aaChris Lattner else 223845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << "zero_reg"; 224845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << " VT=" << VT << '\n'; 225845c04273461b2a10754a1455b02916a19ea72aaChris Lattner} 226845c04273461b2a10754a1455b02916a19ea72aaChris Lattner 227b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitConvertToTargetMatcher:: 228a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 2298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n'; 2308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 232b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMergeInputChainsMatcher:: 233a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 2348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitMergeInputChains <todo: args>\n"; 2358e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 237a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitCopyToRegMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 2388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitCopyToReg <todo: args>\n"; 2398e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 241a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 2428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName() 2438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner << " Slot=" << Slot << '\n'; 2448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 2468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 247e86097af5598e44727875f00e492d43c978239beChris Lattnervoid EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const { 248e86097af5598e44727875f00e492d43c978239beChris Lattner OS.indent(indent); 2499a21500edc485a2c383a03fba429943f031c1398Chris Lattner OS << (isa<MorphNodeToMatcher>(this) ? "MorphNodeTo: " : "EmitNode: ") 250e86097af5598e44727875f00e492d43c978239beChris Lattner << OpcodeName << ": <todo flags> "; 2518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 2528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner for (unsigned i = 0, e = VTs.size(); i != e; ++i) 2538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << ' ' << getEnumName(VTs[i]); 2548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << '('; 2558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) 2568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << Operands[i] << ' '; 2578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << ")\n"; 2588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 2608950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnervoid MarkGlueResultsMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 2618950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner OS.indent(indent) << "MarkGlueResults <todo: args>\n"; 26202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner} 26302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner 264a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CompleteMatchMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 26577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner OS.indent(indent) << "CompleteMatch <todo args>\n"; 2668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n"; 2678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n"; 2688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 2698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 27058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner// getHashImpl Implementation. 27158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 27258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPatternPredicateMatcher::getHashImpl() const { 27358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(Predicate); 27458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 27558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 27658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPredicateMatcher::getHashImpl() const { 277543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner return HashString(getPredicate().getFnName()); 27858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 27958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 28058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckOpcodeMatcher::getHashImpl() const { 281a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner return HashString(Opcode.getEnumName()); 28258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 28358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 28458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckCondCodeMatcher::getHashImpl() const { 28558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(CondCodeName); 28658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 28858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckValueTypeMatcher::getHashImpl() const { 28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(TypeName); 29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitStringIntegerMatcher::getHashImpl() const { 29358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(Val) ^ VT; 29458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 29558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 29658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnertemplate<typename It> 29758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerstatic unsigned HashUnsigneds(It I, It E) { 29858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner unsigned Result = 0; 29958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner for (; I != E; ++I) 30058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner Result = (Result<<3) ^ *I; 30158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return Result; 30258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 30358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 30458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitMergeInputChainsMatcher::getHashImpl() const { 30558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashUnsigneds(ChainNodes.begin(), ChainNodes.end()); 30658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 30758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 308eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerbool CheckOpcodeMatcher::isEqualImpl(const Matcher *M) const { 309eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // Note: pointer equality isn't enough here, we have to check the enum names 310fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach // to ensure that the nodes are for the same opcode. 311eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner return cast<CheckOpcodeMatcher>(M)->Opcode.getEnumName() == 312eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner Opcode.getEnumName(); 313eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner} 314eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 315e86097af5598e44727875f00e492d43c978239beChris Lattnerbool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const { 316e86097af5598e44727875f00e492d43c978239beChris Lattner const EmitNodeMatcherCommon *M = cast<EmitNodeMatcherCommon>(m); 31758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return M->OpcodeName == OpcodeName && M->VTs == VTs && 31858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner M->Operands == Operands && M->HasChain == HasChain && 319036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner M->HasInGlue == HasInGlue && M->HasOutGlue == HasOutGlue && 320ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner M->HasMemRefs == HasMemRefs && 32158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner M->NumFixedArityOperands == NumFixedArityOperands; 32258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 32358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 324e86097af5598e44727875f00e492d43c978239beChris Lattnerunsigned EmitNodeMatcherCommon::getHashImpl() const { 32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return (HashString(OpcodeName) << 4) | Operands.size(); 32658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 32758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 32858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 3292d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid EmitNodeMatcher::anchor() { } 3302d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 3312d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MorphNodeToMatcher::anchor() { } 3322d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 3338950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerunsigned MarkGlueResultsMatcher::getHashImpl() const { 3348950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner return HashUnsigneds(GlueResultNodes.begin(), GlueResultNodes.end()); 33558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 33658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 33758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CompleteMatchMatcher::getHashImpl() const { 338fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach return HashUnsigneds(Results.begin(), Results.end()) ^ 33958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner ((unsigned)(intptr_t)&Pattern << 8); 34058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 34182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 34282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner// isContradictoryImpl Implementations. 34382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 34482781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerstatic bool TypesAreContradictory(MVT::SimpleValueType T1, 34582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner MVT::SimpleValueType T2) { 34682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // If the two types are the same, then they are the same, so they don't 34782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // contradict. 34882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (T1 == T2) return false; 349fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 35082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // If either type is about iPtr, then they don't conflict unless the other 35182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // one is not a scalar integer type. 35282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (T1 == MVT::iPTR) 35382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return !MVT(T2).isInteger() || MVT(T2).isVector(); 354fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 35582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (T2 == MVT::iPTR) 35682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return !MVT(T1).isInteger() || MVT(T1).isVector(); 357fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 35882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // Otherwise, they are two different non-iPTR types, they conflict. 35982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return true; 36082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 36182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 362225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattnerbool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const { 363225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) { 364225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner // One node can't have two different opcodes! 365eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner // Note: pointer equality isn't enough here, we have to check the enum names 366fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach // to ensure that the nodes are for the same opcode. 367eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner return COM->getOpcode().getEnumName() != getOpcode().getEnumName(); 368225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner } 369fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 370225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner // If the node has a known type, and if the type we're checking for is 371225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner // different, then we know they contradict. For example, a check for 372225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner // ISD::STORE will never be true at the same time a check for Type i32 is. 373225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) { 374084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner // If checking for a result the opcode doesn't have, it can't match. 375084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner if (CT->getResNo() >= getOpcode().getNumResults()) 376084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner return true; 377fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 378084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner MVT::SimpleValueType NodeType = getOpcode().getKnownType(CT->getResNo()); 379aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner if (NodeType != MVT::Other) 380aac5b5b2e5eaf2e5bd62f9b96270e31d46125f4fChris Lattner return TypesAreContradictory(NodeType, CT->getType()); 381225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner } 382fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 383225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner return false; 384225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner} 385225798143dbec36685f9d1e2fa82f5c4e70b0bf5Chris Lattner 38682781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const { 38782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) 38882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return TypesAreContradictory(getType(), CT->getType()); 38982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 39082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 39182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 39282781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const { 39382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (const CheckChildTypeMatcher *CC = dyn_cast<CheckChildTypeMatcher>(M)) { 39482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // If the two checks are about different nodes, we don't know if they 39582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // conflict! 39682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (CC->getChildNo() != getChildNo()) 39782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 398fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 39982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return TypesAreContradictory(getType(), CC->getType()); 40082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner } 40182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 40282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 403fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 404247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattnerbool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const { 405247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M)) 406247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner return CIM->getValue() != getValue(); 407247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner return false; 408247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner} 40948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner 41048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattnerbool CheckValueTypeMatcher::isContradictoryImpl(const Matcher *M) const { 41148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner if (const CheckValueTypeMatcher *CVT = dyn_cast<CheckValueTypeMatcher>(M)) 41248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner return CVT->getTypeName() != getTypeName(); 41348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner return false; 41448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner} 41548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner 416