diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 6 | ||||
-rw-r--r-- | llvm/test/CodeGen/AMDGPU/verifier-implicit-virtreg-invalid-physreg-liveness.mir | 21 |
2 files changed, 25 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 1c192815ab9..8b274701d2c 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1533,10 +1533,12 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) { // get a report for its operand. if (Bad) { for (const MachineOperand &MOP : MI->uses()) { - if (!MOP.isReg()) + if (!MOP.isReg() || !MOP.isImplicit()) continue; - if (!MOP.isImplicit()) + + if (!TargetRegisterInfo::isPhysicalRegister(MOP.getReg())) continue; + for (MCSubRegIterator SubRegs(MOP.getReg(), TRI); SubRegs.isValid(); ++SubRegs) { if (*SubRegs == Reg) { diff --git a/llvm/test/CodeGen/AMDGPU/verifier-implicit-virtreg-invalid-physreg-liveness.mir b/llvm/test/CodeGen/AMDGPU/verifier-implicit-virtreg-invalid-physreg-liveness.mir new file mode 100644 index 00000000000..6efd03c35ba --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/verifier-implicit-virtreg-invalid-physreg-liveness.mir @@ -0,0 +1,21 @@ +# RUN: not llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -o /dev/null %s 2>&1 | FileCheck -check-prefix=ERROR %s + +# When the verifier was detecting the invalid liveness for vcc, it would assert when trying to iterate the subregisters of the implicit virtual register use. + + +# ERROR: *** Bad machine code: Using an undefined physical register *** +# ERROR: instruction: S_ENDPGM implicit %0:vgpr_32, implicit $vcc +# ERROR: operand 1: implicit $vcc + +... + +name: invalid_implicit_physreg_use_with_implicit_virtreg +tracksRegLiveness: true + +body: | + bb.0: + %0:vgpr_32 = IMPLICIT_DEF + S_ENDPGM implicit %0, implicit $vcc + +... + |