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