Extend IRCode to accept a use registry Change-Id: If7ad67e3ea62bcecdf076d45623d1fad0d088b46
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java index 550ea8b..a214f7c 100644 --- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java +++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -14,6 +14,8 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens; +import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.VerifyTypesHelper; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -2114,4 +2116,19 @@ phiIt.remove(); } } + + public void registerUse(UseRegistry<?> registry, ProgramMethod method) { + for (Instruction instruction : instructions) { + instruction.registerUse(registry, method); + if (registry.getTraversalContinuation().shouldBreak()) { + return; + } + } + for (DexType guard : catchHandlers.getGuards()) { + registry.registerExceptionGuard(guard); + if (registry.getTraversalContinuation().shouldBreak()) { + return; + } + } + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java index ea014e6..d9a1063 100644 --- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java +++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -16,8 +16,10 @@ import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.VerifyTypesHelper; import com.android.tools.r8.ir.analysis.type.ClassTypeElement; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -278,6 +280,11 @@ return false; } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerCheckCast(type, ignoreCompatRules); + } + public static class Builder extends BuilderBase<Builder, CheckCast> { protected DexType castType;
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java index 1fd0fed..2dfbc18 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -13,8 +13,10 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.analysis.value.AbstractValue; @@ -213,6 +215,11 @@ return UnknownValue.getInstance(); } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerConstClass(clazz, null, ignoreCompatRules); + } + public static class Builder extends BuilderBase<Builder, ConstClass> { private DexType type;
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java index 78ee74e..15afa68 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
@@ -3,15 +3,19 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.code; +import static com.android.tools.r8.graph.UseRegistry.MethodHandleUse.NOT_ARGUMENT_TO_LAMBDA_METAFACTORY; + import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfConstMethodHandle; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.code.DexConstMethodHandle; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexMethodHandle; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.conversion.CfBuilder; @@ -129,4 +133,9 @@ public void insertLoadAndStores(InstructionListIterator it, LoadStoreHelper helper) { helper.storeOutValue(this, it); } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerMethodHandle(methodHandle, NOT_ARGUMENT_TO_LAMBDA_METAFACTORY); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java index 5ce3e31..0b586ca 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
@@ -9,9 +9,11 @@ import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.code.DexConstMethodType; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.conversion.CfBuilder; @@ -129,4 +131,9 @@ InliningConstraints inliningConstraints, ProgramMethod context) { return inliningConstraints.forConstMethodType(); } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerProto(methodType); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java index 78a582b..3a5623d 100644 --- a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java +++ b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
@@ -9,9 +9,11 @@ import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.analysis.value.AbstractValue; @@ -170,4 +172,12 @@ .abstractValueFactory() .createSingleDexItemBasedStringValue(item, nameComputationInfo); } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + if (nameComputationInfo.needsToRegisterReference()) { + assert item.isDexType(); + registry.registerTypeReference(item.asDexType()); + } + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java index dbcd9be..7ec066c 100644 --- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java +++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -13,6 +13,7 @@ import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.graph.classmerging.MergedClassesCollection; import com.android.tools.r8.ir.analysis.TypeChecker; import com.android.tools.r8.ir.analysis.VerifyTypesHelper; @@ -1514,4 +1515,18 @@ } } } + + /** + * Note: This will discard instructions that are not present on the lower level code items, such + * as assume. + */ + public void registerCodeReferences(ProgramMethod method, UseRegistry<ProgramMethod> registry) { + assert registry.getTraversalContinuation().shouldContinue(); + for (BasicBlock block : blocks) { + block.registerUse(registry, method); + if (registry.getTraversalContinuation().shouldBreak()) { + return; + } + } + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java index f331383..765d4a1 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java +++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -11,8 +11,10 @@ import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -171,6 +173,11 @@ return super.toString() + "; " + clazz.toSourceString(); } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInitClass(clazz); + } + public static class Builder extends BuilderBase<Builder, InitClass> { private DexType type;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java index 6f571d0..d01444f 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java +++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -18,9 +18,11 @@ import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -259,6 +261,11 @@ return true; } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInstanceFieldRead(getField()); + } + public static class Builder extends BuilderBase<Builder, InstanceGet> { private DexField field;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java index 4af4442..680ace0 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java +++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -9,8 +9,10 @@ import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.code.DexInstanceOf; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.conversion.CfBuilder; import com.android.tools.r8.ir.conversion.DexBuilder; @@ -128,4 +130,9 @@ StringBuilder builder = new StringBuilder(super.toString()); return builder.append("; ").append(type.toSourceString()).toString(); } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInstanceOf(type); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java index be3739e..bc4d8df 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java +++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -17,11 +17,13 @@ import com.android.tools.r8.dex.code.DexIputWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.FieldResolutionResult; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -276,4 +278,9 @@ public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) { return false; } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInstanceFieldWrite(getField()); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java index 55d96c5..7aba8bd 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java +++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -10,9 +10,11 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DebugLocalInfo; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; import com.android.tools.r8.ir.analysis.VerifyTypesHelper; @@ -1561,6 +1563,14 @@ throw new Unimplemented("Missing impl for " + getClass().getSimpleName()); } + public void registerUse(UseRegistry registry, ProgramMethod context) { + internalRegisterUse(registry, context); + } + + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + // Intentionally empty. + } + public static class SideEffectAssumption { public static final SideEffectAssumption NONE = new SideEffectAssumption();
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java index e43b0f0..75a13c9 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -11,8 +11,10 @@ import com.android.tools.r8.dex.code.DexInvokeCustomRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.ClassTypeElement; import com.android.tools.r8.ir.analysis.type.InterfaceCollection; import com.android.tools.r8.ir.analysis.type.InterfaceCollection.Builder; @@ -204,4 +206,9 @@ public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) { return true; } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerCallSite(callSite); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java index 25d775a..09f6e36 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
@@ -17,6 +17,7 @@ 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.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -221,6 +222,11 @@ builder.addInvokeDirect(getInvokedMethod(), arguments()); } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInvokeDirect(getInvokedMethod()); + } + public static class Builder extends InvokeMethod.Builder<Builder, InvokeDirect> { @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java index 67e78d6..be6eac1 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
@@ -15,6 +15,7 @@ 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.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -140,4 +141,9 @@ return ClassInitializationAnalysis.InstructionUtils.forInvokeInterface( this, clazz, context, appView, mode, assumption); } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInvokeInterface(getInvokedMethod()); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java index 7ac70e7..de12658 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
@@ -11,8 +11,10 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.conversion.CfBuilder; @@ -186,4 +188,9 @@ public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) { return false; } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerTypeReference(type); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java index 5a3a111..a2e815f 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -13,8 +13,10 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.analysis.value.AbstractValue; @@ -214,4 +216,9 @@ public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) { return false; } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerTypeReference(type); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java index 9e6a918..ecc7327 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -17,6 +17,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -237,6 +238,11 @@ .classInitializationMayHaveSideEffectsInContext(appView, context); } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInvokeStatic(getInvokedMethod()); + } + public static class Builder extends InvokeMethod.Builder<Builder, InvokeStatic> { @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java index 705c7f9..ae47eb6 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
@@ -13,6 +13,7 @@ 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.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -134,4 +135,9 @@ return ClassInitializationAnalysis.InstructionUtils.forInvokeSuper( this, clazz, context, appView, mode, assumption); } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInvokeSuper(getInvokedMethod()); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java index f44d128..1af5563 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -16,6 +16,7 @@ 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.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -164,6 +165,11 @@ this, clazz, context, appView, mode, assumption); } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerInvokeVirtual(getInvokedMethod()); + } + public static class Builder extends InvokeMethod.Builder<Builder, InvokeVirtual> { @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java index 88bd18d..c6d527f 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
@@ -10,8 +10,10 @@ import com.android.tools.r8.dex.code.DexNewArray; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.analysis.value.AbstractValue; @@ -164,4 +166,9 @@ public boolean instructionMayTriggerMethodInvocation(AppView<?> appView, ProgramMethod context) { return false; } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerTypeReference(type); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java index 236bd0a..40e7d5d 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -12,11 +12,13 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.MethodResolutionResult; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -232,6 +234,11 @@ return true; } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerNewInstance(clazz); + } + public static class Builder extends BuilderBase<Builder, NewInstance> { private DexType type;
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java index 2274754..123b988 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
@@ -9,8 +9,10 @@ import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.code.DexNewUnboxedEnumInstance; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.VerifyTypesHelper; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -159,4 +161,9 @@ assert type.isDefinitelyNotNull(); return true; } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerNewUnboxedEnumInstance(clazz); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java index 19b9b27..19986d0 100644 --- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java +++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -18,9 +18,11 @@ import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndField; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -268,6 +270,11 @@ } } + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerStaticFieldRead(getField()); + } + public static class Builder extends BuilderBase<Builder, StaticGet> { private DexField field;
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java index 7d54dbb..7e18e04 100644 --- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java +++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -16,11 +16,13 @@ import com.android.tools.r8.dex.code.DexSputWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.FieldResolutionResult; import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption; import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query; @@ -250,4 +252,9 @@ return holder != context.getHolderType(); } } + + @Override + void internalRegisterUse(UseRegistry<?> registry, DexClassAndMethod context) { + registry.registerStaticFieldWrite(getField()); + } }