1 //===- DemoteRegToStack.cpp - Move a virtual register to the stack --------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/DenseMap.h"
10 #include "llvm/Analysis/CFG.h"
11 #include "llvm/Transforms/Utils/Local.h"
12 #include "llvm/IR/Function.h"
13 #include "llvm/IR/Instructions.h"
14 #include "llvm/IR/Type.h"
15 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
18 /// DemoteRegToStack - This function takes a virtual register computed by an
19 /// Instruction and replaces it with a slot in the stack frame, allocated via
20 /// alloca. This allows the CFG to be changed around without fear of
21 /// invalidating the SSA information for the value. It returns the pointer to
22 /// the alloca inserted to create a stack slot for I.
23 AllocaInst
*llvm::DemoteRegToStack(Instruction
&I
, bool VolatileLoads
,
24 Instruction
*AllocaPoint
) {
30 Function
*F
= I
.getParent()->getParent();
31 const DataLayout
&DL
= F
->getParent()->getDataLayout();
33 // Create a stack slot to hold the value.
36 Slot
= new AllocaInst(I
.getType(), DL
.getAllocaAddrSpace(), nullptr,
37 I
.getName()+".reg2mem", AllocaPoint
);
39 Slot
= new AllocaInst(I
.getType(), DL
.getAllocaAddrSpace(), nullptr,
40 I
.getName() + ".reg2mem", &F
->getEntryBlock().front());
43 // We cannot demote invoke instructions to the stack if their normal edge
44 // is critical. Therefore, split the critical edge and create a basic block
45 // into which the store can be inserted.
46 if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(&I
)) {
47 if (!II
->getNormalDest()->getSinglePredecessor()) {
48 unsigned SuccNum
= GetSuccessorNumber(II
->getParent(), II
->getNormalDest());
49 assert(isCriticalEdge(II
, SuccNum
) && "Expected a critical edge!");
50 BasicBlock
*BB
= SplitCriticalEdge(II
, SuccNum
);
51 assert(BB
&& "Unable to split critical edge.");
56 // Change all of the users of the instruction to read from the stack slot.
57 while (!I
.use_empty()) {
58 Instruction
*U
= cast
<Instruction
>(I
.user_back());
59 if (PHINode
*PN
= dyn_cast
<PHINode
>(U
)) {
60 // If this is a PHI node, we can't insert a load of the value before the
61 // use. Instead insert the load in the predecessor block corresponding
62 // to the incoming value.
64 // Note that if there are multiple edges from a basic block to this PHI
65 // node that we cannot have multiple loads. The problem is that the
66 // resulting PHI node will have multiple values (from each load) coming in
67 // from the same block, which is illegal SSA form. For this reason, we
68 // keep track of and reuse loads we insert.
69 DenseMap
<BasicBlock
*, Value
*> Loads
;
70 for (unsigned i
= 0, e
= PN
->getNumIncomingValues(); i
!= e
; ++i
)
71 if (PN
->getIncomingValue(i
) == &I
) {
72 Value
*&V
= Loads
[PN
->getIncomingBlock(i
)];
74 // Insert the load into the predecessor block
75 V
= new LoadInst(I
.getType(), Slot
, I
.getName() + ".reload",
77 PN
->getIncomingBlock(i
)->getTerminator());
79 PN
->setIncomingValue(i
, V
);
83 // If this is a normal instruction, just insert a load.
84 Value
*V
= new LoadInst(I
.getType(), Slot
, I
.getName() + ".reload",
86 U
->replaceUsesOfWith(&I
, V
);
90 // Insert stores of the computed value into the stack slot. We have to be
91 // careful if I is an invoke instruction, because we can't insert the store
92 // AFTER the terminator instruction.
93 BasicBlock::iterator InsertPt
;
94 if (!I
.isTerminator()) {
95 InsertPt
= ++I
.getIterator();
96 for (; isa
<PHINode
>(InsertPt
) || InsertPt
->isEHPad(); ++InsertPt
)
97 /* empty */; // Don't insert before PHI nodes or landingpad instrs.
99 InvokeInst
&II
= cast
<InvokeInst
>(I
);
100 InsertPt
= II
.getNormalDest()->getFirstInsertionPt();
103 new StoreInst(&I
, Slot
, &*InsertPt
);
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. It returns the pointer to the alloca inserted.
110 AllocaInst
*llvm::DemotePHIToStack(PHINode
*P
, Instruction
*AllocaPoint
) {
111 if (P
->use_empty()) {
112 P
->eraseFromParent();
116 const DataLayout
&DL
= P
->getModule()->getDataLayout();
118 // Create a stack slot to hold the value.
121 Slot
= new AllocaInst(P
->getType(), DL
.getAllocaAddrSpace(), nullptr,
122 P
->getName()+".reg2mem", AllocaPoint
);
124 Function
*F
= P
->getParent()->getParent();
125 Slot
= new AllocaInst(P
->getType(), DL
.getAllocaAddrSpace(), nullptr,
126 P
->getName() + ".reg2mem",
127 &F
->getEntryBlock().front());
130 // Iterate over each operand inserting a store in each predecessor.
131 for (unsigned i
= 0, e
= P
->getNumIncomingValues(); i
< e
; ++i
) {
132 if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(P
->getIncomingValue(i
))) {
133 assert(II
->getParent() != P
->getIncomingBlock(i
) &&
134 "Invoke edge not supported yet"); (void)II
;
136 new StoreInst(P
->getIncomingValue(i
), Slot
,
137 P
->getIncomingBlock(i
)->getTerminator());
140 // Insert a load in place of the PHI and replace all uses.
141 BasicBlock::iterator InsertPt
= P
->getIterator();
143 for (; isa
<PHINode
>(InsertPt
) || InsertPt
->isEHPad(); ++InsertPt
)
144 /* empty */; // Don't insert before PHI nodes or landingpad instrs.
147 new LoadInst(P
->getType(), Slot
, P
->getName() + ".reload", &*InsertPt
);
148 P
->replaceAllUsesWith(V
);
151 P
->eraseFromParent();