Clear the intervals list in "destroy", patch by
[oota-llvm.git] / lib / Analysis / AliasSetTracker.cpp
index 1b20c7aebf32d223d3f0a3ea83ab70608f868008..398bf5aca5b4371ee5251711611e37466856b059 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -284,11 +284,13 @@ bool AliasSetTracker::add(StoreInst *SI) {
 
 bool AliasSetTracker::add(FreeInst *FI) {
   bool NewPtr;
-  AliasSet &AS = addPointer(FI->getOperand(0), ~0,
-                            AliasSet::Mods, NewPtr);
+  addPointer(FI->getOperand(0), ~0, AliasSet::Mods, NewPtr);
+  return NewPtr;
+}
 
-  // Free operations are volatile ops (cannot be moved).
-  AS.setVolatile();
+bool AliasSetTracker::add(VAArgInst *VAAI) {
+  bool NewPtr;
+  addPointer(VAAI->getOperand(0), ~0, AliasSet::ModRef, NewPtr);
   return NewPtr;
 }
 
@@ -321,6 +323,8 @@ bool AliasSetTracker::add(Instruction *I) {
     return add(II);
   else if (FreeInst *FI = dyn_cast<FreeInst>(I))
     return add(FI);
+  else if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I))
+    return add(VAAI);
   return true;
 }
 
@@ -414,6 +418,13 @@ bool AliasSetTracker::remove(FreeInst *FI) {
   return true;
 }
 
+bool AliasSetTracker::remove(VAArgInst *VAAI) {
+  AliasSet *AS = findAliasSetForPointer(VAAI->getOperand(0), ~0);
+  if (!AS) return false;
+  remove(*AS);
+  return true;
+}
+
 bool AliasSetTracker::remove(CallSite CS) {
   if (AA.doesNotAccessMemory(CS))
     return false; // doesn't alias anything
@@ -434,6 +445,8 @@ bool AliasSetTracker::remove(Instruction *I) {
     return remove(CI);
   else if (FreeInst *FI = dyn_cast<FreeInst>(I))
     return remove(FI);
+  else if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I))
+    return remove(VAAI);
   return true;
 }
 
@@ -500,7 +513,7 @@ void AliasSetTracker::copyValue(Value *From, Value *To) {
 
 void AliasSet::print(std::ostream &OS) const {
   OS << "  AliasSet[" << (void*)this << "," << RefCount << "] ";
-  OS << (AliasTy == MustAlias ? "must" : "may ") << " alias, ";
+  OS << (AliasTy == MustAlias ? "must" : "may") << " alias, ";
   switch (AccessTy) {
   case NoModRef: OS << "No access "; break;
   case Refs    : OS << "Ref       "; break;
@@ -568,6 +581,8 @@ namespace {
       return false;
     }
   };
-  char AliasSetPrinter::ID = 0;
-  RegisterPass<AliasSetPrinter> X("print-alias-sets", "Alias Set Printer");
 }
+
+char AliasSetPrinter::ID = 0;
+static RegisterPass<AliasSetPrinter>
+X("print-alias-sets", "Alias Set Printer", false, true);