From: Bill Wendling Date: Mon, 10 Oct 2011 22:52:53 +0000 (+0000) Subject: If the CPSR is defined by a copy, then we don't want to merge it into an IT X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=721e1d266902f4d906645b130d1b2a905d75fa31;p=oota-llvm.git 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 & git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141589 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/Thumb2ITBlockPass.cpp b/lib/Target/ARM/Thumb2ITBlockPass.cpp index 360ec009e20..2bf99bfd5c3 100644 --- a/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ b/lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -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;