mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-29 13:24:25 +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:
@ -80,6 +80,11 @@ bool SimplifyCFG(BasicBlock *BB);
|
|||||||
///
|
///
|
||||||
AllocaInst *DemoteRegToStack(Instruction &X, bool VolatileLoads = false);
|
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
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -93,3 +93,41 @@ AllocaInst* llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads) {
|
|||||||
|
|
||||||
return Slot;
|
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;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user