[llvm-commits] [llvm] r39744 - in /llvm/trunk: include/llvm/Transforms/Utils/Local.h lib/Transforms/Utils/DemoteRegToStack.cpp
Tanya Lattner
tonic at nondot.org
Wed Jul 11 11:41:34 PDT 2007
Author: tbrethou
Date: Wed Jul 11 13:41:34 2007
New Revision: 39744
URL: http://llvm.org/viewvc/llvm-project?rev=39744&view=rev
Log:
Adding ability to demote phi to stack.
Modified:
llvm/trunk/include/llvm/Transforms/Utils/Local.h
llvm/trunk/lib/Transforms/Utils/DemoteRegToStack.cpp
Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=39744&r1=39743&r2=39744&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
+++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Wed Jul 11 13:41:34 2007
@@ -80,6 +80,11 @@
///
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
Modified: llvm/trunk/lib/Transforms/Utils/DemoteRegToStack.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/DemoteRegToStack.cpp?rev=39744&r1=39743&r2=39744&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/DemoteRegToStack.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/DemoteRegToStack.cpp Wed Jul 11 13:41:34 2007
@@ -93,3 +93,41 @@
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;
+}
More information about the llvm-commits
mailing list