2010-02-15 08:04:42 +00:00
|
|
|
//===- DAGISelMatcher.cpp - Representation of DAG pattern matcher ---------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "DAGISelMatcher.h"
|
|
|
|
#include "CodeGenDAGPatterns.h"
|
|
|
|
#include "CodeGenTarget.h"
|
2010-02-18 22:03:03 +00:00
|
|
|
#include "Record.h"
|
2010-02-15 08:04:42 +00:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
void MatcherNode::dump() const {
|
|
|
|
print(errs());
|
|
|
|
}
|
|
|
|
|
2010-02-18 02:53:41 +00:00
|
|
|
void MatcherNode::printNext(raw_ostream &OS, unsigned indent) const {
|
|
|
|
if (Next)
|
|
|
|
return Next->print(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void PushMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "Push\n";
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent+2);
|
2010-02-15 08:04:42 +00:00
|
|
|
Failure->print(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RecordMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "Record\n";
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
2010-02-24 07:31:45 +00:00
|
|
|
void RecordChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "RecordChild: " << ChildNo << '\n';
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96716 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-21 03:22:59 +00:00
|
|
|
void RecordMemRefMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "RecordMemRef\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CaptureFlagInputMatcherNode::print(raw_ostream &OS, unsigned indent) const{
|
|
|
|
OS.indent(indent) << "CaptureFlagInput\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
2010-02-15 08:04:42 +00:00
|
|
|
void MoveChildMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "MoveChild " << ChildNo << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void MoveParentMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "MoveParent\n";
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckSameMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckSame " << MatchNumber << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckPatternPredicateMatcherNode::
|
|
|
|
print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckPatternPredicate " << Predicate << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckPredicateMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckPredicate " << PredName << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckOpcode " << OpcodeName << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
2010-02-22 22:30:37 +00:00
|
|
|
void CheckMultiOpcodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckMultiOpcode <todo args>\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
2010-02-15 08:04:42 +00:00
|
|
|
void CheckTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckType " << getEnumName(Type) << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckInteger " << Value << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckCondCodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckCondCode ISD::" << CondCodeName << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckValueTypeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckValueType MVT::" << TypeName << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckComplexPatMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckComplexPat " << Pattern.getSelectFunc() << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckAndImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckAndImm " << Value << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CheckOrImmMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckOrImm " << Value << '\n';
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-15 08:04:42 +00:00
|
|
|
}
|
|
|
|
|
2010-02-16 19:15:55 +00:00
|
|
|
void CheckFoldableChainNodeMatcherNode::print(raw_ostream &OS,
|
|
|
|
unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CheckFoldableChainNode\n";
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-16 06:10:58 +00:00
|
|
|
}
|
2010-02-17 06:23:39 +00:00
|
|
|
|
|
|
|
void CheckChainCompatibleMatcherNode::print(raw_ostream &OS,
|
|
|
|
unsigned indent) const {
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96716 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-21 03:22:59 +00:00
|
|
|
OS.indent(indent) << "CheckChainCompatible " << PreviousOp << "\n";
|
2010-02-18 02:53:41 +00:00
|
|
|
printNext(OS, indent);
|
2010-02-17 06:23:39 +00:00
|
|
|
}
|
2010-02-18 22:03:03 +00:00
|
|
|
|
|
|
|
void EmitIntegerMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96716 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-21 03:22:59 +00:00
|
|
|
OS.indent(indent) << "EmitInteger " << Val << " VT=" << VT << '\n';
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void EmitStringIntegerMatcherNode::
|
|
|
|
print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "EmitStringInteger " << Val << " VT=" << VT << '\n';
|
2010-02-18 22:03:03 +00:00
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void EmitRegisterMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96716 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-21 03:22:59 +00:00
|
|
|
OS.indent(indent) << "EmitRegister ";
|
2010-02-18 22:03:03 +00:00
|
|
|
if (Reg)
|
|
|
|
OS << Reg->getName();
|
|
|
|
else
|
|
|
|
OS << "zero_reg";
|
|
|
|
OS << " VT=" << VT << '\n';
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96716 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-21 03:22:59 +00:00
|
|
|
void EmitConvertToTargetMatcherNode::
|
|
|
|
print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "EmitConvertToTarget " << Slot << '\n';
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void EmitMergeInputChainsMatcherNode::
|
|
|
|
print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "EmitMergeInputChains <todo: args>\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void EmitCopyToRegMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "EmitCopyToReg <todo: args>\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void EmitNodeXFormMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "EmitNodeXForm " << NodeXForm->getName()
|
|
|
|
<< " Slot=" << Slot << '\n';
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmitNodeMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
|
|
|
|
|
|
|
|
for (unsigned i = 0, e = VTs.size(); i != e; ++i)
|
|
|
|
OS << ' ' << getEnumName(VTs[i]);
|
|
|
|
OS << '(';
|
|
|
|
for (unsigned i = 0, e = Operands.size(); i != e; ++i)
|
|
|
|
OS << Operands[i] << ' ';
|
|
|
|
OS << ")\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
2010-02-24 05:33:42 +00:00
|
|
|
void MarkFlagResultsMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "MarkFlagResults <todo: args>\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|
2010-02-21 06:03:07 +00:00
|
|
|
void CompleteMatchMatcherNode::print(raw_ostream &OS, unsigned indent) const {
|
|
|
|
OS.indent(indent) << "CompleteMatch <todo args>\n";
|
Lots of improvements to the new dagisel emitter. This gets it to
the point where it is to the 95% feature complete mark, it just
needs result updating to be done (then testing, optimization
etc).
More specificallly, this adds support for chain and flag handling
on the result nodes, support for sdnodexforms, support for variadic
nodes, memrefs, pinned physreg inputs, and probably lots of other
stuff.
In the old DAGISelEmitter, this deletes the dead code related to
OperatorMap, cleans up a variety of dead stuff handling "implicit
remapping" from things like globaladdr -> targetglobaladdr (which
is no longer used because globaladdr always needs to be legalized),
and some minor formatting fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96716 91177308-0d34-0410-b5e6-96231b3b80d8
2010-02-21 03:22:59 +00:00
|
|
|
OS.indent(indent) << "Src = " << *Pattern.getSrcPattern() << "\n";
|
|
|
|
OS.indent(indent) << "Dst = " << *Pattern.getDstPattern() << "\n";
|
|
|
|
printNext(OS, indent);
|
|
|
|
}
|
|
|
|
|