summaryrefslogtreecommitdiff
path: root/lib/CodeGen/PeepholeOptimizer.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2010-09-10 21:55:43 +0000
committerBill Wendling <isanbard@gmail.com>2010-09-10 21:55:43 +0000
commit220e240bdf3235252c2a1fc8fcc5d4b8e8117918 (patch)
tree30e5da991361c851472bb12f4bb445e4fa6dab10 /lib/CodeGen/PeepholeOptimizer.cpp
parent51f5b67395780b8421f4aa6ee998ed51b23dae9d (diff)
downloadllvm-220e240bdf3235252c2a1fc8fcc5d4b8e8117918.tar.gz
llvm-220e240bdf3235252c2a1fc8fcc5d4b8e8117918.tar.bz2
llvm-220e240bdf3235252c2a1fc8fcc5d4b8e8117918.tar.xz
Modify the comparison optimizations in the peephole optimizer to update the
iterator when an optimization took place. This allows us to do more insane things with the code than just remove an instruction or two. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113640 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PeepholeOptimizer.cpp')
-rw-r--r--lib/CodeGen/PeepholeOptimizer.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/CodeGen/PeepholeOptimizer.cpp b/lib/CodeGen/PeepholeOptimizer.cpp
index ea14d276d5..a4ff04bec1 100644
--- a/lib/CodeGen/PeepholeOptimizer.cpp
+++ b/lib/CodeGen/PeepholeOptimizer.cpp
@@ -76,7 +76,8 @@ namespace {
}
private:
- bool OptimizeCmpInstr(MachineInstr *MI, MachineBasicBlock *MBB);
+ bool OptimizeCmpInstr(MachineInstr *MI, MachineBasicBlock *MBB,
+ MachineBasicBlock::iterator &MII);
bool OptimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB,
SmallPtrSet<MachineInstr*, 8> &LocalMIs);
};
@@ -232,7 +233,8 @@ OptimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB,
/// set) the same flag as the compare, then we can remove the comparison and use
/// the flag from the previous instruction.
bool PeepholeOptimizer::OptimizeCmpInstr(MachineInstr *MI,
- MachineBasicBlock *MBB) {
+ MachineBasicBlock *MBB,
+ MachineBasicBlock::iterator &NextIter){
// If this instruction is a comparison against zero and isn't comparing a
// physical register, we can try to optimize it.
unsigned SrcReg;
@@ -247,7 +249,7 @@ bool PeepholeOptimizer::OptimizeCmpInstr(MachineInstr *MI,
return false;
// Attempt to convert the defining instruction to set the "zero" flag.
- if (TII->ConvertToSetZeroFlag(&*DI, MI)) {
+ if (TII->ConvertToSetZeroFlag(&*DI, MI, NextIter)) {
++NumEliminated;
return true;
}
@@ -269,12 +271,14 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
LocalMIs.clear();
for (MachineBasicBlock::iterator
- MII = I->begin(), ME = I->end(); MII != ME; ) {
+ MII = I->begin(), MIE = I->end(); MII != MIE; ) {
MachineInstr *MI = &*MII;
if (MI->getDesc().isCompare()) {
- ++MII; // The iterator may become invalid if the compare is deleted.
- Changed |= OptimizeCmpInstr(MI, MBB);
+ if (OptimizeCmpInstr(MI, MBB, MII))
+ Changed = true;
+ else
+ ++MII;
} else {
Changed |= OptimizeExtInstr(MI, MBB, LocalMIs);
++MII;