summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/MachineVerifier.cpp6
-rw-r--r--llvm/test/CodeGen/AMDGPU/verifier-implicit-virtreg-invalid-physreg-liveness.mir21
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
+
+...
+
OpenPOWER on IntegriCloud