diff options
-rw-r--r-- | include/llvm/CodeGen/DAGISelHeader.h | 15 | ||||
-rw-r--r-- | utils/TableGen/DAGISelMatcherEmitter.cpp | 23 |
2 files changed, 32 insertions, 6 deletions
diff --git a/include/llvm/CodeGen/DAGISelHeader.h b/include/llvm/CodeGen/DAGISelHeader.h index 0ebb9f1..29d66f5 100644 --- a/include/llvm/CodeGen/DAGISelHeader.h +++ b/include/llvm/CodeGen/DAGISelHeader.h @@ -201,7 +201,7 @@ GetInt8(const unsigned char *MatcherTable, unsigned &Idx) { } enum BuiltinOpcodes { - OPC_Push, + OPC_Push, OPC_Push2, OPC_RecordNode, OPC_RecordMemRef, OPC_CaptureFlagInput, @@ -359,6 +359,19 @@ SDNode *SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable, MatchScopes.push_back(NewEntry); continue; } + case OPC_Push2: { + unsigned NumToSkip = GetInt2(MatcherTable, MatcherIndex); + MatchScope NewEntry; + NewEntry.FailIndex = MatcherIndex+NumToSkip; + NewEntry.NodeStackSize = NodeStack.size(); + NewEntry.NumRecordedNodes = RecordedNodes.size(); + NewEntry.NumMatchedMemRefs = MatchedMemRefs.size(); + NewEntry.InputChain = InputChain; + NewEntry.InputFlag = InputFlag; + NewEntry.HasChainNodesMatched = !ChainNodesMatched.empty(); + MatchScopes.push_back(NewEntry); + continue; + } case OPC_RecordNode: // Remember this node, it may end up being an operand in the pattern. RecordedNodes.push_back(N); diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp index 82d852e..33e37fa 100644 --- a/utils/TableGen/DAGISelMatcherEmitter.cpp +++ b/utils/TableGen/DAGISelMatcherEmitter.cpp @@ -350,16 +350,29 @@ EmitMatcherList(const MatcherNode *N, unsigned Indent, unsigned CurrentIdx, NextSize = EmitMatcherList(cast<PushMatcherNode>(N)->getNext(), Indent+1, CurrentIdx+2, FOS); } - + + // In the unlikely event that we have something too big to emit with a + // one byte offset, regenerate it with a two-byte one. if (NextSize > 255) { - errs() << - "Tblgen internal error: can't handle predicate this complex yet\n"; - // FIXME: exit(1); + TmpBuf.clear(); + raw_svector_ostream OS(TmpBuf); + formatted_raw_ostream FOS(OS); + NextSize = EmitMatcherList(cast<PushMatcherNode>(N)->getNext(), + Indent+1, CurrentIdx+3, FOS); + if (NextSize > 65535) { + errs() << + "Tblgen internal error: can't handle pattern this complex yet\n"; + exit(1); + } } OS << "/*" << CurrentIdx << "*/"; OS.PadToColumn(Indent*2); - OS << "OPC_Push, " << NextSize << ",\n"; + + if (NextSize < 256) + OS << "OPC_Push, " << NextSize << ",\n"; + else + OS << "OPC_Push2, " << (NextSize&255) << ", " << (NextSize>>8) << ",\n"; OS << TmpBuf.str(); Size += 2+NextSize; |