From: Matthias Braun Date: Wed, 14 Jan 2015 22:25:14 +0000 (+0000) Subject: MachineVerifier: Allow undef reads if a matching superreg is defined. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=de8202b0840dcd5c58b9d17d751ef9bf9215892c;p=oota-llvm.git MachineVerifier: Allow undef reads if a matching superreg is defined. Summary: Some pseudo instruction expansions break down a wide register use into multiple uses of smaller sub registers. If the super register was partially undefined the broken down sub registers may be completely undefined now leading to MachineVerifier complaints. Unfortunately liveness information to add the required dead flags is not easily (cheaply) available when expanding pseudo instructions. This commit changes the verifier to be quiet if there is an additional implicit use of a super register. Pseudo instruction expanders can use this to mark cases where partially defined values get potentially broken into completely undefined ones. Differential Revision: http://reviews.llvm.org/D6973 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226047 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/MachineVerifier.cpp b/lib/CodeGen/MachineVerifier.cpp index 364e8e2cb3e..88bd193d0c3 100644 --- a/lib/CodeGen/MachineVerifier.cpp +++ b/lib/CodeGen/MachineVerifier.cpp @@ -1077,6 +1077,25 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) { } } } + // If there is an additional implicit-use of a super register we stop + // here. By definition we are fine if the super register is not + // (completely) dead, if the complete super register is dead we will + // get a report for its operand. + if (Bad) { + for (const MachineOperand &MOP : MI->uses()) { + if (!MOP.isReg()) + continue; + if (!MOP.isImplicit()) + continue; + for (MCSubRegIterator SubRegs(MOP.getReg(), TRI); SubRegs.isValid(); + ++SubRegs) { + if (*SubRegs == Reg) { + Bad = false; + break; + } + } + } + } if (Bad) report("Using an undefined physical register", MO, MONum); } else if (MRI->def_empty(Reg)) {