Implement an AliasSetTracker::copyValue method
authorChris Lattner <sabre@nondot.org>
Tue, 14 Sep 2004 19:15:32 +0000 (19:15 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 14 Sep 2004 19:15:32 +0000 (19:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16344 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/AliasSetTracker.cpp

index e5f7f32f9c7f2ed94aa65e03cb4459a96d50a328..15b4945c59241f2caaa4f37a361413800dcf58cc 100644 (file)
@@ -67,12 +67,13 @@ void AliasSet::removeFromTracker(AliasSetTracker &AST) {
 }
 
 void AliasSet::addPointer(AliasSetTracker &AST, HashNodePair &Entry,
-                          unsigned Size) {
+                          unsigned Size, bool KnownMustAlias) {
   assert(!Entry.second.hasAliasSet() && "Entry already in set!");
 
   AliasAnalysis &AA = AST.getAliasAnalysis();
 
-  if (isMustAlias())    // Check to see if we have to downgrade to _may_ alias
+  // Check to see if we have to downgrade to _may_ alias.
+  if (isMustAlias() && !KnownMustAlias)
     if (HashNodePair *P = getSomePointer()) {
       AliasAnalysis::AliasResult Result =
         AA.alias(P->first, P->second.getSize(), Entry.first, Size);
@@ -400,7 +401,10 @@ bool AliasSetTracker::remove(Instruction *I) {
 // dangling pointers to deleted instructions.
 //
 void AliasSetTracker::deleteValue(Value *PtrVal) {
-  // First, look up the PointerRec for this pointer...
+  // Notify the alias analysis implementation that this value is gone.
+  AA.deleteValue(PtrVal);
+
+  // First, look up the PointerRec for this pointer.
   hash_map<Value*, AliasSet::PointerRec>::iterator I = PointerMap.find(PtrVal);
   if (I == PointerMap.end()) return;  // Noop
 
@@ -415,6 +419,29 @@ void AliasSetTracker::deleteValue(Value *PtrVal) {
   PointerMap.erase(I);
 }
 
+// copyValue - This method should be used whenever a preexisting value in the
+// program is copied or cloned, introducing a new value.  Note that it is ok for
+// clients that use this method to introduce the same value multiple times: if
+// the tracker already knows about a value, it will ignore the request.
+//
+void AliasSetTracker::copyValue(Value *From, Value *To) {
+  // Notify the alias analysis implementation that this value is copied.
+  AA.copyValue(From, To);
+
+  // First, look up the PointerRec for this pointer.
+  hash_map<Value*, AliasSet::PointerRec>::iterator I = PointerMap.find(From);
+  if (I == PointerMap.end() || !I->second.hasAliasSet())
+    return;  // Noop
+
+  AliasSet::HashNodePair &Entry = getEntryFor(To);
+  if (Entry.second.hasAliasSet()) return;    // Already in the tracker!
+
+  // Add it to the alias set it aliases...
+  AliasSet *AS = I->second.getAliasSet(*this);
+  AS->addPointer(*this, Entry, I->second.getSize(), true);
+}
+
+
 
 //===----------------------------------------------------------------------===//
 //               AliasSet/AliasSetTracker Printing Support