Skip to content

Commit

Permalink
Teach the regmask clobber check to check if any subregister is preser…
Browse files Browse the repository at this point in the history
…ved before considering the super register clobbered (#28)

X86 has some calling conventions where bits 127:0 of a vector register are callee saved, but the upper bits aren't. Previously we could detect that the full ymm register was clobbered when the xmm portion was really preserved. This patch checks the subregisters to make sure they aren't preserved.

Fixes PR44140

Differential Revision: https://reviews.llvm.org/D70699
  • Loading branch information
mati865 authored and alexcrichton committed Nov 29, 2019
1 parent de1a7db commit 2cb4100
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp
Expand Up @@ -261,15 +261,25 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr &MI, unsigned Count) {
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
MachineOperand &MO = MI.getOperand(i);

if (MO.isRegMask())
for (unsigned i = 0, e = TRI->getNumRegs(); i != e; ++i)
if (MO.clobbersPhysReg(i)) {
if (MO.isRegMask()) {
auto ClobbersPhysRegAndSubRegs = [&](unsigned PhysReg) {
for (MCSubRegIterator SRI(PhysReg, TRI, true); SRI.isValid(); ++SRI)
if (!MO.clobbersPhysReg(*SRI))
return false;

return true;
};

for (unsigned i = 0, e = TRI->getNumRegs(); i != e; ++i) {
if (ClobbersPhysRegAndSubRegs(i)) {
DefIndices[i] = Count;
KillIndices[i] = ~0u;
KeepRegs.reset(i);
Classes[i] = nullptr;
RegRefs.erase(i);
}
}
}

if (!MO.isReg()) continue;
unsigned Reg = MO.getReg();
Expand Down

0 comments on commit 2cb4100

Please sign in to comment.