Revert "Fix incorrect accessibility check in inliner"
This reverts commit dde2500f111af5c1fa5d8885f8616cad6b756817.
Reason for revert: Changes test expectations
Change-Id: I5b034df5105a33099a7f6a3579fa81e0d6aae949
diff --git a/src/main/java/com/android/tools/r8/graph/AccessControl.java b/src/main/java/com/android/tools/r8/graph/AccessControl.java
index 788b358..854c5e7 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessControl.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessControl.java
@@ -38,14 +38,6 @@
public static OptionalBool isMethodAccessible(
DexEncodedMethod method,
DexClass holder,
- ProgramMethod context,
- AppView<? extends AppInfoWithClassHierarchy> appView) {
- return isMethodAccessible(method, holder, context.getHolder(), appView.appInfo());
- }
-
- public static OptionalBool isMethodAccessible(
- DexEncodedMethod method,
- DexClass holder,
DexProgramClass context,
AppInfoWithClassHierarchy appInfo) {
return isMemberAccessible(method.accessFlags, holder, context, appInfo);
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 c4bf62f..5893a3b 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
@@ -15,7 +15,6 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.IRCode;
@@ -114,7 +113,6 @@
@Override
public boolean passesInliningConstraints(
InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod singleTarget,
Reason reason,
WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
@@ -169,7 +167,7 @@
}
// Abort inlining attempt if method -> target access is not right.
- if (resolutionResult.isAccessibleFrom(method, appView.appInfo()).isPossiblyFalse()) {
+ if (!inliner.hasInliningAccess(method, singleTarget)) {
whyAreYouNotInliningReporter.reportInaccessible();
return false;
}
@@ -256,7 +254,6 @@
@Override
public InlineAction computeInlining(
InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod singleTarget,
ProgramMethod context,
ClassInitializationAnalysis classInitializationAnalysis,
@@ -280,8 +277,7 @@
return null;
}
- if (!passesInliningConstraints(
- invoke, resolutionResult, singleTarget, reason, whyAreYouNotInliningReporter)) {
+ if (!passesInliningConstraints(invoke, singleTarget, reason, whyAreYouNotInliningReporter)) {
return null;
}
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 eea6b7c..a48dece 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
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.IRCode;
@@ -43,7 +42,6 @@
@Override
public boolean passesInliningConstraints(
InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod candidate,
Reason reason,
WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
@@ -62,18 +60,15 @@
@Override
public InlineAction computeInlining(
InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod singleTarget,
ProgramMethod context,
ClassInitializationAnalysis classInitializationAnalysis,
WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
- return computeForInvoke(invoke, resolutionResult, whyAreYouNotInliningReporter);
+ return computeForInvoke(invoke, whyAreYouNotInliningReporter);
}
private InlineAction computeForInvoke(
- InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
- WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
+ InvokeMethod invoke, WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
Inliner.InliningInfo info = invokesToInline.get(invoke);
if (info == null) {
return null;
@@ -85,7 +80,7 @@
// with neverInline() flag.
assert !info.target.getDefinition().getOptimizationInfo().neverInline();
assert passesInliningConstraints(
- invoke, resolutionResult, info.target, Reason.FORCE, whyAreYouNotInliningReporter);
+ invoke, info.target, Reason.FORCE, whyAreYouNotInliningReporter);
return new InlineAction(info.target, invoke, Reason.FORCE);
}
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 3d9a25e..2589e6a 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
@@ -20,7 +20,6 @@
import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.NestMemberClassAttribute;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.analysis.proto.ProtoInliningReasonStrategy;
import com.android.tools.r8.ir.analysis.type.Nullability;
@@ -200,6 +199,29 @@
return false;
}
+ boolean hasInliningAccess(ProgramMethod context, ProgramMethod target) {
+ if (!isVisibleWithFlags(target.getHolderType(), context, target.getDefinition().accessFlags)) {
+ return false;
+ }
+ // The class needs also to be visible for us to have access.
+ return isVisibleWithFlags(target.getHolderType(), context, target.getHolder().accessFlags);
+ }
+
+ private boolean isVisibleWithFlags(DexType target, ProgramMethod context, AccessFlags<?> flags) {
+ if (flags.isPublic()) {
+ return true;
+ }
+ if (flags.isPrivate()) {
+ return NestUtils.sameNest(target, context.getHolderType(), appView);
+ }
+ if (flags.isProtected()) {
+ return appView.appInfo().isSubtype(context.getHolderType(), target)
+ || target.isSamePackage(context.getHolderType());
+ }
+ // package-private
+ return target.isSamePackage(context.getHolderType());
+ }
+
public synchronized boolean isDoubleInlineSelectedTarget(ProgramMethod method) {
return doubleInlineSelectedTargets.contains(method);
}
@@ -953,17 +975,6 @@
if (current.isInvokeMethod()) {
InvokeMethod invoke = current.asInvokeMethod();
// TODO(b/142116551): This should be equivalent to invoke.lookupSingleTarget()!
-
- SingleResolutionResult resolutionResult =
- appView
- .appInfo()
- .resolveMethod(invoke.getInvokedMethod(), invoke.isInvokeInterface())
- .asSingleResolution();
- if (resolutionResult == null) {
- continue;
- }
-
- // TODO(b/156853206): Should not duplicate resolution.
ProgramMethod singleTarget = oracle.lookupSingleTarget(invoke, context);
if (singleTarget == null) {
WhyAreYouNotInliningReporter.handleInvokeWithUnknownTarget(invoke, appView, context);
@@ -978,7 +989,6 @@
InlineAction action =
oracle.computeInlining(
invoke,
- resolutionResult,
singleTarget,
context,
classInitializationAnalysis,
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 5518ab7..a9e4736 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
@@ -5,7 +5,6 @@
package com.android.tools.r8.ir.optimize;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
@@ -24,14 +23,12 @@
boolean passesInliningConstraints(
InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod candidate,
Reason reason,
WhyAreYouNotInliningReporter whyAreYouNotInliningReporter);
InlineAction computeInlining(
InvokeMethod invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod singleTarget,
ProgramMethod context,
ClassInitializationAnalysis classInitializationAnalysis,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 2742a6e..1355477 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -19,7 +19,6 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.ResolutionResult;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.Nullability;
@@ -283,16 +282,6 @@
if (user.isInvokeMethod()) {
InvokeMethod invokeMethod = user.asInvokeMethod();
- SingleResolutionResult resolutionResult =
- appView
- .appInfo()
- .resolveMethod(invokeMethod.getInvokedMethod(), invokeMethod.isInvokeInterface())
- .asSingleResolution();
- if (resolutionResult == null) {
- return user; // Not eligible.
- }
-
- // TODO(b/156853206): Avoid duplicating resolution.
DexEncodedMethod singleTargetMethod = invokeMethod.lookupSingleTarget(appView, method);
if (singleTargetMethod == null) {
return user; // Not eligible.
@@ -332,7 +321,7 @@
InvokeMethodWithReceiver invoke = user.asInvokeMethodWithReceiver();
InliningInfo inliningInfo =
isEligibleDirectVirtualMethodCall(
- invoke, resolutionResult, singleTarget, indirectUsers, defaultOracle);
+ invoke, singleTarget, indirectUsers, defaultOracle);
if (inliningInfo != null) {
methodCallsOnInstance.put(invoke, inliningInfo);
continue;
@@ -890,7 +879,6 @@
private InliningInfo isEligibleDirectVirtualMethodCall(
InvokeMethodWithReceiver invoke,
- SingleResolutionResult resolutionResult,
ProgramMethod singleTarget,
Set<Instruction> indirectUsers,
Supplier<InliningOracle> defaultOracle) {
@@ -908,11 +896,7 @@
if (singleTarget.getDefinition().isLibraryMethodOverride().isTrue()) {
InliningOracle inliningOracle = defaultOracle.get();
if (!inliningOracle.passesInliningConstraints(
- invoke,
- resolutionResult,
- singleTarget,
- Reason.SIMPLE,
- NopWhyAreYouNotInliningReporter.getInstance())) {
+ invoke, singleTarget, Reason.SIMPLE, NopWhyAreYouNotInliningReporter.getInstance())) {
return null;
}
}
@@ -936,16 +920,13 @@
Pair<Type, DexMethod> invokeInfo = eligibility.callsReceiver.get(0);
Type invokeType = invokeInfo.getFirst();
DexMethod indirectlyInvokedMethod = invokeInfo.getSecond();
- SingleResolutionResult indirectResolutionResult =
- appView
- .appInfo()
- .resolveMethodOn(eligibleClass, indirectlyInvokedMethod)
- .asSingleResolution();
- if (indirectResolutionResult == null) {
+ ResolutionResult resolutionResult =
+ appView.appInfo().resolveMethodOn(eligibleClass, indirectlyInvokedMethod);
+ if (!resolutionResult.isSingleResolution()) {
return null;
}
ProgramMethod indirectSingleTarget =
- indirectResolutionResult.getResolutionPair().asProgramMethod();
+ resolutionResult.asSingleResolution().getResolutionPair().asProgramMethod();
if (!isEligibleIndirectVirtualMethodCall(
indirectlyInvokedMethod, invokeType, indirectSingleTarget)) {
return null;
@@ -1214,28 +1195,24 @@
return false;
}
- SingleResolutionResult resolutionResult =
- appView
- .appInfo()
- .resolveMethod(invoke.getInvokedMethod(), invoke.isInvokeInterface())
- .asSingleResolution();
- if (resolutionResult == null) {
- return false;
- }
-
// Check if the method is inline-able by standard inliner.
- // TODO(b/156853206): Should not duplicate resolution.
- ProgramMethod singleTarget = invoke.lookupSingleProgramTarget(appView, method);
+ DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method);
if (singleTarget == null) {
return false;
}
+ DexProgramClass holder = asProgramClassOrNull(appView.definitionForHolder(singleTarget));
+ if (holder == null) {
+ return false;
+ }
+
+ ProgramMethod singleTargetMethod = new ProgramMethod(holder, singleTarget);
+
InliningOracle oracle = defaultOracle.get();
InlineAction inlineAction =
oracle.computeInlining(
invoke,
- resolutionResult,
- singleTarget,
+ singleTargetMethod,
method,
ClassInitializationAnalysis.trivial(),
NopWhyAreYouNotInliningReporter.getInstance());