summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Sanders <daniel_l_sanders@apple.com>2017-10-24 17:08:43 +0000
committerDaniel Sanders <daniel_l_sanders@apple.com>2017-10-24 17:08:43 +0000
commit64f745cf20135e6badee8f76e510bac90ff4fcfc (patch)
treeee808dd379d948c2742f7c0e6a40e64b70b37c43
parent5e8c3f328f5ea227c3770ca550c55245d5ae4d91 (diff)
downloadbcm5719-llvm-64f745cf20135e6badee8f76e510bac90ff4fcfc.tar.gz
bcm5719-llvm-64f745cf20135e6badee8f76e510bac90ff4fcfc.zip
[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
-rw-r--r--llvm/utils/TableGen/GlobalISelEmitter.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp
index 360671a69b8..e472c8c43bf 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<std::unique_ptr<OperandRenderer>> 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<CopyRenderer>(&*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 <class Kind, class... Args>
@@ -2651,7 +2651,7 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
IsExtractSubReg = true;
}
- auto &DstMIBuilder = M.addAction<BuildMIAction>(0, DstI, InsnMatcher);
+ auto &DstMIBuilder = M.addAction<BuildMIAction>(0, DstI, &InsnMatcher);
// Render the explicit defs.
for (unsigned I = 0; I < DstI->Operands.NumDefs; ++I) {
@@ -2802,7 +2802,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
M.defineOperand(OM0.getSymbolicName(), OM0);
OM0.addPredicate<RegisterBankOperandMatcher>(RC);
- auto &DstMIBuilder = M.addAction<BuildMIAction>(0, &DstI, InsnMatcher);
+ auto &DstMIBuilder = M.addAction<BuildMIAction>(0, &DstI, &InsnMatcher);
DstMIBuilder.addRenderer<CopyRenderer>(0, DstIOperand.Name);
DstMIBuilder.addRenderer<CopyRenderer>(0, Dst->getName());
M.addAction<ConstrainOperandToRegClassAction>(0, 0, RC);
OpenPOWER on IntegriCloud