1 //===------------------- SSI.cpp - Creates SSI Representation -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This pass converts a list of variables to the Static Single Information
11 // form. This is a program representation described by Scott Ananian in his
12 // Master Thesis: "The Static Single Information Form (1999)".
13 // We are building an on-demand representation, that is, we do not convert
14 // every single variable in the target function to SSI form. Rather, we receive
15 // a list of target variables that must be converted. We also do not
16 // completely convert a target variable to the SSI format. Instead, we only
17 // change the variable in the points where new information can be attached
18 // to its live range, that is, at branch points.
20 //===----------------------------------------------------------------------===//
22 #define DEBUG_TYPE "ssi"
24 #include "llvm/Transforms/Scalar.h"
25 #include "llvm/Transforms/Utils/SSI.h"
26 #include "llvm/ADT/Statistic.h"
27 #include "llvm/Analysis/Dominators.h"
31 static const std::string SSI_PHI
= "SSI_phi";
32 static const std::string SSI_SIG
= "SSI_sigma";
34 static const unsigned UNSIGNED_INFINITE
= ~0U;
36 STATISTIC(NumSigmaInserted
, "Number of sigma functions inserted");
37 STATISTIC(NumPhiInserted
, "Number of phi functions inserted");
39 void SSI::getAnalysisUsage(AnalysisUsage
&AU
) const {
40 AU
.addRequired
<DominanceFrontier
>();
41 AU
.addRequired
<DominatorTree
>();
45 bool SSI::runOnFunction(Function
&F
) {
46 DT_
= &getAnalysis
<DominatorTree
>();
50 /// This methods creates the SSI representation for the list of values
51 /// received. It will only create SSI representation if a value is used
52 /// in a to decide a branch. Repeated values are created only once.
54 void SSI::createSSI(SmallVectorImpl
<Instruction
*> &value
) {
57 for (unsigned i
= 0; i
< num_values
; ++i
) {
58 if (created
.insert(value
[i
])) {
59 needConstruction
[i
] = true;
62 insertSigmaFunctions(value
);
64 // Test if there is a need to transform to SSI
65 if (needConstruction
.any()) {
66 insertPhiFunctions(value
);
68 rename(DT_
->getRoot());
75 /// Insert sigma functions (a sigma function is a phi function with one
78 void SSI::insertSigmaFunctions(SmallVectorImpl
<Instruction
*> &value
) {
79 for (unsigned i
= 0; i
< num_values
; ++i
) {
80 if (!needConstruction
[i
])
84 for (Value::use_iterator begin
= value
[i
]->use_begin(), end
=
85 value
[i
]->use_end(); begin
!= end
; ++begin
) {
86 // Test if the Use of the Value is in a comparator
87 CmpInst
*CI
= dyn_cast
<CmpInst
>(begin
);
88 if (CI
&& isUsedInTerminator(CI
)) {
89 // Basic Block of the Instruction
90 BasicBlock
*BB
= CI
->getParent();
91 // Last Instruction of the Basic Block
92 const TerminatorInst
*TI
= BB
->getTerminator();
94 for (unsigned j
= 0, e
= TI
->getNumSuccessors(); j
< e
; ++j
) {
96 BasicBlock
*BB_next
= TI
->getSuccessor(j
);
98 BB_next
->getUniquePredecessor() != NULL
&&
99 dominateAny(BB_next
, value
[i
])) {
100 PHINode
*PN
= PHINode::Create(
101 value
[i
]->getType(), SSI_SIG
, BB_next
->begin());
102 PN
->addIncoming(value
[i
], BB
);
103 sigmas
.insert(std::make_pair(PN
, i
));
106 defsites
[i
].push_back(BB_next
);
112 needConstruction
[i
] = need
;
116 /// Insert phi functions when necessary
118 void SSI::insertPhiFunctions(SmallVectorImpl
<Instruction
*> &value
) {
119 DominanceFrontier
*DF
= &getAnalysis
<DominanceFrontier
>();
120 for (unsigned i
= 0; i
< num_values
; ++i
) {
121 // Test if there were any sigmas for this variable
122 if (needConstruction
[i
]) {
124 SmallPtrSet
<BasicBlock
*, 1> BB_visited
;
126 // Insert phi functions if there is any sigma function
127 while (!defsites
[i
].empty()) {
129 BasicBlock
*BB
= defsites
[i
].back();
131 defsites
[i
].pop_back();
132 DominanceFrontier::iterator DF_BB
= DF
->find(BB
);
134 // Iterates through all the dominance frontier of BB
135 for (std::set
<BasicBlock
*>::iterator DF_BB_begin
=
136 DF_BB
->second
.begin(), DF_BB_end
= DF_BB
->second
.end();
137 DF_BB_begin
!= DF_BB_end
; ++DF_BB_begin
) {
138 BasicBlock
*BB_dominated
= *DF_BB_begin
;
140 // Test if has not yet visited this node and if the
141 // original definition dominates this node
142 if (BB_visited
.insert(BB_dominated
) &&
143 DT_
->properlyDominates(value_original
[i
], BB_dominated
) &&
144 dominateAny(BB_dominated
, value
[i
])) {
145 PHINode
*PN
= PHINode::Create(
146 value
[i
]->getType(), SSI_PHI
, BB_dominated
->begin());
147 phis
.insert(std::make_pair(PN
, i
));
150 defsites
[i
].push_back(BB_dominated
);
160 /// Some initialization for the rename part
162 void SSI::renameInit(SmallVectorImpl
<Instruction
*> &value
) {
163 value_stack
.resize(num_values
);
164 for (unsigned i
= 0; i
< num_values
; ++i
) {
165 value_stack
[i
].push_back(value
[i
]);
169 /// Renames all variables in the specified BasicBlock.
170 /// Only variables that need to be rename will be.
172 void SSI::rename(BasicBlock
*BB
) {
173 BitVector
*defined
= new BitVector(num_values
, false);
175 // Iterate through instructions and make appropriate renaming.
176 // For SSI_PHI (b = PHI()), store b at value_stack as a new
177 // definition of the variable it represents.
178 // For SSI_SIG (b = PHI(a)), substitute a with the current
179 // value of a, present in the value_stack.
180 // Then store bin the value_stack as the new definition of a.
181 // For all other instructions (b = OP(a, c, d, ...)), we need to substitute
182 // all operands with its current value, present in value_stack.
183 for (BasicBlock::iterator begin
= BB
->begin(), end
= BB
->end();
184 begin
!= end
; ++begin
) {
185 Instruction
*I
= begin
;
186 if (PHINode
*PN
= dyn_cast
<PHINode
>(I
)) { // Treat PHI functions
190 if ((position
= getPositionPhi(PN
)) != -1) {
191 value_stack
[position
].push_back(PN
);
192 (*defined
)[position
] = true;
196 else if ((position
= getPositionSigma(PN
)) != -1) {
198 value_stack
[position
].push_back(PN
);
199 (*defined
)[position
] = true;
202 // Treat all other PHI functions
208 // Treat all other functions
214 // This loop iterates in all BasicBlocks that are successors of the current
215 // BasicBlock. For each SSI_PHI instruction found, insert an operand.
216 // This operand is the current operand in value_stack for the variable
217 // in "position". And the BasicBlock this operand represents is the current
219 for (succ_iterator SI
= succ_begin(BB
), SE
= succ_end(BB
); SI
!= SE
; ++SI
) {
220 BasicBlock
*BB_succ
= *SI
;
222 for (BasicBlock::iterator begin
= BB_succ
->begin(),
223 notPhi
= BB_succ
->getFirstNonPHI(); begin
!= *notPhi
; ++begin
) {
224 Instruction
*I
= begin
;
227 if ((PN
= dyn_cast
<PHINode
>(I
)) && ((position
228 = getPositionPhi(PN
)) != -1)) {
229 PN
->addIncoming(value_stack
[position
].back(), BB
);
234 // This loop calls rename on all children from this block. This time children
235 // refers to a successor block in the dominance tree.
236 DomTreeNode
*DTN
= DT_
->getNode(BB
);
237 for (DomTreeNode::iterator begin
= DTN
->begin(), end
= DTN
->end();
238 begin
!= end
; ++begin
) {
239 DomTreeNodeBase
<BasicBlock
> *DTN_children
= *begin
;
240 BasicBlock
*BB_children
= DTN_children
->getBlock();
244 // Now we remove all inserted definitions of a variable from the top of
245 // the stack leaving the previous one as the top.
246 if (defined
->any()) {
247 for (unsigned i
= 0; i
< num_values
; ++i
) {
249 value_stack
[i
].pop_back();
255 /// Substitute any use in this instruction for the last definition of
258 void SSI::substituteUse(Instruction
*I
) {
259 for (unsigned i
= 0, e
= I
->getNumOperands(); i
< e
; ++i
) {
260 Value
*operand
= I
->getOperand(i
);
261 for (unsigned j
= 0; j
< num_values
; ++j
) {
262 if (operand
== value_stack
[j
].front() &&
263 I
!= value_stack
[j
].back()) {
264 PHINode
*PN_I
= dyn_cast
<PHINode
>(I
);
265 PHINode
*PN_vs
= dyn_cast
<PHINode
>(value_stack
[j
].back());
267 // If a phi created in a BasicBlock is used as an operand of another
268 // created in the same BasicBlock, this step marks this second phi,
269 // to fix this issue later. It cannot be fixed now, because the
270 // operands of the first phi are not final yet.
272 value_stack
[j
].back()->getParent() == I
->getParent()) {
274 phisToFix
.insert(PN_I
);
277 I
->setOperand(i
, value_stack
[j
].back());
284 /// Test if the BasicBlock BB dominates any use or definition of value.
285 /// If it dominates a phi instruction that is on the same BasicBlock,
286 /// that does not count.
288 bool SSI::dominateAny(BasicBlock
*BB
, Instruction
*value
) {
289 for (Value::use_iterator begin
= value
->use_begin(),
290 end
= value
->use_end(); begin
!= end
; ++begin
) {
291 Instruction
*I
= cast
<Instruction
>(*begin
);
292 BasicBlock
*BB_father
= I
->getParent();
293 if (BB
== BB_father
&& isa
<PHINode
>(I
))
295 if (DT_
->dominates(BB
, BB_father
)) {
302 /// When there is a phi node that is created in a BasicBlock and it is used
303 /// as an operand of another phi function used in the same BasicBlock,
304 /// LLVM looks this as an error. So on the second phi, the first phi is called
305 /// P and the BasicBlock it incomes is B. This P will be replaced by the value
306 /// it has for BasicBlock B.
308 void SSI::fixPhis() {
309 for (SmallPtrSet
<PHINode
*, 1>::iterator begin
= phisToFix
.begin(),
310 end
= phisToFix
.end(); begin
!= end
; ++begin
) {
311 PHINode
*PN
= *begin
;
312 for (unsigned i
= 0, e
= PN
->getNumIncomingValues(); i
< e
; ++i
) {
314 if ((PN_father
= dyn_cast
<PHINode
>(PN
->getIncomingValue(i
))) &&
315 PN
->getParent() == PN_father
->getParent()) {
316 BasicBlock
*BB
= PN
->getIncomingBlock(i
);
317 int pos
= PN_father
->getBasicBlockIndex(BB
);
318 PN
->setIncomingValue(i
, PN_father
->getIncomingValue(pos
));
324 /// Return which variable (position on the vector of variables) this phi
325 /// represents on the phis list.
327 unsigned SSI::getPositionPhi(PHINode
*PN
) {
328 DenseMap
<PHINode
*, unsigned>::iterator val
= phis
.find(PN
);
329 if (val
== phis
.end())
330 return UNSIGNED_INFINITE
;
335 /// Return which variable (position on the vector of variables) this phi
336 /// represents on the sigmas list.
338 unsigned SSI::getPositionSigma(PHINode
*PN
) {
339 DenseMap
<PHINode
*, unsigned>::iterator val
= sigmas
.find(PN
);
340 if (val
== sigmas
.end())
341 return UNSIGNED_INFINITE
;
346 /// Return true if the the Comparison Instruction is an operator
347 /// of the Terminator instruction of its Basic Block.
349 unsigned SSI::isUsedInTerminator(CmpInst
*CI
) {
350 TerminatorInst
*TI
= CI
->getParent()->getTerminator();
351 if (TI
->getNumOperands() == 0) {
353 } else if (CI
== TI
->getOperand(0)) {
362 void SSI::init(SmallVectorImpl
<Instruction
*> &value
) {
363 num_values
= value
.size();
364 needConstruction
.resize(num_values
, false);
366 value_original
.resize(num_values
);
367 defsites
.resize(num_values
);
369 for (unsigned i
= 0; i
< num_values
; ++i
) {
370 value_original
[i
] = value
[i
]->getParent();
371 defsites
[i
].push_back(value_original
[i
]);
375 /// Clean all used resources in this creation of SSI
378 for (unsigned i
= 0; i
< num_values
; ++i
) {
380 if (i
< value_stack
.size())
381 value_stack
[i
].clear();
390 value_original
.clear();
391 needConstruction
.clear();
394 /// createSSIPass - The public interface to this file...
396 FunctionPass
*llvm::createSSIPass() { return new SSI(); }
399 static RegisterPass
<SSI
> X("ssi", "Static Single Information Construction");
401 /// SSIEverything - A pass that runs createSSI on every non-void variable,
402 /// intended for debugging.
404 struct VISIBILITY_HIDDEN SSIEverything
: public FunctionPass
{
405 static char ID
; // Pass identification, replacement for typeid
406 SSIEverything() : FunctionPass((intptr_t)&ID
) {}
408 bool runOnFunction(Function
&F
);
410 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
411 AU
.addRequired
<SSI
>();
416 bool SSIEverything::runOnFunction(Function
&F
) {
417 SmallVector
<Instruction
*, 16> Insts
;
418 SSI
&ssi
= getAnalysis
<SSI
>();
420 if (F
.isDeclaration() || F
.isIntrinsic()) return false;
422 for (Function::iterator B
= F
.begin(), BE
= F
.end(); B
!= BE
; ++B
)
423 for (BasicBlock::iterator I
= B
->begin(), E
= B
->end(); I
!= E
; ++I
)
424 if (I
->getType() != Type::VoidTy
)
427 ssi
.createSSI(Insts
);
431 /// createSSIEverythingPass - The public interface to this file...
433 FunctionPass
*llvm::createSSIEverythingPass() { return new SSIEverything(); }
435 char SSIEverything::ID
= 0;
436 static RegisterPass
<SSIEverything
>
437 Y("ssi-everything", "Static Single Information Construction");