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