diff options
author | Dominik Montada <dominik.montada@hightec-rt.com> | 2020-06-10 17:15:09 +0200 |
---|---|---|
committer | Dominik Montada <dominik.montada@hightec-rt.com> | 2020-06-15 11:17:09 +0200 |
commit | c87bf29149598d6dd24470fe3c22dbd40f215dcb (patch) | |
tree | c9ea144ed15dfdd01f20747e62ecc961bce9b27c /llvm/lib/CodeGen/MachineVerifier.cpp | |
parent | 9e4f674888d6664d27aae31767f397595b1e2566 (diff) | |
download | llvm-c87bf29149598d6dd24470fe3c22dbd40f215dcb.zip llvm-c87bf29149598d6dd24470fe3c22dbd40f215dcb.tar.gz llvm-c87bf29149598d6dd24470fe3c22dbd40f215dcb.tar.bz2 |
[MachineVerifier][GlobalISel] Check that branches have a MBB operand or are declared indirect. Add missing properties to G_BRJT, G_BRINDIRECT
Summary:
Teach MachineVerifier to check branches for MBB operands if they are not declared indirect.
Add `isBarrier`, `isIndirectBranch` to `G_BRINDIRECT` and `G_BRJT`.
Without these, `MachineInstr.isConditionalBranch()` was giving a
false-positive for those instructions.
Reviewers: aemerson, qcolombet, dsanders, arsenm
Reviewed By: dsanders
Subscribers: hiraditya, wdng, simoncook, s.egerton, arsenm, rovka, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D81587
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index c4776261..5929549 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -863,6 +863,22 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) { const MCInstrDesc &MCID = MI->getDesc(); unsigned NumOps = MI->getNumOperands(); + // Branches must reference a basic block if they are not indirect + if (MI->isBranch() && !MI->isIndirectBranch()) { + bool HasMBB = false; + for (const MachineOperand &Op : MI->operands()) { + if (Op.isMBB()) { + HasMBB = true; + break; + } + } + + if (!HasMBB) + report("Branch instruction is missing a basic block operand or " + "isIndirectBranch property", + MI); + } + // Check types. SmallVector<LLT, 4> Types; for (unsigned I = 0, E = std::min(MCID.getNumOperands(), NumOps); |