Rewrite simple inlining constraint during staticizing
Bug: 191246066
Change-Id: Ib664d60c4330cf30d118f191fb6f4e1f908e3f41
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 986b709..213697f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -1404,14 +1404,14 @@
true);
}
- public DexEncodedMethod toStaticMethodWithoutThis() {
+ public DexEncodedMethod toStaticMethodWithoutThis(AppView<AppInfoWithLiveness> appView) {
checkIfObsolete();
assert !accessFlags.isStatic();
Builder builder =
builder(this)
.promoteToStatic()
.withoutThisParameter()
- .adjustOptimizationInfoAfterRemovingThisParameter();
+ .adjustOptimizationInfoAfterRemovingThisParameter(appView);
DexEncodedMethod method = builder.build();
method.copyMetadata(this);
setObsolete();
@@ -1698,10 +1698,12 @@
return this;
}
- public Builder adjustOptimizationInfoAfterRemovingThisParameter() {
+ public Builder adjustOptimizationInfoAfterRemovingThisParameter(
+ AppView<AppInfoWithLiveness> appView) {
if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
- optimizationInfo.asUpdatableMethodOptimizationInfo()
- .adjustOptimizationInfoAfterRemovingThisParameter();
+ optimizationInfo
+ .asUpdatableMethodOptimizationInfo()
+ .adjustOptimizationInfoAfterRemovingThisParameter(appView);
}
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/AlwaysSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/AlwaysSimpleInliningConstraint.java
index 32e01d8..a164607 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/AlwaysSimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/AlwaysSimpleInliningConstraint.java
@@ -30,6 +30,12 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ return this;
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanFalseSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanFalseSimpleInliningConstraint.java
index a4a6a73..351d51d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanFalseSimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanFalseSimpleInliningConstraint.java
@@ -34,6 +34,13 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ assert getArgumentIndex() > 0;
+ return factory.createBooleanFalseConstraint(getArgumentIndex() - 1);
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanTrueSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanTrueSimpleInliningConstraint.java
index f69381f..bf3fde3 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanTrueSimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/BooleanTrueSimpleInliningConstraint.java
@@ -34,6 +34,13 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ assert getArgumentIndex() > 0;
+ return factory.createBooleanTrueConstraint(getArgumentIndex() - 1);
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NeverSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NeverSimpleInliningConstraint.java
index 9407b7b..4568e5f 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NeverSimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NeverSimpleInliningConstraint.java
@@ -29,6 +29,12 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ return this;
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NotNullSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NotNullSimpleInliningConstraint.java
index ea41ccb..0834cba 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NotNullSimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NotNullSimpleInliningConstraint.java
@@ -34,6 +34,13 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ assert getArgumentIndex() > 0;
+ return factory.createNotNullConstraint(getArgumentIndex() - 1);
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
if (unboxedArgumentIndices.contains(getArgumentIndex())) {
// TODO(b/176067541): Could be refined to an argument-equals-int constraint.
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java
index 76d075d..2dce46e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/NullSimpleInliningConstraint.java
@@ -34,6 +34,13 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ assert getArgumentIndex() > 0;
+ return factory.createNullConstraint(getArgumentIndex() - 1);
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
if (unboxedArgumentIndices.contains(getArgumentIndex())) {
// TODO(b/176067541): Could be refined to an argument-equals-int constraint.
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraint.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraint.java
index b411c8b..df108ac 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraint.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraint.java
@@ -106,6 +106,9 @@
return new SimpleInliningConstraintDisjunction(ImmutableList.of(this, other));
}
+ public abstract SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory);
+
public abstract SimpleInliningConstraint rewrittenWithUnboxedArguments(
IntList unboxedArgumentIndices);
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintConjunction.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintConjunction.java
index 02a8536..c993b12 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintConjunction.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintConjunction.java
@@ -66,15 +66,25 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ List<SimpleInliningConstraint> rewrittenConstraints =
+ ListUtils.mapOrElse(
+ constraints, constraint -> constraint.fixupAfterRemovingThisParameter(factory), null);
+ return rewrittenConstraints != null
+ ? new SimpleInliningConstraintConjunction(rewrittenConstraints)
+ : this;
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
List<SimpleInliningConstraint> rewrittenConstraints =
ListUtils.mapOrElse(
constraints,
constraint -> constraint.rewrittenWithUnboxedArguments(unboxedArgumentIndices),
null);
- if (rewrittenConstraints != null) {
- return new SimpleInliningConstraintConjunction(rewrittenConstraints);
- }
- return this;
+ return rewrittenConstraints != null
+ ? new SimpleInliningConstraintConjunction(rewrittenConstraints)
+ : this;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintDisjunction.java b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintDisjunction.java
index c069f37..a6b418d 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintDisjunction.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/inlining/SimpleInliningConstraintDisjunction.java
@@ -66,15 +66,25 @@
}
@Override
+ public SimpleInliningConstraint fixupAfterRemovingThisParameter(
+ SimpleInliningConstraintFactory factory) {
+ List<SimpleInliningConstraint> rewrittenConstraints =
+ ListUtils.mapOrElse(
+ constraints, constraint -> constraint.fixupAfterRemovingThisParameter(factory), null);
+ return rewrittenConstraints != null
+ ? new SimpleInliningConstraintDisjunction(rewrittenConstraints)
+ : this;
+ }
+
+ @Override
public SimpleInliningConstraint rewrittenWithUnboxedArguments(IntList unboxedArgumentIndices) {
List<SimpleInliningConstraint> rewrittenConstraints =
ListUtils.mapOrElse(
constraints,
constraint -> constraint.rewrittenWithUnboxedArguments(unboxedArgumentIndices),
null);
- if (rewrittenConstraints != null) {
- return new SimpleInliningConstraintDisjunction(rewrittenConstraints);
- }
- return this;
+ return rewrittenConstraints != null
+ ? new SimpleInliningConstraintDisjunction(rewrittenConstraints)
+ : this;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index 02c1ad0..27f9d4b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -178,6 +178,7 @@
}
public Value getArgument(int index) {
+ assert index < arguments().size();
return arguments().get(index);
}
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 03eee35..8532dce 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
@@ -498,8 +498,12 @@
return new UpdatableMethodOptimizationInfo(this);
}
- public void adjustOptimizationInfoAfterRemovingThisParameter() {
+ public void adjustOptimizationInfoAfterRemovingThisParameter(
+ AppView<AppInfoWithLiveness> appView) {
classInlinerConstraint = classInlinerConstraint.fixupAfterRemovingThisParameter();
+ simpleInliningConstraint =
+ simpleInliningConstraint.fixupAfterRemovingThisParameter(
+ appView.simpleInliningConstraintFactory());
// cannotBeKept: doesn't depend on `this`
// classInitializerMayBePostponed: `this` could trigger <clinit> of the previous holder.
clearFlag(CLASS_INITIALIZER_MAY_BE_POSTPONED_FLAG);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index 8a5f280..4fa652a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -759,7 +759,7 @@
if (method.isStatic()) {
newDirectMethods.add(method);
} else if (!factory().isConstructor(method.getReference())) {
- DexEncodedMethod staticizedMethod = method.toStaticMethodWithoutThis();
+ DexEncodedMethod staticizedMethod = method.toStaticMethodWithoutThis(appView);
newDirectMethods.add(staticizedMethod);
staticizedMethods.createAndAdd(candidateClass, staticizedMethod);
methodMapping.put(method.getReference(), staticizedMethod.getReference());