1 //===- AliasSetTracker.cpp - Alias Sets Tracker implementation-------------===//
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 AliasSetTracker and AliasSet classes.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Analysis/AliasSetTracker.h"
15 #include "llvm/Analysis/AliasAnalysis.h"
16 #include "llvm/Instructions.h"
17 #include "llvm/IntrinsicInst.h"
18 #include "llvm/Pass.h"
19 #include "llvm/Type.h"
20 #include "llvm/Target/TargetData.h"
21 #include "llvm/Assembly/Writer.h"
22 #include "llvm/Support/Compiler.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/InstIterator.h"
25 #include "llvm/Support/Format.h"
26 #include "llvm/Support/raw_ostream.h"
29 /// mergeSetIn - Merge the specified alias set into this alias set.
31 void AliasSet::mergeSetIn(AliasSet
&AS
, AliasSetTracker
&AST
) {
32 assert(!AS
.Forward
&& "Alias set is already forwarding!");
33 assert(!Forward
&& "This set is a forwarding set!!");
35 // Update the alias and access types of this set...
36 AccessTy
|= AS
.AccessTy
;
37 AliasTy
|= AS
.AliasTy
;
39 if (AliasTy
== MustAlias
) {
40 // Check that these two merged sets really are must aliases. Since both
41 // used to be must-alias sets, we can just check any pointer from each set
43 AliasAnalysis
&AA
= AST
.getAliasAnalysis();
44 PointerRec
*L
= getSomePointer();
45 PointerRec
*R
= AS
.getSomePointer();
47 // If the pointers are not a must-alias pair, this set becomes a may alias.
48 if (AA
.alias(L
->getValue(), L
->getSize(), R
->getValue(), R
->getSize())
49 != AliasAnalysis::MustAlias
)
53 if (CallSites
.empty()) { // Merge call sites...
54 if (!AS
.CallSites
.empty())
55 std::swap(CallSites
, AS
.CallSites
);
56 } else if (!AS
.CallSites
.empty()) {
57 CallSites
.insert(CallSites
.end(), AS
.CallSites
.begin(), AS
.CallSites
.end());
61 AS
.Forward
= this; // Forward across AS now...
62 addRef(); // AS is now pointing to us...
64 // Merge the list of constituent pointers...
66 *PtrListEnd
= AS
.PtrList
;
67 AS
.PtrList
->setPrevInList(PtrListEnd
);
68 PtrListEnd
= AS
.PtrListEnd
;
71 AS
.PtrListEnd
= &AS
.PtrList
;
72 assert(*AS
.PtrListEnd
== 0 && "End of list is not null?");
76 void AliasSetTracker::removeAliasSet(AliasSet
*AS
) {
77 if (AliasSet
*Fwd
= AS
->Forward
) {
84 void AliasSet::removeFromTracker(AliasSetTracker
&AST
) {
85 assert(RefCount
== 0 && "Cannot remove non-dead alias set from tracker!");
86 AST
.removeAliasSet(this);
89 void AliasSet::addPointer(AliasSetTracker
&AST
, PointerRec
&Entry
,
90 unsigned Size
, bool KnownMustAlias
) {
91 assert(!Entry
.hasAliasSet() && "Entry already in set!");
93 // Check to see if we have to downgrade to _may_ alias.
94 if (isMustAlias() && !KnownMustAlias
)
95 if (PointerRec
*P
= getSomePointer()) {
96 AliasAnalysis
&AA
= AST
.getAliasAnalysis();
97 AliasAnalysis::AliasResult Result
=
98 AA
.alias(P
->getValue(), P
->getSize(), Entry
.getValue(), Size
);
99 if (Result
== AliasAnalysis::MayAlias
)
101 else // First entry of must alias must have maximum size!
103 assert(Result
!= AliasAnalysis::NoAlias
&& "Cannot be part of must set!");
106 Entry
.setAliasSet(this);
107 Entry
.updateSize(Size
);
109 // Add it to the end of the list...
110 assert(*PtrListEnd
== 0 && "End of list is not null?");
111 *PtrListEnd
= &Entry
;
112 PtrListEnd
= Entry
.setPrevInList(PtrListEnd
);
113 assert(*PtrListEnd
== 0 && "End of list is not null?");
114 addRef(); // Entry points to alias set...
117 void AliasSet::addCallSite(CallSite CS
, AliasAnalysis
&AA
) {
118 CallSites
.push_back(CS
);
120 AliasAnalysis::ModRefBehavior Behavior
= AA
.getModRefBehavior(CS
);
121 if (Behavior
== AliasAnalysis::DoesNotAccessMemory
)
123 else if (Behavior
== AliasAnalysis::OnlyReadsMemory
) {
129 // FIXME: This should use mod/ref information to make this not suck so bad
134 /// aliasesPointer - Return true if the specified pointer "may" (or must)
135 /// alias one of the members in the set.
137 bool AliasSet::aliasesPointer(const Value
*Ptr
, unsigned Size
,
138 AliasAnalysis
&AA
) const {
139 if (AliasTy
== MustAlias
) {
140 assert(CallSites
.empty() && "Illegal must alias set!");
142 // If this is a set of MustAliases, only check to see if the pointer aliases
143 // SOME value in the set...
144 PointerRec
*SomePtr
= getSomePointer();
145 assert(SomePtr
&& "Empty must-alias set??");
146 return AA
.alias(SomePtr
->getValue(), SomePtr
->getSize(), Ptr
, Size
);
149 // If this is a may-alias set, we have to check all of the pointers in the set
150 // to be sure it doesn't alias the set...
151 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
152 if (AA
.alias(Ptr
, Size
, I
.getPointer(), I
.getSize()))
155 // Check the call sites list and invoke list...
156 if (!CallSites
.empty()) {
157 if (AA
.hasNoModRefInfoForCalls())
160 for (unsigned i
= 0, e
= CallSites
.size(); i
!= e
; ++i
)
161 if (AA
.getModRefInfo(CallSites
[i
], const_cast<Value
*>(Ptr
), Size
)
162 != AliasAnalysis::NoModRef
)
169 bool AliasSet::aliasesCallSite(CallSite CS
, AliasAnalysis
&AA
) const {
170 if (AA
.doesNotAccessMemory(CS
))
173 if (AA
.hasNoModRefInfoForCalls())
176 for (unsigned i
= 0, e
= CallSites
.size(); i
!= e
; ++i
)
177 if (AA
.getModRefInfo(CallSites
[i
], CS
) != AliasAnalysis::NoModRef
||
178 AA
.getModRefInfo(CS
, CallSites
[i
]) != AliasAnalysis::NoModRef
)
181 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
182 if (AA
.getModRefInfo(CS
, I
.getPointer(), I
.getSize()) !=
183 AliasAnalysis::NoModRef
)
189 void AliasSetTracker::clear() {
190 // Delete all the PointerRec entries.
191 for (PointerMapType::iterator I
= PointerMap
.begin(), E
= PointerMap
.end();
193 I
->second
->eraseFromList();
197 // The alias sets should all be clear now.
202 /// findAliasSetForPointer - Given a pointer, find the one alias set to put the
203 /// instruction referring to the pointer into. If there are multiple alias sets
204 /// that may alias the pointer, merge them together and return the unified set.
206 AliasSet
*AliasSetTracker::findAliasSetForPointer(const Value
*Ptr
,
208 AliasSet
*FoundSet
= 0;
209 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
210 if (!I
->Forward
&& I
->aliasesPointer(Ptr
, Size
, AA
)) {
211 if (FoundSet
== 0) { // If this is the first alias set ptr can go into.
212 FoundSet
= I
; // Remember it.
213 } else { // Otherwise, we must merge the sets.
214 FoundSet
->mergeSetIn(*I
, *this); // Merge in contents.
221 /// containsPointer - Return true if the specified location is represented by
222 /// this alias set, false otherwise. This does not modify the AST object or
224 bool AliasSetTracker::containsPointer(Value
*Ptr
, unsigned Size
) const {
225 for (const_iterator I
= begin(), E
= end(); I
!= E
; ++I
)
226 if (!I
->Forward
&& I
->aliasesPointer(Ptr
, Size
, AA
))
233 AliasSet
*AliasSetTracker::findAliasSetForCallSite(CallSite CS
) {
234 AliasSet
*FoundSet
= 0;
235 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
236 if (!I
->Forward
&& I
->aliasesCallSite(CS
, AA
)) {
237 if (FoundSet
== 0) { // If this is the first alias set ptr can go into.
238 FoundSet
= I
; // Remember it.
239 } else if (!I
->Forward
) { // Otherwise, we must merge the sets.
240 FoundSet
->mergeSetIn(*I
, *this); // Merge in contents.
250 /// getAliasSetForPointer - Return the alias set that the specified pointer
252 AliasSet
&AliasSetTracker::getAliasSetForPointer(Value
*Pointer
, unsigned Size
,
254 AliasSet::PointerRec
&Entry
= getEntryFor(Pointer
);
256 // Check to see if the pointer is already known...
257 if (Entry
.hasAliasSet()) {
258 Entry
.updateSize(Size
);
260 return *Entry
.getAliasSet(*this)->getForwardedTarget(*this);
261 } else if (AliasSet
*AS
= findAliasSetForPointer(Pointer
, Size
)) {
262 // Add it to the alias set it aliases...
263 AS
->addPointer(*this, Entry
, Size
);
266 if (New
) *New
= true;
267 // Otherwise create a new alias set to hold the loaded pointer...
268 AliasSets
.push_back(new AliasSet());
269 AliasSets
.back().addPointer(*this, Entry
, Size
);
270 return AliasSets
.back();
274 bool AliasSetTracker::add(Value
*Ptr
, unsigned Size
) {
276 addPointer(Ptr
, Size
, AliasSet::NoModRef
, NewPtr
);
281 bool AliasSetTracker::add(LoadInst
*LI
) {
283 AliasSet
&AS
= addPointer(LI
->getOperand(0),
284 AA
.getTypeStoreSize(LI
->getType()),
285 AliasSet::Refs
, NewPtr
);
286 if (LI
->isVolatile()) AS
.setVolatile();
290 bool AliasSetTracker::add(StoreInst
*SI
) {
292 Value
*Val
= SI
->getOperand(0);
293 AliasSet
&AS
= addPointer(SI
->getOperand(1),
294 AA
.getTypeStoreSize(Val
->getType()),
295 AliasSet::Mods
, NewPtr
);
296 if (SI
->isVolatile()) AS
.setVolatile();
300 bool AliasSetTracker::add(FreeInst
*FI
) {
302 addPointer(FI
->getOperand(0), ~0, AliasSet::Mods
, NewPtr
);
306 bool AliasSetTracker::add(VAArgInst
*VAAI
) {
308 addPointer(VAAI
->getOperand(0), ~0, AliasSet::ModRef
, NewPtr
);
313 bool AliasSetTracker::add(CallSite CS
) {
314 if (isa
<DbgInfoIntrinsic
>(CS
.getInstruction()))
315 return true; // Ignore DbgInfo Intrinsics.
316 if (AA
.doesNotAccessMemory(CS
))
317 return true; // doesn't alias anything
319 AliasSet
*AS
= findAliasSetForCallSite(CS
);
321 AliasSets
.push_back(new AliasSet());
322 AS
= &AliasSets
.back();
323 AS
->addCallSite(CS
, AA
);
326 AS
->addCallSite(CS
, AA
);
331 bool AliasSetTracker::add(Instruction
*I
) {
332 // Dispatch to one of the other add methods...
333 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(I
))
335 else if (StoreInst
*SI
= dyn_cast
<StoreInst
>(I
))
337 else if (CallInst
*CI
= dyn_cast
<CallInst
>(I
))
339 else if (InvokeInst
*II
= dyn_cast
<InvokeInst
>(I
))
341 else if (FreeInst
*FI
= dyn_cast
<FreeInst
>(I
))
343 else if (VAArgInst
*VAAI
= dyn_cast
<VAArgInst
>(I
))
348 void AliasSetTracker::add(BasicBlock
&BB
) {
349 for (BasicBlock::iterator I
= BB
.begin(), E
= BB
.end(); I
!= E
; ++I
)
353 void AliasSetTracker::add(const AliasSetTracker
&AST
) {
354 assert(&AA
== &AST
.AA
&&
355 "Merging AliasSetTracker objects with different Alias Analyses!");
357 // Loop over all of the alias sets in AST, adding the pointers contained
358 // therein into the current alias sets. This can cause alias sets to be
359 // merged together in the current AST.
360 for (const_iterator I
= AST
.begin(), E
= AST
.end(); I
!= E
; ++I
)
361 if (!I
->Forward
) { // Ignore forwarding alias sets
362 AliasSet
&AS
= const_cast<AliasSet
&>(*I
);
364 // If there are any call sites in the alias set, add them to this AST.
365 for (unsigned i
= 0, e
= AS
.CallSites
.size(); i
!= e
; ++i
)
366 add(AS
.CallSites
[i
]);
368 // Loop over all of the pointers in this alias set...
369 AliasSet::iterator I
= AS
.begin(), E
= AS
.end();
371 for (; I
!= E
; ++I
) {
372 AliasSet
&NewAS
= addPointer(I
.getPointer(), I
.getSize(),
373 (AliasSet::AccessType
)AS
.AccessTy
, X
);
374 if (AS
.isVolatile()) NewAS
.setVolatile();
379 /// remove - Remove the specified (potentially non-empty) alias set from the
381 void AliasSetTracker::remove(AliasSet
&AS
) {
382 // Drop all call sites.
383 AS
.CallSites
.clear();
385 // Clear the alias set.
386 unsigned NumRefs
= 0;
387 while (!AS
.empty()) {
388 AliasSet::PointerRec
*P
= AS
.PtrList
;
390 Value
*ValToRemove
= P
->getValue();
392 // Unlink and delete entry from the list of values.
395 // Remember how many references need to be dropped.
398 // Finally, remove the entry.
399 PointerMap
.erase(ValToRemove
);
402 // Stop using the alias set, removing it.
403 AS
.RefCount
-= NumRefs
;
404 if (AS
.RefCount
== 0)
405 AS
.removeFromTracker(*this);
408 bool AliasSetTracker::remove(Value
*Ptr
, unsigned Size
) {
409 AliasSet
*AS
= findAliasSetForPointer(Ptr
, Size
);
410 if (!AS
) return false;
415 bool AliasSetTracker::remove(LoadInst
*LI
) {
416 unsigned Size
= AA
.getTypeStoreSize(LI
->getType());
417 AliasSet
*AS
= findAliasSetForPointer(LI
->getOperand(0), Size
);
418 if (!AS
) return false;
423 bool AliasSetTracker::remove(StoreInst
*SI
) {
424 unsigned Size
= AA
.getTypeStoreSize(SI
->getOperand(0)->getType());
425 AliasSet
*AS
= findAliasSetForPointer(SI
->getOperand(1), Size
);
426 if (!AS
) return false;
431 bool AliasSetTracker::remove(FreeInst
*FI
) {
432 AliasSet
*AS
= findAliasSetForPointer(FI
->getOperand(0), ~0);
433 if (!AS
) return false;
438 bool AliasSetTracker::remove(VAArgInst
*VAAI
) {
439 AliasSet
*AS
= findAliasSetForPointer(VAAI
->getOperand(0), ~0);
440 if (!AS
) return false;
445 bool AliasSetTracker::remove(CallSite CS
) {
446 if (AA
.doesNotAccessMemory(CS
))
447 return false; // doesn't alias anything
449 AliasSet
*AS
= findAliasSetForCallSite(CS
);
450 if (!AS
) return false;
455 bool AliasSetTracker::remove(Instruction
*I
) {
456 // Dispatch to one of the other remove methods...
457 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(I
))
459 else if (StoreInst
*SI
= dyn_cast
<StoreInst
>(I
))
461 else if (CallInst
*CI
= dyn_cast
<CallInst
>(I
))
463 else if (FreeInst
*FI
= dyn_cast
<FreeInst
>(I
))
465 else if (VAArgInst
*VAAI
= dyn_cast
<VAArgInst
>(I
))
471 // deleteValue method - This method is used to remove a pointer value from the
472 // AliasSetTracker entirely. It should be used when an instruction is deleted
473 // from the program to update the AST. If you don't use this, you would have
474 // dangling pointers to deleted instructions.
476 void AliasSetTracker::deleteValue(Value
*PtrVal
) {
477 // Notify the alias analysis implementation that this value is gone.
478 AA
.deleteValue(PtrVal
);
480 // If this is a call instruction, remove the callsite from the appropriate
482 CallSite CS
= CallSite::get(PtrVal
);
483 if (CS
.getInstruction())
484 if (!AA
.doesNotAccessMemory(CS
))
485 if (AliasSet
*AS
= findAliasSetForCallSite(CS
))
486 AS
->removeCallSite(CS
);
488 // First, look up the PointerRec for this pointer.
489 PointerMapType::iterator I
= PointerMap
.find(PtrVal
);
490 if (I
== PointerMap
.end()) return; // Noop
492 // If we found one, remove the pointer from the alias set it is in.
493 AliasSet::PointerRec
*PtrValEnt
= I
->second
;
494 AliasSet
*AS
= PtrValEnt
->getAliasSet(*this);
496 // Unlink and delete from the list of values.
497 PtrValEnt
->eraseFromList();
499 // Stop using the alias set.
505 // copyValue - This method should be used whenever a preexisting value in the
506 // program is copied or cloned, introducing a new value. Note that it is ok for
507 // clients that use this method to introduce the same value multiple times: if
508 // the tracker already knows about a value, it will ignore the request.
510 void AliasSetTracker::copyValue(Value
*From
, Value
*To
) {
511 // Notify the alias analysis implementation that this value is copied.
512 AA
.copyValue(From
, To
);
514 // First, look up the PointerRec for this pointer.
515 PointerMapType::iterator I
= PointerMap
.find(From
);
516 if (I
== PointerMap
.end())
518 assert(I
->second
->hasAliasSet() && "Dead entry?");
520 AliasSet::PointerRec
&Entry
= getEntryFor(To
);
521 if (Entry
.hasAliasSet()) return; // Already in the tracker!
523 // Add it to the alias set it aliases...
524 I
= PointerMap
.find(From
);
525 AliasSet
*AS
= I
->second
->getAliasSet(*this);
526 AS
->addPointer(*this, Entry
, I
->second
->getSize(), true);
531 //===----------------------------------------------------------------------===//
532 // AliasSet/AliasSetTracker Printing Support
533 //===----------------------------------------------------------------------===//
535 void AliasSet::print(raw_ostream
&OS
) const {
536 OS
<< " AliasSet[" << format("0x%p", (void*)this) << "," << RefCount
<< "] ";
537 OS
<< (AliasTy
== MustAlias
? "must" : "may") << " alias, ";
539 case NoModRef
: OS
<< "No access "; break;
540 case Refs
: OS
<< "Ref "; break;
541 case Mods
: OS
<< "Mod "; break;
542 case ModRef
: OS
<< "Mod/Ref "; break;
543 default: llvm_unreachable("Bad value for AccessTy!");
545 if (isVolatile()) OS
<< "[volatile] ";
547 OS
<< " forwarding to " << (void*)Forward
;
552 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
) {
553 if (I
!= begin()) OS
<< ", ";
554 WriteAsOperand(OS
<< "(", I
.getPointer());
555 OS
<< ", " << I
.getSize() << ")";
558 if (!CallSites
.empty()) {
559 OS
<< "\n " << CallSites
.size() << " Call Sites: ";
560 for (unsigned i
= 0, e
= CallSites
.size(); i
!= e
; ++i
) {
562 WriteAsOperand(OS
, CallSites
[i
].getCalledValue());
568 void AliasSetTracker::print(raw_ostream
&OS
) const {
569 OS
<< "Alias Set Tracker: " << AliasSets
.size() << " alias sets for "
570 << PointerMap
.size() << " pointer values.\n";
571 for (const_iterator I
= begin(), E
= end(); I
!= E
; ++I
)
576 void AliasSet::dump() const { print(errs()); }
577 void AliasSetTracker::dump() const { print(errs()); }
579 //===----------------------------------------------------------------------===//
580 // ASTCallbackVH Class Implementation
581 //===----------------------------------------------------------------------===//
583 void AliasSetTracker::ASTCallbackVH::deleted() {
584 assert(AST
&& "ASTCallbackVH called with a null AliasSetTracker!");
585 AST
->deleteValue(getValPtr());
589 AliasSetTracker::ASTCallbackVH::ASTCallbackVH(Value
*V
, AliasSetTracker
*ast
)
590 : CallbackVH(V
), AST(ast
) {}
592 AliasSetTracker::ASTCallbackVH
&
593 AliasSetTracker::ASTCallbackVH::operator=(Value
*V
) {
594 return *this = ASTCallbackVH(V
, AST
);
597 //===----------------------------------------------------------------------===//
598 // AliasSetPrinter Pass
599 //===----------------------------------------------------------------------===//
602 class VISIBILITY_HIDDEN AliasSetPrinter
: public FunctionPass
{
603 AliasSetTracker
*Tracker
;
605 static char ID
; // Pass identification, replacement for typeid
606 AliasSetPrinter() : FunctionPass(&ID
) {}
608 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const {
609 AU
.setPreservesAll();
610 AU
.addRequired
<AliasAnalysis
>();
613 virtual bool runOnFunction(Function
&F
) {
614 Tracker
= new AliasSetTracker(getAnalysis
<AliasAnalysis
>());
616 for (inst_iterator I
= inst_begin(F
), E
= inst_end(F
); I
!= E
; ++I
)
618 Tracker
->print(errs());
625 char AliasSetPrinter::ID
= 0;
626 static RegisterPass
<AliasSetPrinter
>
627 X("print-alias-sets", "Alias Set Printer", false, true);