mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-02 10:21:54 +00:00
trailing whitespace.
llvm-svn: 126733
This commit is contained in:
parent
fbdcd70f4b
commit
3b72823981
@ -764,7 +764,7 @@ bool SelectionDAGISel::TryToFoldFastISelLoad(const LoadInst *LI,
|
||||
"The only use of the vreg must be a use, we haven't emitted the def!");
|
||||
|
||||
MachineInstr *User = &*RI;
|
||||
|
||||
|
||||
// Set the insertion point properly. Folding the load can cause generation of
|
||||
// other random instructions (like sign extends) for addressing modes, make
|
||||
// sure they get inserted in a logical place before the new instruction.
|
||||
|
@ -27,7 +27,7 @@ using namespace llvm;
|
||||
static unsigned getResultPatternCost(TreePatternNode *P,
|
||||
CodeGenDAGPatterns &CGP) {
|
||||
if (P->isLeaf()) return 0;
|
||||
|
||||
|
||||
unsigned Cost = 0;
|
||||
Record *Op = P->getOperator();
|
||||
if (Op->isSubClassOf("Instruction")) {
|
||||
@ -43,7 +43,7 @@ static unsigned getResultPatternCost(TreePatternNode *P,
|
||||
|
||||
/// getResultPatternCodeSize - Compute the code size of instructions for this
|
||||
/// pattern.
|
||||
static unsigned getResultPatternSize(TreePatternNode *P,
|
||||
static unsigned getResultPatternSize(TreePatternNode *P,
|
||||
CodeGenDAGPatterns &CGP) {
|
||||
if (P->isLeaf()) return 0;
|
||||
|
||||
@ -64,21 +64,21 @@ namespace {
|
||||
struct PatternSortingPredicate {
|
||||
PatternSortingPredicate(CodeGenDAGPatterns &cgp) : CGP(cgp) {}
|
||||
CodeGenDAGPatterns &CGP;
|
||||
|
||||
|
||||
bool operator()(const PatternToMatch *LHS, const PatternToMatch *RHS) {
|
||||
const TreePatternNode *LHSSrc = LHS->getSrcPattern();
|
||||
const TreePatternNode *RHSSrc = RHS->getSrcPattern();
|
||||
|
||||
|
||||
if (LHSSrc->getNumTypes() != 0 && RHSSrc->getNumTypes() != 0 &&
|
||||
LHSSrc->getType(0) != RHSSrc->getType(0)) {
|
||||
MVT::SimpleValueType V1 = LHSSrc->getType(0), V2 = RHSSrc->getType(0);
|
||||
if (MVT(V1).isVector() != MVT(V2).isVector())
|
||||
return MVT(V2).isVector();
|
||||
|
||||
|
||||
if (MVT(V1).isFloatingPoint() != MVT(V2).isFloatingPoint())
|
||||
return MVT(V2).isFloatingPoint();
|
||||
}
|
||||
|
||||
|
||||
// Otherwise, if the patterns might both match, sort based on complexity,
|
||||
// which means that we prefer to match patterns that cover more nodes in the
|
||||
// input over nodes that cover fewer.
|
||||
@ -86,18 +86,18 @@ struct PatternSortingPredicate {
|
||||
unsigned RHSSize = RHS->getPatternComplexity(CGP);
|
||||
if (LHSSize > RHSSize) return true; // LHS -> bigger -> less cost
|
||||
if (LHSSize < RHSSize) return false;
|
||||
|
||||
|
||||
// If the patterns have equal complexity, compare generated instruction cost
|
||||
unsigned LHSCost = getResultPatternCost(LHS->getDstPattern(), CGP);
|
||||
unsigned RHSCost = getResultPatternCost(RHS->getDstPattern(), CGP);
|
||||
if (LHSCost < RHSCost) return true;
|
||||
if (LHSCost > RHSCost) return false;
|
||||
|
||||
|
||||
unsigned LHSPatSize = getResultPatternSize(LHS->getDstPattern(), CGP);
|
||||
unsigned RHSPatSize = getResultPatternSize(RHS->getDstPattern(), CGP);
|
||||
if (LHSPatSize < RHSPatSize) return true;
|
||||
if (LHSPatSize > RHSPatSize) return false;
|
||||
|
||||
|
||||
// Sort based on the UID of the pattern, giving us a deterministic ordering
|
||||
// if all other sorting conditions fail.
|
||||
assert(LHS == RHS || LHS->ID != RHS->ID);
|
||||
@ -110,7 +110,7 @@ struct PatternSortingPredicate {
|
||||
void DAGISelEmitter::run(raw_ostream &OS) {
|
||||
EmitSourceFileHeader("DAG Instruction Selector for the " +
|
||||
CGP.getTargetInfo().getName() + " target", OS);
|
||||
|
||||
|
||||
OS << "// *** NOTE: This file is #included into the middle of the target\n"
|
||||
<< "// *** instruction selector class. These functions are really "
|
||||
<< "methods.\n\n";
|
||||
@ -132,8 +132,8 @@ void DAGISelEmitter::run(raw_ostream &OS) {
|
||||
// We want to process the matches in order of minimal cost. Sort the patterns
|
||||
// so the least cost one is at the start.
|
||||
std::sort(Patterns.begin(), Patterns.end(), PatternSortingPredicate(CGP));
|
||||
|
||||
|
||||
|
||||
|
||||
// Convert each variant of each pattern into a Matcher.
|
||||
std::vector<Matcher*> PatternMatchers;
|
||||
for (unsigned i = 0, e = Patterns.size(); i != e; ++i) {
|
||||
@ -144,7 +144,7 @@ void DAGISelEmitter::run(raw_ostream &OS) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Matcher *TheMatcher = new ScopeMatcher(&PatternMatchers[0],
|
||||
PatternMatchers.size());
|
||||
|
||||
|
@ -51,14 +51,14 @@ public:
|
||||
|
||||
unsigned EmitMatcherList(const Matcher *N, unsigned Indent,
|
||||
unsigned StartIdx, formatted_raw_ostream &OS);
|
||||
|
||||
|
||||
void EmitPredicateFunctions(formatted_raw_ostream &OS);
|
||||
|
||||
|
||||
void EmitHistogram(const Matcher *N, formatted_raw_ostream &OS);
|
||||
private:
|
||||
unsigned EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
formatted_raw_ostream &OS);
|
||||
|
||||
|
||||
unsigned getNodePredicate(StringRef PredName) {
|
||||
unsigned &Entry = NodePredicateMap[PredName];
|
||||
if (Entry == 0) {
|
||||
@ -75,7 +75,7 @@ private:
|
||||
}
|
||||
return Entry-1;
|
||||
}
|
||||
|
||||
|
||||
unsigned getComplexPat(const ComplexPattern &P) {
|
||||
unsigned &Entry = ComplexPatternMap[&P];
|
||||
if (Entry == 0) {
|
||||
@ -84,7 +84,7 @@ private:
|
||||
}
|
||||
return Entry-1;
|
||||
}
|
||||
|
||||
|
||||
unsigned getNodeXFormID(Record *Rec) {
|
||||
unsigned &Entry = NodeXFormMap[Rec];
|
||||
if (Entry == 0) {
|
||||
@ -93,13 +93,13 @@ private:
|
||||
}
|
||||
return Entry-1;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
} // end anonymous namespace.
|
||||
|
||||
static unsigned GetVBRSize(unsigned Val) {
|
||||
if (Val <= 127) return 1;
|
||||
|
||||
|
||||
unsigned NumBytes = 0;
|
||||
while (Val >= 128) {
|
||||
Val >>= 7;
|
||||
@ -115,7 +115,7 @@ static uint64_t EmitVBRValue(uint64_t Val, raw_ostream &OS) {
|
||||
OS << Val << ", ";
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
uint64_t InVal = Val;
|
||||
unsigned NumBytes = 0;
|
||||
while (Val >= 128) {
|
||||
@ -136,14 +136,14 @@ unsigned MatcherTableEmitter::
|
||||
EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
formatted_raw_ostream &OS) {
|
||||
OS.PadToColumn(Indent*2);
|
||||
|
||||
|
||||
switch (N->getKind()) {
|
||||
case Matcher::Scope: {
|
||||
const ScopeMatcher *SM = cast<ScopeMatcher>(N);
|
||||
assert(SM->getNext() == 0 && "Shouldn't have next after scope");
|
||||
|
||||
|
||||
unsigned StartIdx = CurrentIdx;
|
||||
|
||||
|
||||
// Emit all of the children.
|
||||
for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i) {
|
||||
if (i == 0) {
|
||||
@ -167,29 +167,29 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
unsigned VBRSize = 0;
|
||||
do {
|
||||
VBRSize = GetVBRSize(ChildSize);
|
||||
|
||||
|
||||
TmpBuf.clear();
|
||||
raw_svector_ostream OS(TmpBuf);
|
||||
formatted_raw_ostream FOS(OS);
|
||||
ChildSize = EmitMatcherList(SM->getChild(i), Indent+1,
|
||||
CurrentIdx+VBRSize, FOS);
|
||||
} while (GetVBRSize(ChildSize) != VBRSize);
|
||||
|
||||
|
||||
assert(ChildSize != 0 && "Should not have a zero-sized child!");
|
||||
|
||||
|
||||
CurrentIdx += EmitVBRValue(ChildSize, OS);
|
||||
if (!OmitComments) {
|
||||
OS << "/*->" << CurrentIdx+ChildSize << "*/";
|
||||
|
||||
|
||||
if (i == 0)
|
||||
OS.PadToColumn(CommentIndent) << "// " << SM->getNumChildren()
|
||||
<< " children in Scope";
|
||||
}
|
||||
|
||||
|
||||
OS << '\n' << TmpBuf.str();
|
||||
CurrentIdx += ChildSize;
|
||||
}
|
||||
|
||||
|
||||
// Emit a zero as a sentinel indicating end of 'Scope'.
|
||||
if (!OmitComments)
|
||||
OS << "/*" << CurrentIdx << "*/";
|
||||
@ -199,7 +199,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << '\n';
|
||||
return CurrentIdx - StartIdx + 1;
|
||||
}
|
||||
|
||||
|
||||
case Matcher::RecordNode:
|
||||
OS << "OPC_RecordNode,";
|
||||
if (!OmitComments)
|
||||
@ -218,23 +218,23 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
<< cast<RecordChildMatcher>(N)->getWhatFor();
|
||||
OS << '\n';
|
||||
return 1;
|
||||
|
||||
|
||||
case Matcher::RecordMemRef:
|
||||
OS << "OPC_RecordMemRef,\n";
|
||||
return 1;
|
||||
|
||||
|
||||
case Matcher::CaptureGlueInput:
|
||||
OS << "OPC_CaptureGlueInput,\n";
|
||||
return 1;
|
||||
|
||||
|
||||
case Matcher::MoveChild:
|
||||
OS << "OPC_MoveChild, " << cast<MoveChildMatcher>(N)->getChildNo() << ",\n";
|
||||
return 2;
|
||||
|
||||
|
||||
case Matcher::MoveParent:
|
||||
OS << "OPC_MoveParent,\n";
|
||||
return 1;
|
||||
|
||||
|
||||
case Matcher::CheckSame:
|
||||
OS << "OPC_CheckSame, "
|
||||
<< cast<CheckSameMatcher>(N)->getMatchNumber() << ",\n";
|
||||
@ -261,11 +261,11 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << "OPC_CheckOpcode, TARGET_VAL("
|
||||
<< cast<CheckOpcodeMatcher>(N)->getOpcode().getEnumName() << "),\n";
|
||||
return 3;
|
||||
|
||||
|
||||
case Matcher::SwitchOpcode:
|
||||
case Matcher::SwitchType: {
|
||||
unsigned StartIdx = CurrentIdx;
|
||||
|
||||
|
||||
unsigned NumCases;
|
||||
if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N)) {
|
||||
OS << "OPC_SwitchOpcode ";
|
||||
@ -279,7 +279,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << "/*" << NumCases << " cases */";
|
||||
OS << ", ";
|
||||
++CurrentIdx;
|
||||
|
||||
|
||||
// For each case we emit the size, then the opcode, then the matcher.
|
||||
for (unsigned i = 0, e = NumCases; i != e; ++i) {
|
||||
const Matcher *Child;
|
||||
@ -291,7 +291,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
Child = cast<SwitchTypeMatcher>(N)->getCaseMatcher(i);
|
||||
IdxSize = 1; // size of type in table is 1 byte.
|
||||
}
|
||||
|
||||
|
||||
// We need to encode the opcode and the offset of the case code before
|
||||
// emitting the case code. Handle this by buffering the output into a
|
||||
// string while we get the size. Unfortunately, the offset of the
|
||||
@ -302,26 +302,26 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
unsigned VBRSize = 0;
|
||||
do {
|
||||
VBRSize = GetVBRSize(ChildSize);
|
||||
|
||||
|
||||
TmpBuf.clear();
|
||||
raw_svector_ostream OS(TmpBuf);
|
||||
formatted_raw_ostream FOS(OS);
|
||||
ChildSize = EmitMatcherList(Child, Indent+1, CurrentIdx+VBRSize+IdxSize,
|
||||
FOS);
|
||||
} while (GetVBRSize(ChildSize) != VBRSize);
|
||||
|
||||
|
||||
assert(ChildSize != 0 && "Should not have a zero-sized child!");
|
||||
|
||||
|
||||
if (i != 0) {
|
||||
OS.PadToColumn(Indent*2);
|
||||
if (!OmitComments)
|
||||
OS << (isa<SwitchOpcodeMatcher>(N) ?
|
||||
"/*SwitchOpcode*/ " : "/*SwitchType*/ ");
|
||||
}
|
||||
|
||||
|
||||
// Emit the VBR.
|
||||
CurrentIdx += EmitVBRValue(ChildSize, OS);
|
||||
|
||||
|
||||
OS << ' ';
|
||||
if (const SwitchOpcodeMatcher *SOM = dyn_cast<SwitchOpcodeMatcher>(N))
|
||||
OS << "TARGET_VAL(" << SOM->getCaseOpcode(i).getEnumName() << "),";
|
||||
@ -354,13 +354,13 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << "OPC_CheckType, "
|
||||
<< getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
|
||||
return 2;
|
||||
|
||||
|
||||
case Matcher::CheckChildType:
|
||||
OS << "OPC_CheckChild"
|
||||
<< cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
|
||||
<< getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
|
||||
return 2;
|
||||
|
||||
|
||||
case Matcher::CheckInteger: {
|
||||
OS << "OPC_CheckInteger, ";
|
||||
unsigned Bytes=1+EmitVBRValue(cast<CheckIntegerMatcher>(N)->getValue(), OS);
|
||||
@ -371,7 +371,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << "OPC_CheckCondCode, ISD::"
|
||||
<< cast<CheckCondCodeMatcher>(N)->getCondCodeName() << ",\n";
|
||||
return 2;
|
||||
|
||||
|
||||
case Matcher::CheckValueType:
|
||||
OS << "OPC_CheckValueType, MVT::"
|
||||
<< cast<CheckValueTypeMatcher>(N)->getTypeName() << ",\n";
|
||||
@ -382,20 +382,20 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
const ComplexPattern &Pattern = CCPM->getPattern();
|
||||
OS << "OPC_CheckComplexPat, /*CP*/" << getComplexPat(Pattern) << ", /*#*/"
|
||||
<< CCPM->getMatchNumber() << ',';
|
||||
|
||||
|
||||
if (!OmitComments) {
|
||||
OS.PadToColumn(CommentIndent) << "// " << Pattern.getSelectFunc();
|
||||
OS << ":$" << CCPM->getName();
|
||||
for (unsigned i = 0, e = Pattern.getNumOperands(); i != e; ++i)
|
||||
OS << " #" << CCPM->getFirstResult()+i;
|
||||
|
||||
|
||||
if (Pattern.hasProperty(SDNPHasChain))
|
||||
OS << " + chain result";
|
||||
}
|
||||
OS << '\n';
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
case Matcher::CheckAndImm: {
|
||||
OS << "OPC_CheckAndImm, ";
|
||||
unsigned Bytes=1+EmitVBRValue(cast<CheckAndImmMatcher>(N)->getValue(), OS);
|
||||
@ -409,11 +409,11 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << '\n';
|
||||
return Bytes;
|
||||
}
|
||||
|
||||
|
||||
case Matcher::CheckFoldableChainNode:
|
||||
OS << "OPC_CheckFoldableChainNode,\n";
|
||||
return 1;
|
||||
|
||||
|
||||
case Matcher::EmitInteger: {
|
||||
int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
|
||||
OS << "OPC_EmitInteger, "
|
||||
@ -430,7 +430,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
<< Val << ",\n";
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
case Matcher::EmitRegister:
|
||||
if (useEmitRegister2) {
|
||||
OS << "OPC_EmitRegister2, "
|
||||
@ -457,22 +457,22 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
}
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
case Matcher::EmitConvertToTarget:
|
||||
OS << "OPC_EmitConvertToTarget, "
|
||||
<< cast<EmitConvertToTargetMatcher>(N)->getSlot() << ",\n";
|
||||
return 2;
|
||||
|
||||
|
||||
case Matcher::EmitMergeInputChains: {
|
||||
const EmitMergeInputChainsMatcher *MN =
|
||||
cast<EmitMergeInputChainsMatcher>(N);
|
||||
|
||||
|
||||
// Handle the specialized forms OPC_EmitMergeInputChains1_0 and 1_1.
|
||||
if (MN->getNumNodes() == 1 && MN->getNode(0) < 2) {
|
||||
OS << "OPC_EmitMergeInputChains1_" << MN->getNode(0) << ",\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
OS << "OPC_EmitMergeInputChains, " << MN->getNumNodes() << ", ";
|
||||
for (unsigned i = 0, e = MN->getNumNodes(); i != e; ++i)
|
||||
OS << MN->getNode(i) << ", ";
|
||||
@ -494,13 +494,13 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS <<'\n';
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
case Matcher::EmitNode:
|
||||
case Matcher::MorphNodeTo: {
|
||||
const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
|
||||
OS << (isa<EmitNodeMatcher>(EN) ? "OPC_EmitNode" : "OPC_MorphNodeTo");
|
||||
OS << ", TARGET_VAL(" << EN->getOpcodeName() << "), 0";
|
||||
|
||||
|
||||
if (EN->hasChain()) OS << "|OPFL_Chain";
|
||||
if (EN->hasInFlag()) OS << "|OPFL_GlueInput";
|
||||
if (EN->hasOutFlag()) OS << "|OPFL_GlueOutput";
|
||||
@ -508,7 +508,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
if (EN->getNumFixedArityOperands() != -1)
|
||||
OS << "|OPFL_Variadic" << EN->getNumFixedArityOperands();
|
||||
OS << ",\n";
|
||||
|
||||
|
||||
OS.PadToColumn(Indent*2+4) << EN->getNumVTs();
|
||||
if (!OmitComments)
|
||||
OS << "/*#VTs*/";
|
||||
@ -523,7 +523,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
unsigned NumOperandBytes = 0;
|
||||
for (unsigned i = 0, e = EN->getNumOperands(); i != e; ++i)
|
||||
NumOperandBytes += EmitVBRValue(EN->getOperand(i), OS);
|
||||
|
||||
|
||||
if (!OmitComments) {
|
||||
// Print the result #'s for EmitNode.
|
||||
if (const EmitNodeMatcher *E = dyn_cast<EmitNodeMatcher>(EN)) {
|
||||
@ -538,14 +538,14 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
|
||||
if (const MorphNodeToMatcher *SNT = dyn_cast<MorphNodeToMatcher>(N)) {
|
||||
OS.PadToColumn(Indent*2) << "// Src: "
|
||||
<< *SNT->getPattern().getSrcPattern() << " - Complexity = "
|
||||
<< *SNT->getPattern().getSrcPattern() << " - Complexity = "
|
||||
<< SNT->getPattern().getPatternComplexity(CGP) << '\n';
|
||||
OS.PadToColumn(Indent*2) << "// Dst: "
|
||||
<< *SNT->getPattern().getDstPattern() << '\n';
|
||||
}
|
||||
} else
|
||||
OS << '\n';
|
||||
|
||||
|
||||
return 6+EN->getNumVTs()+NumOperandBytes;
|
||||
}
|
||||
case Matcher::MarkGlueResults: {
|
||||
@ -566,7 +566,7 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
OS << '\n';
|
||||
if (!OmitComments) {
|
||||
OS.PadToColumn(Indent*2) << "// Src: "
|
||||
<< *CM->getPattern().getSrcPattern() << " - Complexity = "
|
||||
<< *CM->getPattern().getSrcPattern() << " - Complexity = "
|
||||
<< CM->getPattern().getPatternComplexity(CGP) << '\n';
|
||||
OS.PadToColumn(Indent*2) << "// Dst: "
|
||||
<< *CM->getPattern().getDstPattern();
|
||||
@ -590,7 +590,7 @@ EmitMatcherList(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
unsigned MatcherSize = EmitMatcher(N, Indent, CurrentIdx, OS);
|
||||
Size += MatcherSize;
|
||||
CurrentIdx += MatcherSize;
|
||||
|
||||
|
||||
// If there are other nodes in this list, iterate to them, otherwise we're
|
||||
// done.
|
||||
N = N->getNext();
|
||||
@ -609,15 +609,15 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
||||
OS << " }\n";
|
||||
OS << "}\n\n";
|
||||
}
|
||||
|
||||
|
||||
// Emit Node predicates.
|
||||
// FIXME: Annoyingly, these are stored by name, which we never even emit. Yay?
|
||||
StringMap<TreePattern*> PFsByName;
|
||||
|
||||
|
||||
for (CodeGenDAGPatterns::pf_iterator I = CGP.pf_begin(), E = CGP.pf_end();
|
||||
I != E; ++I)
|
||||
PFsByName[I->first->getName()] = I->second;
|
||||
|
||||
|
||||
if (!NodePredicates.empty()) {
|
||||
OS << "bool CheckNodePredicate(SDNode *Node, unsigned PredNo) const {\n";
|
||||
OS << " switch (PredNo) {\n";
|
||||
@ -626,7 +626,7 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
||||
// FIXME: Storing this by name is horrible.
|
||||
TreePattern *P =PFsByName[NodePredicates[i].substr(strlen("Predicate_"))];
|
||||
assert(P && "Unknown name?");
|
||||
|
||||
|
||||
// Emit the predicate code corresponding to this pattern.
|
||||
std::string Code = P->getRecord()->getValueAsCode("Predicate");
|
||||
assert(!Code.empty() && "No code in this predicate");
|
||||
@ -646,7 +646,7 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
||||
OS << " }\n";
|
||||
OS << "}\n\n";
|
||||
}
|
||||
|
||||
|
||||
// Emit CompletePattern matchers.
|
||||
// FIXME: This should be const.
|
||||
if (!ComplexPatterns.empty()) {
|
||||
@ -662,7 +662,7 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
||||
|
||||
if (P.hasProperty(SDNPHasChain))
|
||||
++NumOps; // Get the chained node too.
|
||||
|
||||
|
||||
OS << " case " << i << ":\n";
|
||||
OS << " Result.resize(NextRes+" << NumOps << ");\n";
|
||||
OS << " return " << P.getSelectFunc();
|
||||
@ -672,12 +672,12 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
||||
// first argument.
|
||||
if (P.hasProperty(SDNPWantRoot))
|
||||
OS << "Root, ";
|
||||
|
||||
|
||||
// If the complex pattern wants the parent of the operand being matched,
|
||||
// pass it in as the next argument.
|
||||
if (P.hasProperty(SDNPWantParent))
|
||||
OS << "Parent, ";
|
||||
|
||||
|
||||
OS << "N";
|
||||
for (unsigned i = 0; i != NumOps; ++i)
|
||||
OS << ", Result[NextRes+" << i << "].first";
|
||||
@ -686,28 +686,28 @@ void MatcherTableEmitter::EmitPredicateFunctions(formatted_raw_ostream &OS) {
|
||||
OS << " }\n";
|
||||
OS << "}\n\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Emit SDNodeXForm handlers.
|
||||
// FIXME: This should be const.
|
||||
if (!NodeXForms.empty()) {
|
||||
OS << "SDValue RunSDNodeXForm(SDValue V, unsigned XFormNo) {\n";
|
||||
OS << " switch (XFormNo) {\n";
|
||||
OS << " default: assert(0 && \"Invalid xform # in table?\");\n";
|
||||
|
||||
|
||||
// FIXME: The node xform could take SDValue's instead of SDNode*'s.
|
||||
for (unsigned i = 0, e = NodeXForms.size(); i != e; ++i) {
|
||||
const CodeGenDAGPatterns::NodeXForm &Entry =
|
||||
CGP.getSDNodeTransform(NodeXForms[i]);
|
||||
|
||||
|
||||
Record *SDNode = Entry.first;
|
||||
const std::string &Code = Entry.second;
|
||||
|
||||
|
||||
OS << " case " << i << ": { ";
|
||||
if (!OmitComments)
|
||||
OS << "// " << NodeXForms[i]->getName();
|
||||
OS << '\n';
|
||||
|
||||
|
||||
std::string ClassName = CGP.getSDNodeInfo(SDNode).getSDClassName();
|
||||
if (ClassName == "SDNode")
|
||||
OS << " SDNode *N = V.getNode();\n";
|
||||
@ -727,12 +727,12 @@ static void BuildHistogram(const Matcher *M, std::vector<unsigned> &OpcodeFreq){
|
||||
if (unsigned(M->getKind()) >= OpcodeFreq.size())
|
||||
OpcodeFreq.resize(M->getKind()+1);
|
||||
OpcodeFreq[M->getKind()]++;
|
||||
|
||||
|
||||
// Handle recursive nodes.
|
||||
if (const ScopeMatcher *SM = dyn_cast<ScopeMatcher>(M)) {
|
||||
for (unsigned i = 0, e = SM->getNumChildren(); i != e; ++i)
|
||||
BuildHistogram(SM->getChild(i), OpcodeFreq);
|
||||
} else if (const SwitchOpcodeMatcher *SOM =
|
||||
} else if (const SwitchOpcodeMatcher *SOM =
|
||||
dyn_cast<SwitchOpcodeMatcher>(M)) {
|
||||
for (unsigned i = 0, e = SOM->getNumCases(); i != e; ++i)
|
||||
BuildHistogram(SOM->getCaseMatcher(i), OpcodeFreq);
|
||||
@ -747,16 +747,16 @@ void MatcherTableEmitter::EmitHistogram(const Matcher *M,
|
||||
formatted_raw_ostream &OS) {
|
||||
if (OmitComments)
|
||||
return;
|
||||
|
||||
|
||||
std::vector<unsigned> OpcodeFreq;
|
||||
BuildHistogram(M, OpcodeFreq);
|
||||
|
||||
|
||||
OS << " // Opcode Histogram:\n";
|
||||
for (unsigned i = 0, e = OpcodeFreq.size(); i != e; ++i) {
|
||||
OS << " // #";
|
||||
switch ((Matcher::KindTy)i) {
|
||||
case Matcher::Scope: OS << "OPC_Scope"; break;
|
||||
case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
|
||||
case Matcher::Scope: OS << "OPC_Scope"; break;
|
||||
case Matcher::RecordNode: OS << "OPC_RecordNode"; break;
|
||||
case Matcher::RecordChild: OS << "OPC_RecordChild"; break;
|
||||
case Matcher::RecordMemRef: OS << "OPC_RecordMemRef"; break;
|
||||
case Matcher::CaptureGlueInput: OS << "OPC_CaptureGlueInput"; break;
|
||||
@ -789,9 +789,9 @@ void MatcherTableEmitter::EmitHistogram(const Matcher *M,
|
||||
case Matcher::MorphNodeTo: OS << "OPC_MorphNodeTo"; break;
|
||||
case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
|
||||
case Matcher::MarkGlueResults: OS << "OPC_MarkGlueResults"; break;
|
||||
case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
|
||||
case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
|
||||
}
|
||||
|
||||
|
||||
OS.PadToColumn(40) << " = " << OpcodeFreq[i] << '\n';
|
||||
}
|
||||
OS << '\n';
|
||||
@ -803,7 +803,7 @@ void llvm::EmitMatcherTable(const Matcher *TheMatcher,
|
||||
bool useEmitRegister2,
|
||||
raw_ostream &O) {
|
||||
formatted_raw_ostream OS(O);
|
||||
|
||||
|
||||
OS << "// The main instruction selector code.\n";
|
||||
OS << "SDNode *SelectCode(SDNode *N) {\n";
|
||||
|
||||
@ -815,13 +815,13 @@ void llvm::EmitMatcherTable(const Matcher *TheMatcher,
|
||||
OS << " static const unsigned char MatcherTable[] = {\n";
|
||||
unsigned TotalSize = MatcherEmitter.EmitMatcherList(TheMatcher, 5, 0, OS);
|
||||
OS << " 0\n }; // Total Array size is " << (TotalSize+1) << " bytes\n\n";
|
||||
|
||||
|
||||
MatcherEmitter.EmitHistogram(TheMatcher, OS);
|
||||
|
||||
|
||||
OS << " #undef TARGET_VAL\n";
|
||||
OS << " return SelectCodeCommon(N, MatcherTable,sizeof(MatcherTable));\n}\n";
|
||||
OS << '\n';
|
||||
|
||||
|
||||
// Next up, emit the function for node and pattern predicates:
|
||||
MatcherEmitter.EmitPredicateFunctions(OS);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user