[llvm-commits] [llvm] r110069 - /llvm/trunk/lib/CodeGen/OptimizeExts.cpp

Bill Wendling isanbard at gmail.com
Mon Aug 2 15:06:08 PDT 2010


Author: void
Date: Mon Aug  2 17:06:08 2010
New Revision: 110069

URL: http://llvm.org/viewvc/llvm-project?rev=110069&view=rev
Log:
Early exit and reduce indentation. No functionality change.

Modified:
    llvm/trunk/lib/CodeGen/OptimizeExts.cpp

Modified: llvm/trunk/lib/CodeGen/OptimizeExts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/OptimizeExts.cpp?rev=110069&r1=110068&r2=110069&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/OptimizeExts.cpp (original)
+++ llvm/trunk/lib/CodeGen/OptimizeExts.cpp Mon Aug  2 17:06:08 2010
@@ -78,119 +78,120 @@
 /// ignore all debug uses.
 bool OptimizeExts::OptimizeInstr(MachineInstr *MI, MachineBasicBlock *MBB,
                                  SmallPtrSet<MachineInstr*, 8> &LocalMIs) {
-  bool Changed = false;
   LocalMIs.insert(MI);
 
   unsigned SrcReg, DstReg, SubIdx;
-  if (TII->isCoalescableExtInstr(*MI, SrcReg, DstReg, SubIdx)) {
-    if (TargetRegisterInfo::isPhysicalRegister(DstReg) ||
-        TargetRegisterInfo::isPhysicalRegister(SrcReg))
-      return false;
-
-    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_nodbg_begin(DstReg);
-    for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end();
-         UI != UE; ++UI)
-      ReachedBBs.insert(UI->getParent());
-
-    bool ExtendLife = true;
-    // Uses that are in the same BB of uses of the result of the instruction.
-    SmallVector<MachineOperand*, 8> Uses;
-    // Uses that the result of the instruction can reach.
-    SmallVector<MachineOperand*, 8> ExtendedUses;
+  if (!TII->isCoalescableExtInstr(*MI, SrcReg, DstReg, SubIdx))
+    return false;
 
-    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;
-      }
-
-      // It's an error to translate this:
-      //
-      //    %reg1025 = <sext> %reg1024
-      //     ...
-      //    %reg1026 = SUBREG_TO_REG 0, %reg1024, 4
-      //
-      // into this:
-      //
-      //    %reg1025 = <sext> %reg1024
-      //     ...
-      //    %reg1027 = COPY %reg1025:4
-      //    %reg1026 = SUBREG_TO_REG 0, %reg1027, 4
-      //
-      // The problem here is that SUBREG_TO_REG is there to assert that an
-      // implicit zext occurs. It doesn't insert a zext instruction. If we allow
-      // the COPY here, it will give us the value after the <sext>,
-      // not the original value of %reg1024 before <sext>.
-      if (UseMI->getOpcode() == TargetOpcode::SUBREG_TO_REG)
-        continue;
+  if (TargetRegisterInfo::isPhysicalRegister(DstReg) ||
+      TargetRegisterInfo::isPhysicalRegister(SrcReg))
+    return false;
+
+  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_nodbg_begin(DstReg);
+  for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end();
+       UI != UE; ++UI)
+    ReachedBBs.insert(UI->getParent());
+
+  bool ExtendLife = true;
+  // Uses that are in the same BB of uses of the result of the instruction.
+  SmallVector<MachineOperand*, 8> Uses;
+  // Uses that the result of the instruction can reach.
+  SmallVector<MachineOperand*, 8> ExtendedUses;
+
+  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.
-        if (!LocalMIs.count(UseMI))
-          Uses.push_back(&UseMO);
-      } else if (ReachedBBs.count(UseMBB))
-        // Non-local uses where the result of extension is used. Always
-        // replace these unless it's a PHI.
+    // It's an error to translate this:
+    //
+    //    %reg1025 = <sext> %reg1024
+    //     ...
+    //    %reg1026 = SUBREG_TO_REG 0, %reg1024, 4
+    //
+    // into this:
+    //
+    //    %reg1025 = <sext> %reg1024
+    //     ...
+    //    %reg1027 = COPY %reg1025:4
+    //    %reg1026 = SUBREG_TO_REG 0, %reg1027, 4
+    //
+    // The problem here is that SUBREG_TO_REG is there to assert that an
+    // implicit zext occurs. It doesn't insert a zext instruction. If we allow
+    // the COPY here, it will give us the value after the <sext>, not the
+    // original value of %reg1024 before <sext>.
+    if (UseMI->getOpcode() == TargetOpcode::SUBREG_TO_REG)
+      continue;
+
+    MachineBasicBlock *UseMBB = UseMI->getParent();
+    if (UseMBB == MBB) {
+      // Local uses that come after the extension.
+      if (!LocalMIs.count(UseMI))
         Uses.push_back(&UseMO);
-      else if (Aggressive && DT->dominates(MBB, UseMBB))
-        // We may want to extend live range of the extension result in order
-        // to replace these uses.
-        ExtendedUses.push_back(&UseMO);
-      else {
-        // Both will be live out of the def MBB anyway. Don't extend live
-        // range of the extension result.
-        ExtendLife = false;
-        break;
-      }
+    } else if (ReachedBBs.count(UseMBB))
+      // Non-local uses where the result of extension is used. Always 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 to
+      // replace these uses.
+      ExtendedUses.push_back(&UseMO);
+    else {
+      // Both will be live out of the def MBB anyway. Don't extend live range of
+      // the extension result.
+      ExtendLife = false;
+      break;
     }
+  }
+
+  if (ExtendLife && !ExtendedUses.empty())
+    // Ok, we'll extend the liveness of the extension result.
+    std::copy(ExtendedUses.begin(), ExtendedUses.end(),
+              std::back_inserter(Uses));
+
+  // Now replace all uses.
+  bool Changed = false;
+  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());
 
-    if (ExtendLife && !ExtendedUses.empty())
-      // Ok, we'll extend the liveness of the extension result.
-      std::copy(ExtendedUses.begin(), ExtendedUses.end(),
-                std::back_inserter(Uses));
-
-    // 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(TargetOpcode::COPY), NewVR)
-          .addReg(DstReg, 0, SubIdx);
-        UseMO->setReg(NewVR);
-        ++NumReuse;
-        Changed = true;
-      }
+    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(TargetOpcode::COPY), NewVR)
+        .addReg(DstReg, 0, SubIdx);
+      UseMO->setReg(NewVR);
+      ++NumReuse;
+      Changed = true;
     }
   }
 





More information about the llvm-commits mailing list