diff --git a/lib/CodeGen/InstrSelection/InstrForest.cpp b/lib/CodeGen/InstrSelection/InstrForest.cpp
index 4a08c24..a95f1e3 100644
--- a/lib/CodeGen/InstrSelection/InstrForest.cpp
+++ b/lib/CodeGen/InstrSelection/InstrForest.cpp
@@ -25,7 +25,6 @@
 #include "llvm/iTerminators.h"
 #include "llvm/iMemory.h"
 #include "llvm/Constant.h"
-#include "llvm/BasicBlock.h"
 #include "llvm/Type.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "Support/STLExtras.h"
@@ -188,10 +187,9 @@
 
 InstrForest::InstrForest(Function *F)
 {
-  for (Function::iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI) {
-    BasicBlock *BB = *FI;
-    for_each(BB->begin(), BB->end(),
-             bind_obj(this, &InstrForest::buildTreeForInstruction));
+  for (Function::iterator BB = F->begin(), FE = F->end(); BB != FE; ++BB) {
+    for(BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
+      buildTreeForInstruction(I);
   }
 }
 
diff --git a/lib/CodeGen/InstrSelection/InstrSelection.cpp b/lib/CodeGen/InstrSelection/InstrSelection.cpp
index 614c5f6..b27f902 100644
--- a/lib/CodeGen/InstrSelection/InstrSelection.cpp
+++ b/lib/CodeGen/InstrSelection/InstrSelection.cpp
@@ -123,14 +123,10 @@
   // Record instructions in the vector for each basic block
   // 
   for (Function::iterator BI = F->begin(), BE = F->end(); BI != BE; ++BI)
-    {
-      MachineCodeForBasicBlock& bbMvec = (*BI)->getMachineInstrVec();
-      for (BasicBlock::iterator II = (*BI)->begin(); II != (*BI)->end(); ++II)
-	{
-	  MachineCodeForInstruction &mvec =MachineCodeForInstruction::get(*II);
-	  for (unsigned i=0; i < mvec.size(); i++)
-	    bbMvec.push_back(mvec[i]);
-	}
+    for (BasicBlock::iterator II = BI->begin(); II != BI->end(); ++II) {
+      MachineCodeForInstruction &mvec =MachineCodeForInstruction::get(II);
+      for (unsigned i=0; i < mvec.size(); i++)
+        BI->getMachineInstrVec().push_back(mvec[i]);
     }
 
   // Insert phi elimination code -- added by Ruchira
@@ -191,49 +187,38 @@
 {
   // for all basic blocks in function
   //
-  for (Function::iterator BI = F->begin(); BI != F->end(); ++BI) {
-
-    BasicBlock *BB = *BI;
-    const BasicBlock::InstListType &InstList = BB->getInstList();
-    BasicBlock::InstListType::const_iterator  IIt = InstList.begin();
-
-    // for all instructions in the basic block
-    //
-    for( ; IIt != InstList.end(); ++IIt ) {
-
-      if (PHINode *PN = dyn_cast<PHINode>(*IIt)) {
-        // FIXME: This is probably wrong...
-	Value *PhiCpRes = new PHINode(PN->getType(), "PhiCp:");
+  for (Function::iterator BB = F->begin(); BB != F->end(); ++BB) {
+    BasicBlock::InstListType &InstList = BB->getInstList();
+    for (BasicBlock::iterator IIt = InstList.begin();
+         PHINode *PN = dyn_cast<PHINode>(&*IIt); ++IIt) {
+      // FIXME: This is probably wrong...
+      Value *PhiCpRes = new PHINode(PN->getType(), "PhiCp:");
         
-	// for each incoming value of the phi, insert phi elimination
-	//
-        for (unsigned i = 0; i < PN->getNumIncomingValues(); ++i)
-          { // insert the copy instruction to the predecessor BB
-            vector<MachineInstr*> mvec, CpVec;
-            target.getRegInfo().cpValue2Value(PN->getIncomingValue(i), PhiCpRes,
-                                              mvec);
-            for (vector<MachineInstr*>::iterator MI=mvec.begin();
-                 MI != mvec.end(); ++MI)
-              {
-                vector<MachineInstr*> CpVec2 =
-                  FixConstantOperandsForInstr(PN, *MI, target);
-                CpVec2.push_back(*MI);
-                CpVec.insert(CpVec.end(), CpVec2.begin(), CpVec2.end());
-              }
-            
-            InsertPhiElimInstructions(PN->getIncomingBlock(i), CpVec);
-          }
+      // for each incoming value of the phi, insert phi elimination
+      //
+      for (unsigned i = 0; i < PN->getNumIncomingValues(); ++i) {
+        // insert the copy instruction to the predecessor BB
+        vector<MachineInstr*> mvec, CpVec;
+        target.getRegInfo().cpValue2Value(PN->getIncomingValue(i), PhiCpRes,
+                                          mvec);
+        for (vector<MachineInstr*>::iterator MI=mvec.begin();
+             MI != mvec.end(); ++MI) {
+          vector<MachineInstr*> CpVec2 =
+            FixConstantOperandsForInstr(PN, *MI, target);
+          CpVec2.push_back(*MI);
+          CpVec.insert(CpVec.end(), CpVec2.begin(), CpVec2.end());
+        }
         
-        vector<MachineInstr*> mvec;
-        target.getRegInfo().cpValue2Value(PhiCpRes, PN, mvec);
-        
-	// get an iterator to machine instructions in the BB
-	MachineCodeForBasicBlock& bbMvec = BB->getMachineInstrVec();
-
-	bbMvec.insert( bbMvec.begin(), mvec.begin(), mvec.end());
+        InsertPhiElimInstructions(PN->getIncomingBlock(i), CpVec);
       }
-      else break;   // since PHI nodes can only be at the top
       
+      vector<MachineInstr*> mvec;
+      target.getRegInfo().cpValue2Value(PhiCpRes, PN, mvec);
+      
+      // get an iterator to machine instructions in the BB
+      MachineCodeForBasicBlock& bbMvec = BB->getMachineInstrVec();
+      
+      bbMvec.insert(bbMvec.begin(), mvec.begin(), mvec.end());
     }  // for each Phi Instr in BB
   } // for all BBs in function
 }
diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp
index 06e0666..4d50f89 100644
--- a/lib/CodeGen/MachineFunction.cpp
+++ b/lib/CodeGen/MachineFunction.cpp
@@ -60,43 +60,40 @@
 {
   const MachineFrameInfo& frameInfo = target.getFrameInfo();
   
-  unsigned int maxSize = 0;
+  unsigned maxSize = 0;
   
-  for (Function::const_iterator MI = F->begin(), ME = F->end(); MI != ME; ++MI)
-    {
-      const BasicBlock *BB = *MI;
-      for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I)
-        if (CallInst *callInst = dyn_cast<CallInst>(*I))
-          {
-            unsigned int numOperands = callInst->getNumOperands() - 1;
-            int numExtra =(int)numOperands-frameInfo.getNumFixedOutgoingArgs();
-            if (numExtra <= 0)
-              continue;
-            
-            unsigned int sizeForThisCall;
-            if (frameInfo.argsOnStackHaveFixedSize())
-              {
-                int argSize = frameInfo.getSizeOfEachArgOnStack(); 
-                sizeForThisCall = numExtra * (unsigned) argSize;
-              }
-            else
-              {
-                assert(0 && "UNTESTED CODE: Size per stack argument is not "
-                       "fixed on this architecture: use actual arg sizes to "
-                       "compute MaxOptionalArgsSize");
-                sizeForThisCall = 0;
-                for (unsigned i=0; i < numOperands; ++i)
-                  sizeForThisCall += target.findOptimalStorageSize(callInst->
-                                                       getOperand(i)->getType());
-              }
-            
-            if (maxSize < sizeForThisCall)
-              maxSize = sizeForThisCall;
-            
-            if (((int) maxOptionalNumArgs) < numExtra)
-              maxOptionalNumArgs = (unsigned) numExtra;
-          }
-    }
+  for (Function::const_iterator BB = F->begin(), BBE = F->end(); BB !=BBE; ++BB)
+    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
+      if (const CallInst *callInst = dyn_cast<CallInst>(&*I))
+        {
+          unsigned numOperands = callInst->getNumOperands() - 1;
+          int numExtra = (int)numOperands-frameInfo.getNumFixedOutgoingArgs();
+          if (numExtra <= 0)
+            continue;
+          
+          unsigned int sizeForThisCall;
+          if (frameInfo.argsOnStackHaveFixedSize())
+            {
+              int argSize = frameInfo.getSizeOfEachArgOnStack(); 
+              sizeForThisCall = numExtra * (unsigned) argSize;
+            }
+          else
+            {
+              assert(0 && "UNTESTED CODE: Size per stack argument is not "
+                     "fixed on this architecture: use actual arg sizes to "
+                     "compute MaxOptionalArgsSize");
+              sizeForThisCall = 0;
+              for (unsigned i = 0; i < numOperands; ++i)
+                sizeForThisCall += target.findOptimalStorageSize(callInst->
+                                              getOperand(i)->getType());
+            }
+          
+          if (maxSize < sizeForThisCall)
+            maxSize = sizeForThisCall;
+          
+          if ((int)maxOptionalNumArgs < numExtra)
+            maxOptionalNumArgs = (unsigned) numExtra;
+        }
   
   return maxSize;
 }
@@ -278,12 +275,11 @@
   std::cerr << "\n" << method->getReturnType()
             << " \"" << method->getName() << "\"\n";
   
-  for (Function::const_iterator BI = method->begin(); BI != method->end(); ++BI)
+  for (Function::const_iterator BB = method->begin(); BB != method->end(); ++BB)
     {
-      BasicBlock* bb = *BI;
-      std::cerr << "\n" << bb->getName() << " (" << bb << ")" << ":\n";
+      std::cerr << "\n" << BB->getName() << " (" << *BB << ")" << ":\n";
 
-      MachineCodeForBasicBlock& mvec = bb->getMachineInstrVec();
+      MachineCodeForBasicBlock& mvec = BB->getMachineInstrVec();
       for (unsigned i=0; i < mvec.size(); i++)
 	std::cerr << "\t" << *mvec[i];
     } 
