DAGISelMatcher.cpp revision 19b5a7590b784f19875b9880ea8838c393431656
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"
15da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerusing namespace llvm;
16da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
17da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MatcherNode::dump() const {
18da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  print(errs());
19da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
21bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattnervoid MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
22bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  if (Next)
23bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    return Next->print(OS, indent);
24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
26da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
28da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Push\n";
29bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent+2);
30da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  Failure->print(OS, indent);
31da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
32da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
33da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
34da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Record\n";
35bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
36da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
37da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
3819b5a7590b784f19875b9880ea8838c393431656Chris Lattnervoid RecordChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
3919b5a7590b784f19875b9880ea8838c393431656Chris Lattner  OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
4019b5a7590b784f19875b9880ea8838c393431656Chris Lattner  printNext(OS, indent);
4119b5a7590b784f19875b9880ea8838c393431656Chris Lattner}
4219b5a7590b784f19875b9880ea8838c393431656Chris Lattner
438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "RecordMemRef\n";
458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid CaptureFlagInputMatcherNode::print(raw_ostream &OS, unsigned indent) const{
498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "CaptureFlagInput\n";
508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
53da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
54da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
55bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
56da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
57da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
59da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
60bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
61da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
62da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
64da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
65bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
66da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckPatternPredicateMatcherNode::
69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerprint(raw_ostream &OS, unsigned indent) const {
70da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
71bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
72da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
73da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
74da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
75da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPredicate " << PredName << '\n';
76bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
77da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
78da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
79da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
80da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
81bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
82da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
83da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
8412a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattnervoid CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
8512a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner  OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
8612a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner  printNext(OS, indent);
8712a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner}
8812a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
89da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
91bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
92da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
94da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
95da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
96bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
97da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
98da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
99da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
100da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
101bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
102da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
103da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
104da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
105da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
106bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
109da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
111bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
113da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
114da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
115da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
116bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
120da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
121bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
122da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
123da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
12421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattnervoid CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
12521390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
12621390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
127bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
128e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
1299a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
1309a747f1305e76025df2323a03b805a284f2cde77Chris Lattnervoid CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
1319a747f1305e76025df2323a03b805a284f2cde77Chris Lattner                                              unsigned indent) const {
1328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n";
133bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
1349a747f1305e76025df2323a03b805a284f2cde77Chris Lattner}
135845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
136845c04273461b2a10754a1455b02916a19ea72aaChris Lattnervoid EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
1388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1398e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitStringIntegerMatcherNode::
1428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerprint(raw_ostream &OS, unsigned indent) const {
1438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
144845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  printNext(OS, indent);
145845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
146845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
147845c04273461b2a10754a1455b02916a19ea72aaChris Lattnervoid EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitRegister ";
149845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
150845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
151845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
152845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
153845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
154845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  printNext(OS, indent);
155845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
156845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
1578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitConvertToTargetMatcherNode::
1588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerprint(raw_ostream &OS, unsigned indent) const {
1598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
1608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1618e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1638e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitMergeInputChainsMatcherNode::
1648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerprint(raw_ostream &OS, unsigned indent) const {
1658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
1668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitCopyToRegMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
1718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitNodeXFormMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
1768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner     << " Slot=" << Slot << '\n';
1778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
1838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = VTs.size(); i != e; ++i)
1858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ' ' << getEnumName(VTs[i]);
1868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << '(';
1878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
1888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << Operands[i] << ' ';
1898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << ")\n";
1908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
19302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattnervoid MarkFlagResultsMatcherNode::print(raw_ostream &OS, unsigned indent) const {
19402f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  OS.indent(indent) << "MarkFlagResults <todo: args>\n";
19502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  printNext(OS, indent);
19602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner}
19702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
19877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattnervoid CompleteMatchMatcherNode::print(raw_ostream &OS, unsigned indent) const {
19977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  OS.indent(indent) << "CompleteMatch <todo args>\n";
2008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
2018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
2028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
2038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
2048e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
205