Fix instance initializer escape analysis
Bug: 150673257
Change-Id: I9439bf520b75583f9fd0d7e546bfc955f49db91e
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 9a01028..84e4fdc 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
@@ -411,6 +411,8 @@
return null;
}
+ AliasedValueConfiguration aliasesThroughAssumeAndCheckCasts =
+ AssumeAndCheckCastAliasedValueConfiguration.getInstance();
Value receiver = code.getThis();
boolean hasCatchHandler = false;
for (BasicBlock block : code.blocks) {
@@ -486,12 +488,14 @@
if (field == null) {
return null;
}
- if (instancePut.object().getAliasedValue() != receiver
+ Value object =
+ instancePut.object().getAliasedValue(aliasesThroughAssumeAndCheckCasts);
+ if (object != receiver
|| instancePut.instructionInstanceCanThrow(appView, clazz.type).isThrowing()) {
builder.setMayHaveOtherSideEffectsThanInstanceFieldAssignments();
}
- Value value = instancePut.value().getAliasedValue();
+ Value value = instancePut.value().getAliasedValue(aliasesThroughAssumeAndCheckCasts);
// TODO(b/142762134): Replace the use of onlyDependsOnArgument() by
// ValueMayDependOnEnvironmentAnalysis.
if (!value.onlyDependsOnArgument()) {
@@ -523,7 +527,8 @@
}
builder.merge(singleTarget.getOptimizationInfo().getInstanceInitializerInfo());
for (int i = 1; i < invoke.arguments().size(); i++) {
- Value argument = invoke.arguments().get(i).getAliasedValue();
+ Value argument =
+ invoke.arguments().get(i).getAliasedValue(aliasesThroughAssumeAndCheckCasts);
if (argument == receiver) {
// In the analysis of the parent constructor, we don't consider the non-receiver
// arguments as being aliases of the receiver. Therefore, we explicitly mark
@@ -542,7 +547,7 @@
.markAllFieldsAsRead()
.setMayHaveOtherSideEffectsThanInstanceFieldAssignments();
for (Value inValue : invoke.inValues()) {
- if (inValue.getAliasedValue() == receiver) {
+ if (inValue.getAliasedValue(aliasesThroughAssumeAndCheckCasts) == receiver) {
builder.setReceiverMayEscapeOutsideConstructorChain();
break;
}
@@ -558,7 +563,7 @@
builder.setMayHaveOtherSideEffectsThanInstanceFieldAssignments();
}
for (Value argument : invoke.arguments()) {
- if (argument.getAliasedValue() == receiver) {
+ if (argument.getAliasedValue(aliasesThroughAssumeAndCheckCasts) == receiver) {
builder.setReceiverMayEscapeOutsideConstructorChain();
break;
}
@@ -575,7 +580,7 @@
.markAllFieldsAsRead()
.setMayHaveOtherSideEffectsThanInstanceFieldAssignments();
for (Value argument : invoke.arguments()) {
- if (argument.getAliasedValue() == receiver) {
+ if (argument.getAliasedValue(aliasesThroughAssumeAndCheckCasts) == receiver) {
builder.setReceiverMayEscapeOutsideConstructorChain();
break;
}