Add new BreakCriticalEdges pass
[oota-llvm.git] / lib / Transforms / Utils / PromoteMemoryToRegister.cpp
index 0a92d0d9060b9c7f623602e7516d9fdf2227317d..b84f1a378fa2970409e05a66e87ced6e050f01d7 100644 (file)
@@ -55,7 +55,7 @@ namespace {
     // getAnalysisUsage - We need dominance frontiers
     //
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-      AU.addRequired(DominanceFrontier::ID);
+      AU.addRequired<DominanceFrontier>();
       AU.preservesCFG();
     }
 
@@ -76,25 +76,11 @@ namespace {
 static inline bool isSafeAlloca(const AllocaInst *AI) {
   if (AI->isArrayAllocation()) return false;
 
+  // Only allow direct loads and stores...
   for (Value::use_const_iterator UI = AI->use_begin(), UE = AI->use_end();
-       UI != UE; ++UI) {   // Loop over all of the uses of the alloca
-
-    // Only allow nonindexed memory access instructions...
-    if (MemAccessInst *MAI = dyn_cast<MemAccessInst>(*UI)) {
-      if (MAI->getPointerOperand() != (Value*)AI)
-        return false;  // Reject stores of alloca pointer into some other loc.
-
-      if (MAI->hasIndices()) {  // indexed?
-        // Allow the access if there is only one index and the index is
-        // zero.
-        if (*MAI->idx_begin() != Constant::getNullValue(Type::UIntTy) ||
-            MAI->idx_begin()+1 != MAI->idx_end())
-          return false;
-      }
-    } else {
+       UI != UE; ++UI)     // Loop over all of the uses of the alloca
+    if (!isa<LoadInst>(*UI) && !isa<StoreInst>(*UI))
       return false;   // Not a load or store?
-    }
-  }
   
   return true;
 }
@@ -210,14 +196,12 @@ bool PromotePass::QueuePhiNode(BasicBlock *BB, unsigned AllocaNo) {
   // If the BB already has a phi node added for the i'th alloca then we're done!
   if (BBPNs[AllocaNo]) return false;
 
-  // Create a PhiNode using the dereferenced type...
+  // Create a PhiNode using the dereferenced type... and add the phi-node to the
+  // BasicBlock
   PHINode *PN = new PHINode(Allocas[AllocaNo]->getAllocatedType(),
-                            Allocas[AllocaNo]->getName()+".mem2reg");
+                            Allocas[AllocaNo]->getName()+".mem2reg",
+                            BB->begin());
   BBPNs[AllocaNo] = PN;
-
-  // Add the phi-node to the basic-block
-  BB->getInstList().push_front(PN);
-
   PhiNodes[AllocaNo].push_back(BB);
   return true;
 }