[PATCH] D28489: [CodeGen] Generalize MacroFusion for any instructions pair

Evandro Menezes via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 13 14:00:44 PST 2017


evandro updated this revision to Diff 84375.

Repository:
  rL LLVM

https://reviews.llvm.org/D28489

Files:
  llvm/lib/CodeGen/MachineScheduler.cpp


Index: llvm/lib/CodeGen/MachineScheduler.cpp
===================================================================
--- llvm/lib/CodeGen/MachineScheduler.cpp
+++ llvm/lib/CodeGen/MachineScheduler.cpp
@@ -1556,6 +1556,10 @@
     : TII(TII) {}
 
   void apply(ScheduleDAGInstrs *DAGInstrs) override;
+
+private:
+  bool applyImpl(ScheduleDAGMI *DAG, SUnit *ASU, SmallVectorImpl<SDep> &APreds,
+                 bool Preds);
 };
 } // anonymous
 
@@ -1573,43 +1577,52 @@
 void MacroFusion::apply(ScheduleDAGInstrs *DAGInstrs) {
   ScheduleDAGMI *DAG = static_cast<ScheduleDAGMI*>(DAGInstrs);
 
-  // For now, assume targets can only fuse with the branch.
-  SUnit &ExitSU = DAG->ExitSU;
-  MachineInstr *Branch = ExitSU.getInstr();
-  if (!Branch)
-    return;
+  // For each of the block SUnits, iterate over its successors.
+  for (SUnit &ASU : DAG->SUnits)
+    applyImpl(DAG, &ASU, ASU.Succs, false);
+
+  // Iterate over the predecessors of ExitSU.
+  applyImpl(DAG, &DAG->ExitSU, DAG->ExitSU.Preds, true);
+}
 
-  for (SDep &PredDep : ExitSU.Preds) {
-    if (PredDep.isWeak())
+bool MacroFusion::applyImpl(ScheduleDAGMI *DAG, SUnit *ASU,
+                            SmallVectorImpl<SDep> &APreds, bool Preds) {
+  const MachineInstr *AMI = ASU->getInstr();
+  if (!AMI || AMI->isPseudo() || AMI->isTransient())
+    return false;
+
+  for (SDep &BDep : APreds) {
+    if (BDep.isWeak())
       continue;
-    SUnit &SU = *PredDep.getSUnit();
-    MachineInstr &Pred = *SU.getInstr();
-    if (!TII.shouldScheduleAdjacent(Pred, *Branch))
+
+    SUnit *BSU = BDep.getSUnit();
+    const MachineInstr *BMI = BSU->getInstr();
+    if (!BMI || BMI->isPseudo() || BMI->isTransient() ||
+        !TII.shouldScheduleAdjacent(*AMI, *BMI))
       continue;
 
-    // Create a single weak edge from SU to ExitSU. The only effect is to cause
-    // bottom-up scheduling to heavily prioritize the clustered SU.  There is no
-    // need to copy predecessor edges from ExitSU to SU, since top-down
-    // scheduling cannot prioritize ExitSU anyway. To defer top-down scheduling
-    // of SU, we could create an artificial edge from the deepest root, but it
-    // hasn't been needed yet.
-    bool Success = DAG->addEdge(&ExitSU, SDep(&SU, SDep::Cluster));
-    (void)Success;
-    assert(Success && "No DAG nodes should be reachable from ExitSU");
-
-    // Adjust latency of data deps between the nodes.
-    for (SDep &PredDep : ExitSU.Preds) {
-      if (PredDep.getSUnit() == &SU)
-        PredDep.setLatency(0);
-    }
-    for (SDep &SuccDep : SU.Succs) {
-      if (SuccDep.getSUnit() == &ExitSU)
-        SuccDep.setLatency(0);
-    }
+    // Create a single weak edge between the adjacent instrs. The only
+    // effect is to cause bottom-up scheduling to heavily prioritize the
+    // clustered instrs.
+    DAG->addEdge(BSU, SDep(ASU, SDep::Cluster));
 
-    DEBUG(dbgs() << "Macro Fuse SU(" << SU.NodeNum << ")\n");
-    break;
+    // Adjust the latency between the 1st instr and its predecessors/successors.
+    for (SDep &Dep : APreds)
+      if (Dep.getSUnit() == BSU)
+        Dep.setLatency(0);
+
+    // Adjust the latency between the 2nd instr and its successors/predecessors.
+    SmallVectorImpl<SDep> &BSuccs = Preds ? BSU->Succs : BSU->Preds;
+    for (SDep &Dep : BSuccs)
+      if (Dep.getSUnit() == ASU)
+        Dep.setLatency(0);
+
+    DEBUG(dbgs() << "Macro fuse "; ASU->print(dbgs(), DAG); dbgs() << " - ";
+                                   BSU->print(dbgs(), DAG); dbgs() << '\n');
+    return true;
   }
+
+  return false;
 }
 
 //===----------------------------------------------------------------------===//


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28489.84375.patch
Type: text/x-patch
Size: 3642 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170113/e7d161c1/attachment.bin>


More information about the llvm-commits mailing list