Add a flag to SDep for tracking which edges are anti-dependence edges.
authorDan Gohman <gohman@apple.com>
Fri, 21 Nov 2008 02:27:52 +0000 (02:27 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 21 Nov 2008 02:27:52 +0000 (02:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59785 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/ScheduleDAG.h
lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp
lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp

index 446e74c2b8c3dd32732b4437ac752c5953b9e5f6..4b65bd23e37027be716bb2c9839b5128aa61f2ca 100644 (file)
@@ -48,8 +48,10 @@ namespace llvm {
     bool      isArtificial : 1; // True iff it's an artificial ctrl dep added
                                 // during sched that may be safely deleted if
                                 // necessary.
-    SDep(SUnit *d, unsigned r, int t, bool c, bool a)
-      : Dep(d), Reg(r), Cost(t), isCtrl(c), isArtificial(a) {}
+    bool      isAntiDep : 1; // True iff it's an anti-dependency (on a physical
+                             // register.
+    SDep(SUnit *d, unsigned r, int t, bool c, bool a, bool anti)
+      : Dep(d), Reg(r), Cost(t), isCtrl(c), isArtificial(a), isAntiDep(anti) {}
   };
 
   /// SUnit - Scheduling unit. This is a node in the scheduling DAG.
@@ -140,15 +142,17 @@ namespace llvm {
     }
 
     /// addPred - This adds the specified node as a pred of the current node if
-    /// not already.  This returns true if this is a new pred.
+    /// not already.  It also adds the current node as a successor of the
+    /// specified node.  This returns true if this is a new pred.
     bool addPred(SUnit *N, bool isCtrl, bool isArtificial,
-                 unsigned PhyReg = 0, int Cost = 1) {
+                 unsigned PhyReg = 0, int Cost = 1, bool isAntiDep = false) {
       for (unsigned i = 0, e = (unsigned)Preds.size(); i != e; ++i)
         if (Preds[i].Dep == N &&
             Preds[i].isCtrl == isCtrl && Preds[i].isArtificial == isArtificial)
           return false;
-      Preds.push_back(SDep(N, PhyReg, Cost, isCtrl, isArtificial));
-      N->Succs.push_back(SDep(this, PhyReg, Cost, isCtrl, isArtificial));
+      Preds.push_back(SDep(N, PhyReg, Cost, isCtrl, isArtificial, isAntiDep));
+      N->Succs.push_back(SDep(this, PhyReg, Cost, isCtrl,
+                              isArtificial, isAntiDep));
       if (!isCtrl) {
         ++NumPreds;
         ++N->NumSuccs;
index f684c3efcfe737992f6cf21a99f330309ce4ba72..55fd7e4abc0c68703d879e1e143d11ab82459b39 100644 (file)
@@ -287,18 +287,18 @@ SUnit *ScheduleDAGFast::CopyAndMoveSuccessors(SUnit *SU) {
       if (I->isCtrl)
         ChainPred = I->Dep;
       else if (I->Dep->getNode() && I->Dep->getNode()->isOperandOf(LoadNode))
-        LoadPreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false));
+        LoadPreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false, false));
       else
-        NodePreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false));
+        NodePreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false, false));
     }
     for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
          I != E; ++I) {
       if (I->isCtrl)
         ChainSuccs.push_back(SDep(I->Dep, I->Reg, I->Cost,
-                                  I->isCtrl, I->isArtificial));
+                                  I->isCtrl, I->isArtificial, I->isAntiDep));
       else
         NodeSuccs.push_back(SDep(I->Dep, I->Reg, I->Cost,
-                                 I->isCtrl, I->isArtificial));
+                                 I->isCtrl, I->isArtificial, I->isAntiDep));
     }
 
     if (ChainPred) {
index bdca21ec78ea4a146cbe85ded0dc837000ef4405..03a91cffdeea1ef5dacfcf01f6d7990749503b42 100644 (file)
@@ -688,18 +688,18 @@ SUnit *ScheduleDAGRRList::CopyAndMoveSuccessors(SUnit *SU) {
       if (I->isCtrl)
         ChainPred = I->Dep;
       else if (I->Dep->getNode() && I->Dep->getNode()->isOperandOf(LoadNode))
-        LoadPreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false));
+        LoadPreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false, false));
       else
-        NodePreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false));
+        NodePreds.push_back(SDep(I->Dep, I->Reg, I->Cost, false, false, false));
     }
     for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
          I != E; ++I) {
       if (I->isCtrl)
         ChainSuccs.push_back(SDep(I->Dep, I->Reg, I->Cost,
-                                  I->isCtrl, I->isArtificial));
+                                  I->isCtrl, I->isArtificial, I->isAntiDep));
       else
         NodeSuccs.push_back(SDep(I->Dep, I->Reg, I->Cost,
-                                 I->isCtrl, I->isArtificial));
+                                 I->isCtrl, I->isArtificial, I->isAntiDep));
     }
 
     if (ChainPred) {