Analyze all field accesses for limited horizontal class merging
Bug: b/347676160
Change-Id: If1dc4510124582233df02d6b4c2595f34eee2fd5
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ef0e11e..abee4a2 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3356,18 +3356,6 @@
getKeepInfo().keepField(field);
}
- if (mode.isFinalTreeShaking() && options.isOptimizing() && !field.getAccessFlags().isStatic()) {
- DexType fieldBaseType = field.getType().toBaseType(appView.dexItemFactory());
- if (fieldBaseType.isClassType()) {
- DexClass clazz = definitionFor(fieldBaseType, context);
- if (clazz != null
- && AccessControl.isClassAccessible(clazz, context, appView).isPossiblyFalse()) {
- applyMinimumKeepInfoWhenLive(
- field.getHolder(), KeepClassInfo.newEmptyJoiner().disallowHorizontalClassMerging());
- }
- }
- }
-
// Notify analyses.
analyses.forEach(analysis -> analysis.processNewlyLiveField(field, context, worklist));
}
@@ -3384,6 +3372,8 @@
markFieldAsLive(field, context, reason);
}
+ handleFieldAccessWithInaccessibleFieldType(field, context);
+
if (liveFields.contains(field)
|| !reachableInstanceFields
.computeIfAbsent(field.getHolder(), ignore -> ProgramFieldSet.create())
@@ -3398,6 +3388,21 @@
analyses.forEach(analysis -> analysis.notifyMarkFieldAsReachable(field, worklist));
}
+ private void handleFieldAccessWithInaccessibleFieldType(
+ ProgramField field, ProgramDefinition context) {
+ if (mode.isFinalTreeShaking() && options.isOptimizing() && !field.getAccessFlags().isStatic()) {
+ DexType fieldBaseType = field.getType().toBaseType(appView.dexItemFactory());
+ if (fieldBaseType.isClassType()) {
+ DexClass clazz = definitionFor(fieldBaseType, context);
+ if (clazz != null
+ && AccessControl.isClassAccessible(clazz, context, appView).isPossiblyFalse()) {
+ applyMinimumKeepInfoWhenLive(
+ field.getHolder(), KeepClassInfo.newEmptyJoiner().disallowHorizontalClassMerging());
+ }
+ }
+ }
+ }
+
private void traceFieldDefinition(ProgramField field) {
markTypeAsLive(field.getHolder(), field);
markTypeAsLive(field.getType(), field);