Add a new beta option for critical edge splitting, to avoid a problem that
authorChris Lattner <sabre@nondot.org>
Wed, 17 Aug 2005 06:37:43 +0000 (06:37 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Aug 2005 06:37:43 +0000 (06:37 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22825 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 7303ee2add2035304999bac38004d559e0e7be47..6ba00bccdf88fd41f92e032151767c13e8f3b816 100644 (file)
 #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 @@ unsigned SelectionDAGISel::MakeReg(MVT::ValueType VT) {
   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 @@ bool SelectionDAGISel::runOnFunction(Function &Fn) {
   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)