DAGISelMatcher.cpp revision a230f9623d864450d432bb76c397b0cb35a3437e
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 32d6c84720df0b63e34081e0c7890f3074d8b110b9Chris LattnerScopeMatcher::~ScopeMatcher() { 33d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner for (unsigned i = 0, e = Children.size(); i != e; ++i) 34d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner delete Children[i]; 35d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner} 36d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 37d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 38d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner// printImpl methods. 39d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 40a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid ScopeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 4160df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner OS.indent(indent) << "Scope\n"; 42d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner for (unsigned i = 0, e = getNumChildren(); i != e; ++i) 43d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner getChild(i)->print(OS, indent+2); 44da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 45da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 46a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 47da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "Record\n"; 48da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 49da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 50a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 5119b5a7590b784f19875b9880ea8838c393431656Chris Lattner OS.indent(indent) << "RecordChild: " << ChildNo << '\n'; 5219b5a7590b784f19875b9880ea8838c393431656Chris Lattner} 5319b5a7590b784f19875b9880ea8838c393431656Chris Lattner 54a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid RecordMemRefMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "RecordMemRef\n"; 568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 58a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CaptureFlagInputMatcher::printImpl(raw_ostream &OS, unsigned indent) const{ 598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "CaptureFlagInput\n"; 608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 618e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 62a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveChildMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "MoveChild " << ChildNo << '\n'; 64da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 65da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 66a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MoveParentMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "MoveParent\n"; 68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 70a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckSameMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 71da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckSame " << MatchNumber << '\n'; 72da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 73da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 74b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid CheckPatternPredicateMatcher:: 75a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 76da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n'; 77da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 78da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 79a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckPredicateMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 80da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckPredicate " << PredName << '\n'; 81da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 82da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 83a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 84a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner OS.indent(indent) << "CheckOpcode " << Opcode.getEnumName() << '\n'; 85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 87a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckMultiOpcodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const{ 8812a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner OS.indent(indent) << "CheckMultiOpcode <todo args>\n"; 8912a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner} 9012a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner 91a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 92da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n'; 93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 94da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 95a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChildTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 9623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner OS.indent(indent) << "CheckChildType " << ChildNo << " " 9723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner << getEnumName(Type) << '\n'; 9823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner} 9923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner 10023cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner 101a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 102da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckInteger " << Value << '\n'; 103da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 104da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 105a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckCondCodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 106da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n'; 107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 109a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckValueTypeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n'; 111da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 113a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckComplexPatMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 114da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n'; 115da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 116da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 117a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckAndImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckAndImm " << Value << '\n'; 119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 120da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 121a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckOrImmMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 122da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner OS.indent(indent) << "CheckOrImm " << Value << '\n'; 123da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} 124da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 125a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckFoldableChainNodeMatcher::printImpl(raw_ostream &OS, 12621390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner unsigned indent) const { 12721390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner OS.indent(indent) << "CheckFoldableChainNode\n"; 128e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner} 1299a747f1305e76025df2323a03b805a284f2cde77Chris Lattner 130a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CheckChainCompatibleMatcher::printImpl(raw_ostream &OS, 1319a747f1305e76025df2323a03b805a284f2cde77Chris Lattner unsigned indent) const { 1328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n"; 1339a747f1305e76025df2323a03b805a284f2cde77Chris Lattner} 134845c04273461b2a10754a1455b02916a19ea72aaChris Lattner 135a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitIntegerMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 1368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n'; 1378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 139b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitStringIntegerMatcher:: 140a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 1418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n'; 142845c04273461b2a10754a1455b02916a19ea72aaChris Lattner} 143845c04273461b2a10754a1455b02916a19ea72aaChris Lattner 144a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitRegisterMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 1458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitRegister "; 146845c04273461b2a10754a1455b02916a19ea72aaChris Lattner if (Reg) 147845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << Reg->getName(); 148845c04273461b2a10754a1455b02916a19ea72aaChris Lattner else 149845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << "zero_reg"; 150845c04273461b2a10754a1455b02916a19ea72aaChris Lattner OS << " VT=" << VT << '\n'; 151845c04273461b2a10754a1455b02916a19ea72aaChris Lattner} 152845c04273461b2a10754a1455b02916a19ea72aaChris Lattner 153b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitConvertToTargetMatcher:: 154a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 1558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n'; 1568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 158b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMergeInputChainsMatcher:: 159a5028a64634f995630e93390c5c23374a09a450fChris LattnerprintImpl(raw_ostream &OS, unsigned indent) const { 1608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitMergeInputChains <todo: args>\n"; 1618e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 163a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitCopyToRegMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 1648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitCopyToReg <todo: args>\n"; 1658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 167a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 1688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName() 1698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner << " Slot=" << Slot << '\n'; 1708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 1728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 173a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid EmitNodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 1748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> "; 1758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 1768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner for (unsigned i = 0, e = VTs.size(); i != e; ++i) 1778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << ' ' << getEnumName(VTs[i]); 1788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << '('; 1798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) 1808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << Operands[i] << ' '; 1818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS << ")\n"; 1828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 184a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid MarkFlagResultsMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 18502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner OS.indent(indent) << "MarkFlagResults <todo: args>\n"; 18602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner} 18702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner 188a5028a64634f995630e93390c5c23374a09a450fChris Lattnervoid CompleteMatchMatcher::printImpl(raw_ostream &OS, unsigned indent) const { 18977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner OS.indent(indent) << "CompleteMatch <todo args>\n"; 1908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n"; 1918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n"; 1928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner} 1938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 19458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner// getHashImpl Implementation. 19558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 19658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPatternPredicateMatcher::getHashImpl() const { 19758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(Predicate); 19858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 19958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 20058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckPredicateMatcher::getHashImpl() const { 20158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(PredName); 20258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 20358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 20458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckOpcodeMatcher::getHashImpl() const { 205a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner return HashString(Opcode.getEnumName()); 20658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 20758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 20858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckMultiOpcodeMatcher::getHashImpl() const { 20958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner unsigned Result = 0; 210a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner for (unsigned i = 0, e = Opcodes.size(); i != e; ++i) 211a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner Result |= HashString(Opcodes[i]->getEnumName()); 21258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return Result; 21358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 21458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 21558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckCondCodeMatcher::getHashImpl() const { 21658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(CondCodeName); 21758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 21858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 21958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CheckValueTypeMatcher::getHashImpl() const { 22058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(TypeName); 22158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 22258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 22358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitStringIntegerMatcher::getHashImpl() const { 22458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashString(Val) ^ VT; 22558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 22658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 22758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnertemplate<typename It> 22858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerstatic unsigned HashUnsigneds(It I, It E) { 22958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner unsigned Result = 0; 23058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner for (; I != E; ++I) 23158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner Result = (Result<<3) ^ *I; 23258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return Result; 23358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 23458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 23558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitMergeInputChainsMatcher::getHashImpl() const { 23658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashUnsigneds(ChainNodes.begin(), ChainNodes.end()); 23758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 23858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 23958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerbool EmitNodeMatcher::isEqualImpl(const Matcher *m) const { 24058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner const EmitNodeMatcher *M = cast<EmitNodeMatcher>(m); 24158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return M->OpcodeName == OpcodeName && M->VTs == VTs && 24258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner M->Operands == Operands && M->HasChain == HasChain && 24358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner M->HasFlag == HasFlag && M->HasMemRefs == HasMemRefs && 24458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner M->NumFixedArityOperands == NumFixedArityOperands; 24558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 24658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 24758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned EmitNodeMatcher::getHashImpl() const { 24858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return (HashString(OpcodeName) << 4) | Operands.size(); 24958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 25058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 25158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 25258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned MarkFlagResultsMatcher::getHashImpl() const { 25358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashUnsigneds(FlagResultNodes.begin(), FlagResultNodes.end()); 25458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 25558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner 25658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerunsigned CompleteMatchMatcher::getHashImpl() const { 25758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return HashUnsigneds(Results.begin(), Results.end()) ^ 25858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner ((unsigned)(intptr_t)&Pattern << 8); 25958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner} 26082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 26182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner// isContradictoryImpl Implementations. 26282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 26382781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const { 26482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) { 26582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // One node can't have two different opcodes! 266a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner return &COM->getOpcode() != &getOpcode(); 26782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner } 26882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 26982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // TODO: CheckMultiOpcodeMatcher? 270247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner 271247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner // This is a special common case we see a lot in the X86 backend, we know that 272247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner // ISD::STORE nodes can't have non-void type. 273247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) 274255584aaa6ccc4333f0493daa03cf2db97ef42f9Chris Lattner // FIXME: This sucks, get void nodes from type constraints. 275a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner return (getOpcode().getEnumName() == "ISD::STORE" || 276a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner getOpcode().getEnumName() == "ISD::INTRINSIC_VOID") && 277255584aaa6ccc4333f0493daa03cf2db97ef42f9Chris Lattner CT->getType() != MVT::isVoid; 278247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner 27982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 28082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 28182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 28282781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerstatic bool TypesAreContradictory(MVT::SimpleValueType T1, 28382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner MVT::SimpleValueType T2) { 28482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // If the two types are the same, then they are the same, so they don't 28582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // contradict. 28682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (T1 == T2) return false; 28782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 28882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // If either type is about iPtr, then they don't conflict unless the other 28982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // one is not a scalar integer type. 29082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (T1 == MVT::iPTR) 29182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return !MVT(T2).isInteger() || MVT(T2).isVector(); 29282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 29382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (T2 == MVT::iPTR) 29482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return !MVT(T1).isInteger() || MVT(T1).isVector(); 29582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 29682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // Otherwise, they are two different non-iPTR types, they conflict. 29782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return true; 29882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 29982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 30082781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const { 30182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) 30282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return TypesAreContradictory(getType(), CT->getType()); 30382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 30482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 30582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 30682781b938af4057df90b5fa4035781ddc4aa681aChris Lattnerbool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const { 30782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (const CheckChildTypeMatcher *CC = dyn_cast<CheckChildTypeMatcher>(M)) { 30882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // If the two checks are about different nodes, we don't know if they 30982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // conflict! 31082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (CC->getChildNo() != getChildNo()) 31182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 31282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 31382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return TypesAreContradictory(getType(), CC->getType()); 31482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner } 31582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return false; 31682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner} 31782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner 318247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattnerbool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const { 319247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M)) 320247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner return CIM->getValue() != getValue(); 321247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner return false; 322247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner} 323