From 4812c91f56252bb0a72234abf12a2fe5ffe515e8 Mon Sep 17 00:00:00 2001 From: Quentin Colombet Date: Wed, 6 Apr 2016 17:01:43 +0000 Subject: [PATCH] [RegisterBankInfo] Implement the verify method of the InstructionMapping helper class. This checks that all the register operands get a proper mapping. llvm-svn: 265563 --- .../llvm/CodeGen/GlobalISel/RegisterBankInfo.h | 2 +- llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp | 25 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h index 5932d34..766739a 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/RegisterBankInfo.h @@ -89,7 +89,7 @@ public: public: /// Constructor for the mapping of an instruction. - /// \p NumOperands should be equal to number of all the operands of + /// \p NumOperands must be equal to number of all the operands of /// the related instruction. /// The rationale is that it is more efficient for the optimizers /// to be able to assume that the mapping of the ith operand is diff --git a/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp b/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp index b07688a..6e83079 100644 --- a/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/RegisterBankInfo.cpp @@ -14,6 +14,9 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" +#include "llvm/CodeGen/MachineBasicBlock.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetRegisterInfo.h" @@ -231,4 +234,26 @@ void RegisterBankInfo::ValueMapping::verify(unsigned ExpectedBitWidth) const { void RegisterBankInfo::InstructionMapping::verify( const MachineInstr &MI) const { // Check that all the register operands are properly mapped. + const MachineRegisterInfo &MRI = MI.getParent()->getParent()->getRegInfo(); + // Check the constructor invariant. + assert(NumOperands == MI.getNumOperands() && + "NumOperands must match, see constructor"); + for (unsigned Idx = 0; Idx < NumOperands; ++Idx) { + const MachineOperand &MO = MI.getOperand(Idx); + const RegisterBankInfo::ValueMapping &MOMapping = getOperandMapping(Idx); + if (!MO.isReg()) { + assert(MOMapping.BreakDown.empty() && + "We should not care about non-reg mapping"); + continue; + } + unsigned Reg = MO.getReg(); + // Register size in bits. + // This size must match what the mapping expect. + unsigned RegSize = MRI.getSize(Reg); + // If Reg is not a generic register, query the register class to + // get its size. + if (!RegSize) + RegSize = MRI.getRegClass(Reg)->getSize() * 8; + MOMapping.verify(RegSize); + } } -- 2.7.4