diff options
| author | Tom Stellard <thomas.stellard@amd.com> | 2014-03-17 17:03:49 +0000 |
|---|---|---|
| committer | Tom Stellard <thomas.stellard@amd.com> | 2014-03-17 17:03:49 +0000 |
| commit | ca700e41efd98f34ede26946aba20bd2e5d3c5b5 (patch) | |
| tree | 3fa945f1b937542d06dcc3c5074c0059aae144a7 /llvm | |
| parent | 5df6aa465ee1857daa98e3c0bd5f30aea5dc602a (diff) | |
| download | bcm5719-llvm-ca700e41efd98f34ede26946aba20bd2e5d3c5b5.tar.gz bcm5719-llvm-ca700e41efd98f34ede26946aba20bd2e5d3c5b5.zip | |
R600/SI: Add generic checks to SIInstrInfo::verifyInstruction()
Added checks for number of operands and operand register classes.
Tested-by: Michel Dänzer <michel.daenzer@amd.com>
llvm-svn: 204054
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/R600/SIInstrInfo.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Target/R600/SIInstrInfo.cpp b/llvm/lib/Target/R600/SIInstrInfo.cpp index 676e0388b0f..f68dc2e0e49 100644 --- a/llvm/lib/Target/R600/SIInstrInfo.cpp +++ b/llvm/lib/Target/R600/SIInstrInfo.cpp @@ -377,6 +377,47 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr *MI, int Src1Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src1); int Src2Idx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2); + // Make sure the number of operands is correct. + const MCInstrDesc &Desc = get(Opcode); + if (!Desc.isVariadic() && + Desc.getNumOperands() != MI->getNumExplicitOperands()) { + ErrInfo = "Instruction has wrong number of operands."; + return false; + } + + // Make sure the register classes are correct + for (unsigned i = 0, e = Desc.getNumOperands(); i != e; ++i) { + switch (Desc.OpInfo[i].OperandType) { + case MCOI::OPERAND_REGISTER: + break; + case MCOI::OPERAND_IMMEDIATE: + if (!MI->getOperand(i).isImm() && !MI->getOperand(i).isFPImm()) { + ErrInfo = "Expected immediate, but got non-immediate"; + return false; + } + // Fall-through + default: + continue; + } + + if (!MI->getOperand(i).isReg()) + continue; + + int RegClass = Desc.OpInfo[i].RegClass; + if (RegClass != -1) { + unsigned Reg = MI->getOperand(i).getReg(); + if (TargetRegisterInfo::isVirtualRegister(Reg)) + continue; + + const TargetRegisterClass *RC = RI.getRegClass(RegClass); + if (!RC->contains(Reg)) { + ErrInfo = "Operand has incorrect register class."; + return false; + } + } + } + + // Verify VOP* if (isVOP1(Opcode) || isVOP2(Opcode) || isVOP3(Opcode) || isVOPC(Opcode)) { unsigned ConstantBusCount = 0; |

