DAGISelMatcher.cpp revision 845c04273461b2a10754a1455b02916a19ea72aa
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
21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "EmitNode: Src = " << *Pattern.getSrcPattern() << "\n";
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "EmitNode: Dst = " << *Pattern.getDstPattern() << "\n";
24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
26bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattnervoid MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
27bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  if (Next)
28bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner    return Next->print(OS, indent);
29bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  OS.indent(indent) << "<null next field>\n";
30da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
31da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
32da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
33da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
34da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Push\n";
35bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent+2);
36da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  Failure->print(OS, indent);
37da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
38da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
39da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
40da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "Record\n";
41bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
42da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
43da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
44da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
45da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveChild " << ChildNo << '\n';
46bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
47da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
48da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
49da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
50da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "MoveParent\n";
51bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
52da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
53da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
54da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
55da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
56bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
57da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
59da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckPatternPredicateMatcherNode::
60da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerprint(raw_ostream &OS, unsigned indent) const {
61da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
62bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
64da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
65da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
66da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckPredicate " << PredName << '\n';
67bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
70da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
71da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
72bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
73da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
74da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
75da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
76da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
77bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
78da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
79da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
80da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
81da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckInteger " << Value << '\n';
82bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
83da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
84da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
87bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
88da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
89da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
91da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
92bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
94da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
95da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
96da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
97bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
98da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
99da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
100da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
101da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckAndImm " << Value << '\n';
102bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
103da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
104da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
105da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnervoid CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
106da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  OS.indent(indent) << "CheckOrImm " << Value << '\n';
107bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
108da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}
109da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
11021390d79843050ae8b3226860cadc16ff51d0dcfChris Lattnervoid CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
11121390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner                                              unsigned indent) const {
11221390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner  OS.indent(indent) << "CheckFoldableChainNode\n";
113bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
114e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}
1159a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
1169a747f1305e76025df2323a03b805a284f2cde77Chris Lattnervoid CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
1179a747f1305e76025df2323a03b805a284f2cde77Chris Lattner                                              unsigned indent) const {
1189a747f1305e76025df2323a03b805a284f2cde77Chris Lattner  OS.indent(indent) << "CheckChainCompatibleMatcherNode " << PreviousOp << "\n";
119bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  printNext(OS, indent);
1209a747f1305e76025df2323a03b805a284f2cde77Chris Lattner}
121845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
122845c04273461b2a10754a1455b02916a19ea72aaChris Lattnervoid EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
123845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS.indent(indent) << "EmitIntegerMatcherNode " << Val << " VT=" << VT << '\n';
124845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  printNext(OS, indent);
125845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
126845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
127845c04273461b2a10754a1455b02916a19ea72aaChris Lattnervoid EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
128845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS.indent(indent) << "EmitRegisterMatcherNode ";
129845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  if (Reg)
130845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << Reg->getName();
131845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  else
132845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    OS << "zero_reg";
133845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  OS << " VT=" << VT << '\n';
134845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  printNext(OS, indent);
135845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}
136845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
137