diff --git a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp
index 8bc78ad..ebbb499 100644
--- a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp
+++ b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.cpp
@@ -50,12 +50,12 @@
 
 // class Modulo SchedGraphNode
 
-ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int _nodeId,
-                                           const BasicBlock * _bb,
-                                           const Instruction * _inst,
+ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int in_nodeId,
+                                           const BasicBlock * in_bb,
+                                           const Instruction * in_inst,
                                            int indexInBB,
                                            const TargetMachine & target)
-:SchedGraphNodeCommon(_nodeId, _bb, indexInBB), inst(_inst)
+:SchedGraphNodeCommon(in_nodeId, indexInBB), inst(in_inst)
 {
   if (inst) {
     //FIXME: find the latency 
@@ -298,8 +298,7 @@
   //only if the last instruction in the basicblock is branch instruction and 
   //there is at least an option to branch itself
 
-  assert(bbVec.size() == 1 && "only 1 basicblock in a graph");
-  const BasicBlock *bb = bbVec[0];
+  assert(this->bb&& "the basicblock is not empty");
   const Instruction *inst = &(bb->back());
   if (BranchInst::classof(inst))
     for (unsigned i = 0; i < ((BranchInst *) inst)->getNumSuccessors();
@@ -308,7 +307,7 @@
       if (sb == bb)
         return true;
     }
-
+  
   return false;
 
 }
@@ -674,7 +673,6 @@
   oNodes.clear();
 
   std::vector < ModuloSchedGraphNode * >set;
-  const BasicBlock *bb = bbVec[0];
   unsigned numNodes = bb->size();
 
   // first order all the sets
@@ -873,9 +871,8 @@
 
 void ModuloSchedGraph::buildGraph(const TargetMachine & target)
 {
-  const BasicBlock *bb = bbVec[0];
 
-  assert(bbVec.size() == 1 && "only handling a single basic block here");
+  assert(this->bb && "The basicBlock is NULL?");
 
   // Use this data structure to note all machine operands that compute
   // ordinary LLVM values.  These must be computed defs (i.e., instructions). 
@@ -1277,10 +1274,9 @@
 void ModuloSchedGraph::dump() const
 {
   DEBUG(std::cerr << " ModuloSchedGraph for basic Blocks:");
-  for (unsigned i = 0, N = bbVec.size(); i < N; i++) {
-    DEBUG(std::cerr << (bbVec[i]->hasName()? bbVec[i]->getName() : "block")
-          << " (" << bbVec[i] << ")" << ((i == N - 1) ? "" : ", "));
-  }
+
+  DEBUG(std::cerr << (bb->hasName()? bb->getName() : "block")
+	<< " (" << bb << ")" <<  "");
 
   DEBUG(std::cerr << "\n\n    Actual Root nodes : ");
   for (unsigned i = 0, N = graphRoot->outEdges.size(); i < N; i++)
@@ -1290,7 +1286,7 @@
   DEBUG(std::cerr << "\n    Graph Nodes:\n");
   //for (const_iterator I=begin(); I != end(); ++I)
   //DEBUG(std::cerr << "\n" << *I->second;
-  unsigned numNodes = bbVec[0]->size();
+  unsigned numNodes = bb->size();
   for (unsigned i = 2; i < numNodes + 2; i++) {
     ModuloSchedGraphNode *node = getNode(i);
     DEBUG(std::cerr << "\n" << *node);
@@ -1301,7 +1297,7 @@
 
 void ModuloSchedGraph::dumpNodeProperty() const
 {
-  const BasicBlock *bb = bbVec[0];
+
   unsigned numNodes = bb->size();
   for (unsigned i = 2; i < numNodes + 2; i++) {
     ModuloSchedGraphNode *node = getNode(i);
@@ -1317,8 +1313,11 @@
 void ModuloSchedGraphSet::buildGraphsForMethod(const Function *F,
                                                const TargetMachine &target)
 {
-  for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI)
-    addGraph(new ModuloSchedGraph(BI, target));
+  for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI){
+    const BasicBlock* local_bb;
+    local_bb=BI;
+    addGraph(new ModuloSchedGraph((BasicBlock*)local_bb, target));
+  }
 }
 
 std::ostream& operator<<(std::ostream &os,
diff --git a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h
index 9fe40f2..7cdfdd9 100644
--- a/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h
+++ b/lib/CodeGen/ModuloScheduling/ModuloSchedGraph.h
@@ -56,6 +56,7 @@
   const unsigned getInstOpcode() const {
     return inst->getOpcode();
   }
+
   //return whether the node is NULL
   bool isNullNode() const {
     return (inst == NULL);
@@ -138,6 +139,9 @@
   protected hash_map<const Instruction*,ModuloSchedGraphNode*> {
 
 private:
+
+  BasicBlock* bb;
+  
   //iteration Interval
   int MII;
 
@@ -153,14 +157,14 @@
   typedef std::vector<ModuloSchedGraphNode*> NodeVec;
 
   //the function to compute properties
-  void computeNodeASAP(const BasicBlock *bb);
-  void computeNodeALAP(const BasicBlock *bb);
-  void computeNodeMov(const BasicBlock *bb);
-  void computeNodeDepth(const BasicBlock *bb);
-  void computeNodeHeight(const BasicBlock *bb);
+  void computeNodeASAP(const BasicBlock * in_bb);
+  void computeNodeALAP(const BasicBlock * in_bb);
+  void computeNodeMov(const BasicBlock *  in_bb);
+  void computeNodeDepth(const BasicBlock * in_bb);
+  void computeNodeHeight(const BasicBlock * in_bb);
 
   //the function to compute node property
-  void computeNodeProperty(const BasicBlock *bb);
+  void computeNodeProperty(const BasicBlock * in_bb);
 
   //the function to sort nodes
   void orderNodes();
@@ -220,6 +224,13 @@
   const TargetMachine & getTarget() {
     return target;
   }
+
+  //get the basic block
+  BasicBlock* getBasicBlock() const {
+    return bb;
+  }
+
+
   //get the iteration interval
   const int getMII() {
     return MII;
@@ -265,8 +276,9 @@
   friend class ModuloSchedGraphSet;     //give access to ctor
 
 public:
-  ModuloSchedGraph(const BasicBlock *bb, const TargetMachine &_target)
-    :SchedGraphCommon(bb), target(_target)
+  ModuloSchedGraph(BasicBlock * in_bb, 
+		   const TargetMachine & in_target)
+    :SchedGraphCommon(), bb(in_bb),target(in_target)
   {
     buildGraph(target);
   }
diff --git a/lib/CodeGen/ModuloScheduling/ModuloScheduling.h b/lib/CodeGen/ModuloScheduling/ModuloScheduling.h
index 782476e..5e1e53e 100644
--- a/lib/CodeGen/ModuloScheduling/ModuloScheduling.h
+++ b/lib/CodeGen/ModuloScheduling/ModuloScheduling.h
@@ -65,7 +65,7 @@
     graph(_graph), target(graph.getTarget()), oNodes(graph.getONodes())
   {
     II = graph.getMII();
-    bb = (BasicBlock *) graph.getBasicBlocks()[0];
+    bb = graph.getBasicBlock();
     instrScheduling();
   };
 
diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp
index 8bc78ad..ebbb499 100644
--- a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp
+++ b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.cpp
@@ -50,12 +50,12 @@
 
 // class Modulo SchedGraphNode
 
-ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int _nodeId,
-                                           const BasicBlock * _bb,
-                                           const Instruction * _inst,
+ModuloSchedGraphNode::ModuloSchedGraphNode(unsigned int in_nodeId,
+                                           const BasicBlock * in_bb,
+                                           const Instruction * in_inst,
                                            int indexInBB,
                                            const TargetMachine & target)
-:SchedGraphNodeCommon(_nodeId, _bb, indexInBB), inst(_inst)
+:SchedGraphNodeCommon(in_nodeId, indexInBB), inst(in_inst)
 {
   if (inst) {
     //FIXME: find the latency 
@@ -298,8 +298,7 @@
   //only if the last instruction in the basicblock is branch instruction and 
   //there is at least an option to branch itself
 
-  assert(bbVec.size() == 1 && "only 1 basicblock in a graph");
-  const BasicBlock *bb = bbVec[0];
+  assert(this->bb&& "the basicblock is not empty");
   const Instruction *inst = &(bb->back());
   if (BranchInst::classof(inst))
     for (unsigned i = 0; i < ((BranchInst *) inst)->getNumSuccessors();
@@ -308,7 +307,7 @@
       if (sb == bb)
         return true;
     }
-
+  
   return false;
 
 }
@@ -674,7 +673,6 @@
   oNodes.clear();
 
   std::vector < ModuloSchedGraphNode * >set;
-  const BasicBlock *bb = bbVec[0];
   unsigned numNodes = bb->size();
 
   // first order all the sets
@@ -873,9 +871,8 @@
 
 void ModuloSchedGraph::buildGraph(const TargetMachine & target)
 {
-  const BasicBlock *bb = bbVec[0];
 
-  assert(bbVec.size() == 1 && "only handling a single basic block here");
+  assert(this->bb && "The basicBlock is NULL?");
 
   // Use this data structure to note all machine operands that compute
   // ordinary LLVM values.  These must be computed defs (i.e., instructions). 
@@ -1277,10 +1274,9 @@
 void ModuloSchedGraph::dump() const
 {
   DEBUG(std::cerr << " ModuloSchedGraph for basic Blocks:");
-  for (unsigned i = 0, N = bbVec.size(); i < N; i++) {
-    DEBUG(std::cerr << (bbVec[i]->hasName()? bbVec[i]->getName() : "block")
-          << " (" << bbVec[i] << ")" << ((i == N - 1) ? "" : ", "));
-  }
+
+  DEBUG(std::cerr << (bb->hasName()? bb->getName() : "block")
+	<< " (" << bb << ")" <<  "");
 
   DEBUG(std::cerr << "\n\n    Actual Root nodes : ");
   for (unsigned i = 0, N = graphRoot->outEdges.size(); i < N; i++)
@@ -1290,7 +1286,7 @@
   DEBUG(std::cerr << "\n    Graph Nodes:\n");
   //for (const_iterator I=begin(); I != end(); ++I)
   //DEBUG(std::cerr << "\n" << *I->second;
-  unsigned numNodes = bbVec[0]->size();
+  unsigned numNodes = bb->size();
   for (unsigned i = 2; i < numNodes + 2; i++) {
     ModuloSchedGraphNode *node = getNode(i);
     DEBUG(std::cerr << "\n" << *node);
@@ -1301,7 +1297,7 @@
 
 void ModuloSchedGraph::dumpNodeProperty() const
 {
-  const BasicBlock *bb = bbVec[0];
+
   unsigned numNodes = bb->size();
   for (unsigned i = 2; i < numNodes + 2; i++) {
     ModuloSchedGraphNode *node = getNode(i);
@@ -1317,8 +1313,11 @@
 void ModuloSchedGraphSet::buildGraphsForMethod(const Function *F,
                                                const TargetMachine &target)
 {
-  for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI)
-    addGraph(new ModuloSchedGraph(BI, target));
+  for (Function::const_iterator BI = F->begin(); BI != F->end(); ++BI){
+    const BasicBlock* local_bb;
+    local_bb=BI;
+    addGraph(new ModuloSchedGraph((BasicBlock*)local_bb, target));
+  }
 }
 
 std::ostream& operator<<(std::ostream &os,
diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h
index 9fe40f2..7cdfdd9 100644
--- a/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h
+++ b/lib/Target/SparcV9/ModuloScheduling/ModuloSchedGraph.h
@@ -56,6 +56,7 @@
   const unsigned getInstOpcode() const {
     return inst->getOpcode();
   }
+
   //return whether the node is NULL
   bool isNullNode() const {
     return (inst == NULL);
@@ -138,6 +139,9 @@
   protected hash_map<const Instruction*,ModuloSchedGraphNode*> {
 
 private:
+
+  BasicBlock* bb;
+  
   //iteration Interval
   int MII;
 
@@ -153,14 +157,14 @@
   typedef std::vector<ModuloSchedGraphNode*> NodeVec;
 
   //the function to compute properties
-  void computeNodeASAP(const BasicBlock *bb);
-  void computeNodeALAP(const BasicBlock *bb);
-  void computeNodeMov(const BasicBlock *bb);
-  void computeNodeDepth(const BasicBlock *bb);
-  void computeNodeHeight(const BasicBlock *bb);
+  void computeNodeASAP(const BasicBlock * in_bb);
+  void computeNodeALAP(const BasicBlock * in_bb);
+  void computeNodeMov(const BasicBlock *  in_bb);
+  void computeNodeDepth(const BasicBlock * in_bb);
+  void computeNodeHeight(const BasicBlock * in_bb);
 
   //the function to compute node property
-  void computeNodeProperty(const BasicBlock *bb);
+  void computeNodeProperty(const BasicBlock * in_bb);
 
   //the function to sort nodes
   void orderNodes();
@@ -220,6 +224,13 @@
   const TargetMachine & getTarget() {
     return target;
   }
+
+  //get the basic block
+  BasicBlock* getBasicBlock() const {
+    return bb;
+  }
+
+
   //get the iteration interval
   const int getMII() {
     return MII;
@@ -265,8 +276,9 @@
   friend class ModuloSchedGraphSet;     //give access to ctor
 
 public:
-  ModuloSchedGraph(const BasicBlock *bb, const TargetMachine &_target)
-    :SchedGraphCommon(bb), target(_target)
+  ModuloSchedGraph(BasicBlock * in_bb, 
+		   const TargetMachine & in_target)
+    :SchedGraphCommon(), bb(in_bb),target(in_target)
   {
     buildGraph(target);
   }
diff --git a/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h b/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h
index 782476e..5e1e53e 100644
--- a/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h
+++ b/lib/Target/SparcV9/ModuloScheduling/ModuloScheduling.h
@@ -65,7 +65,7 @@
     graph(_graph), target(graph.getTarget()), oNodes(graph.getONodes())
   {
     II = graph.getMII();
-    bb = (BasicBlock *) graph.getBasicBlocks()[0];
+    bb = graph.getBasicBlock();
     instrScheduling();
   };
 
