1 //===- PHITransAddr.cpp - PHI Translation for Addresses -------------------===//
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 file implements the PHITransAddr class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Analysis/PHITransAddr.h"
15 #include "llvm/Analysis/Dominators.h"
16 #include "llvm/Analysis/InstructionSimplify.h"
17 #include "llvm/Support/Debug.h"
18 #include "llvm/Support/raw_ostream.h"
21 static bool CanPHITrans(Instruction
*Inst
) {
22 if (isa
<PHINode
>(Inst
) ||
23 isa
<BitCastInst
>(Inst
) ||
24 isa
<GetElementPtrInst
>(Inst
))
27 if (Inst
->getOpcode() == Instruction::Add
&&
28 isa
<ConstantInt
>(Inst
->getOperand(1)))
31 // cerr << "MEMDEP: Could not PHI translate: " << *Pointer;
32 // if (isa<BitCastInst>(PtrInst) || isa<GetElementPtrInst>(PtrInst))
33 // cerr << "OP:\t\t\t\t" << *PtrInst->getOperand(0);
37 void PHITransAddr::dump() const {
39 dbgs() << "PHITransAddr: null\n";
42 dbgs() << "PHITransAddr: " << *Addr
<< "\n";
43 for (unsigned i
= 0, e
= InstInputs
.size(); i
!= e
; ++i
)
44 dbgs() << " Input #" << i
<< " is " << *InstInputs
[i
] << "\n";
48 static bool VerifySubExpr(Value
*Expr
,
49 SmallVectorImpl
<Instruction
*> &InstInputs
) {
50 // If this is a non-instruction value, there is nothing to do.
51 Instruction
*I
= dyn_cast
<Instruction
>(Expr
);
52 if (I
== 0) return true;
54 // If it's an instruction, it is either in Tmp or its operands recursively
56 SmallVectorImpl
<Instruction
*>::iterator Entry
=
57 std::find(InstInputs
.begin(), InstInputs
.end(), I
);
58 if (Entry
!= InstInputs
.end()) {
59 InstInputs
.erase(Entry
);
63 // If it isn't in the InstInputs list it is a subexpr incorporated into the
64 // address. Sanity check that it is phi translatable.
65 if (!CanPHITrans(I
)) {
66 errs() << "Non phi translatable instruction found in PHITransAddr, either "
67 "something is missing from InstInputs or CanPHITrans is wrong:\n";
72 // Validate the operands of the instruction.
73 for (unsigned i
= 0, e
= I
->getNumOperands(); i
!= e
; ++i
)
74 if (!VerifySubExpr(I
->getOperand(i
), InstInputs
))
80 /// Verify - Check internal consistency of this data structure. If the
81 /// structure is valid, it returns true. If invalid, it prints errors and
83 bool PHITransAddr::Verify() const {
84 if (Addr
== 0) return true;
86 SmallVector
<Instruction
*, 8> Tmp(InstInputs
.begin(), InstInputs
.end());
88 if (!VerifySubExpr(Addr
, Tmp
))
92 errs() << "PHITransAddr inconsistent, contains extra instructions:\n";
93 for (unsigned i
= 0, e
= InstInputs
.size(); i
!= e
; ++i
)
94 errs() << " InstInput #" << i
<< " is " << *InstInputs
[i
] << "\n";
103 /// IsPotentiallyPHITranslatable - If this needs PHI translation, return true
104 /// if we have some hope of doing it. This should be used as a filter to
105 /// avoid calling PHITranslateValue in hopeless situations.
106 bool PHITransAddr::IsPotentiallyPHITranslatable() const {
107 // If the input value is not an instruction, or if it is not defined in CurBB,
108 // then we don't need to phi translate it.
109 Instruction
*Inst
= dyn_cast
<Instruction
>(Addr
);
110 return Inst
== 0 || CanPHITrans(Inst
);
114 static void RemoveInstInputs(Value
*V
,
115 SmallVectorImpl
<Instruction
*> &InstInputs
) {
116 Instruction
*I
= dyn_cast
<Instruction
>(V
);
119 // If the instruction is in the InstInputs list, remove it.
120 SmallVectorImpl
<Instruction
*>::iterator Entry
=
121 std::find(InstInputs
.begin(), InstInputs
.end(), I
);
122 if (Entry
!= InstInputs
.end()) {
123 InstInputs
.erase(Entry
);
127 assert(!isa
<PHINode
>(I
) && "Error, removing something that isn't an input");
129 // Otherwise, it must have instruction inputs itself. Zap them recursively.
130 for (unsigned i
= 0, e
= I
->getNumOperands(); i
!= e
; ++i
) {
131 if (Instruction
*Op
= dyn_cast
<Instruction
>(I
->getOperand(i
)))
132 RemoveInstInputs(Op
, InstInputs
);
136 Value
*PHITransAddr::PHITranslateSubExpr(Value
*V
, BasicBlock
*CurBB
,
138 const DominatorTree
*DT
) {
139 // If this is a non-instruction value, it can't require PHI translation.
140 Instruction
*Inst
= dyn_cast
<Instruction
>(V
);
141 if (Inst
== 0) return V
;
143 // Determine whether 'Inst' is an input to our PHI translatable expression.
144 bool isInput
= std::count(InstInputs
.begin(), InstInputs
.end(), Inst
);
146 // Handle inputs instructions if needed.
148 if (Inst
->getParent() != CurBB
) {
149 // If it is an input defined in a different block, then it remains an
154 // If 'Inst' is defined in this block and is an input that needs to be phi
155 // translated, we need to incorporate the value into the expression or fail.
157 // In either case, the instruction itself isn't an input any longer.
158 InstInputs
.erase(std::find(InstInputs
.begin(), InstInputs
.end(), Inst
));
160 // If this is a PHI, go ahead and translate it.
161 if (PHINode
*PN
= dyn_cast
<PHINode
>(Inst
))
162 return AddAsInput(PN
->getIncomingValueForBlock(PredBB
));
164 // If this is a non-phi value, and it is analyzable, we can incorporate it
165 // into the expression by making all instruction operands be inputs.
166 if (!CanPHITrans(Inst
))
169 // All instruction operands are now inputs (and of course, they may also be
170 // defined in this block, so they may need to be phi translated themselves.
171 for (unsigned i
= 0, e
= Inst
->getNumOperands(); i
!= e
; ++i
)
172 if (Instruction
*Op
= dyn_cast
<Instruction
>(Inst
->getOperand(i
)))
173 InstInputs
.push_back(Op
);
176 // Ok, it must be an intermediate result (either because it started that way
177 // or because we just incorporated it into the expression). See if its
178 // operands need to be phi translated, and if so, reconstruct it.
180 if (BitCastInst
*BC
= dyn_cast
<BitCastInst
>(Inst
)) {
181 Value
*PHIIn
= PHITranslateSubExpr(BC
->getOperand(0), CurBB
, PredBB
, DT
);
182 if (PHIIn
== 0) return 0;
183 if (PHIIn
== BC
->getOperand(0))
186 // Find an available version of this cast.
188 // Constants are trivial to find.
189 if (Constant
*C
= dyn_cast
<Constant
>(PHIIn
))
190 return AddAsInput(ConstantExpr::getBitCast(C
, BC
->getType()));
192 // Otherwise we have to see if a bitcasted version of the incoming pointer
193 // is available. If so, we can use it, otherwise we have to fail.
194 for (Value::use_iterator UI
= PHIIn
->use_begin(), E
= PHIIn
->use_end();
196 if (BitCastInst
*BCI
= dyn_cast
<BitCastInst
>(*UI
))
197 if (BCI
->getType() == BC
->getType() &&
198 (!DT
|| DT
->dominates(BCI
->getParent(), PredBB
)))
204 // Handle getelementptr with at least one PHI translatable operand.
205 if (GetElementPtrInst
*GEP
= dyn_cast
<GetElementPtrInst
>(Inst
)) {
206 SmallVector
<Value
*, 8> GEPOps
;
207 bool AnyChanged
= false;
208 for (unsigned i
= 0, e
= GEP
->getNumOperands(); i
!= e
; ++i
) {
209 Value
*GEPOp
= PHITranslateSubExpr(GEP
->getOperand(i
), CurBB
, PredBB
, DT
);
210 if (GEPOp
== 0) return 0;
212 AnyChanged
|= GEPOp
!= GEP
->getOperand(i
);
213 GEPOps
.push_back(GEPOp
);
219 // Simplify the GEP to handle 'gep x, 0' -> x etc.
220 if (Value
*V
= SimplifyGEPInst(&GEPOps
[0], GEPOps
.size(), TD
)) {
221 for (unsigned i
= 0, e
= GEPOps
.size(); i
!= e
; ++i
)
222 RemoveInstInputs(GEPOps
[i
], InstInputs
);
224 return AddAsInput(V
);
227 // Scan to see if we have this GEP available.
228 Value
*APHIOp
= GEPOps
[0];
229 for (Value::use_iterator UI
= APHIOp
->use_begin(), E
= APHIOp
->use_end();
231 if (GetElementPtrInst
*GEPI
= dyn_cast
<GetElementPtrInst
>(*UI
))
232 if (GEPI
->getType() == GEP
->getType() &&
233 GEPI
->getNumOperands() == GEPOps
.size() &&
234 GEPI
->getParent()->getParent() == CurBB
->getParent() &&
235 (!DT
|| DT
->dominates(GEPI
->getParent(), PredBB
))) {
236 bool Mismatch
= false;
237 for (unsigned i
= 0, e
= GEPOps
.size(); i
!= e
; ++i
)
238 if (GEPI
->getOperand(i
) != GEPOps
[i
]) {
249 // Handle add with a constant RHS.
250 if (Inst
->getOpcode() == Instruction::Add
&&
251 isa
<ConstantInt
>(Inst
->getOperand(1))) {
252 // PHI translate the LHS.
253 Constant
*RHS
= cast
<ConstantInt
>(Inst
->getOperand(1));
254 bool isNSW
= cast
<BinaryOperator
>(Inst
)->hasNoSignedWrap();
255 bool isNUW
= cast
<BinaryOperator
>(Inst
)->hasNoUnsignedWrap();
257 Value
*LHS
= PHITranslateSubExpr(Inst
->getOperand(0), CurBB
, PredBB
, DT
);
258 if (LHS
== 0) return 0;
260 // If the PHI translated LHS is an add of a constant, fold the immediates.
261 if (BinaryOperator
*BOp
= dyn_cast
<BinaryOperator
>(LHS
))
262 if (BOp
->getOpcode() == Instruction::Add
)
263 if (ConstantInt
*CI
= dyn_cast
<ConstantInt
>(BOp
->getOperand(1))) {
264 LHS
= BOp
->getOperand(0);
265 RHS
= ConstantExpr::getAdd(RHS
, CI
);
266 isNSW
= isNUW
= false;
268 // If the old 'LHS' was an input, add the new 'LHS' as an input.
269 if (std::count(InstInputs
.begin(), InstInputs
.end(), BOp
)) {
270 RemoveInstInputs(BOp
, InstInputs
);
275 // See if the add simplifies away.
276 if (Value
*Res
= SimplifyAddInst(LHS
, RHS
, isNSW
, isNUW
, TD
)) {
277 // If we simplified the operands, the LHS is no longer an input, but Res
279 RemoveInstInputs(LHS
, InstInputs
);
280 return AddAsInput(Res
);
283 // If we didn't modify the add, just return it.
284 if (LHS
== Inst
->getOperand(0) && RHS
== Inst
->getOperand(1))
287 // Otherwise, see if we have this add available somewhere.
288 for (Value::use_iterator UI
= LHS
->use_begin(), E
= LHS
->use_end();
290 if (BinaryOperator
*BO
= dyn_cast
<BinaryOperator
>(*UI
))
291 if (BO
->getOpcode() == Instruction::Add
&&
292 BO
->getOperand(0) == LHS
&& BO
->getOperand(1) == RHS
&&
293 BO
->getParent()->getParent() == CurBB
->getParent() &&
294 (!DT
|| DT
->dominates(BO
->getParent(), PredBB
)))
301 // Otherwise, we failed.
306 /// PHITranslateValue - PHI translate the current address up the CFG from
307 /// CurBB to Pred, updating our state to reflect any needed changes. If the
308 /// dominator tree DT is non-null, the translated value must dominate
309 /// PredBB. This returns true on failure and sets Addr to null.
310 bool PHITransAddr::PHITranslateValue(BasicBlock
*CurBB
, BasicBlock
*PredBB
,
311 const DominatorTree
*DT
) {
312 assert(Verify() && "Invalid PHITransAddr!");
313 Addr
= PHITranslateSubExpr(Addr
, CurBB
, PredBB
, DT
);
314 assert(Verify() && "Invalid PHITransAddr!");
317 // Make sure the value is live in the predecessor.
318 if (Instruction
*Inst
= dyn_cast_or_null
<Instruction
>(Addr
))
319 if (!DT
->dominates(Inst
->getParent(), PredBB
))
326 /// PHITranslateWithInsertion - PHI translate this value into the specified
327 /// predecessor block, inserting a computation of the value if it is
330 /// All newly created instructions are added to the NewInsts list. This
331 /// returns null on failure.
333 Value
*PHITransAddr::
334 PHITranslateWithInsertion(BasicBlock
*CurBB
, BasicBlock
*PredBB
,
335 const DominatorTree
&DT
,
336 SmallVectorImpl
<Instruction
*> &NewInsts
) {
337 unsigned NISize
= NewInsts
.size();
339 // Attempt to PHI translate with insertion.
340 Addr
= InsertPHITranslatedSubExpr(Addr
, CurBB
, PredBB
, DT
, NewInsts
);
342 // If successful, return the new value.
343 if (Addr
) return Addr
;
345 // If not, destroy any intermediate instructions inserted.
346 while (NewInsts
.size() != NISize
)
347 NewInsts
.pop_back_val()->eraseFromParent();
352 /// InsertPHITranslatedPointer - Insert a computation of the PHI translated
353 /// version of 'V' for the edge PredBB->CurBB into the end of the PredBB
354 /// block. All newly created instructions are added to the NewInsts list.
355 /// This returns null on failure.
357 Value
*PHITransAddr::
358 InsertPHITranslatedSubExpr(Value
*InVal
, BasicBlock
*CurBB
,
359 BasicBlock
*PredBB
, const DominatorTree
&DT
,
360 SmallVectorImpl
<Instruction
*> &NewInsts
) {
361 // See if we have a version of this value already available and dominating
362 // PredBB. If so, there is no need to insert a new instance of it.
363 PHITransAddr
Tmp(InVal
, TD
);
364 if (!Tmp
.PHITranslateValue(CurBB
, PredBB
, &DT
))
365 return Tmp
.getAddr();
367 // If we don't have an available version of this value, it must be an
369 Instruction
*Inst
= cast
<Instruction
>(InVal
);
371 // Handle bitcast of PHI translatable value.
372 if (BitCastInst
*BC
= dyn_cast
<BitCastInst
>(Inst
)) {
373 Value
*OpVal
= InsertPHITranslatedSubExpr(BC
->getOperand(0),
374 CurBB
, PredBB
, DT
, NewInsts
);
375 if (OpVal
== 0) return 0;
377 // Otherwise insert a bitcast at the end of PredBB.
378 BitCastInst
*New
= new BitCastInst(OpVal
, InVal
->getType(),
379 InVal
->getName()+".phi.trans.insert",
380 PredBB
->getTerminator());
381 NewInsts
.push_back(New
);
385 // Handle getelementptr with at least one PHI operand.
386 if (GetElementPtrInst
*GEP
= dyn_cast
<GetElementPtrInst
>(Inst
)) {
387 SmallVector
<Value
*, 8> GEPOps
;
388 BasicBlock
*CurBB
= GEP
->getParent();
389 for (unsigned i
= 0, e
= GEP
->getNumOperands(); i
!= e
; ++i
) {
390 Value
*OpVal
= InsertPHITranslatedSubExpr(GEP
->getOperand(i
),
391 CurBB
, PredBB
, DT
, NewInsts
);
392 if (OpVal
== 0) return 0;
393 GEPOps
.push_back(OpVal
);
396 GetElementPtrInst
*Result
=
397 GetElementPtrInst::Create(GEPOps
[0], GEPOps
.begin()+1, GEPOps
.end(),
398 InVal
->getName()+".phi.trans.insert",
399 PredBB
->getTerminator());
400 Result
->setIsInBounds(GEP
->isInBounds());
401 NewInsts
.push_back(Result
);
406 // FIXME: This code works, but it is unclear that we actually want to insert
407 // a big chain of computation in order to make a value available in a block.
408 // This needs to be evaluated carefully to consider its cost trade offs.
410 // Handle add with a constant RHS.
411 if (Inst
->getOpcode() == Instruction::Add
&&
412 isa
<ConstantInt
>(Inst
->getOperand(1))) {
413 // PHI translate the LHS.
414 Value
*OpVal
= InsertPHITranslatedSubExpr(Inst
->getOperand(0),
415 CurBB
, PredBB
, DT
, NewInsts
);
416 if (OpVal
== 0) return 0;
418 BinaryOperator
*Res
= BinaryOperator::CreateAdd(OpVal
, Inst
->getOperand(1),
419 InVal
->getName()+".phi.trans.insert",
420 PredBB
->getTerminator());
421 Res
->setHasNoSignedWrap(cast
<BinaryOperator
>(Inst
)->hasNoSignedWrap());
422 Res
->setHasNoUnsignedWrap(cast
<BinaryOperator
>(Inst
)->hasNoUnsignedWrap());
423 NewInsts
.push_back(Res
);