Add registerInstanceOf to UseRegistry
Bug: 163471800
Bug: 163311975
Change-Id: If314b45420f81a1c4f1db98f3b59456afa2c88d1
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index c94d67c..45ce043 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -182,6 +182,12 @@
return false;
}
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ addType(type);
+ return false;
+ }
+
private void addType(DexType type) {
if (isTargetType(type) && types.add(type)) {
DexClass clazz = appInfo.definitionFor(type);
diff --git a/src/main/java/com/android/tools/r8/code/InstanceOf.java b/src/main/java/com/android/tools/r8/code/InstanceOf.java
index 4550406..36d7a0b 100644
--- a/src/main/java/com/android/tools/r8/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/code/InstanceOf.java
@@ -49,7 +49,7 @@
@Override
public void registerUse(UseRegistry registry) {
- registry.registerTypeReference(getType());
+ registry.registerInstanceOf(getType());
}
public DexType getType() {
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultUseRegistry.java b/src/main/java/com/android/tools/r8/graph/DefaultUseRegistry.java
index 7d6b095..a267d5b 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultUseRegistry.java
@@ -69,4 +69,9 @@
public boolean registerTypeReference(DexType type) {
return true;
}
+
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ return true;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
index 1e89e13..de4021e 100644
--- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java
+++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -57,6 +57,8 @@
public abstract boolean registerTypeReference(DexType type);
+ public abstract boolean registerInstanceOf(DexType type);
+
public boolean registerConstClass(DexType type) {
return registerTypeReference(type);
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index dd450d6..f06a1c7 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -241,5 +241,10 @@
public boolean registerTypeReference(DexType type) {
return false;
}
+
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ return false;
+ }
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
index 8119a9c..07783f5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
@@ -373,6 +373,11 @@
}
@Override
+ public boolean registerInstanceOf(DexType type) {
+ return false;
+ }
+
+ @Override
public void registerCallSite(DexCallSite callSite) {
registerMethodHandle(
callSite.bootstrapMethod, MethodHandleUse.NOT_ARGUMENT_TO_LAMBDA_METAFACTORY);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
index bbe2ae0..42e3ec7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -455,6 +455,12 @@
// Unrelated to access based control.
return false;
}
+
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ // Unrelated to access based control.
+ return false;
+ }
}
public static final class DexFieldWithAccess {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
index e6a6492..617a12e 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizer.java
@@ -762,5 +762,10 @@
}
return true;
}
+
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ return registerTypeReference(type);
+ }
}
}
diff --git a/src/main/java/com/android/tools/r8/optimize/InvokeSingleTargetExtractor.java b/src/main/java/com/android/tools/r8/optimize/InvokeSingleTargetExtractor.java
index 292f616..37df60c 100644
--- a/src/main/java/com/android/tools/r8/optimize/InvokeSingleTargetExtractor.java
+++ b/src/main/java/com/android/tools/r8/optimize/InvokeSingleTargetExtractor.java
@@ -102,6 +102,11 @@
return invalid();
}
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ return invalid();
+ }
+
public enum InvokeKind {
VIRTUAL,
STATIC,
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
index 7c0afe9..9a488d1 100644
--- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -129,6 +129,11 @@
}
@Override
+ public boolean registerInstanceOf(DexType type) {
+ return enqueuer.traceInstanceOf(type, context);
+ }
+
+ @Override
public void registerMethodHandle(DexMethodHandle methodHandle, MethodHandleUse use) {
super.registerMethodHandle(methodHandle, use);
enqueuer.traceMethodHandle(methodHandle, use, context);
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 b31228b..d1455a7 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1027,6 +1027,10 @@
return true;
}
+ boolean traceInstanceOf(DexType type, ProgramMethod currentMethod) {
+ return traceTypeReference(type, currentMethod);
+ }
+
boolean traceInvokeDirect(DexMethod invokedMethod, ProgramMethod context) {
boolean skipTracing =
registerDeferredActionForDeadProtoBuilder(
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
index 205cf71..0382893 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -175,6 +175,11 @@
consumer.accept(type);
return true;
}
+
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ return registerTypeReference(type);
+ }
}
private class AnnotationDirectReferenceCollector implements IndexedItemCollection {
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index c2b3627..1de617d 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1918,6 +1918,11 @@
public boolean registerTypeReference(DexType type) {
return checkTypeReference(type);
}
+
+ @Override
+ public boolean registerInstanceOf(DexType type) {
+ return checkTypeReference(type);
+ }
}
protected static class SynthesizedBridgeCode extends AbstractSynthesizedCode {