]> granicus.if.org Git - llvm/commitdiff
[DemandedBits] Use SetVector for Worklist
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 7 Jan 2019 18:03:36 +0000 (18:03 +0000)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 7 Jan 2019 18:03:36 +0000 (18:03 +0000)
DemandedBits currently uses a simple vector for the worklist, which
means that instructions may be inserted multiple times into it.
Especially in combination with the deep lattice, this may cause
instructions too be recomputed very often. To avoid this, switch
to a SetVector.

Differential Revision: https://reviews.llvm.org/D56362

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350547 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DemandedBits.cpp

index ba310d8d3210aefc78b14eee4d75807b98c4abb7..016399ff592e3efe31627bf95f76f7a6d792963f 100644 (file)
@@ -21,8 +21,7 @@
 
 #include "llvm/Analysis/DemandedBits.h"
 #include "llvm/ADT/APInt.h"
-#include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/SetVector.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/Analysis/AssumptionCache.h"
 #include "llvm/Analysis/ValueTracking.h"
@@ -315,7 +314,7 @@ void DemandedBits::performAnalysis() {
   AliveBits.clear();
   DeadUses.clear();
 
-  SmallVector<Instruction*, 128> Worklist;
+  SmallSetVector<Instruction*, 128> Worklist;
 
   // Collect the set of "root" instructions that are known live.
   for (Instruction &I : instructions(F)) {
@@ -330,7 +329,7 @@ void DemandedBits::performAnalysis() {
     Type *T = I.getType();
     if (T->isIntOrIntVectorTy()) {
       if (AliveBits.try_emplace(&I, T->getScalarSizeInBits(), 0).second)
-        Worklist.push_back(&I);
+        Worklist.insert(&I);
 
       continue;
     }
@@ -341,7 +340,7 @@ void DemandedBits::performAnalysis() {
         Type *T = J->getType();
         if (T->isIntOrIntVectorTy())
           AliveBits[J] = APInt::getAllOnesValue(T->getScalarSizeInBits());
-        Worklist.push_back(J);
+        Worklist.insert(J);
       }
     }
     // To save memory, we don't add I to the Visited set here. Instead, we
@@ -412,11 +411,11 @@ void DemandedBits::performAnalysis() {
           APInt ABNew = AB | ABPrev;
           if (ABNew != ABPrev || ABI == AliveBits.end()) {
             AliveBits[I] = std::move(ABNew);
-            Worklist.push_back(I);
+            Worklist.insert(I);
           }
         }
       } else if (I && !Visited.count(I)) {
-        Worklist.push_back(I);
+        Worklist.insert(I);
       }
     }
   }