diff options
| author | Manman Ren <mren@apple.com> | 2012-07-11 19:35:12 +0000 |
|---|---|---|
| committer | Manman Ren <mren@apple.com> | 2012-07-11 19:35:12 +0000 |
| commit | 1553ce0e81cf1a5cb2b3cc8e995fdb0e88aa7de5 (patch) | |
| tree | f2baa553852b79d2249a8517680f8ab87f81b06e /llvm/lib | |
| parent | 24cf4e36e591be7ec1e061fca810521bb5150d25 (diff) | |
| download | bcm5719-llvm-1553ce0e81cf1a5cb2b3cc8e995fdb0e88aa7de5.tar.gz bcm5719-llvm-1553ce0e81cf1a5cb2b3cc8e995fdb0e88aa7de5.zip | |
X86: Update to peephole optimization to move Movr0 before (Sub, Cmp) pair.
When Movr0 is between sub and cmp, we move Movr0 before sub if it enables
removal of Cmp.
llvm-svn: 160066
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index eb30a870c5a..921d2150f62 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -3110,6 +3110,7 @@ optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, RE = CmpInstr->getParent() == MI->getParent() ? MachineBasicBlock::reverse_iterator(++Def) /* points to MI */ : CmpInstr->getParent()->rend(); + MachineInstr *Movr0Inst = 0; for (; RI != RE; ++RI) { MachineInstr *Instr = &*RI; // Check whether CmpInstr can be made redundant by the current instruction. @@ -3119,10 +3120,24 @@ optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, } if (Instr->modifiesRegister(X86::EFLAGS, TRI) || - Instr->readsRegister(X86::EFLAGS, TRI)) + Instr->readsRegister(X86::EFLAGS, TRI)) { // This instruction modifies or uses EFLAGS. + + // MOV32r0 etc. are implemented with xor which clobbers condition code. + // They are safe to move up, if the definition to EFLAGS is dead and + // earlier instructions do not read or write EFLAGS. + if (!Movr0Inst && (Instr->getOpcode() == X86::MOV8r0 || + Instr->getOpcode() == X86::MOV16r0 || + Instr->getOpcode() == X86::MOV32r0 || + Instr->getOpcode() == X86::MOV64r0) && + Instr->registerDefIsDead(X86::EFLAGS, TRI)) { + Movr0Inst = Instr; + continue; + } + // We can't remove CmpInstr. return false; + } } // Return false if no candidates exist. @@ -3204,6 +3219,12 @@ optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, return false; } + // Move Movr0Inst to the place right before Sub. + if (Movr0Inst) { + Sub->getParent()->remove(Movr0Inst); + Sub->getParent()->insert(MachineBasicBlock::iterator(Sub), Movr0Inst); + } + // Make sure Sub instruction defines EFLAGS. assert(Sub->getNumOperands() >= 4 && Sub->getOperand(3).isReg() && Sub->getOperand(3).getReg() == X86::EFLAGS && |

