Remove unnecessary include.
[oota-llvm.git] / lib / CodeGen / OptimizeExts.cpp
index 844eb232f66d17977995a0ed64a97fc52155f4c3..41fc204074410c144140afac9df3edd72a4ebe3b 100644 (file)
@@ -73,6 +73,9 @@ FunctionPass *llvm::createOptimizeExtsPass() { return new OptimizeExts(); }
 /// the source, and if the source value is preserved as a sub-register of
 /// the result, then replace all reachable uses of the source with the subreg
 /// of the result.
+/// Do not generate an EXTRACT that is used only in a debug use, as this
+/// changes the code.  Since this code does not currently share EXTRACTs, just
+/// ignore all debug uses.
 bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
                                  SmallPtrSet<MachineInstr*, 8> &LocalMIs) {
   bool Changed = false;
@@ -84,17 +87,17 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
         TargetRegisterInfo::isPhysicalRegister(SrcReg))
       return false;
 
-    MachineRegisterInfo::use_iterator UI = MRI->use_begin(SrcReg);
-    if (++UI == MRI->use_end())
+    MachineRegisterInfo::use_nodbg_iterator UI = MRI->use_nodbg_begin(SrcReg);
+    if (++UI == MRI->use_nodbg_end())
       // No other uses.
       return false;
 
     // Ok, the source has other uses. See if we can replace the other uses
     // with use of the result of the extension.
     SmallPtrSet<MachineBasicBlock*, 4> ReachedBBs;
-    UI = MRI->use_begin(DstReg);
-    for (MachineRegisterInfo::use_iterator UE = MRI->use_end(); UI != UE;
-         ++UI)
+    UI = MRI->use_nodbg_begin(DstReg);
+    for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end();
+         UI != UE; ++UI)
       ReachedBBs.insert(UI->getParent());
 
     bool ExtendLife = true;
@@ -103,13 +106,18 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
     // Uses that the result of the instruction can reach.
     SmallVector<MachineOperand*, 8> ExtendedUses;
 
-    UI = MRI->use_begin(SrcReg);
-    for (MachineRegisterInfo::use_iterator UE = MRI->use_end(); UI != UE;
-         ++UI) {
+    UI = MRI->use_nodbg_begin(SrcReg);
+    for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end();
+         UI != UE; ++UI) {
       MachineOperand &UseMO = UI.getOperand();
       MachineInstr *UseMI = &*UI;
       if (UseMI == MI)
         continue;
+      if (UseMI->isPHI()) {
+        ExtendLife = false;
+        continue;
+      }
+
       MachineBasicBlock *UseMBB = UseMI->getParent();
       if (UseMBB == MBB) {
         // Local uses that come after the extension.
@@ -117,7 +125,7 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
           Uses.push_back(&UseMO);
       } else if (ReachedBBs.count(UseMBB))
         // Non-local uses where the result of extension is used. Always
-        // replace these.
+        // replace these unless it's a PHI.
         Uses.push_back(&UseMO);
       else if (Aggressive && DT->dominates(MBB, UseMBB))
         // We may want to extend live range of the extension result in order
@@ -138,14 +146,26 @@ bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
 
     // Now replace all uses.
     if (!Uses.empty()) {
+      SmallPtrSet<MachineBasicBlock*, 4> PHIBBs;
+      // Look for PHI uses of the extended result, we don't want to extend the
+      // liveness of a PHI input. It breaks all kinds of assumptions down
+      // stream. A PHI use is expected to be the kill of its source values.
+      UI = MRI->use_nodbg_begin(DstReg);
+      for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end();
+           UI != UE; ++UI)
+        if (UI->isPHI())
+          PHIBBs.insert(UI->getParent());
+
       const TargetRegisterClass *RC = MRI->getRegClass(SrcReg);
       for (unsigned i = 0, e = Uses.size(); i != e; ++i) {
         MachineOperand *UseMO = Uses[i];
         MachineInstr *UseMI = UseMO->getParent();
         MachineBasicBlock *UseMBB = UseMI->getParent();
+        if (PHIBBs.count(UseMBB))
+          continue;
         unsigned NewVR = MRI->createVirtualRegister(RC);
         BuildMI(*UseMBB, UseMI, UseMI->getDebugLoc(),
-                TII->get(TargetInstrInfo::EXTRACT_SUBREG), NewVR)
+                TII->get(TargetOpcode::EXTRACT_SUBREG), NewVR)
           .addReg(DstReg).addImm(SubIdx);
         UseMO->setReg(NewVR);
         ++NumReuse;