Put all IVUsers in the processed set. Allow querying IVUsers with isIVUserOrOperand.
authorAndrew Trick <atrick@apple.com>
Fri, 6 Jan 2012 21:41:55 +0000 (21:41 +0000)
committerAndrew Trick <atrick@apple.com>
Fri, 6 Jan 2012 21:41:55 +0000 (21:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147686 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/IVUsers.h
lib/Analysis/IVUsers.cpp

index 2fb607cc5c37f1bc1ee338ef4650b9ccbd7b02fa..2a3bb9bc48061babe68c5f19132109e0f3126d1b 100644 (file)
@@ -166,6 +166,10 @@ public:
   const_iterator end() const   { return IVUses.end(); }
   bool empty() const { return IVUses.empty(); }
 
+  bool isIVUserOrOperand(Instruction *Inst) const {
+    return Processed.count(Inst);
+  }
+
   void print(raw_ostream &OS, const Module* = 0) const;
 
   /// dump - This method is used for debugging.
index d0ca8920ab9f0f96232f94e313d4e60e0b934d35..cad22f8f1a6c9bfcefda0df2b0006f023f86eb28 100644 (file)
@@ -83,6 +83,11 @@ static bool isInteresting(const SCEV *S, const Instruction *I, const Loop *L,
 /// reducible SCEV, recursively add its users to the IVUsesByStride set and
 /// return true.  Otherwise, return false.
 bool IVUsers::AddUsersIfInteresting(Instruction *I) {
+  // Add this IV user to the Processed set before returning false to ensure that
+  // all IV users are members of the set. See IVUsers::isIVUserOrOperand.
+  if (!Processed.insert(I))
+    return true;    // Instruction already handled.
+
   if (!SE->isSCEVable(I->getType()))
     return false;   // Void and FP expressions cannot be reduced.
 
@@ -93,9 +98,6 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I) {
   if (Width > 64 || (TD && !TD->isLegalInteger(Width)))
     return false;
 
-  if (!Processed.insert(I))
-    return true;    // Instruction already handled.
-
   // Get the symbolic expression for this instruction.
   const SCEV *ISE = SE->getSCEV(I);
 
@@ -268,6 +270,7 @@ void IVStrideUse::transformToPostInc(const Loop *L) {
 
 void IVStrideUse::deleted() {
   // Remove this user from the list.
+  Parent->Processed.erase(this->getUser());
   Parent->IVUses.erase(this);
   // this now dangles!
 }