1 //===- DemoteRegToStack.cpp - Move a virtual register to the stack --------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file provide the function DemoteRegToStack(). This function takes a 11 // virtual register computed by an Instruction and replaces it with a slot in 12 // the stack frame, allocated via alloca. It returns the pointer to the 13 // AllocaInst inserted. After this function is called on an instruction, we are 14 // guaranteed that the only user of the instruction is a store that is 15 // immediately after it. 16 // 17 //===----------------------------------------------------------------------===// 18 19 #include "llvm/Transforms/Utils/Local.h" 20 #include "llvm/Function.h" 21 #include "llvm/Instructions.h" 22 #include "llvm/Type.h" 23 #include <map> 24 using namespace llvm; 25 26 /// DemoteRegToStack - This function takes a virtual register computed by an 27 /// Instruction and replaces it with a slot in the stack frame, allocated via 28 /// alloca. This allows the CFG to be changed around without fear of 29 /// invalidating the SSA information for the value. It returns the pointer to 30 /// the alloca inserted to create a stack slot for I. 31 /// 32 AllocaInst* llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads, 33 Instruction *AllocaPoint) { 34 if (I.use_empty()) { 35 I.eraseFromParent(); 36 return 0; 37 } 38 39 // Create a stack slot to hold the value. 40 AllocaInst *Slot; 41 if (AllocaPoint) { 42 Slot = new AllocaInst(I.getType(), 0, I.getName()+".reg2mem", AllocaPoint); 43 } else { 44 Function *F = I.getParent()->getParent(); 45 Slot = new AllocaInst(I.getType(), 0, I.getName()+".reg2mem", 46 F->getEntryBlock().begin()); 47 } 48 49 // Change all of the users of the instruction to read from the stack slot 50 // instead. 51 while (!I.use_empty()) { 52 Instruction *U = cast<Instruction>(I.use_back()); 53 if (PHINode *PN = dyn_cast<PHINode>(U)) { 54 // If this is a PHI node, we can't insert a load of the value before the 55 // use. Instead, insert the load in the predecessor block corresponding 56 // to the incoming value. 57 // 58 // Note that if there are multiple edges from a basic block to this PHI 59 // node that we cannot multiple loads. The problem is that the resultant 60 // PHI node will have multiple values (from each load) coming in from the 61 // same block, which is illegal SSA form. For this reason, we keep track 62 // and reuse loads we insert. 63 std::map<BasicBlock*, Value*> Loads; 64 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) 65 if (PN->getIncomingValue(i) == &I) { 66 Value *&V = Loads[PN->getIncomingBlock(i)]; 67 if (V == 0) { 68 // Insert the load into the predecessor block 69 V = new LoadInst(Slot, I.getName()+".reload", VolatileLoads, 70 PN->getIncomingBlock(i)->getTerminator()); 71 } 72 PN->setIncomingValue(i, V); 73 } 74 75 } else { 76 // If this is a normal instruction, just insert a load. 77 Value *V = new LoadInst(Slot, I.getName()+".reload", VolatileLoads, U); 78 U->replaceUsesOfWith(&I, V); 79 } 80 } 81 82 83 // Insert stores of the computed value into the stack slot. We have to be 84 // careful is I is an invoke instruction though, because we can't insert the 85 // store AFTER the terminator instruction. 86 BasicBlock::iterator InsertPt; 87 if (!isa<TerminatorInst>(I)) { 88 InsertPt = &I; 89 ++InsertPt; 90 } else { 91 // We cannot demote invoke instructions to the stack if their normal edge 92 // is critical. 93 InvokeInst &II = cast<InvokeInst>(I); 94 assert(II.getNormalDest()->getSinglePredecessor() && 95 "Cannot demote invoke with a critical successor!"); 96 InsertPt = II.getNormalDest()->begin(); 97 } 98 99 for (; isa<PHINode>(InsertPt); ++InsertPt) 100 /* empty */; // Don't insert before any PHI nodes. 101 new StoreInst(&I, Slot, InsertPt); 102 103 return Slot; 104 } 105 106 107 /// DemotePHIToStack - This function takes a virtual register computed by a phi 108 /// node and replaces it with a slot in the stack frame, allocated via alloca. 109 /// The phi node is deleted and it returns the pointer to the alloca inserted. 110 AllocaInst* llvm::DemotePHIToStack(PHINode *P, Instruction *AllocaPoint) { 111 if (P->use_empty()) { 112 P->eraseFromParent(); 113 return 0; 114 } 115 116 // Create a stack slot to hold the value. 117 AllocaInst *Slot; 118 if (AllocaPoint) { 119 Slot = new AllocaInst(P->getType(), 0, P->getName()+".reg2mem", AllocaPoint); 120 } else { 121 Function *F = P->getParent()->getParent(); 122 Slot = new AllocaInst(P->getType(), 0, P->getName()+".reg2mem", 123 F->getEntryBlock().begin()); 124 } 125 126 // Iterate over each operand, insert store in each predecessor. 127 for (unsigned i = 0, e = P->getNumIncomingValues(); i < e; ++i) { 128 if (InvokeInst *II = dyn_cast<InvokeInst>(P->getIncomingValue(i))) { 129 assert(II->getParent() != P->getIncomingBlock(i) && 130 "Invoke edge not supported yet"); II=II; 131 } 132 new StoreInst(P->getIncomingValue(i), Slot, 133 P->getIncomingBlock(i)->getTerminator()); 134 } 135 136 // Insert load in place of the phi and replace all uses. 137 Value *V = new LoadInst(Slot, P->getName()+".reload", P); 138 P->replaceAllUsesWith(V); 139 140 // Delete phi. 141 P->eraseFromParent(); 142 143 return Slot; 144 } 145