[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Aug 16 23:37:55 PDT 2005



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.70 -> 1.71
---
Log message:

Add a new beta option for critical edge splitting, to avoid a problem that
Nate noticed in yacr2 (and I know occurs in other places as well).

This is still rough, as the critical edge blocks are not intelligently placed
but is added to get some idea to see if this improves performance.



---
Diffs of the changes:  (+23 -0)

 SelectionDAGISel.cpp |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+)


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.70 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.71
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.70	Wed Aug 17 01:06:25 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Wed Aug 17 01:37:43 2005
@@ -29,12 +29,18 @@
 #include "llvm/Target/TargetInstrInfo.h"
 #include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/TargetMachine.h"
+#include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include <map>
 #include <iostream>
 using namespace llvm;
 
+static cl::opt<bool>
+SplitPHICritEdges("split-phi-constant-crit-edges", cl::Hidden,
+         cl::desc("Split critical edges for PHI values that are constants"));
+
+
 #ifndef _NDEBUG
 static cl::opt<bool>
 ViewDAGs("view-isel-dags", cl::Hidden,
@@ -959,6 +965,10 @@
   return RegMap->createVirtualRegister(TLI.getRegClassFor(VT));
 }
 
+void SelectionDAGISel::getAnalysisUsage(AnalysisUsage &AU) const {
+  if (!SplitPHICritEdges)
+    AU.setPreservesAll();
+}
 
 
 bool SelectionDAGISel::runOnFunction(Function &Fn) {
@@ -966,6 +976,19 @@
   RegMap = MF.getSSARegMap();
   DEBUG(std::cerr << "\n\n\n=== " << Fn.getName() << "\n");
 
+  // First pass, split all critical edges for PHI nodes with incoming values
+  // that are constants, this way the load of the constant into a vreg will not
+  // be placed into MBBs that are used some other way.
+  if (SplitPHICritEdges)
+    for (Function::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
+      PHINode *PN;
+      for (BasicBlock::iterator BBI = BB->begin();
+           (PN = dyn_cast<PHINode>(BBI)); ++BBI)
+        for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
+          if (isa<Constant>(PN->getIncomingValue(i)))
+            SplitCriticalEdge(PN->getIncomingBlock(i), BB);
+    }
+
   FunctionLoweringInfo FuncInfo(TLI, Fn, MF);
 
   for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)






More information about the llvm-commits mailing list