[llvm-commits] [llvm] r147594 - /llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp

Andrew Trick atrick at apple.com
Wed Jan 4 18:52:12 PST 2012


Author: atrick
Date: Wed Jan  4 20:52:11 2012
New Revision: 147594

URL: http://llvm.org/viewvc/llvm-project?rev=147594&view=rev
Log:
Minor postra scheduler cleanup. It could result in more precise antidependence latency on ARM in exceedingly rare cases.

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

Modified: llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp?rev=147594&r1=147593&r2=147594&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp (original)
+++ llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp Wed Jan  4 20:52:11 2012
@@ -260,9 +260,6 @@
 
       assert(TRI->isPhysicalRegister(Reg) && "Virtual register encountered!");
 
-      std::vector<SUnit *> &UseList = Uses[Reg];
-      // Defs are push in the order they are visited and never reordered.
-      std::vector<SUnit *> &DefList = Defs[Reg];
       // Optionally add output and anti dependencies. For anti
       // dependencies we use a latency of 0 because for a multi-issue
       // target we want to allow the defining instruction to issue
@@ -271,36 +268,33 @@
       //       there's no cost for reusing registers.
       SDep::Kind Kind = MO.isUse() ? SDep::Anti : SDep::Output;
       unsigned AOLatency = (Kind == SDep::Anti) ? 0 : 1;
-      for (unsigned i = 0, e = DefList.size(); i != e; ++i) {
-        SUnit *DefSU = DefList[i];
-        if (DefSU == &ExitSU)
-          continue;
-        if (DefSU != SU &&
-            (Kind != SDep::Output || !MO.isDead() ||
-             !DefSU->getInstr()->registerDefIsDead(Reg))) {
-          if (Kind == SDep::Anti)
-            DefSU->addPred(SDep(SU, Kind, 0, /*Reg=*/Reg));
-          else {
-            unsigned AOLat = TII->getOutputLatency(InstrItins, MI, j,
-                                                   DefSU->getInstr());
-            DefSU->addPred(SDep(SU, Kind, AOLat, /*Reg=*/Reg));
-          }
-        }
-      }
-      for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
-        std::vector<SUnit *> &MemDefList = Defs[*Alias];
-        for (unsigned i = 0, e = MemDefList.size(); i != e; ++i) {
-          SUnit *DefSU = MemDefList[i];
+      for (const unsigned *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) {
+        std::vector<SUnit *> &DefList = Defs[*Alias];
+        for (unsigned i = 0, e = DefList.size(); i != e; ++i) {
+          SUnit *DefSU = DefList[i];
           if (DefSU == &ExitSU)
             continue;
           if (DefSU != SU &&
               (Kind != SDep::Output || !MO.isDead() ||
-               !DefSU->getInstr()->registerDefIsDead(*Alias)))
-            DefSU->addPred(SDep(SU, Kind, AOLatency, /*Reg=*/ *Alias));
+               !DefSU->getInstr()->registerDefIsDead(*Alias))) {
+            if (Kind == SDep::Anti)
+              DefSU->addPred(SDep(SU, Kind, 0, /*Reg=*/*Alias));
+            else {
+              unsigned AOLat = TII->getOutputLatency(InstrItins, MI, j,
+                                                     DefSU->getInstr());
+              DefSU->addPred(SDep(SU, Kind, AOLat, /*Reg=*/*Alias));
+            }
+          }
         }
       }
 
+      // Retrieve the UseList to add data dependencies and update uses.
+      std::vector<SUnit *> &UseList = Uses[Reg];
       if (MO.isDef()) {
+        // Update DefList. Defs are pushed in the order they are visited and
+        // never reordered.
+        std::vector<SUnit *> &DefList = Defs[Reg];
+
         // Add any data dependencies.
         unsigned DataLatency = SU->Latency;
         for (unsigned i = 0, e = UseList.size(); i != e; ++i) {





More information about the llvm-commits mailing list