diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-23 01:15:26 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-23 01:15:26 +0000 |
commit | 38ce889cb61869bc4b1a2b4c57b899e5e642a496 (patch) | |
tree | 1b90ebc1cc162854f2fe0f852f5fb7b528e77d98 /llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp | |
parent | e664abb8373e6634ca555db323001bc994a42985 (diff) | |
download | bcm5719-llvm-38ce889cb61869bc4b1a2b4c57b899e5e642a496.tar.gz bcm5719-llvm-38ce889cb61869bc4b1a2b4c57b899e5e642a496.zip |
Handle regmasks in CriticalAntiDepBreaker.
llvm-svn: 151223
Diffstat (limited to 'llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp')
-rw-r--r-- | llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp b/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp index 0751229f4e0..82495054982 100644 --- a/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp +++ b/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp @@ -253,6 +253,17 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI, // address updates. 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)) { + DefIndices[i] = Count; + KillIndices[i] = ~0u; + KeepRegs.erase(i); + Classes[i] = 0; + RegRefs.erase(i); + } + if (!MO.isReg()) continue; unsigned Reg = MO.getReg(); if (Reg == 0) continue; @@ -355,6 +366,9 @@ CriticalAntiDepBreaker::isNewRegClobberedByRefs(RegRefIter RegRefBegin, for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { const MachineOperand &CheckOper = MI->getOperand(i); + if (CheckOper.isRegMask() && CheckOper.clobbersPhysReg(NewReg)) + return true; + if (!CheckOper.isReg() || !CheckOper.isDef() || CheckOper.getReg() != NewReg) continue; |