mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 21:34:23 +00:00
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:
parent
5d9c4b6020
commit
08d14d2469
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user