From 64f745cf20135e6badee8f76e510bac90ff4fcfc Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Tue, 24 Oct 2017 17:08:43 +0000 Subject: [PATCH] [globalisel][tablegen] Multi-insn emission requires that BuildMIAction support not being linked to an InstructionMatcher. NFC When multi-instruction emission is supported, it will no longer be guaranteed that every BuildMIAction has a corresponding matched instruction. BuildMIAction should support not having one to cover the case where a rule produces more instructions than it matched. llvm-svn: 316463 --- llvm/utils/TableGen/GlobalISelEmitter.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp index 360671a..e472c8c 100644 --- a/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -1753,18 +1753,18 @@ class BuildMIAction : public MatchAction { private: unsigned InsnID; const CodeGenInstruction *I; - const InstructionMatcher &Matched; + const InstructionMatcher *Matched; std::vector> OperandRenderers; /// True if the instruction can be built solely by mutating the opcode. bool canMutate(RuleMatcher &Rule) const { - if (OperandRenderers.size() != Matched.getNumOperands()) + if (OperandRenderers.size() != Matched->getNumOperands()) return false; for (const auto &Renderer : enumerate(OperandRenderers)) { if (const auto *Copy = dyn_cast(&*Renderer.value())) { const OperandMatcher &OM = Rule.getOperandMatcher(Copy->getSymbolicName()); - if (&Matched != &OM.getInstructionMatcher() || + if ((Matched != nullptr && Matched != &OM.getInstructionMatcher()) || OM.getOperandIndex() != Renderer.index()) return false; } else @@ -1776,7 +1776,7 @@ private: public: BuildMIAction(unsigned InsnID, const CodeGenInstruction *I, - const InstructionMatcher &Matched) + const InstructionMatcher *Matched) : InsnID(InsnID), I(I), Matched(Matched) {} template @@ -2651,7 +2651,7 @@ Expected GlobalISelEmitter::createAndImportInstructionRenderer( IsExtractSubReg = true; } - auto &DstMIBuilder = M.addAction(0, DstI, InsnMatcher); + auto &DstMIBuilder = M.addAction(0, DstI, &InsnMatcher); // Render the explicit defs. for (unsigned I = 0; I < DstI->Operands.NumDefs; ++I) { @@ -2802,7 +2802,7 @@ Expected GlobalISelEmitter::runOnPattern(const PatternToMatch &P) { M.defineOperand(OM0.getSymbolicName(), OM0); OM0.addPredicate(RC); - auto &DstMIBuilder = M.addAction(0, &DstI, InsnMatcher); + auto &DstMIBuilder = M.addAction(0, &DstI, &InsnMatcher); DstMIBuilder.addRenderer(0, DstIOperand.Name); DstMIBuilder.addRenderer(0, Dst->getName()); M.addAction(0, 0, RC); -- 2.7.4