If the CPSR is defined by a copy, then we don't want to merge it into an IT

block. E.g., if we have:

  movs  r1, r1
  rsb   r1, 0
  movs  r2, r2
  rsb   r2, 0

we don't want this to be converted to:

  movs  r1, r1
  movs  r2, r2
  itt   mi
  rsb   r1, 0
  rsb   r2, 0

PR11107 & <rdar://problem/10259534>

llvm-svn: 141589
This commit is contained in:
Bill Wendling 2011-10-10 22:52:53 +00:00
parent c7a3107baf
commit 0a10cdc704
1 changed files with 22 additions and 0 deletions

View File

@ -124,6 +124,28 @@ Thumb2ITBlockPass::MoveCopyOutOfITBlock(MachineInstr *MI,
if (Uses.count(DstReg) || Defs.count(SrcReg))
return false;
// If the CPSR is defined by this copy, then we don't want to move it. E.g.,
// if we have:
//
// movs r1, r1
// rsb r1, 0
// movs r2, r2
// rsb r2, 0
//
// we don't want this to be converted to:
//
// movs r1, r1
// movs r2, r2
// itt mi
// rsb r1, 0
// rsb r2, 0
//
//
for (unsigned I = 0, E = MI->getNumOperands(); I != E; ++I)
if (MI->getOperand(I).isReg() && MI->getOperand(I).getReg() == ARM::CPSR &&
MI->getOperand(I).isDef())
return false;
// Then peek at the next instruction to see if it's predicated on CC or OCC.
// If not, then there is nothing to be gained by moving the copy.
MachineBasicBlock::iterator I = MI; ++I;