aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineVerifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineVerifier.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 0f6d9b8..2691dd8 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -941,6 +941,41 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
// Verify properties of various specific instruction types
switch (MI->getOpcode()) {
+ case TargetOpcode::G_ASSERT_ZEXT: {
+ if (!MI->getOperand(2).isImm()) {
+ report("G_ASSERT_ZEXT expects an immediate operand #2", MI);
+ break;
+ }
+
+ Register Dst = MI->getOperand(0).getReg();
+ Register Src = MI->getOperand(1).getReg();
+ LLT DstTy = MRI->getType(Dst);
+ LLT SrcTy = MRI->getType(Src);
+ verifyVectorElementMatch(DstTy, SrcTy, MI);
+ int64_t Imm = MI->getOperand(2).getImm();
+ if (Imm <= 0) {
+ report("G_ASSERT_ZEXT size must be >= 1", MI);
+ break;
+ }
+
+ if (Imm >= SrcTy.getScalarSizeInBits()) {
+ report("G_ASSERT_ZEXT size must be less than source bit width", MI);
+ break;
+ }
+
+ if (MRI->getRegBankOrNull(Src) != MRI->getRegBankOrNull(Dst)) {
+ report("G_ASSERT_ZEXT source and destination register banks must match",
+ MI);
+ break;
+ }
+
+ if (MRI->getRegClassOrNull(Src) != MRI->getRegClassOrNull(Dst))
+ report("G_ASSERT_ZEXT source and destination register classes must match",
+ MI);
+
+ break;
+ }
+
case TargetOpcode::G_CONSTANT:
case TargetOpcode::G_FCONSTANT: {
LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
@@ -1594,7 +1629,8 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
}
}
- if (isPreISelGenericOpcode(MCID.getOpcode())) {
+ unsigned Opc = MCID.getOpcode();
+ if (isPreISelGenericOpcode(Opc) || isPreISelGenericOptimizationHint(Opc)) {
verifyPreISelGenericInstruction(MI);
return;
}