mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
add an optimized form of OPC_EmitMergeInputChains for the 1, 0 and
1, 1 cases which are by-far the most frequent. This shrinks the X86 isel table from 77014 -> 74657 bytes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99740 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
856fb395e4
commit
aa4e3391c8
@ -136,6 +136,8 @@ public:
|
||||
OPC_EmitRegister,
|
||||
OPC_EmitConvertToTarget,
|
||||
OPC_EmitMergeInputChains,
|
||||
OPC_EmitMergeInputChains1_0,
|
||||
OPC_EmitMergeInputChains1_1,
|
||||
OPC_EmitCopyToReg,
|
||||
OPC_EmitNodeXForm,
|
||||
OPC_EmitNode,
|
||||
|
@ -2440,6 +2440,35 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,
|
||||
continue;
|
||||
}
|
||||
|
||||
case OPC_EmitMergeInputChains1_0: // OPC_EmitMergeInputChains, 1, 0
|
||||
case OPC_EmitMergeInputChains1_1: { // OPC_EmitMergeInputChains, 1, 1
|
||||
// These are space-optimized forms of OPC_EmitMergeInputChains.
|
||||
assert(InputChain.getNode() == 0 &&
|
||||
"EmitMergeInputChains should be the first chain producing node");
|
||||
assert(ChainNodesMatched.empty() &&
|
||||
"Should only have one EmitMergeInputChains per match");
|
||||
|
||||
// Read all of the chained nodes.
|
||||
unsigned RecNo = Opcode == OPC_EmitMergeInputChains1_1;
|
||||
assert(RecNo < RecordedNodes.size() && "Invalid CheckSame");
|
||||
ChainNodesMatched.push_back(RecordedNodes[RecNo].getNode());
|
||||
|
||||
// FIXME: What if other value results of the node have uses not matched
|
||||
// by this pattern?
|
||||
if (ChainNodesMatched.back() != NodeToMatch &&
|
||||
!RecordedNodes[RecNo].hasOneUse()) {
|
||||
ChainNodesMatched.clear();
|
||||
break;
|
||||
}
|
||||
|
||||
// Merge the input chains if they are not intra-pattern references.
|
||||
InputChain = HandleMergeInputChains(ChainNodesMatched, CurDAG);
|
||||
|
||||
if (InputChain.getNode() == 0)
|
||||
break; // Failed to merge.
|
||||
continue;
|
||||
}
|
||||
|
||||
case OPC_EmitMergeInputChains: {
|
||||
assert(InputChain.getNode() == 0 &&
|
||||
"EmitMergeInputChains should be the first chain producing node");
|
||||
|
@ -449,6 +449,13 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
|
||||
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) << ", ";
|
||||
|
Loading…
Reference in New Issue
Block a user