diff options
| author | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2019-12-13 08:06:28 -0800 |
|---|---|---|
| committer | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2019-12-16 09:51:54 -0800 |
| commit | 49f55dda011ba80abeece9c44d667415eaf9ccb4 (patch) | |
| tree | e69a7eb7b706b5c54a9f0a9a7cdd70d7b7c50b78 /llvm/lib/Target/SystemZ | |
| parent | 2597135571ecae435e10e9136d1eb0435beca8ee (diff) | |
| download | bcm5719-llvm-49f55dda011ba80abeece9c44d667415eaf9ccb4.tar.gz bcm5719-llvm-49f55dda011ba80abeece9c44d667415eaf9ccb4.zip | |
[SystemZ] Improve verification of MachineOperands.
Now that the machine verifier will check for cases of register/immediate
MachineOperands and their correspondence to the MC instruction descriptor,
this patch adds the operand types to the descriptors where they were
previously missing. All MCOI::OPERAND_UNKNOWN operand types have been handled
to get a known type, except for G_... (global isel) instructions.
Review: Ulrich Weigand
https://reviews.llvm.org/D71494
Diffstat (limited to 'llvm/lib/Target/SystemZ')
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp | 22 | ||||
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZOperands.td | 22 |
3 files changed, 40 insertions, 8 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp index 785f1c81dfb..181a50786a2 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -1748,6 +1748,28 @@ void SystemZInstrInfo::loadImmediate(MachineBasicBlock &MBB, BuildMI(MBB, MBBI, DL, get(Opcode), Reg).addImm(Value); } +bool SystemZInstrInfo::verifyInstruction(const MachineInstr &MI, + StringRef &ErrInfo) const { + const MCInstrDesc &MCID = MI.getDesc(); + for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) { + if (I >= MCID.getNumOperands()) + break; + const MachineOperand &Op = MI.getOperand(I); + const MCOperandInfo &MCOI = MCID.OpInfo[I]; + // Addressing modes have register and immediate operands. Op should be a + // register (or frame index) operand if MCOI.RegClass contains a valid + // register class, or an immediate otherwise. + if (MCOI.OperandType == MCOI::OPERAND_MEMORY && + ((MCOI.RegClass != -1 && !Op.isReg() && !Op.isFI()) || + (MCOI.RegClass == -1 && !Op.isImm()))) { + ErrInfo = "Addressing mode operands corrupt!"; + return false; + } + } + + return true; +} + bool SystemZInstrInfo:: areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const { diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.h b/llvm/lib/Target/SystemZ/SystemZInstrInfo.h index 6c6a074bb83..4b4cfab1f8f 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.h +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.h @@ -322,6 +322,10 @@ public: MachineBasicBlock::iterator MBBI, unsigned Reg, uint64_t Value) const; + // Perform target specific instruction verification. + bool verifyInstruction(const MachineInstr &MI, + StringRef &ErrInfo) const override; + // Sometimes, it is possible for the target to tell, even without // aliasing information, that two MIs access different memory // addresses. This function returns true if two MIs access different diff --git a/llvm/lib/Target/SystemZ/SystemZOperands.td b/llvm/lib/Target/SystemZ/SystemZOperands.td index b2bab68a627..bd40f6d7bf4 100644 --- a/llvm/lib/Target/SystemZ/SystemZOperands.td +++ b/llvm/lib/Target/SystemZ/SystemZOperands.td @@ -25,6 +25,7 @@ class ImmediateOp<ValueType vt, string asmop> : Operand<vt> { let PrintMethod = "print"##asmop##"Operand"; let DecoderMethod = "decode"##asmop##"Operand"; let ParserMatchClass = !cast<AsmOperandClass>(asmop); + let OperandType = "OPERAND_IMMEDIATE"; } class ImmOpWithPattern<ValueType vt, string asmop, code pred, SDNodeXForm xform, @@ -63,13 +64,15 @@ class PCRelTLSAsmOperand<string size> // Constructs an operand for a PC-relative address with address type VT. // ASMOP is the associated asm operand. -class PCRelOperand<ValueType vt, AsmOperandClass asmop> : Operand<vt> { - let PrintMethod = "printPCRelOperand"; - let ParserMatchClass = asmop; -} -class PCRelTLSOperand<ValueType vt, AsmOperandClass asmop> : Operand<vt> { - let PrintMethod = "printPCRelTLSOperand"; - let ParserMatchClass = asmop; +let OperandType = "OPERAND_PCREL" in { + class PCRelOperand<ValueType vt, AsmOperandClass asmop> : Operand<vt> { + let PrintMethod = "printPCRelOperand"; + let ParserMatchClass = asmop; + } + class PCRelTLSOperand<ValueType vt, AsmOperandClass asmop> : Operand<vt> { + let PrintMethod = "printPCRelTLSOperand"; + let ParserMatchClass = asmop; + } } // Constructs both a DAG pattern and instruction operand for a PC-relative @@ -105,6 +108,7 @@ class AddressOperand<string bitsize, string dispsize, string length, let EncoderMethod = "get"##format##dispsize##length##"Encoding"; let DecoderMethod = "decode"##format##bitsize##"Disp"##dispsize##length##"Operand"; + let OperandType = "OPERAND_MEMORY"; let MIOperandInfo = operands; let ParserMatchClass = !cast<AddressAsmOperand>(format##bitsize##"Disp"##dispsize##length); @@ -508,7 +512,8 @@ defm imm64zx48 : Immediate<i64, [{ return isUInt<64>(N->getZExtValue()); }], UIMM48, "U48Imm">; -def imm64 : ImmLeaf<i64, [{}]>, Operand<i64>; +let OperandType = "OPERAND_IMMEDIATE" in + def imm64 : ImmLeaf<i64, [{}]>, Operand<i64>; //===----------------------------------------------------------------------===// // Floating-point immediates @@ -657,4 +662,5 @@ def bdvaddr12only : BDVMode< "64", "12">; def cond4 : PatLeaf<(i32 timm), [{ return (N->getZExtValue() < 16); }]>, Operand<i32> { let PrintMethod = "printCond4Operand"; + let OperandType = "OPERAND_IMMEDIATE"; } |

