]> granicus.if.org Git - llvm/commitdiff
[DemandedBits] Remove some redundancy in the work list
authorFangrui Song <maskray@google.com>
Sun, 3 Mar 2019 14:50:01 +0000 (14:50 +0000)
committerFangrui Song <maskray@google.com>
Sun, 3 Mar 2019 14:50:01 +0000 (14:50 +0000)
InputIsKnownDead check is shared by all operands. Compute it once.

For non-integer instructions, use Visited.insert(I).second to replace a
find() and an insert().

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

lib/Analysis/DemandedBits.cpp

index 48412d204dcc7db790982e4f24f633d0bce0c6be..01b8ff10d35594028432a438360f11997b74a83b 100644 (file)
@@ -339,6 +339,8 @@ void DemandedBits::performAnalysis() {
         Type *T = J->getType();
         if (T->isIntOrIntVectorTy())
           AliveBits[J] = APInt::getAllOnesValue(T->getScalarSizeInBits());
+        else
+          Visited.insert(J);
         Worklist.insert(J);
       }
     }
@@ -354,16 +356,18 @@ void DemandedBits::performAnalysis() {
 
     LLVM_DEBUG(dbgs() << "DemandedBits: Visiting: " << *UserI);
     APInt AOut;
+    bool InputIsKnownDead = false;
     if (UserI->getType()->isIntOrIntVectorTy()) {
       AOut = AliveBits[UserI];
       LLVM_DEBUG(dbgs() << " Alive Out: 0x"
                         << Twine::utohexstr(AOut.getLimitedValue()));
+
+      // If all bits of the output are dead, then all bits of the input
+      // are also dead.
+      InputIsKnownDead = !AOut && !isAlwaysLive(UserI);
     }
     LLVM_DEBUG(dbgs() << "\n");
 
-    if (!UserI->getType()->isIntOrIntVectorTy())
-      Visited.insert(UserI);
-
     KnownBits Known, Known2;
     bool KnownBitsComputed = false;
     // Compute the set of alive bits for each operand. These are anded into the
@@ -380,10 +384,7 @@ void DemandedBits::performAnalysis() {
       if (T->isIntOrIntVectorTy()) {
         unsigned BitWidth = T->getScalarSizeInBits();
         APInt AB = APInt::getAllOnesValue(BitWidth);
-        if (UserI->getType()->isIntOrIntVectorTy() && !AOut &&
-            !isAlwaysLive(UserI)) {
-          // If all bits of the output are dead, then all bits of the input
-          // are also dead.
+        if (InputIsKnownDead) {
           AB = APInt(BitWidth, 0);
         } else {
           // Bits of each operand that are used to compute alive bits of the
@@ -408,7 +409,7 @@ void DemandedBits::performAnalysis() {
             Worklist.insert(I);
           }
         }
-      } else if (I && !Visited.count(I)) {
+      } else if (I && Visited.insert(I).second) {
         Worklist.insert(I);
       }
     }