Account for indirect phi users when computing parameter usage info
Change-Id: I988c1cef99fd60d75f948a960f85a3ad2fa756fd
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index a6a088a..bbf2f22 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -95,6 +95,7 @@
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.MethodSignatureEquivalence;
import com.android.tools.r8.utils.Pair;
+import com.android.tools.r8.utils.WorkList;
import com.google.common.base.Equivalence.Wrapper;
import com.google.common.collect.Sets;
import java.util.ArrayDeque;
@@ -287,9 +288,6 @@
List<Value> values = code.collectArguments();
for (int i = 0; i < values.size(); i++) {
Value value = values.get(i);
- if (value.numberOfPhiUsers() > 0) {
- continue;
- }
ParameterUsage usage = collectParameterUsages(i, value);
if (usage != null) {
usages.add(usage);
@@ -302,12 +300,23 @@
: new ParameterUsagesInfo(usages));
}
- private ParameterUsage collectParameterUsages(int i, Value value) {
- ParameterUsageBuilder builder = new ParameterUsageBuilder(value, i, dexItemFactory);
- for (Instruction user : value.aliasedUsers()) {
- if (!builder.note(user)) {
+ private ParameterUsage collectParameterUsages(int i, Value root) {
+ ParameterUsageBuilder builder = new ParameterUsageBuilder(root, i, dexItemFactory);
+ WorkList<Value> worklist = WorkList.newIdentityWorkList();
+ worklist.addIfNotSeen(root);
+ while (worklist.hasNext()) {
+ Value value = worklist.next();
+ if (value.hasPhiUsers()) {
return null;
}
+ for (Instruction user : value.uniqueUsers()) {
+ if (!builder.note(user)) {
+ return null;
+ }
+ if (user.isAssume()) {
+ worklist.addIfNotSeen(user.outValue());
+ }
+ }
}
return builder.build();
}