diff options
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 18 |
2 files changed, 20 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 0f466e4b2d1..92abd84c56b 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -1224,8 +1224,12 @@ LLT MachineInstr::getTypeToPrint(unsigned OpIdx, SmallBitVector &PrintedTypes, if (PrintedTypes[OpInfo.getGenericTypeIndex()]) return LLT{}; - PrintedTypes.set(OpInfo.getGenericTypeIndex()); - return MRI.getType(Op.getReg()); + LLT TypeToPrint = MRI.getType(Op.getReg()); + // Don't mark the type index printed if it wasn't actually printed: maybe + // another operand with the same type index has an actual type attached: + if (TypeToPrint.isValid()) + PrintedTypes.set(OpInfo.getGenericTypeIndex()); + return TypeToPrint; } #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index f2cdcaaf659..ab5b389a111 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -930,16 +930,26 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { const MachineOperand *MO = &MI->getOperand(I); LLT OpTy = MRI->getType(MO->getReg()); - if (Types[TypeIdx].isValid() && Types[TypeIdx] != OpTy) - report("type mismatch in generic instruction", MI); - Types[TypeIdx] = OpTy; + // Don't report a type mismatch if there is no actual mismatch, only a + // type missing, to reduce noise: + if (OpTy.isValid()) { + // Only the first valid type for a type index will be printed: don't + // overwrite it later so it's always clear which type was expected: + if (!Types[TypeIdx].isValid()) + Types[TypeIdx] = OpTy; + else if (Types[TypeIdx] != OpTy) + report("Type mismatch in generic instruction", MO, I, OpTy); + } else { + // Generic instructions must have types attached to their operands. + report("Generic instruction is missing a virtual register type", MO, I); + } } // Generic opcodes must not have physical register operands. for (unsigned I = 0; I < MI->getNumOperands(); ++I) { const MachineOperand *MO = &MI->getOperand(I); if (MO->isReg() && TargetRegisterInfo::isPhysicalRegister(MO->getReg())) - report("Generic instruction cannot have physical register", MI); + report("Generic instruction cannot have physical register", MO, I); } } |