DAGISelMatcher.cpp revision 12a667c1e8fa57a13ae751164b6dd4412a62dc5d
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
388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
398e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "RecordMemRef\n";
408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid CaptureFlagInputMatcherNode::print(raw_ostream &OS, unsigned indent) const{
448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "CaptureFlagInput\n";
458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
48da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
49da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
50bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
51da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
52da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
53da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
54da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
55bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
56da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
57da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
59da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
60bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
61da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
62da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckPatternPredicateMatcherNode::
64da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerprint(raw_ostream &OS, unsigned indent) const {
65da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
66bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
70da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPredicate " << PredName << '\n';
71bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
72da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
73da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
74da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
75da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
76bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
77da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
78da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
7912a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattnervoid CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
8012a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner  OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
8112a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner  printNext(OS, indent);
8212a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner}
8312a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
84da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
86bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
87da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
88da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
89da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
91bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
92da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
94da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
95da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
96bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
97da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
98da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
99da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
100da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
101bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
102da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
103da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
104da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
105da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
106bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
107da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
109da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
110da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
111bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
112da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
113da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
114da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
115da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
116bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
11921390d79843050ae8b3226860cadc16ff51d0dcfChris Lattnervoid CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
12021390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
12121390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
122bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
123e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
1249a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
1259a747f1305e76025df2323a03b805a284f2cde77Chris Lattnervoid CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
1269a747f1305e76025df2323a03b805a284f2cde77Chris Lattner                                              unsigned indent) const {
1278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n";
128bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
1299a747f1305e76025df2323a03b805a284f2cde77Chris Lattner}
130845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
131845c04273461b2a10754a1455b02916a19ea72aaChris Lattnervoid EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
1338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1348e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1358e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitStringIntegerMatcherNode::
1378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerprint(raw_ostream &OS, unsigned indent) const {
1388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
139845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  printNext(OS, indent);
140845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
141845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
142845c04273461b2a10754a1455b02916a19ea72aaChris Lattnervoid EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitRegister ";
144845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
145845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
146845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
147845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
148845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
149845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  printNext(OS, indent);
150845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
151845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
1528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitConvertToTargetMatcherNode::
1538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerprint(raw_ostream &OS, unsigned indent) const {
1548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
1558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitMergeInputChainsMatcherNode::
1598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerprint(raw_ostream &OS, unsigned indent) const {
1608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
1618e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1638e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitCopyToRegMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
1668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitNodeXFormMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
1718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner     << " Slot=" << Slot << '\n';
1728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnervoid EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
1778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
1788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
1798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = VTs.size(); i != e; ++i)
1808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << ' ' << getEnumName(VTs[i]);
1818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << '(';
1828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
1838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    OS << Operands[i] << ' ';
1848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  OS << ")\n";
1858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  printNext(OS, indent);
1868e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
18877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattnervoid CompleteMatchMatcherNode::print(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  printNext(OS, indent);
1938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}
1948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
195