Let scalar-evolution analyze loops with an unsigned comparison for the exit
[oota-llvm.git] / lib / Analysis / AliasSetTracker.cpp
index 83ba69a69d0780ca072230c481347adf4d5f019b..0397af7e979fce11be064f15f8cb82d6bc21f05a 100644 (file)
@@ -18,8 +18,9 @@
 #include "llvm/Type.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Assembly/Writer.h"
+#include "llvm/Support/Compiler.h"
 #include "llvm/Support/InstIterator.h"
-#include <iostream>
+#include "llvm/Support/Streams.h"
 using namespace llvm;
 
 /// mergeSetIn - Merge the specified alias set into this alias set.
@@ -350,25 +351,40 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
       // Loop over all of the pointers in this alias set...
       AliasSet::iterator I = AS.begin(), E = AS.end();
       bool X;
-      for (; I != E; ++I)
-        addPointer(I.getPointer(), I.getSize(),
-                   (AliasSet::AccessType)AS.AccessTy, X);
+      for (; I != E; ++I) {
+        AliasSet &NewAS = addPointer(I.getPointer(), I.getSize(),
+                                     (AliasSet::AccessType)AS.AccessTy, X);
+        if (AS.isVolatile()) NewAS.setVolatile();
+      }
     }
 }
 
 /// remove - Remove the specified (potentially non-empty) alias set from the
 /// tracker.
 void AliasSetTracker::remove(AliasSet &AS) {
-  bool SetDead;
-  do {
-    AliasSet::iterator I = AS.begin();
-    Value *Ptr = I.getPointer(); ++I;
-
-    // deleteValue will delete the set automatically when the last pointer
-    // reference is destroyed.  "Predict" when this will happen.
-    SetDead = I == AS.end();
-    deleteValue(Ptr);  // Delete all of the pointers from the set
-  } while (!SetDead);
+  // Drop all call sites.
+  AS.CallSites.clear();
+  
+  // Clear the alias set.
+  unsigned NumRefs = 0;
+  while (!AS.empty()) {
+    AliasSet::HashNodePair *P = AS.PtrList;
+    
+    // Unlink from the list of values.
+    P->second.removeFromList();
+    
+    // Remember how many references need to be dropped.
+    ++NumRefs;
+
+    // Finally, remove the entry.
+    Value *Remove = P->first;   // Take a copy because it is invalid to pass
+    PointerMap.erase(Remove);   // a reference to the data being erased.
+  }
+  
+  // Stop using the alias set, removing it.
+  AS.RefCount -= NumRefs;
+  if (AS.RefCount == 0)
+    AS.removeFromTracker(*this);
 }
 
 bool AliasSetTracker::remove(Value *Ptr, unsigned Size) {
@@ -530,17 +546,20 @@ void AliasSetTracker::print(std::ostream &OS) const {
   OS << "\n";
 }
 
-void AliasSet::dump() const { print (std::cerr); }
-void AliasSetTracker::dump() const { print(std::cerr); }
+void AliasSet::dump() const { print (cerr); }
+void AliasSetTracker::dump() const { print(cerr); }
 
 //===----------------------------------------------------------------------===//
 //                            AliasSetPrinter Pass
 //===----------------------------------------------------------------------===//
 
 namespace {
-  class AliasSetPrinter : public FunctionPass {
+  class VISIBILITY_HIDDEN AliasSetPrinter : public FunctionPass {
     AliasSetTracker *Tracker;
   public:
+    static char ID; // Pass identification, replacement for typeid
+    AliasSetPrinter() : FunctionPass((intptr_t)&ID) {}
+
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.setPreservesAll();
       AU.addRequired<AliasAnalysis>();
@@ -551,10 +570,11 @@ namespace {
 
       for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
         Tracker->add(&*I);
-      Tracker->print(std::cerr);
+      Tracker->print(cerr);
       delete Tracker;
       return false;
     }
   };
-  RegisterOpt<AliasSetPrinter> X("print-alias-sets", "Alias Set Printer");
+  char AliasSetPrinter::ID = 0;
+  RegisterPass<AliasSetPrinter> X("print-alias-sets", "Alias Set Printer");
 }