Revert "Extend the range of assume instructions, part 6."

This reverts commit 81a9953879f98c96581bc61677b8d386886bd494.

Reason for revert: b/142607578 and b/142610292

Change-Id: I0b90d026ae8e0fafc39e11fde7639acc793d6711
diff --git a/src/main/java/com/android/tools/r8/ir/code/Assume.java b/src/main/java/com/android/tools/r8/ir/code/Assume.java
index 8bbedb3..9ba29fd 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Assume.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Assume.java
@@ -288,13 +288,11 @@
 
   @Override
   public String toString() {
-    // `origin` could become obsolete:
-    //   1) during branch simplification, the origin `if` could be simplified, which means the
-    //     assumption became "truth."
-    //   2) invoke-interface could be devirtualized, while its dynamic type and/or non-null receiver
-    //     are still valid.
+    // During branch simplification, the origin `if` could be simplified.
+    // It means the assumption became "truth."
+    assert origin.hasBlock() || isAssumeNonNull();
     String originString =
-        origin.hasBlock() ? " (origin: `" + origin.toString() + "`)" : " (obsolete origin)";
+        origin.hasBlock() ? " (origin: `" + origin.toString() + "`)" : " (origin simplified)";
     if (isAssumeNone() || isAssumeNonNull()) {
       return super.toString() + originString;
     }
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 a4421c9..33b06c5 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
@@ -431,20 +431,16 @@
 
   public Set<Instruction> aliasedUsers() {
     Set<Instruction> users = SetUtils.newIdentityHashSet(uniqueUsers());
-    Set<Instruction> visited = Sets.newIdentityHashSet();
-    collectAliasedUsersViaAssume(visited, uniqueUsers(), users);
+    collectAliasedUsersViaAssume(uniqueUsers(), users);
     return users;
   }
 
   private static void collectAliasedUsersViaAssume(
-      Set<Instruction> visited, Set<Instruction> usersToTest, Set<Instruction> collectedUsers) {
+      Set<Instruction> usersToTest, Set<Instruction> collectedUsers) {
     for (Instruction user : usersToTest) {
-      if (!visited.add(user)) {
-        continue;
-      }
       if (user.isAssume()) {
         collectedUsers.addAll(user.outValue().uniqueUsers());
-        collectAliasedUsersViaAssume(visited, user.outValue().uniqueUsers(), collectedUsers);
+        collectAliasedUsersViaAssume(user.outValue().uniqueUsers(), collectedUsers);
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 7ef6cd5..995a583 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -620,12 +620,8 @@
     }
 
     // Update the IR code if collected call site optimization info has something useful.
-    // While aggregation of parameter information at call sites would be more precise than static
-    // types, those could be still less precise at one single call site, where specific arguments
-    // will be passed during (double) inlining. Instead of adding assumptions and removing invalid
-    // ones, it's better not to insert assumptions for inlinee in the beginning.
     CallSiteOptimizationInfo callSiteOptimizationInfo = method.getCallSiteOptimizationInfo();
-    if (method == context && appView.callSiteOptimizationInfoPropagator() != null) {
+    if (appView.callSiteOptimizationInfoPropagator() != null) {
       appView.callSiteOptimizationInfoPropagator()
           .applyCallSiteOptimizationInfo(ir, callSiteOptimizationInfo);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index ff63c28..dd3416f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -685,7 +685,6 @@
                   CallSiteInformation.empty(),
                   Outliner::noProcessing),
           executorService);
-      feedback.updateVisibleOptimizationInfo();
       timing.end();
     }
 
@@ -853,7 +852,6 @@
                 // unused out-values.
                 codeRewriter.rewriteMoveResult(code);
                 deadCodeRemover.run(code);
-                codeRewriter.removeAssumeInstructions(code);
                 consumer.accept(code, method);
                 return null;
               }));
@@ -1391,6 +1389,24 @@
       classStaticizer.examineMethodCode(method, code);
     }
 
+    if (nonNullTracker != null) {
+      // TODO(b/139246447): Once we extend this optimization to, e.g., constants of primitive args,
+      //   this may not be the right place to collect call site optimization info.
+      // Collecting call-site optimization info depends on the existence of non-null IRs.
+      // Arguments can be changed during the debug mode.
+      if (!isDebugMode && appView.callSiteOptimizationInfoPropagator() != null) {
+        appView.callSiteOptimizationInfoPropagator().collectCallSiteOptimizationInfo(code);
+      }
+      // Computation of non-null parameters on normal exits rely on the existence of non-null IRs.
+      methodOptimizationInfoCollector.computeNonNullParamOnNormalExits(feedback, code);
+    }
+    if (aliasIntroducer != null || nonNullTracker != null || dynamicTypeOptimization != null) {
+      codeRewriter.removeAssumeInstructions(code);
+      assert code.isConsistentSSA();
+    }
+    // Assert that we do not have unremoved non-sense code in the output, e.g., v <- non-null NULL.
+    assert code.verifyNoNullabilityBottomTypes();
+
     assert code.verifyTypes(appView);
 
     if (appView.enableWholeProgramOptimizations()) {
@@ -1402,29 +1418,31 @@
         fieldBitAccessAnalysis.recordFieldAccesses(code, feedback);
       }
 
-      // Arguments can be changed during the debug mode.
-      if (!isDebugMode && appView.callSiteOptimizationInfoPropagator() != null) {
-        appView.callSiteOptimizationInfoPropagator().collectCallSiteOptimizationInfo(code);
-      }
-
       // Compute optimization info summary for the current method unless it is pinned
       // (in that case we should not be making any assumptions about the behavior of the method).
       if (!appView.appInfo().withLiveness().isPinned(method.method)) {
+        methodOptimizationInfoCollector.identifyClassInlinerEligibility(method, code, feedback);
+        methodOptimizationInfoCollector.identifyParameterUsages(method, code, feedback);
+        methodOptimizationInfoCollector.identifyReturnsArgument(method, code, feedback);
+        methodOptimizationInfoCollector.identifyTrivialInitializer(method, code, feedback);
+
+        if (options.enableInlining && inliner != null) {
+          methodOptimizationInfoCollector
+              .identifyInvokeSemanticsForInlining(method, code, appView, feedback);
+        }
+
         methodOptimizationInfoCollector
-            .collectMethodOptimizationInfo(method, code, feedback, dynamicTypeOptimization);
+            .computeDynamicReturnType(dynamicTypeOptimization, feedback, method, code);
         FieldValueAnalysis.run(appView, code, feedback, method);
+        methodOptimizationInfoCollector
+            .computeInitializedClassesOnNormalExit(feedback, method, code);
+        methodOptimizationInfoCollector.computeMayHaveSideEffects(feedback, method, code);
+        methodOptimizationInfoCollector
+            .computeReturnValueOnlyDependsOnArguments(feedback, method, code);
+        methodOptimizationInfoCollector.computeNonNullParamOrThrow(feedback, method, code);
       }
     }
 
-    if (aliasIntroducer != null || nonNullTracker != null || dynamicTypeOptimization != null) {
-      codeRewriter.removeAssumeInstructions(code);
-      assert code.isConsistentSSA();
-    }
-    // Assert that we do not have unremoved non-sense code in the output, e.g., v <- non-null NULL.
-    assert code.verifyNoNullabilityBottomTypes();
-
-    assert code.verifyTypes(appView);
-
     previous =
         printMethod(code, "IR after computation of optimization info summary (SSA)", previous);
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java b/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java
index 73214ba..257d002 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssumeDynamicTypeRemover.java
@@ -53,7 +53,7 @@
   }
 
   public void markUsersForRemoval(Value value) {
-    for (Instruction user : value.aliasedUsers()) {
+    for (Instruction user : value.uniqueUsers()) {
       if (user.isAssumeDynamicType()) {
         assert value.numberOfAllUsers() == 1
             : "Expected value flowing into Assume<DynamicTypeAssumption> instruction to have a "
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
index c01e20c..4826545 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
@@ -47,8 +47,11 @@
   private enum Mode {
     COLLECT, // Set until the end of the 1st round of IR processing. CallSiteOptimizationInfo will
              // be updated in this mode only.
-    REVISIT  // Set once the all methods are processed. IRBuilder will add other instructions that
+    REVISIT, // Set once the all methods are processed. IRBuilder will add other instructions that
              // reflect collected CallSiteOptimizationInfo.
+    FINISH;  // Set once the 2nd round of IR processing is done. Other optimizations that need post
+             // IR processing, e.g., outliner, are still using IRBuilder, and this will isolate the
+             // impact of IR manipulation due to this optimization.
   }
 
   private final AppView<AppInfoWithLiveness> appView;
@@ -248,13 +251,14 @@
         }
       }
     }
-    mode = Mode.REVISIT;
     if (targetsToRevisit.isEmpty()) {
+      mode = Mode.FINISH;
       return;
     }
     if (revisitedMethods != null) {
       revisitedMethods.addAll(targetsToRevisit);
     }
+    mode = Mode.REVISIT;
     List<Future<?>> futures = new ArrayList<>();
     for (DexEncodedMethod method : targetsToRevisit) {
       futures.add(
@@ -265,5 +269,6 @@
               }));
     }
     ThreadUtils.awaitFutures(futures);
+    mode = Mode.FINISH;
   }
 }
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 be2127c..932c817 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
@@ -1247,10 +1247,10 @@
     assumeDynamicTypeRemover.finish();
     if (!blocksToBeRemoved.isEmpty()) {
       code.removeBlocks(blocksToBeRemoved);
-      code.removeAllTrivialPhis(affectedValues);
+      code.removeAllTrivialPhis();
       assert code.getUnreachableBlocks().isEmpty();
     } else if (mayHaveRemovedTrivialPhi || assumeDynamicTypeRemover.mayHaveIntroducedTrivialPhi()) {
-      code.removeAllTrivialPhis(affectedValues);
+      code.removeAllTrivialPhis();
     }
     if (!affectedValues.isEmpty()) {
       new TypeAnalysis(appView).narrowing(affectedValues);
@@ -1407,10 +1407,7 @@
     // Removing check-cast may result in a trivial phi:
     // v3 <- phi(v1, v1)
     if (needToRemoveTrivialPhis) {
-      code.removeAllTrivialPhis(affectedValues);
-      if (!affectedValues.isEmpty()) {
-        typeAnalysis.narrowing(affectedValues);
-      }
+      code.removeAllTrivialPhis();
     }
     assert code.isConsistentSSA();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
index cea6258..62d5bd8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -3,9 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize;
 
-import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
-import static com.android.tools.r8.ir.analysis.type.TypeLatticeElement.stringClassType;
-
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DebugLocalInfo;
 import com.android.tools.r8.graph.DexDefinition;
@@ -196,8 +193,7 @@
             appView.dexItemFactory().stringType,
             typeLattice.asClassTypeLatticeElement().getClassType())
         .isTrue();
-    Value returnedValue =
-        code.createValue(stringClassType(appView, definitelyNotNull()), debugLocalInfo);
+    Value returnedValue = code.createValue(typeLattice, debugLocalInfo);
     ConstString instruction =
         new ConstString(
             returnedValue, constant, ThrowingInfo.defaultForConstString(appView.options()));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
index 86d3645..fdfa3ee 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
@@ -422,12 +422,12 @@
         }
       }
     }
-    code.removeBlocks(blocksToBeRemoved);
-    code.removeAllTrivialPhis(valuesToNarrow);
-    code.removeUnreachableBlocks();
     if (!valuesToNarrow.isEmpty()) {
       new TypeAnalysis(appView).narrowing(valuesToNarrow);
     }
+    code.removeBlocks(blocksToBeRemoved);
+    code.removeAllTrivialPhis();
+    code.removeUnreachableBlocks();
     assert code.isConsistentSSA();
   }
 
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 e23fa01..78369e3 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
@@ -46,7 +46,6 @@
 import com.android.tools.r8.kotlin.Kotlin;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.MethodSignatureEquivalence;
 import com.google.common.base.Equivalence.Wrapper;
 import com.google.common.collect.Sets;
@@ -71,6 +70,7 @@
     this.dexItemFactory = appView.dexItemFactory();
   }
 
+  // TODO(b/141656615): Use this and then make all utils in this collector `private`.
   public void collectMethodOptimizationInfo(
       DexEncodedMethod method,
       IRCode code,
@@ -91,7 +91,7 @@
     computeNonNullParamOnNormalExits(feedback, code);
   }
 
-  private void identifyClassInlinerEligibility(
+  public void identifyClassInlinerEligibility(
       DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
     // Method eligibility is calculated in similar way for regular method
     // and for the constructor. To be eligible method should only be using its
@@ -126,11 +126,7 @@
 
     boolean receiverUsedAsReturnValue = false;
     boolean seenSuperInitCall = false;
-    for (Instruction insn : receiver.aliasedUsers()) {
-      if (insn.isAssume()) {
-        continue;
-      }
-
+    for (Instruction insn : receiver.uniqueUsers()) {
       if (insn.isMonitor()) {
         continue;
       }
@@ -144,11 +140,11 @@
         if (insn.isInstancePut()) {
           InstancePut instancePutInstruction = insn.asInstancePut();
           // Only allow field writes to the receiver.
-          if (instancePutInstruction.object().getAliasedValue() != receiver) {
+          if (instancePutInstruction.object() != receiver) {
             return;
           }
           // Do not allow the receiver to escape via a field write.
-          if (instancePutInstruction.value().getAliasedValue() == receiver) {
+          if (instancePutInstruction.value() == receiver) {
             return;
           }
         }
@@ -166,8 +162,7 @@
         DexMethod invokedMethod = invokedDirect.getInvokedMethod();
         if (dexItemFactory.isConstructor(invokedMethod)
             && invokedMethod.holder == clazz.superType
-            && ListUtils.lastIndexMatching(
-                invokedDirect.inValues(), v -> v.getAliasedValue() == receiver) == 0
+            && invokedDirect.inValues().lastIndexOf(receiver) == 0
             && !seenSuperInitCall
             && instanceInitializer) {
           seenSuperInitCall = true;
@@ -189,7 +184,7 @@
         method, new ClassInlinerEligibility(receiverUsedAsReturnValue));
   }
 
-  private void identifyParameterUsages(
+  public void identifyParameterUsages(
       DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
     List<ParameterUsage> usages = new ArrayList<>();
     List<Value> values = code.collectArguments();
@@ -208,7 +203,7 @@
 
   private ParameterUsage collectParameterUsages(int i, Value value) {
     ParameterUsageBuilder builder = new ParameterUsageBuilder(value, i);
-    for (Instruction user : value.aliasedUsers()) {
+    for (Instruction user : value.uniqueUsers()) {
       if (!builder.note(user)) {
         return null;
       }
@@ -216,7 +211,7 @@
     return builder.build();
   }
 
-  private void identifyReturnsArgument(
+  public void identifyReturnsArgument(
       DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
     List<BasicBlock> normalExits = code.computeNormalExitBlocks();
     if (normalExits.isEmpty()) {
@@ -238,19 +233,18 @@
       isNeverNull &= value.getTypeLattice().isReference() && value.isNeverNull();
     }
     if (returnValue != null) {
-      Value aliasedValue = returnValue.getAliasedValue();
-      if (aliasedValue.isArgument()) {
+      if (returnValue.isArgument()) {
         // Find the argument number.
-        int index = aliasedValue.computeArgumentPosition(code);
-        assert index >= 0;
+        int index = code.collectArguments().indexOf(returnValue);
+        assert index != -1;
         feedback.methodReturnsArgument(method, index);
       }
-      if (aliasedValue.isConstant()) {
-        if (aliasedValue.definition.isConstNumber()) {
-          long value = aliasedValue.definition.asConstNumber().getRawValue();
+      if (returnValue.isConstant()) {
+        if (returnValue.definition.isConstNumber()) {
+          long value = returnValue.definition.asConstNumber().getRawValue();
           feedback.methodReturnsConstantNumber(method, value);
-        } else if (aliasedValue.definition.isConstString()) {
-          ConstString constStringInstruction = aliasedValue.definition.asConstString();
+        } else if (returnValue.definition.isConstString()) {
+          ConstString constStringInstruction = returnValue.definition.asConstString();
           if (!constStringInstruction.instructionInstanceCanThrow()) {
             feedback.methodReturnsConstantString(method, constStringInstruction.getValue());
           }
@@ -262,7 +256,7 @@
     }
   }
 
-  private void identifyTrivialInitializer(
+  public void identifyTrivialInitializer(
       DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
     if (!method.isInstanceInitializer() && !method.isClassInitializer()) {
       return;
@@ -309,10 +303,6 @@
         continue;
       }
 
-      if (insn.isAssume()) {
-        continue;
-      }
-
       if (insn.isNewInstance()) {
         NewInstance newInstance = insn.asNewInstance();
         if (createdSingletonInstance != null
@@ -384,10 +374,6 @@
         continue;
       }
 
-      if (insn.isAssume()) {
-        continue;
-      }
-
       if (insn.isArgument()) {
         continue;
       }
@@ -454,7 +440,7 @@
     return TrivialInstanceInitializer.INSTANCE;
   }
 
-  private void identifyInvokeSemanticsForInlining(
+  public void identifyInvokeSemanticsForInlining(
       DexEncodedMethod method, IRCode code, AppView<?> appView, OptimizationFeedback feedback) {
     if (method.isStatic()) {
       // Identifies if the method preserves class initialization after inlining.
@@ -706,7 +692,7 @@
     return true;
   }
 
-  private void computeDynamicReturnType(
+  public void computeDynamicReturnType(
       DynamicTypeOptimization dynamicTypeOptimization,
       OptimizationFeedback feedback,
       DexEncodedMethod method,
@@ -735,7 +721,7 @@
     }
   }
 
-  private void computeInitializedClassesOnNormalExit(
+  public void computeInitializedClassesOnNormalExit(
       OptimizationFeedback feedback, DexEncodedMethod method, IRCode code) {
     if (options.enableInitializedClassesAnalysis && appView.appInfo().hasLiveness()) {
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
@@ -748,7 +734,7 @@
     }
   }
 
-  private void computeMayHaveSideEffects(
+  public void computeMayHaveSideEffects(
       OptimizationFeedback feedback, DexEncodedMethod method, IRCode code) {
     // If the method is native, we don't know what could happen.
     assert !method.accessFlags.isNative();
@@ -816,7 +802,7 @@
     return false;
   }
 
-  private void computeReturnValueOnlyDependsOnArguments(
+  public void computeReturnValueOnlyDependsOnArguments(
       OptimizationFeedback feedback, DexEncodedMethod method, IRCode code) {
     if (!options.enableDeterminismAnalysis) {
       return;
@@ -829,7 +815,7 @@
   }
 
   // Track usage of parameters and compute their nullability and possibility of NPE.
-  private void computeNonNullParamOrThrow(
+  public void computeNonNullParamOrThrow(
       OptimizationFeedback feedback, DexEncodedMethod method, IRCode code) {
     if (method.getOptimizationInfo().getNonNullParamOrThrow() != null) {
       return;
@@ -857,7 +843,7 @@
     }
   }
 
-  private void computeNonNullParamOnNormalExits(OptimizationFeedback feedback, IRCode code) {
+  public void computeNonNullParamOnNormalExits(OptimizationFeedback feedback, IRCode code) {
     Set<BasicBlock> normalExits = Sets.newIdentityHashSet();
     normalExits.addAll(code.computeNormalExitBlocks());
     DominatorTree dominatorTree = new DominatorTree(code, MAY_HAVE_UNREACHABLE_BLOCKS);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
index 7e61600..0495bba 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.ir.code.InvokeMethodWithReceiver;
 import com.android.tools.r8.ir.code.Return;
 import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -111,10 +110,6 @@
 
     // Returns false if the instruction is not supported.
     public boolean note(Instruction instruction) {
-      if (instruction.isAssume()) {
-        // Keep examining other users, but the param usage builder should consider aliased users.
-        return true;
-      }
       if (instruction.isIf()) {
         return note(instruction.asIf());
       }
@@ -146,8 +141,7 @@
 
     private boolean note(If ifInstruction) {
       if (ifInstruction.asIf().isZeroTest()) {
-        assert ifInstruction.inValues().size() == 1
-            && ifInstruction.inValues().get(0).getAliasedValue() == arg;
+        assert ifInstruction.inValues().size() == 1 && ifInstruction.inValues().get(0) == arg;
         ifZeroTestTypes.add(ifInstruction.asIf().getType());
         return true;
       }
@@ -156,7 +150,7 @@
 
     private boolean note(InstanceGet instanceGetInstruction) {
       assert arg != instanceGetInstruction.outValue();
-      if (instanceGetInstruction.object().getAliasedValue() == arg) {
+      if (instanceGetInstruction.object() == arg) {
         hasFieldRead = true;
         return true;
       }
@@ -165,12 +159,12 @@
 
     private boolean note(InstancePut instancePutInstruction) {
       assert arg != instancePutInstruction.outValue();
-      if (instancePutInstruction.object().getAliasedValue() == arg) {
+      if (instancePutInstruction.object() == arg) {
         hasFieldAssignment = true;
-        isAssignedToField |= instancePutInstruction.value().getAliasedValue() == arg;
+        isAssignedToField |= instancePutInstruction.value() == arg;
         return true;
       }
-      if (instancePutInstruction.value().getAliasedValue() == arg) {
+      if (instancePutInstruction.value() == arg) {
         isAssignedToField = true;
         return true;
       }
@@ -178,8 +172,7 @@
     }
 
     private boolean note(InvokeMethodWithReceiver invokeInstruction) {
-      if (ListUtils.lastIndexMatching(
-          invokeInstruction.inValues(), v -> v.getAliasedValue() == arg) == 0) {
+      if (invokeInstruction.inValues().lastIndexOf(arg) == 0) {
         callsOnReceiver.add(
             new Pair<>(
                 invokeInstruction.asInvokeMethodWithReceiver().getType(),
@@ -190,8 +183,7 @@
     }
 
     private boolean note(Return returnInstruction) {
-      assert returnInstruction.inValues().size() == 1
-          && returnInstruction.inValues().get(0).getAliasedValue() == arg;
+      assert returnInstruction.inValues().size() == 1 && returnInstruction.inValues().get(0) == arg;
       isReturned = true;
       return true;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
index 09a8d13..06e7332 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -371,12 +371,7 @@
     // We may get more precise type information if the method is reprocessed (e.g., due to
     // optimization info collected from all call sites), and hence the `returnsObjectOfType` is
     // allowed to become more precise.
-    // TODO(b/142559221): non-materializable assume instructions?
-    // Nullability could be less precise, though. For example, suppose a value is known to be
-    // non-null after a safe invocation, hence recorded with the non-null variant. If that call is
-    // inlined and the method is reprocessed, such non-null assumption cannot be made again.
-    assert returnsObjectOfType == UNKNOWN_TYPE
-            || type.lessThanOrEqualUpToNullability(returnsObjectOfType, appView)
+    assert returnsObjectOfType == UNKNOWN_TYPE || type.lessThanOrEqual(returnsObjectOfType, appView)
         : "return type changed from " + returnsObjectOfType + " to " + type;
     returnsObjectOfType = type;
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 5e0e77f..86245a3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -121,9 +121,6 @@
           o.enableInlining = inlining;
           o.enableInliningOfInvokesWithNullableReceivers = false;
           o.inliningInstructionLimit = 6;
-          // Tests depend on nullability of receiver and argument in general. Learning very accurate
-          // nullability from actual usage in tests bothers what we want to test.
-          o.enableCallSiteOptimizationInfoPropagation = false;
         });
   }