1 //===- Reg2Mem.cpp - Convert registers to allocas -------------------------===//
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 // This file demotes all registers to memory references. It is intended to be
10 // the inverse of PromoteMemoryToRegister. By converting to loads, the only
11 // values live across basic blocks are allocas and loads before phi nodes.
12 // It is intended that this should make CFG hacking much easier.
13 // To make later hacking easier, the entry block is split into two, such that
14 // all introduced allocas and nothing else are in the entry block.
16 //===----------------------------------------------------------------------===//
18 #include "llvm/ADT/Statistic.h"
19 #include "llvm/Transforms/Utils/Local.h"
20 #include "llvm/IR/BasicBlock.h"
21 #include "llvm/IR/CFG.h"
22 #include "llvm/IR/Function.h"
23 #include "llvm/IR/Instructions.h"
24 #include "llvm/IR/LLVMContext.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/Pass.h"
27 #include "llvm/Transforms/Scalar.h"
28 #include "llvm/Transforms/Utils.h"
32 #define DEBUG_TYPE "reg2mem"
34 STATISTIC(NumRegsDemoted
, "Number of registers demoted");
35 STATISTIC(NumPhisDemoted
, "Number of phi-nodes demoted");
38 struct RegToMem
: public FunctionPass
{
39 static char ID
; // Pass identification, replacement for typeid
40 RegToMem() : FunctionPass(ID
) {
41 initializeRegToMemPass(*PassRegistry::getPassRegistry());
44 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
45 AU
.addRequiredID(BreakCriticalEdgesID
);
46 AU
.addPreservedID(BreakCriticalEdgesID
);
49 bool valueEscapes(const Instruction
*Inst
) const {
50 const BasicBlock
*BB
= Inst
->getParent();
51 for (const User
*U
: Inst
->users()) {
52 const Instruction
*UI
= cast
<Instruction
>(U
);
53 if (UI
->getParent() != BB
|| isa
<PHINode
>(UI
))
59 bool runOnFunction(Function
&F
) override
;
63 char RegToMem::ID
= 0;
64 INITIALIZE_PASS_BEGIN(RegToMem
, "reg2mem", "Demote all values to stack slots",
66 INITIALIZE_PASS_DEPENDENCY(BreakCriticalEdges
)
67 INITIALIZE_PASS_END(RegToMem
, "reg2mem", "Demote all values to stack slots",
70 bool RegToMem::runOnFunction(Function
&F
) {
71 if (F
.isDeclaration() || skipFunction(F
))
74 // Insert all new allocas into entry block.
75 BasicBlock
*BBEntry
= &F
.getEntryBlock();
76 assert(pred_empty(BBEntry
) &&
77 "Entry block to function must not have predecessors!");
79 // Find first non-alloca instruction and create insertion point. This is
80 // safe if block is well-formed: it always have terminator, otherwise
81 // we'll get and assertion.
82 BasicBlock::iterator I
= BBEntry
->begin();
83 while (isa
<AllocaInst
>(I
)) ++I
;
85 CastInst
*AllocaInsertionPoint
= new BitCastInst(
86 Constant::getNullValue(Type::getInt32Ty(F
.getContext())),
87 Type::getInt32Ty(F
.getContext()), "reg2mem alloca point", &*I
);
89 // Find the escaped instructions. But don't create stack slots for
90 // allocas in entry block.
91 std::list
<Instruction
*> WorkList
;
92 for (BasicBlock
&ibb
: F
)
93 for (BasicBlock::iterator iib
= ibb
.begin(), iie
= ibb
.end(); iib
!= iie
;
95 if (!(isa
<AllocaInst
>(iib
) && iib
->getParent() == BBEntry
) &&
96 valueEscapes(&*iib
)) {
97 WorkList
.push_front(&*iib
);
101 // Demote escaped instructions
102 NumRegsDemoted
+= WorkList
.size();
103 for (Instruction
*ilb
: WorkList
)
104 DemoteRegToStack(*ilb
, false, AllocaInsertionPoint
);
109 for (BasicBlock
&ibb
: F
)
110 for (BasicBlock::iterator iib
= ibb
.begin(), iie
= ibb
.end(); iib
!= iie
;
112 if (isa
<PHINode
>(iib
))
113 WorkList
.push_front(&*iib
);
116 NumPhisDemoted
+= WorkList
.size();
117 for (Instruction
*ilb
: WorkList
)
118 DemotePHIToStack(cast
<PHINode
>(ilb
), AllocaInsertionPoint
);
124 // createDemoteRegisterToMemory - Provide an entry point to create this pass.
125 char &llvm::DemoteRegisterToMemoryID
= RegToMem::ID
;
126 FunctionPass
*llvm::createDemoteRegisterToMemoryPass() {
127 return new RegToMem();