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