Minor cleanup of value-has-users checks

Change-Id: Ifcb17a8a1b36bd3513a6389e515795ca309fb634
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
index 79081ee..72ac893 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
@@ -88,7 +88,7 @@
               if (value.definition != evaluatedConst) {
                 if (value.isPhi()) {
                   // D8 relies on dead code removal to get rid of the dead phi itself.
-                  if (value.numberOfAllUsers() != 0) {
+                  if (value.hasAnyUsers()) {
                     BasicBlock block = value.asPhi().getBlock();
                     blockToAnalyze.add(block);
                     // Create a new constant, because it can be an existing constant that flow
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 955182b..bd5ea0a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -878,13 +878,13 @@
   private boolean verifyNoValueWithOnlyAssumeInstructionAsUsers() {
     Predicate<Value> verifyValue =
         v -> {
-          assert v.numberOfUsers() == 0
-              || v.uniqueUsers().stream().anyMatch(i -> !i.isAssume())
-              || (!v.isPhi() && v.definition.isArgument())
-              || v.numberOfDebugUsers() == 0
-              || v.debugUsers().stream().anyMatch(i -> !i.isAssume())
-              || v.numberOfPhiUsers() > 0
-                  : StringUtils.join(v.uniqueUsers(), System.lineSeparator());
+          assert !v.hasUsers()
+                  || v.uniqueUsers().stream().anyMatch(i -> !i.isAssume())
+                  || (!v.isPhi() && v.definition.isArgument())
+                  || !v.hasDebugUsers()
+                  || v.debugUsers().stream().anyMatch(i -> !i.isAssume())
+                  || v.numberOfPhiUsers() > 0
+              : StringUtils.join(v.uniqueUsers(), System.lineSeparator());
           return true;
         };
     return verifySSATypeLattice(wrapSSAVerifierWithStackValueHandling(verifyValue));
diff --git a/src/main/java/com/android/tools/r8/ir/code/Phi.java b/src/main/java/com/android/tools/r8/ir/code/Phi.java
index ae145b3..47eb9d4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Phi.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Phi.java
@@ -290,7 +290,7 @@
 
   public void removeDeadPhi() {
     // First, make sure it is indeed dead, i.e., no non-phi users.
-    assert numberOfUsers() == 0;
+    assert !hasUsers();
     // Then, manually clean up this from all of the operands.
     for (Value operand : getOperands()) {
       operand.removePhiUser(this);
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index 218a755..c7aeff1 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -467,6 +467,22 @@
     return debugData == null ? null : Collections.unmodifiableSet(debugData.users.keySet());
   }
 
+  public boolean hasAnyUsers() {
+    return hasUsers() || hasPhiUsers() || hasDebugUsers();
+  }
+
+  public boolean hasDebugUsers() {
+    return debugData != null && !debugData.users.isEmpty();
+  }
+
+  public boolean hasPhiUsers() {
+    return !phiUsers.isEmpty();
+  }
+
+  public boolean hasUsers() {
+    return !users.isEmpty();
+  }
+
   public int numberOfUsers() {
     int size = users.size();
     if (size <= 1) {
@@ -475,10 +491,6 @@
     return uniqueUsers().size();
   }
 
-  public boolean hasPhiUsers() {
-    return numberOfPhiUsers() > 0;
-  }
-
   public int numberOfPhiUsers() {
     int size = phiUsers.size();
     if (size <= 1) {
@@ -491,10 +503,6 @@
     return numberOfUsers() + numberOfPhiUsers();
   }
 
-  public boolean hasDebugUsers() {
-    return numberOfDebugUsers() > 0;
-  }
-
   public int numberOfDebugUsers() {
     return debugData == null ? 0 : debugData.users.size();
   }
@@ -1008,7 +1016,7 @@
 
     // If the value has debug users we cannot eliminate it since it represents a value in a local
     // variable that should be visible in the debugger.
-    if (numberOfDebugUsers() != 0) {
+    if (hasDebugUsers()) {
       return false;
     }
     // This is a candidate for a dead value. Guard against looping by adding it to the set of
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 0eaf180..f2c9031 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -1093,12 +1093,12 @@
           // If the original input to the switch is now unused, remove it too. It is not dead
           // as it might have side-effects but we ignore these here.
           Instruction arrayGet = info.arrayGet;
-          if (arrayGet.outValue().numberOfUsers() == 0) {
+          if (!arrayGet.outValue().hasUsers()) {
             arrayGet.inValues().forEach(v -> v.removeUser(arrayGet));
             arrayGet.getBlock().removeInstruction(arrayGet);
           }
           Instruction staticGet = info.staticGet;
-          if (staticGet.outValue().numberOfUsers() == 0) {
+          if (!staticGet.outValue().hasUsers()) {
             assert staticGet.inValues().isEmpty();
             staticGet.getBlock().removeInstruction(staticGet);
           }
@@ -1399,7 +1399,7 @@
     while (it.hasNext()) {
       Instruction current = it.next();
       if (current.isCheckCast()) {
-        boolean hasPhiUsers = current.outValue().numberOfPhiUsers() != 0;
+        boolean hasPhiUsers = current.outValue().hasPhiUsers();
         RemoveCheckCastInstructionIfTrivialResult removeResult =
             removeCheckCastInstructionIfTrivial(current.asCheckCast(), it, code, affectedValues);
         if (removeResult != RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS) {
@@ -1409,7 +1409,7 @@
           affectedValues.clear();
         }
       } else if (current.isInstanceOf()) {
-        boolean hasPhiUsers = current.outValue().numberOfPhiUsers() != 0;
+        boolean hasPhiUsers = current.outValue().hasPhiUsers();
         if (removeInstanceOfInstructionIfTrivial(current.asInstanceOf(), it, code)) {
           needToRemoveTrivialPhis |= hasPhiUsers;
         }
@@ -1756,8 +1756,8 @@
             dominatorTreeMemoization,
             addConstantInBlock,
             insn ->
-                (insn.isConstNumber() && insn.outValue().numberOfAllUsers() != 0)
-                    || (insn.isConstString() && insn.outValue().numberOfAllUsers() != 0));
+                (insn.isConstNumber() && insn.outValue().hasAnyUsers())
+                    || (insn.isConstString() && insn.outValue().hasAnyUsers()));
       } else {
         // For all following blocks only process ConstString with just one use.
         shortenLiveRangesInsideBlock(
@@ -1785,12 +1785,12 @@
         // except if they are used by phi instructions or they are a string constants.
         assert constants instanceof LinkedHashMap;
         for (Instruction constantInstruction : constants.values()) {
-          if (constantInstruction.outValue().numberOfPhiUsers() == 0
+          if (!constantInstruction.outValue().hasPhiUsers()
               && !constantInstruction.isConstString()) {
             assert constantInstruction.isConstNumber();
             ConstNumber constNumber = constantInstruction.asConstNumber();
             Value constantValue = constantInstruction.outValue();
-            assert constantValue.numberOfUsers() != 0;
+            assert constantValue.hasUsers();
             assert constantValue.numberOfUsers() == constantValue.numberOfAllUsers();
             for (Instruction user : constantValue.uniqueUsers()) {
               ConstNumber newCstNum = ConstNumber.copyOf(code, constNumber);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
index 451788f..29ad438 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -97,8 +97,7 @@
 
       InvokeStatic serviceLoaderLoad = instruction.asInvokeStatic();
       Value serviceLoaderLoadOut = serviceLoaderLoad.outValue();
-      if (serviceLoaderLoadOut.numberOfAllUsers() != 1
-          || serviceLoaderLoadOut.numberOfPhiUsers() != 0) {
+      if (serviceLoaderLoadOut.numberOfAllUsers() != 1 || serviceLoaderLoadOut.hasPhiUsers()) {
         continue;
       }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 1203a35..084f3d3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -447,7 +447,7 @@
       Assume<?> assumeInstruction = user.asAssume();
       Value src = assumeInstruction.src();
       Value dest = assumeInstruction.outValue();
-      assert dest.numberOfPhiUsers() == 0;
+      assert !dest.hasPhiUsers();
       dest.replaceUsers(src);
       removeInstruction(user);
     }
@@ -550,7 +550,7 @@
       for (FieldValueHelper fieldValueHelper : fieldHelpers.values()) {
         fieldValueHelper.replaceValue(value, newValue);
       }
-      assert value.numberOfAllUsers() == 0;
+      assert !value.hasAnyUsers();
       // `newValue` could be a phi introduced by FieldValueHelper. Its initial type is set as the
       // type of read field, but it could be more precise than that due to (multiple) inlining.
       // In addition to values affected by `newValue`, it's necessary to revisit `newValue` itself.
@@ -655,7 +655,7 @@
       Set<Instruction> indirectUsers) {
     if (!eligibility.returnsReceiver
         || invoke.outValue() == null
-        || invoke.outValue().numberOfAllUsers() == 0) {
+        || !invoke.outValue().hasAnyUsers()) {
       return true;
     }
     // For CF we no longer perform the code-rewrite in CodeRewriter.rewriteMoveResult that removes
@@ -885,7 +885,7 @@
     }
 
     if (parameterUsage.isReturned) {
-      if (!(invoke.outValue() == null || invoke.outValue().numberOfAllUsers() == 0)) {
+      if (invoke.outValue() != null && invoke.outValue().hasAnyUsers()) {
         // Used as return value which is not ignored.
         return false;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index 05039c3..7625078 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -176,7 +176,7 @@
         trivialPhis.clear();
         boolean onlyHasTrivialPhis = testAndCollectPhisComposedOfThis(
             visited, thisValue.uniquePhiUsers(), thisValue, trivialPhis);
-        if (thisValue.numberOfPhiUsers() != 0 && !onlyHasTrivialPhis) {
+        if (thisValue.hasPhiUsers() && !onlyHasTrivialPhis) {
           fixableThisPointer = false;
           break;
         }
@@ -204,7 +204,7 @@
           trivialPhis.clear();
           boolean onlyHasTrivialPhis = testAndCollectPhisComposedOfSameFieldRead(
               visited, dest.uniquePhiUsers(), read.getField(), trivialPhis);
-          if (dest.numberOfPhiUsers() != 0 && !onlyHasTrivialPhis) {
+          if (dest.hasPhiUsers() && !onlyHasTrivialPhis) {
             fixableFieldReadsPerUsage = false;
             break;
           }
@@ -388,7 +388,7 @@
     Set<Phi> trivialPhis = Sets.newIdentityHashSet();
     boolean onlyHasTrivialPhis = testAndCollectPhisComposedOfThis(
         Sets.newIdentityHashSet(), thisValue.uniquePhiUsers(), thisValue, trivialPhis);
-    assert thisValue.numberOfPhiUsers() == 0 || onlyHasTrivialPhis;
+    assert !thisValue.hasPhiUsers() || onlyHasTrivialPhis;
     assert trivialPhis.isEmpty() || onlyHasTrivialPhis;
 
     Set<Instruction> users = SetUtils.newIdentityHashSet(thisValue.aliasedUsers());
@@ -403,7 +403,7 @@
     trivialPhis.forEach(Phi::removeDeadPhi);
 
     // No matter what, number of phi users should be zero too.
-    assert thisValue.numberOfUsers() == 0 && thisValue.numberOfPhiUsers() == 0;
+    assert !thisValue.hasUsers() && !thisValue.hasPhiUsers();
   }
 
   // Re-processing finalized code may create slightly different IR code than what the examining
@@ -479,7 +479,7 @@
     Set<Phi> trivialPhis = Sets.newIdentityHashSet();
     boolean onlyHasTrivialPhis = testAndCollectPhisComposedOfSameFieldRead(
         Sets.newIdentityHashSet(), dest.uniquePhiUsers(), field, trivialPhis);
-    assert dest.numberOfPhiUsers() == 0 || onlyHasTrivialPhis;
+    assert !dest.hasPhiUsers() || onlyHasTrivialPhis;
     assert trivialPhis.isEmpty() || onlyHasTrivialPhis;
 
     Set<Instruction> users = SetUtils.newIdentityHashSet(dest.aliasedUsers());
@@ -494,7 +494,7 @@
     trivialPhis.forEach(Phi::removeDeadPhi);
 
     // No matter what, number of phi users should be zero too.
-    assert dest.numberOfUsers() == 0 && dest.numberOfPhiUsers() == 0;
+    assert !dest.hasUsers() && !dest.hasPhiUsers();
   }
 
   private void fixupStaticizedValueUsers(IRCode code, Set<Instruction> users) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
index 2751153..41e1264 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
@@ -320,7 +320,7 @@
 
       Value out = invoke.outValue();
       // Skip the call if the computed name is already discarded or not used anywhere.
-      if (out == null || out.numberOfAllUsers() == 0) {
+      if (out == null || !out.hasAnyUsers()) {
         continue;
       }