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