Ensure inliner has exact type information from class inliner
Bug: 142116551
Change-Id: Iaa4bd3a52b482f64baa52d6240dfd46d3172270e
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 61b64d5..1b51071 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -337,6 +337,11 @@
}
@Override
+ public DexEncodedMethod lookupSingleTarget(InvokeMethod invoke, DexType context) {
+ return invoke.lookupSingleTarget(appView, context);
+ }
+
+ @Override
public InlineAction computeForInvokeWithReceiver(
InvokeMethodWithReceiver invoke,
DexEncodedMethod singleTarget,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
index 8849066..4f34bd3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.ir.optimize;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
@@ -19,21 +20,35 @@
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.ListIterator;
import java.util.Map;
final class ForcedInliningOracle implements InliningOracle, InliningStrategy {
+
+ private final AppView<AppInfoWithLiveness> appView;
private final DexEncodedMethod method;
private final Map<InvokeMethod, Inliner.InliningInfo> invokesToInline;
- ForcedInliningOracle(DexEncodedMethod method,
+ ForcedInliningOracle(
+ AppView<AppInfoWithLiveness> appView,
+ DexEncodedMethod method,
Map<InvokeMethod, Inliner.InliningInfo> invokesToInline) {
+ this.appView = appView;
this.method = method;
this.invokesToInline = invokesToInline;
}
@Override
- public void finish() {
+ public void finish() {}
+
+ @Override
+ public DexEncodedMethod lookupSingleTarget(InvokeMethod invoke, DexType context) {
+ Inliner.InliningInfo info = invokesToInline.get(invoke);
+ if (info != null) {
+ return info.target;
+ }
+ return invoke.lookupSingleTarget(appView, context);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 3ed156a..27c3831 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -663,7 +663,7 @@
IRCode code,
Map<InvokeMethod, InliningInfo> invokesToInline) {
- ForcedInliningOracle oracle = new ForcedInliningOracle(method, invokesToInline);
+ ForcedInliningOracle oracle = new ForcedInliningOracle(appView, method, invokesToInline);
performInliningImpl(oracle, oracle, method, code, OptimizationFeedbackIgnore.getInstance());
}
@@ -724,7 +724,8 @@
Instruction current = iterator.next();
if (current.isInvokeMethod()) {
InvokeMethod invoke = current.asInvokeMethod();
- DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, context.method.holder);
+ // TODO(b/142116551): This should be equivalent to invoke.lookupSingleTarget()!
+ DexEncodedMethod singleTarget = oracle.lookupSingleTarget(invoke, context.method.holder);
if (singleTarget == null) {
WhyAreYouNotInliningReporter.handleInvokeWithUnknownTarget(invoke, appView, context);
continue;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
index 3205552..f289b24 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
@@ -6,7 +6,9 @@
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
+import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.InvokeMethodWithReceiver;
import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
@@ -19,6 +21,9 @@
void finish();
+ // TODO(b/142116551): This should be equivalent to invoke.lookupSingleTarget(appView, context)!
+ DexEncodedMethod lookupSingleTarget(InvokeMethod invoke, DexType context);
+
InlineAction computeForInvokeWithReceiver(
InvokeMethodWithReceiver invoke,
DexEncodedMethod singleTarget,