Fix some typos.
[oota-llvm.git] / lib / CodeGen / PeepholeOptimizer.cpp
index 07c2b80dcb06f4f7a9813a81307254e3254873b9..5d7123caa0175f482e442fe6299d6b47e263a065 100644 (file)
@@ -295,7 +295,7 @@ bool PeepholeOptimizer::FoldImmediate(MachineInstr *MI, MachineBasicBlock *MBB,
     if (!MO.isReg() || MO.isDef())
       continue;
     unsigned Reg = MO.getReg();
-    if (!Reg || TargetRegisterInfo::isPhysicalRegister(Reg))
+    if (!TargetRegisterInfo::isVirtualRegister(Reg))
       continue;
     if (ImmDefRegs.count(Reg) == 0)
       continue;
@@ -331,23 +331,40 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
     ImmDefRegs.clear();
     ImmDefMIs.clear();
 
+    bool First = true;
+    MachineBasicBlock::iterator PMII;
     for (MachineBasicBlock::iterator
            MII = I->begin(), MIE = I->end(); MII != MIE; ) {
-      MachineInstr *MI = &*MII++;
+      MachineInstr *MI = &*MII;
       LocalMIs.insert(MI);
 
-      if (MI->getDesc().hasUnmodeledSideEffects())
+      if (MI->isLabel() || MI->isPHI() || MI->isImplicitDef() ||
+          MI->isKill() || MI->isInlineAsm() || MI->isDebugValue() ||
+          MI->hasUnmodeledSideEffects()) {
+        ++MII;
         continue;
+      }
 
       if (MI->getDesc().isCompare()) {
-        Changed |= OptimizeCmpInstr(MI, MBB);
-      } else if (isMoveImmediate(MI, ImmDefRegs, ImmDefMIs)) {
+        if (OptimizeCmpInstr(MI, MBB)) {
+          // MI is deleted.
+          Changed = true;
+          MII = First ? I->begin() : llvm::next(PMII);
+          continue;
+        }
+      }
+
+      if (isMoveImmediate(MI, ImmDefRegs, ImmDefMIs)) {
         SeenMoveImm = true;
       } else {
         Changed |= OptimizeExtInstr(MI, MBB, LocalMIs);
         if (SeenMoveImm)
           Changed |= FoldImmediate(MI, MBB, ImmDefRegs, ImmDefMIs);
       }
+
+      First = false;
+      PMII = MII;
+      ++MII;
     }
   }