Fix PR8854. Track inserted copies to avoid read before write. Sorry, it's hard to...
authorEvan Cheng <evan.cheng@apple.com>
Mon, 14 Feb 2011 21:50:37 +0000 (21:50 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 14 Feb 2011 21:50:37 +0000 (21:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125523 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/PeepholeOptimizer.cpp

index 5f6ee306f48452efd36a6c97234e19c36a225be4..3474f755b8ef1e8e6407b4a9053f203b7840fe25 100644 (file)
@@ -331,25 +331,37 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
     ImmDefRegs.clear();
     ImmDefMIs.clear();
 
+    MachineBasicBlock::iterator PMII = I->begin();
     for (MachineBasicBlock::iterator
            MII = I->begin(), MIE = I->end(); MII != MIE; ) {
-      MachineInstr *MI = &*MII++;
+      MachineInstr *MI = &*MII;
       LocalMIs.insert(MI);
 
       if (MI->isLabel() || MI->isPHI() || MI->isImplicitDef() ||
           MI->isKill() || MI->isInlineAsm() || MI->isDebugValue() ||
-          MI->hasUnmodeledSideEffects())
+          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 = 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);
       }
+      PMII = MII;
+      ++MII;
     }
   }