Adding ability to demote phi to stack.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@39744 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tanya Lattner 2007-07-11 18:41:34 +00:00
parent 5d9c4b6020
commit 08d14d2469
2 changed files with 43 additions and 0 deletions

View File

@ -80,6 +80,11 @@ bool SimplifyCFG(BasicBlock *BB);
///
AllocaInst *DemoteRegToStack(Instruction &X, bool VolatileLoads = false);
/// 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);
} // End llvm namespace
#endif

View File

@ -93,3 +93,41 @@ AllocaInst* llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads) {
return Slot;
}
/// 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) {
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());
// Iterate over each operand, insert store in each predecessor.
for (unsigned i = 0, e = P->getNumIncomingValues(); i < e; ++i) {
if (InvokeInst *II = dyn_cast<InvokeInst>(P->getIncomingValue(i))) {
assert(II->getParent() != P->getIncomingBlock(i) &&
"Invoke edge not supported yet");
}
new StoreInst(P->getIncomingValue(i), Slot,
P->getIncomingBlock(i)->getTerminator());
}
// Insert load in place of the phi and replace all uses.
BasicBlock::iterator InsertPt;
for (InsertPt = P->getParent()->getInstList().begin();
isa<PHINode>(InsertPt); ++InsertPt);
Value *V = new LoadInst(Slot, P->getName()+".reload", P);
P->replaceAllUsesWith(V);
// Delete phi.
P->eraseFromParent();
return Slot;
}