Factor code that finalize PHI nodes, jump tables, etc. out of SelectBasicBlock. No...
authorEvan Cheng <evan.cheng@apple.com>
Thu, 7 Aug 2008 00:43:25 +0000 (00:43 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 7 Aug 2008 00:43:25 +0000 (00:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54438 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAGISel.h
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 668e64eb8747fc939048a6dee0ac4177bcfb10c3..804ccf3e59077caec7e4a0639785ca82fa74cc59 100644 (file)
@@ -182,10 +182,15 @@ private:
                             FunctionLoweringInfo &FuncInfo);
   void SelectBasicBlock(BasicBlock *BB, MachineFunction &MF,
                         FunctionLoweringInfo &FuncInfo,
+             std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
+                        NodeAllocatorType &NodeAllocator);
+  void FinishBasicBlock(BasicBlock *BB, MachineFunction &MF,
+                        FunctionLoweringInfo &FuncInfo,
+             std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
                         NodeAllocatorType &NodeAllocator);
 
   void BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
-           std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
+             std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
                          FunctionLoweringInfo &FuncInfo);
   void CodeGenAndEmitDAG(SelectionDAG &DAG);
   void LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL);
index 961c12d7a7718398b46b425f6c31ef0cb1ddeada..ac30ff63b70fc883118dfbd3570e894e036cb249 100644 (file)
@@ -5441,29 +5441,38 @@ void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn, MachineFunction &MF,
   // each basic block.
   NodeAllocatorType NodeAllocator;
 
-  for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
-    SelectBasicBlock(I, MF, FuncInfo, NodeAllocator);
+  std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
+  for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
+    BasicBlock *LLVMBB = &*I;
+    PHINodesToUpdate.clear();
+    SelectBasicBlock(LLVMBB, MF, FuncInfo, PHINodesToUpdate, NodeAllocator);
+    FinishBasicBlock(LLVMBB, MF, FuncInfo, PHINodesToUpdate, NodeAllocator);
+  }
 }
 
 void
 SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF,
                                    FunctionLoweringInfo &FuncInfo,
+             std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
                                    NodeAllocatorType &NodeAllocator) {
-  std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
-  {
-    SelectionDAG DAG(TLI, MF, FuncInfo, 
-                     getAnalysisToUpdate<MachineModuleInfo>(),
-                     NodeAllocator);
-    CurDAG = &DAG;
+  SelectionDAG DAG(TLI, MF, FuncInfo, 
+                   getAnalysisToUpdate<MachineModuleInfo>(),
+                   NodeAllocator);
+  CurDAG = &DAG;
   
-    // First step, lower LLVM code to some DAG.  This DAG may use operations and
-    // types that are not supported by the target.
-    BuildSelectionDAG(DAG, LLVMBB, PHINodesToUpdate, FuncInfo);
+  // First step, lower LLVM code to some DAG.  This DAG may use operations and
+  // types that are not supported by the target.
+  BuildSelectionDAG(DAG, LLVMBB, PHINodesToUpdate, FuncInfo);
 
-    // Second step, emit the lowered DAG as machine code.
-    CodeGenAndEmitDAG(DAG);
-  }
+  // Second step, emit the lowered DAG as machine code.
+  CodeGenAndEmitDAG(DAG);
+}
 
+void
+SelectionDAGISel::FinishBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF,
+                                   FunctionLoweringInfo &FuncInfo,
+             std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
+                                   NodeAllocatorType &NodeAllocator) {
   DOUT << "Total amount of phi nodes to update: "
        << PHINodesToUpdate.size() << "\n";
   DEBUG(for (unsigned i = 0, e = PHINodesToUpdate.size(); i != e; ++i)