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