diff options
author | Manman Ren <mren@apple.com> | 2012-07-11 22:51:44 +0000 |
---|---|---|
committer | Manman Ren <mren@apple.com> | 2012-07-11 22:51:44 +0000 |
commit | 45ed19499b8f7025d9acf91cc37fbf6ea63abc4f (patch) | |
tree | a62c7eab67e6865b2e5c3f3b2e898f419a352fab /lib | |
parent | 1d82115042c81793cc3d807a8136f7f0f475f083 (diff) | |
download | llvm-45ed19499b8f7025d9acf91cc37fbf6ea63abc4f.tar.gz llvm-45ed19499b8f7025d9acf91cc37fbf6ea63abc4f.tar.bz2 llvm-45ed19499b8f7025d9acf91cc37fbf6ea63abc4f.tar.xz |
ARM: Fix optimizeCompare to correctly check safe condition.
It is safe if CPSR is killed or re-defined.
When we are done with the basic block, check whether CPSR is live-out.
Do not optimize away cmp if CPSR is live-out.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160090 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/ARM/ARMBaseInstrInfo.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/Target/ARM/ARMBaseInstrInfo.cpp b/lib/Target/ARM/ARMBaseInstrInfo.cpp index 57c20ae6a4..3393f0975a 100644 --- a/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -1974,10 +1974,10 @@ optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, case ARM::t2EORri: { // Scan forward for the use of CPSR // When checking against MI: if it's a conditional code requires - // checking of V bit, then this is not safe to do. If we can't find the - // CPSR use (i.e. used in another block), then it's not safe to perform - // the optimization. - // When checking against Sub, we handle the condition codes GE, LT, GT, LE. + // checking of V bit, then this is not safe to do. + // It is safe to remove CmpInstr if CPSR is redefined or killed. + // If we are done with the basic block, we need to check whether CPSR is + // live-out. SmallVector<std::pair<MachineOperand*, ARMCC::CondCodes>, 4> OperandsToUpdate; bool isSafe = false; @@ -2017,7 +2017,7 @@ optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, else switch (CC) { default: - isSafe = true; + // CPSR can be used mutliple times, we should continue. break; case ARMCC::VS: case ARMCC::VC: @@ -2030,10 +2030,15 @@ optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, } } - // If the candidate is Sub, we may exit the loop at end of the basic block. - // In that case, it is still safe to remove CmpInstr. - if (!isSafe && !Sub) - return false; + // If CPSR is not killed nor re-defined, we should check whether it is + // live-out. If it is live-out, do not optimize. + if (!isSafe) { + MachineBasicBlock *MBB = CmpInstr->getParent(); + for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(), + SE = MBB->succ_end(); SI != SE; ++SI) + if ((*SI)->isLiveIn(ARM::CPSR)) + return false; + } // Toggle the optional operand to CPSR. MI->getOperand(5).setReg(ARM::CPSR); |