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