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;
}