diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-28 02:08:50 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-28 02:08:50 +0000 |
| commit | 4c5ad2b81267b4b8db085ddce1d6f7588ffc66e3 (patch) | |
| tree | 6753e958dedd5c6a77143ac92b3e644e4023a8d9 /llvm/lib | |
| parent | 334eaeae8e18aaaca9c2706a065881a0d504c232 (diff) | |
| download | bcm5719-llvm-4c5ad2b81267b4b8db085ddce1d6f7588ffc66e3.tar.gz bcm5719-llvm-4c5ad2b81267b4b8db085ddce1d6f7588ffc66e3.zip | |
Handle regmasks in MachineCSE.
Don't attempt to extend physreg live ranges across calls.
<rdar://problem/10942095>
llvm-svn: 151610
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/MachineCSE.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineCSE.cpp b/llvm/lib/CodeGen/MachineCSE.cpp index 491a22caf0c..27226f1e636 100644 --- a/llvm/lib/CodeGen/MachineCSE.cpp +++ b/llvm/lib/CodeGen/MachineCSE.cpp @@ -170,6 +170,8 @@ MachineCSE::isPhysDefTriviallyDead(unsigned Reg, bool SeenDef = false; for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { const MachineOperand &MO = I->getOperand(i); + if (MO.isRegMask() && MO.clobbersPhysReg(Reg)) + SeenDef = true; if (!MO.isReg() || !MO.getReg()) continue; if (!TRI->regsOverlap(MO.getReg(), Reg)) @@ -271,6 +273,10 @@ bool MachineCSE::PhysRegDefsReach(MachineInstr *CSMI, MachineInstr *MI, for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) { const MachineOperand &MO = I->getOperand(i); + // RegMasks go on instructions like calls that clobber lots of physregs. + // Don't attempt to CSE across such an instruction. + if (MO.isRegMask()) + return false; if (!MO.isReg() || !MO.isDef()) continue; unsigned MOReg = MO.getReg(); |

