diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-20 18:42:51 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-20 18:42:51 +0000 |
| commit | 00f07dec0c389f7618fa79c2ee16f028fc6d1d1a (patch) | |
| tree | fef2a9124ddc0888ba628f2958a11ea610f3f6f8 | |
| parent | 8eb05fd093b8e2878440e2b074b60d07e1d397d9 (diff) | |
| download | bcm5719-llvm-00f07dec0c389f7618fa79c2ee16f028fc6d1d1a.tar.gz bcm5719-llvm-00f07dec0c389f7618fa79c2ee16f028fc6d1d1a.zip | |
Constrain register classes in TailDup.
When rewriting operands, make sure the new registers have a compatible
register class.
llvm-svn: 157163
| -rw-r--r-- | llvm/lib/CodeGen/TailDuplication.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/TailDuplication.cpp b/llvm/lib/CodeGen/TailDuplication.cpp index 8ebfbcae785..3e203850f90 100644 --- a/llvm/lib/CodeGen/TailDuplication.cpp +++ b/llvm/lib/CodeGen/TailDuplication.cpp @@ -272,8 +272,8 @@ TailDuplicatePass::TailDuplicateAndUpdate(MachineBasicBlock *MBB, continue; unsigned Dst = Copy->getOperand(0).getReg(); unsigned Src = Copy->getOperand(1).getReg(); - MachineRegisterInfo::use_iterator UI = MRI->use_begin(Src); - if (++UI == MRI->use_end()) { + if (MRI->hasOneNonDBGUse(Src) && + MRI->constrainRegClass(Src, MRI->getRegClass(Dst))) { // Copy is the only use. Do trivial copy propagation here. MRI->replaceRegWith(Dst, Src); Copy->eraseFromParent(); @@ -429,8 +429,10 @@ void TailDuplicatePass::DuplicateInstruction(MachineInstr *MI, AddSSAUpdateEntry(Reg, NewReg, PredBB); } else { DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg); - if (VI != LocalVRMap.end()) + if (VI != LocalVRMap.end()) { MO.setReg(VI->second); + MRI->constrainRegClass(VI->second, MRI->getRegClass(Reg)); + } } } PredBB->insert(PredBB->instr_end(), NewMI); |

