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 {