diff --git a/include/llvm/Transforms/Utils/Local.h b/include/llvm/Transforms/Utils/Local.h
index c2b95db..2b2ca56 100644
--- a/include/llvm/Transforms/Utils/Local.h
+++ b/include/llvm/Transforms/Utils/Local.h
@@ -78,12 +78,13 @@
 /// invalidating the SSA information for the value.  It returns the pointer to
 /// the alloca inserted to create a stack slot for X.
 ///
-AllocaInst *DemoteRegToStack(Instruction &X, bool VolatileLoads = false);
+AllocaInst *DemoteRegToStack(Instruction &X, bool VolatileLoads = false,
+                             Instruction *AllocaPoint = NULL);
 
 /// DemotePHIToStack - This function takes a virtual register computed by a phi
 /// node and replaces it with a slot in the stack frame, allocated via alloca.
 /// The phi node is deleted and it returns the pointer to the alloca inserted. 
-AllocaInst *DemotePHIToStack(PHINode *P);
+AllocaInst *DemotePHIToStack(PHINode *P, Instruction *AllocaPoint = NULL);
 
 } // End llvm namespace
 
diff --git a/lib/Transforms/Scalar/Reg2Mem.cpp b/lib/Transforms/Scalar/Reg2Mem.cpp
index ef7411a..e4ef5ba 100644
--- a/lib/Transforms/Scalar/Reg2Mem.cpp
+++ b/lib/Transforms/Scalar/Reg2Mem.cpp
@@ -26,10 +26,12 @@
 #include "llvm/Instructions.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/CFG.h"
 #include <list>
 using namespace llvm;
 
-STATISTIC(NumDemoted, "Number of registers demoted");
+STATISTIC(NumRegsDemoted, "Number of registers demoted");
+STATISTIC(NumPhisDemoted, "Number of phi-nodes demoted");
 
 namespace {
   struct VISIBILITY_HIDDEN RegToMem : public FunctionPass {
@@ -43,8 +45,8 @@
 
    bool valueEscapes(Instruction* i) {
       BasicBlock* bb = i->getParent();
-      for(Value::use_iterator ii = i->use_begin(), ie = i->use_end();
-          ii != ie; ++ii)
+      for (Value::use_iterator ii = i->use_begin(), ie = i->use_end();
+           ii != ie; ++ii)
         if (cast<Instruction>(*ii)->getParent() != bb ||
             isa<PHINode>(*ii))
           return true;
@@ -53,26 +55,57 @@
 
     virtual bool runOnFunction(Function &F) {
       if (!F.isDeclaration()) {
-        //give us a clean block
-        BasicBlock* bbold = &F.getEntryBlock();
-        BasicBlock* bbnew = new BasicBlock("allocablock", &F, 
-                                           &F.getEntryBlock());
-        new BranchInst(bbold, bbnew);
+        // Insert all new allocas into entry block.
+        BasicBlock* BBEntry = &F.getEntryBlock();
+        assert(pred_begin(BBEntry) == pred_end(BBEntry) &&
+               "Entry block to function must not have predecessors!");
 
-        //find the instructions
+        // Find first non-alloca instruction and create insertion point. This is
+        // safe if block is well-formed: it always have terminator, otherwise
+        // we'll get and assertion.
+        BasicBlock::iterator I = BBEntry->begin();
+        while (isa<AllocaInst>(I)) ++I;
+
+        CastInst *AllocaInsertionPoint =
+          CastInst::create(Instruction::BitCast,
+                           Constant::getNullValue(Type::Int32Ty), Type::Int32Ty,
+                           "reg2mem alloca point", I);
+
+        // Find the escaped instructions. But don't create stack slots for
+        // allocas in entry block.
         std::list<Instruction*> worklist;
         for (Function::iterator ibb = F.begin(), ibe = F.end();
              ibb != ibe; ++ibb)
           for (BasicBlock::iterator iib = ibb->begin(), iie = ibb->end();
                iib != iie; ++iib) {
-            if(valueEscapes(iib))
+            if (!(isa<AllocaInst>(iib) && iib->getParent() == BBEntry) &&
+                valueEscapes(iib)) {
               worklist.push_front(&*iib);
+            }
           }
-        //demote escaped instructions
-        NumDemoted += worklist.size();
+
+        // Demote escaped instructions
+        NumRegsDemoted += worklist.size();
         for (std::list<Instruction*>::iterator ilb = worklist.begin(), 
                ile = worklist.end(); ilb != ile; ++ilb)
-          DemoteRegToStack(**ilb, false);
+          DemoteRegToStack(**ilb, false, AllocaInsertionPoint);
+
+        worklist.clear();
+
+        // Find all phi's
+        for (Function::iterator ibb = F.begin(), ibe = F.end();
+             ibb != ibe; ++ibb)
+          for (BasicBlock::iterator iib = ibb->begin(), iie = ibb->end();
+               iib != iie; ++iib)
+            if (isa<PHINode>(iib))
+              worklist.push_front(&*iib);
+
+        // Demote phi nodes
+        NumPhisDemoted += worklist.size();
+        for (std::list<Instruction*>::iterator ilb = worklist.begin(), 
+               ile = worklist.end(); ilb != ile; ++ilb)
+          DemotePHIToStack(cast<PHINode>(*ilb), AllocaInsertionPoint);
+
         return true;
       }
       return false;
diff --git a/lib/Transforms/Utils/DemoteRegToStack.cpp b/lib/Transforms/Utils/DemoteRegToStack.cpp
index 95b28f1..32c1f19 100644
--- a/lib/Transforms/Utils/DemoteRegToStack.cpp
+++ b/lib/Transforms/Utils/DemoteRegToStack.cpp
@@ -29,14 +29,23 @@
 /// invalidating the SSA information for the value.  It returns the pointer to
 /// the alloca inserted to create a stack slot for I.
 ///
-AllocaInst* llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads) {
-  if (I.use_empty()) return 0;                // nothing to do!
-
+AllocaInst* llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads,
+                                   Instruction *AllocaPoint) {
+  if (I.use_empty()) {
+    I.eraseFromParent();
+    return 0;
+  }
+  
   // Create a stack slot to hold the value.
-  Function *F = I.getParent()->getParent();
-  AllocaInst *Slot = new AllocaInst(I.getType(), 0, I.getName(),
-                                    F->getEntryBlock().begin());
-
+  AllocaInst *Slot;
+  if (AllocaPoint) {
+    Slot = new AllocaInst(I.getType(), 0, I.getName()+".reg2mem", AllocaPoint);
+  } else {
+    Function *F = I.getParent()->getParent();
+    Slot = new AllocaInst(I.getType(), 0, I.getName()+".reg2mem",
+                          F->getEntryBlock().begin());
+  }
+  
   // Change all of the users of the instruction to read from the stack slot
   // instead.
   while (!I.use_empty()) {
@@ -98,16 +107,21 @@
 /// DemotePHIToStack - This function takes a virtual register computed by a phi
 /// node and replaces it with a slot in the stack frame, allocated via alloca.
 /// The phi node is deleted and it returns the pointer to the alloca inserted.
-AllocaInst* llvm::DemotePHIToStack(PHINode *P) {
+AllocaInst* llvm::DemotePHIToStack(PHINode *P, Instruction *AllocaPoint) {
   if (P->use_empty()) {
     P->eraseFromParent();    
     return 0;                
   }
-  
+
   // Create a stack slot to hold the value.
-  Function *F = P->getParent()->getParent();
-  AllocaInst *Slot = new AllocaInst(P->getType(), 0, P->getName(),
-                                    F->getEntryBlock().begin());
+  AllocaInst *Slot;
+  if (AllocaPoint) {
+    Slot = new AllocaInst(P->getType(), 0, P->getName()+".reg2mem", AllocaPoint);
+  } else {
+    Function *F = P->getParent()->getParent();
+    Slot = new AllocaInst(P->getType(), 0, P->getName()+".reg2mem",
+                          F->getEntryBlock().begin());
+  }
   
   // Iterate over each operand, insert store in each predecessor.
   for (unsigned i = 0, e = P->getNumIncomingValues(); i < e; ++i) {
