mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
add infrastructure to support forming selectnodeto. Not used yet
because I have to go on another detour first. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97362 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6ac33b4533
commit
e86097af55
@ -170,8 +170,10 @@ void EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
|
||||
}
|
||||
|
||||
|
||||
void EmitNodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const {
|
||||
OS.indent(indent) << "EmitNode: " << OpcodeName << ": <todo flags> ";
|
||||
void EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const {
|
||||
OS.indent(indent);
|
||||
OS << (isSelectNodeTo() ? "SelectNodeTo: " : "EmitNode: ")
|
||||
<< OpcodeName << ": <todo flags> ";
|
||||
|
||||
for (unsigned i = 0, e = VTs.size(); i != e; ++i)
|
||||
OS << ' ' << getEnumName(VTs[i]);
|
||||
@ -236,15 +238,15 @@ unsigned EmitMergeInputChainsMatcher::getHashImpl() const {
|
||||
return HashUnsigneds(ChainNodes.begin(), ChainNodes.end());
|
||||
}
|
||||
|
||||
bool EmitNodeMatcher::isEqualImpl(const Matcher *m) const {
|
||||
const EmitNodeMatcher *M = cast<EmitNodeMatcher>(m);
|
||||
bool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const {
|
||||
const EmitNodeMatcherCommon *M = cast<EmitNodeMatcherCommon>(m);
|
||||
return M->OpcodeName == OpcodeName && M->VTs == VTs &&
|
||||
M->Operands == Operands && M->HasChain == HasChain &&
|
||||
M->HasFlag == HasFlag && M->HasMemRefs == HasMemRefs &&
|
||||
M->NumFixedArityOperands == NumFixedArityOperands;
|
||||
}
|
||||
|
||||
unsigned EmitNodeMatcher::getHashImpl() const {
|
||||
unsigned EmitNodeMatcherCommon::getHashImpl() const {
|
||||
return (HashString(OpcodeName) << 4) | Operands.size();
|
||||
}
|
||||
|
||||
|
@ -75,7 +75,8 @@ public:
|
||||
EmitNode, // Create a DAG node
|
||||
EmitNodeXForm, // Run a SDNodeXForm
|
||||
MarkFlagResults, // Indicate which interior nodes have flag results.
|
||||
CompleteMatch // Finish a match and update the results.
|
||||
CompleteMatch, // Finish a match and update the results.
|
||||
SelectNodeTo // Build a node, finish a match and update results.
|
||||
};
|
||||
const KindTy Kind;
|
||||
|
||||
@ -869,8 +870,9 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
/// EmitNodeMatcher - This signals a successful match and generates a node.
|
||||
class EmitNodeMatcher : public Matcher {
|
||||
/// EmitNodeMatcherCommon - Common class shared between EmitNode and
|
||||
/// SelectNodeTo.
|
||||
class EmitNodeMatcherCommon : public Matcher {
|
||||
std::string OpcodeName;
|
||||
const SmallVector<MVT::SimpleValueType, 3> VTs;
|
||||
const SmallVector<unsigned, 6> Operands;
|
||||
@ -881,16 +883,18 @@ class EmitNodeMatcher : public Matcher {
|
||||
/// operands in the root of the pattern. The rest are appended to this node.
|
||||
int NumFixedArityOperands;
|
||||
public:
|
||||
EmitNodeMatcher(const std::string &opcodeName,
|
||||
const MVT::SimpleValueType *vts, unsigned numvts,
|
||||
const unsigned *operands, unsigned numops,
|
||||
bool hasChain, bool hasFlag, bool hasmemrefs,
|
||||
int numfixedarityoperands)
|
||||
: Matcher(EmitNode), OpcodeName(opcodeName),
|
||||
EmitNodeMatcherCommon(const std::string &opcodeName,
|
||||
const MVT::SimpleValueType *vts, unsigned numvts,
|
||||
const unsigned *operands, unsigned numops,
|
||||
bool hasChain, bool hasFlag, bool hasmemrefs,
|
||||
int numfixedarityoperands, bool isSelectNodeTo)
|
||||
: Matcher(isSelectNodeTo ? SelectNodeTo : EmitNode), OpcodeName(opcodeName),
|
||||
VTs(vts, vts+numvts), Operands(operands, operands+numops),
|
||||
HasChain(hasChain), HasFlag(hasFlag), HasMemRefs(hasmemrefs),
|
||||
NumFixedArityOperands(numfixedarityoperands) {}
|
||||
|
||||
bool isSelectNodeTo() const { return getKind() == SelectNodeTo; }
|
||||
|
||||
const std::string &getOpcodeName() const { return OpcodeName; }
|
||||
|
||||
unsigned getNumVTs() const { return VTs.size(); }
|
||||
@ -911,7 +915,7 @@ public:
|
||||
int getNumFixedArityOperands() const { return NumFixedArityOperands; }
|
||||
|
||||
static inline bool classof(const Matcher *N) {
|
||||
return N->getKind() == EmitNode;
|
||||
return N->getKind() == EmitNode || N->getKind() == SelectNodeTo;
|
||||
}
|
||||
|
||||
private:
|
||||
@ -920,6 +924,44 @@ private:
|
||||
virtual unsigned getHashImpl() const;
|
||||
};
|
||||
|
||||
/// EmitNodeMatcher - This signals a successful match and generates a node.
|
||||
class EmitNodeMatcher : public EmitNodeMatcherCommon {
|
||||
public:
|
||||
EmitNodeMatcher(const std::string &opcodeName,
|
||||
const MVT::SimpleValueType *vts, unsigned numvts,
|
||||
const unsigned *operands, unsigned numops,
|
||||
bool hasChain, bool hasFlag, bool hasmemrefs,
|
||||
int numfixedarityoperands)
|
||||
: EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain,
|
||||
hasFlag, hasmemrefs, numfixedarityoperands, false)
|
||||
{}
|
||||
|
||||
static inline bool classof(const Matcher *N) {
|
||||
return N->getKind() == EmitNode;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class SelectNodeToMatcher : public EmitNodeMatcherCommon {
|
||||
const PatternToMatch &Pattern;
|
||||
public:
|
||||
SelectNodeToMatcher(const std::string &opcodeName,
|
||||
const MVT::SimpleValueType *vts, unsigned numvts,
|
||||
const unsigned *operands, unsigned numops,
|
||||
bool hasChain, bool hasFlag, bool hasmemrefs,
|
||||
int numfixedarityoperands, const PatternToMatch &pattern)
|
||||
: EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain,
|
||||
hasFlag, hasmemrefs, numfixedarityoperands, true),
|
||||
Pattern(pattern) {
|
||||
}
|
||||
|
||||
const PatternToMatch &getPattern() const { return Pattern; }
|
||||
|
||||
static inline bool classof(const Matcher *N) {
|
||||
return N->getKind() == SelectNodeTo;
|
||||
}
|
||||
};
|
||||
|
||||
/// MarkFlagResultsMatcher - This node indicates which non-root nodes in the
|
||||
/// pattern produce flags. This allows CompleteMatchMatcher to update them
|
||||
/// with the output flag of the resultant code.
|
||||
@ -976,7 +1018,7 @@ private:
|
||||
}
|
||||
virtual unsigned getHashImpl() const;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -389,9 +389,11 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
return 3;
|
||||
}
|
||||
|
||||
case Matcher::EmitNode: {
|
||||
const EmitNodeMatcher *EN = cast<EmitNodeMatcher>(N);
|
||||
OS << "OPC_EmitNode, TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
|
||||
case Matcher::EmitNode:
|
||||
case Matcher::SelectNodeTo: {
|
||||
const EmitNodeMatcherCommon *EN = cast<EmitNodeMatcherCommon>(N);
|
||||
OS << (EN->isSelectNodeTo() ? "OPC_EmitNode" : "OPC_SelectNodeTo");
|
||||
OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0";
|
||||
|
||||
if (EN->hasChain()) OS << "|OPFL_Chain";
|
||||
if (EN->hasFlag()) OS << "|OPFL_Flag";
|
||||
@ -564,6 +566,7 @@ void MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) {
|
||||
case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break;
|
||||
case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break;
|
||||
case Matcher::EmitNode: OS << "OPC_EmitNode"; break;
|
||||
case Matcher::SelectNodeTo: OS << "OPC_SelectNodeTo"; break;
|
||||
case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break;
|
||||
case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break;
|
||||
case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break;
|
||||
|
@ -746,10 +746,10 @@ EmitResultInstructionAsOperand(const TreePatternNode *N,
|
||||
// (add (load)) -> add32rm is ok because result #0 is the result and result #1
|
||||
// is new.
|
||||
AddMatcher(new EmitNodeMatcher(II.Namespace+"::"+II.TheDef->getName(),
|
||||
ResultVTs.data(), ResultVTs.size(),
|
||||
InstOps.data(), InstOps.size(),
|
||||
NodeHasChain, TreeHasInFlag,
|
||||
NodeHasMemRefs,NumFixedArityOperands));
|
||||
ResultVTs.data(), ResultVTs.size(),
|
||||
InstOps.data(), InstOps.size(),
|
||||
NodeHasChain, TreeHasInFlag,
|
||||
NodeHasMemRefs, NumFixedArityOperands));
|
||||
|
||||
// The non-chain and non-flag results of the newly emitted node get recorded.
|
||||
for (unsigned i = 0, e = ResultVTs.size(); i != e; ++i) {
|
||||
|
@ -56,6 +56,7 @@ static void ContractNodes(OwningPtr<Matcher> &MatcherPtr) {
|
||||
}
|
||||
}
|
||||
|
||||
// Zap movechild -> moveparent.
|
||||
if (MoveChildMatcher *MC = dyn_cast<MoveChildMatcher>(N))
|
||||
if (MoveParentMatcher *MP =
|
||||
dyn_cast<MoveParentMatcher>(MC->getNext())) {
|
||||
@ -63,6 +64,14 @@ static void ContractNodes(OwningPtr<Matcher> &MatcherPtr) {
|
||||
return ContractNodes(MatcherPtr);
|
||||
}
|
||||
|
||||
// Turn EmitNode->CompleteMatch into SelectNodeTo if we can.
|
||||
if (EmitNodeMatcher *EN = dyn_cast<EmitNodeMatcher>(N))
|
||||
if (CompleteMatchMatcher *CM = cast<CompleteMatchMatcher>(EN->getNext())) {
|
||||
(void)CM;
|
||||
|
||||
|
||||
}
|
||||
|
||||
ContractNodes(N->getNextPtr());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user