Move optimization info structures to same package
Currently, the mutator methods on UpdatableMethodOptimizationInfo are public. Thus, it is currently possible to mutate a method optimization info object *directly*, circumventing the optimization feedback:
method.getMutableOptimizationInfo().markMayNotHaveSideEffects()
This can potentially lead to subtle bugs, because the changes made directly to the optimization info could be overwritten when the delayed optimization info mechanism updates all the method optimization infos when a wave ends.
Moving all the optimization info structures into the same package is a first step towards fixing this problem, since this allows us to make all the mutator methods package-private, such that they can only be accessed via a optimization info feedback instance.
Besides, this CL makes a few minor changes to the optimization info:
* removes the UpdatableMethodOptimizationInfo info, which is only implemented by MethodOptimizationInfoImpl,
* renames MethodOptimizationInfoImpl to UpdatableMethodOptimizationInfo,
* renames DefaultMethodOptimizationInfoImpl to DefaultMethodOptimizationInfo.
Bug: 140214568
Change-Id: I9652bf70021827ffdb3864e888afe7be5b6f2a6b
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 52c0a3e..609a409 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -16,7 +16,7 @@
import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedbackSimple;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.naming.PrefixRewritingNamingLens;
import com.android.tools.r8.origin.CommandLineOrigin;
import com.android.tools.r8.utils.AndroidApp;
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index bfe0efc..c5a51c0 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -29,7 +29,6 @@
import com.android.tools.r8.graph.analysis.InitializedClassesInInstanceMethodsAnalysis;
import com.android.tools.r8.ir.analysis.proto.GeneratedExtensionRegistryShrinker;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedbackSimple;
import com.android.tools.r8.ir.desugar.R8NestBasedAccessDesugaring;
import com.android.tools.r8.ir.optimize.EnumInfoMapCollector;
import com.android.tools.r8.ir.optimize.MethodPoolCollection;
@@ -37,6 +36,7 @@
import com.android.tools.r8.ir.optimize.SwitchMapCollector;
import com.android.tools.r8.ir.optimize.UninstantiatedTypeOptimization;
import com.android.tools.r8.ir.optimize.UnusedArgumentsCollector;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.jar.CfApplicationWriter;
import com.android.tools.r8.kotlin.Kotlin;
import com.android.tools.r8.logging.Log;
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index 0446c21..e1c8b62 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -5,7 +5,7 @@
import com.android.tools.r8.ClassFileConsumer;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedbackIgnore;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.naming.MemberNaming.FieldSignature;
import com.android.tools.r8.utils.CfgPrinter;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index eb3d43c..383f816 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -8,6 +8,9 @@
import com.android.tools.r8.ir.code.ConstInstruction;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.optimize.info.DefaultFieldOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.FieldOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MutableFieldOptimizationInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
public class DexEncodedField extends KeyedDexItem<DexField> {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 64d5dc1..d43583a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -9,7 +9,6 @@
import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_INLINING_CANDIDATE_SAME_PACKAGE;
import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_INLINING_CANDIDATE_SUBCLASS;
import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_NOT_INLINING_CANDIDATE;
-import static com.android.tools.r8.graph.DexEncodedMethod.DefaultMethodOptimizationInfoImpl.UNKNOWN_TYPE;
import com.android.tools.r8.OptionalBool;
import com.android.tools.r8.cf.code.CfConstNull;
@@ -36,8 +35,6 @@
import com.android.tools.r8.dex.MixedSectionCollection;
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.ParameterUsagesInfo.ParameterUsage;
-import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Invoke;
import com.android.tools.r8.ir.code.Position;
@@ -51,6 +48,9 @@
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.ir.optimize.NestUtils;
+import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.UpdatableMethodOptimizationInfo;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import com.android.tools.r8.ir.synthetic.CfEmulateInterfaceSyntheticSourceCodeProvider;
import com.android.tools.r8.ir.synthetic.FieldAccessorSourceCode;
@@ -65,16 +65,13 @@
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Pair;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.function.Consumer;
import java.util.function.IntPredicate;
import org.objectweb.asm.Opcodes;
@@ -135,8 +132,7 @@
// TODO(b/128967328): towards finer-grained inlining constraints,
// we need to maintain a set of states with (potentially different) contexts.
private CompilationState compilationState = CompilationState.NOT_PROCESSED;
- private MethodOptimizationInfo optimizationInfo =
- DefaultMethodOptimizationInfoImpl.DEFAULT_INSTANCE;
+ private MethodOptimizationInfo optimizationInfo = DefaultMethodOptimizationInfo.DEFAULT_INSTANCE;
private CallSiteOptimizationInfo callSiteOptimizationInfo =
DefaultCallSiteOptimizationInfo.getInstance();
private int classFileVersion = -1;
@@ -1118,583 +1114,6 @@
}
}
- public static class DefaultMethodOptimizationInfoImpl implements MethodOptimizationInfo {
-
- public static final MethodOptimizationInfo DEFAULT_INSTANCE =
- new DefaultMethodOptimizationInfoImpl();
-
- public static Set<DexType> UNKNOWN_INITIALIZED_CLASSES_ON_NORMAL_EXIT = ImmutableSet.of();
- public static int UNKNOWN_RETURNED_ARGUMENT = -1;
- public static boolean UNKNOWN_NEVER_RETURNS_NULL = false;
- public static boolean UNKNOWN_NEVER_RETURNS_NORMALLY = false;
- public static boolean UNKNOWN_RETURNS_CONSTANT = false;
- public static long UNKNOWN_RETURNED_CONSTANT_NUMBER = 0;
- public static DexString UNKNOWN_RETURNED_CONSTANT_STRING = null;
- public static TypeLatticeElement UNKNOWN_TYPE = null;
- public static boolean DOES_NOT_USE_IDNETIFIER_NAME_STRING = false;
- public static boolean UNKNOWN_CHECKS_NULL_RECEIVER_BEFORE_ANY_SIDE_EFFECT = false;
- public static boolean UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT = false;
- public static ClassInlinerEligibility UNKNOWN_CLASS_INLINER_ELIGIBILITY = null;
- public static TrivialInitializer UNKNOWN_TRIVIAL_INITIALIZER = null;
- public static boolean UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS = false;
- public static ParameterUsagesInfo UNKNOWN_PARAMETER_USAGE_INFO = null;
- public static boolean UNKNOWN_MAY_HAVE_SIDE_EFFECTS = true;
- public static boolean UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS = false;
- public static BitSet NO_NULL_PARAMETER_OR_THROW_FACTS = null;
- public static BitSet NO_NULL_PARAMETER_ON_NORMAL_EXITS_FACTS = null;
-
- private DefaultMethodOptimizationInfoImpl() {}
-
- @Override
- public boolean cannotBeKept() {
- return false;
- }
-
- @Override
- public boolean classInitializerMayBePostponed() {
- return false;
- }
-
- @Override
- public TypeLatticeElement getDynamicReturnType() {
- return UNKNOWN_TYPE;
- }
-
- @Override
- public Set<DexType> getInitializedClassesOnNormalExit() {
- return UNKNOWN_INITIALIZED_CLASSES_ON_NORMAL_EXIT;
- }
-
- @Override
- public TrivialInitializer getTrivialInitializerInfo() {
- return UNKNOWN_TRIVIAL_INITIALIZER;
- }
-
- @Override
- public ParameterUsage getParameterUsages(int parameter) {
- assert UNKNOWN_PARAMETER_USAGE_INFO == null;
- return null;
- }
-
- @Override
- public BitSet getNonNullParamOrThrow() {
- return NO_NULL_PARAMETER_OR_THROW_FACTS;
- }
-
- @Override
- public BitSet getNonNullParamOnNormalExits() {
- return NO_NULL_PARAMETER_ON_NORMAL_EXITS_FACTS;
- }
-
- @Override
- public boolean hasBeenInlinedIntoSingleCallSite() {
- return false;
- }
-
- @Override
- public boolean isReachabilitySensitive() {
- return false;
- }
-
- @Override
- public boolean returnsArgument() {
- return false;
- }
-
- @Override
- public int getReturnedArgument() {
- assert returnsArgument();
- return UNKNOWN_RETURNED_ARGUMENT;
- }
-
- @Override
- public boolean neverReturnsNull() {
- return UNKNOWN_NEVER_RETURNS_NULL;
- }
-
- @Override
- public boolean neverReturnsNormally() {
- return UNKNOWN_NEVER_RETURNS_NORMALLY;
- }
-
- @Override
- public boolean returnsConstant() {
- return UNKNOWN_RETURNS_CONSTANT;
- }
-
- @Override
- public boolean returnsConstantNumber() {
- return UNKNOWN_RETURNS_CONSTANT;
- }
-
- @Override
- public boolean returnsConstantString() {
- return UNKNOWN_RETURNS_CONSTANT;
- }
-
- @Override
- public ClassInlinerEligibility getClassInlinerEligibility() {
- return UNKNOWN_CLASS_INLINER_ELIGIBILITY;
- }
-
- @Override
- public long getReturnedConstantNumber() {
- assert returnsConstantNumber();
- return UNKNOWN_RETURNED_CONSTANT_NUMBER;
- }
-
- @Override
- public DexString getReturnedConstantString() {
- assert returnsConstantString();
- return UNKNOWN_RETURNED_CONSTANT_STRING;
- }
-
- @Override
- public boolean isInitializerEnablingJavaAssertions() {
- return UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS;
- }
-
- @Override
- public boolean useIdentifierNameString() {
- return DOES_NOT_USE_IDNETIFIER_NAME_STRING;
- }
-
- @Override
- public boolean forceInline() {
- return false;
- }
-
- @Override
- public boolean neverInline() {
- return false;
- }
-
- @Override
- public boolean checksNullReceiverBeforeAnySideEffect() {
- return UNKNOWN_CHECKS_NULL_RECEIVER_BEFORE_ANY_SIDE_EFFECT;
- }
-
- @Override
- public boolean triggersClassInitBeforeAnySideEffect() {
- return UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT;
- }
-
- @Override
- public boolean mayHaveSideEffects() {
- return UNKNOWN_MAY_HAVE_SIDE_EFFECTS;
- }
-
- @Override
- public boolean returnValueOnlyDependsOnArguments() {
- return UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS;
- }
-
- @Override
- public boolean returnValueHasBeenPropagated() {
- return false;
- }
-
- @Override
- public UpdatableMethodOptimizationInfo mutableCopy() {
- return new MethodOptimizationInfoImpl();
- }
- }
-
- public static class MethodOptimizationInfoImpl implements UpdatableMethodOptimizationInfo {
-
- private boolean cannotBeKept = false;
- private boolean classInitializerMayBePostponed = false;
- private boolean hasBeenInlinedIntoSingleCallSite = false;
- private Set<DexType> initializedClassesOnNormalExit =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_INITIALIZED_CLASSES_ON_NORMAL_EXIT;
- private int returnedArgument = DefaultMethodOptimizationInfoImpl.UNKNOWN_RETURNED_ARGUMENT;
- private boolean mayHaveSideEffects =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_MAY_HAVE_SIDE_EFFECTS;
- private boolean returnValueOnlyDependsOnArguments =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS;
- private boolean neverReturnsNull = DefaultMethodOptimizationInfoImpl.UNKNOWN_NEVER_RETURNS_NULL;
- private boolean neverReturnsNormally =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_NEVER_RETURNS_NORMALLY;
- private boolean returnsConstantNumber =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_RETURNS_CONSTANT;
- private long returnedConstantNumber =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_RETURNED_CONSTANT_NUMBER;
- private boolean returnsConstantString =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_RETURNS_CONSTANT;
- private DexString returnedConstantString =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_RETURNED_CONSTANT_STRING;
- private TypeLatticeElement returnsObjectOfType = UNKNOWN_TYPE;
- private InlinePreference inlining = InlinePreference.Default;
- private boolean useIdentifierNameString =
- DefaultMethodOptimizationInfoImpl.DOES_NOT_USE_IDNETIFIER_NAME_STRING;
- private boolean checksNullReceiverBeforeAnySideEffect =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_CHECKS_NULL_RECEIVER_BEFORE_ANY_SIDE_EFFECT;
- private boolean triggersClassInitBeforeAnySideEffect =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT;
- // Stores information about instance methods and constructors for
- // class inliner, null value indicates that the method is not eligible.
- private ClassInlinerEligibility classInlinerEligibility =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_CLASS_INLINER_ELIGIBILITY;
- private TrivialInitializer trivialInitializerInfo =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_TRIVIAL_INITIALIZER;
- private boolean initializerEnablingJavaAssertions =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS;
- private ParameterUsagesInfo parametersUsages =
- DefaultMethodOptimizationInfoImpl.UNKNOWN_PARAMETER_USAGE_INFO;
- // Stores information about nullability hint per parameter. If set, that means, the method
- // somehow (e.g., null check, such as arg != null, or using checkParameterIsNotNull) ensures
- // the corresponding parameter is not null, or throws NPE before any other side effects.
- // This info is used by {@link UninstantiatedTypeOptimization#rewriteInvoke} that replaces an
- // invocation with null throwing code if an always-null argument is passed. Also used by Inliner
- // to give a credit to null-safe code, e.g., Kotlin's null safe argument.
- // Note that this bit set takes into account the receiver for instance methods.
- private BitSet nonNullParamOrThrow = null;
- // Stores information about nullability facts per parameter. If set, that means, the method
- // somehow (e.g., null check, such as arg != null, or NPE-throwing instructions such as array
- // access or another invocation) ensures the corresponding parameter is not null, and that is
- // guaranteed until the normal exits. That is, if the invocation of this method is finished
- // normally, the recorded parameter is definitely not null. These facts are used to propagate
- // non-null information through {@link NonNullTracker}.
- // Note that this bit set takes into account the receiver for instance methods.
- private BitSet nonNullParamOnNormalExits = null;
- private boolean reachabilitySensitive = false;
- private boolean returnValueHasBeenPropagated = false;
-
- private MethodOptimizationInfoImpl() {
- // Intentionally left empty, just use the default values.
- }
-
- private MethodOptimizationInfoImpl(MethodOptimizationInfoImpl template) {
- cannotBeKept = template.cannotBeKept;
- returnedArgument = template.returnedArgument;
- neverReturnsNull = template.neverReturnsNull;
- neverReturnsNormally = template.neverReturnsNormally;
- returnsConstantNumber = template.returnsConstantNumber;
- returnedConstantNumber = template.returnedConstantNumber;
- returnsConstantString = template.returnsConstantString;
- returnedConstantString = template.returnedConstantString;
- inlining = template.inlining;
- useIdentifierNameString = template.useIdentifierNameString;
- checksNullReceiverBeforeAnySideEffect = template.checksNullReceiverBeforeAnySideEffect;
- triggersClassInitBeforeAnySideEffect = template.triggersClassInitBeforeAnySideEffect;
- classInlinerEligibility = template.classInlinerEligibility;
- trivialInitializerInfo = template.trivialInitializerInfo;
- initializerEnablingJavaAssertions = template.initializerEnablingJavaAssertions;
- parametersUsages = template.parametersUsages;
- nonNullParamOrThrow = template.nonNullParamOrThrow;
- nonNullParamOnNormalExits = template.nonNullParamOnNormalExits;
- reachabilitySensitive = template.reachabilitySensitive;
- }
-
- @Override
- public boolean cannotBeKept() {
- return cannotBeKept;
- }
-
- @Override
- public void markCannotBeKept() {
- cannotBeKept = true;
- }
-
- @Override
- public boolean classInitializerMayBePostponed() {
- return classInitializerMayBePostponed;
- }
-
- @Override
- public void markClassInitializerMayBePostponed() {
- classInitializerMayBePostponed = true;
- }
-
- @Override
- public TypeLatticeElement getDynamicReturnType() {
- return returnsObjectOfType;
- }
-
- @Override
- public Set<DexType> getInitializedClassesOnNormalExit() {
- return initializedClassesOnNormalExit;
- }
-
- @Override
- public TrivialInitializer getTrivialInitializerInfo() {
- return trivialInitializerInfo;
- }
-
- @Override
- public ParameterUsage getParameterUsages(int parameter) {
- return parametersUsages == null ? null : parametersUsages.getParameterUsage(parameter);
- }
-
- @Override
- public BitSet getNonNullParamOrThrow() {
- return nonNullParamOrThrow;
- }
-
- @Override
- public BitSet getNonNullParamOnNormalExits() {
- return nonNullParamOnNormalExits;
- }
-
- @Override
- public boolean hasBeenInlinedIntoSingleCallSite() {
- return hasBeenInlinedIntoSingleCallSite;
- }
-
- @Override
- public void markInlinedIntoSingleCallSite() {
- hasBeenInlinedIntoSingleCallSite = true;
- }
-
- @Override
- public boolean isReachabilitySensitive() {
- return reachabilitySensitive;
- }
-
- @Override
- public boolean returnsArgument() {
- return returnedArgument != -1;
- }
-
- @Override
- public int getReturnedArgument() {
- assert returnsArgument();
- return returnedArgument;
- }
-
- @Override
- public boolean neverReturnsNull() {
- return neverReturnsNull;
- }
-
- @Override
- public boolean neverReturnsNormally() {
- return neverReturnsNormally;
- }
-
- @Override
- public boolean returnsConstant() {
- assert !(returnsConstantNumber && returnsConstantString);
- return returnsConstantNumber || returnsConstantString;
- }
-
- @Override
- public boolean returnsConstantNumber() {
- return returnsConstantNumber;
- }
-
- @Override
- public boolean returnsConstantString() {
- return returnsConstantString;
- }
-
- @Override
- public ClassInlinerEligibility getClassInlinerEligibility() {
- return classInlinerEligibility;
- }
-
- @Override
- public long getReturnedConstantNumber() {
- assert returnsConstant();
- return returnedConstantNumber;
- }
-
- @Override
- public DexString getReturnedConstantString() {
- assert returnsConstant();
- return returnedConstantString;
- }
-
- @Override
- public boolean isInitializerEnablingJavaAssertions() {
- return initializerEnablingJavaAssertions;
- }
-
- @Override
- public boolean useIdentifierNameString() {
- return useIdentifierNameString;
- }
-
- @Override
- public boolean forceInline() {
- return inlining == InlinePreference.ForceInline;
- }
-
- @Override
- public boolean neverInline() {
- return inlining == InlinePreference.NeverInline;
- }
-
- @Override
- public boolean checksNullReceiverBeforeAnySideEffect() {
- return checksNullReceiverBeforeAnySideEffect;
- }
-
- @Override
- public boolean triggersClassInitBeforeAnySideEffect() {
- return triggersClassInitBeforeAnySideEffect;
- }
-
- @Override
- public boolean mayHaveSideEffects() {
- return mayHaveSideEffects;
- }
-
- @Override
- public boolean returnValueOnlyDependsOnArguments() {
- return returnValueOnlyDependsOnArguments;
- }
-
- @Override
- public void setParameterUsages(ParameterUsagesInfo parametersUsages) {
- this.parametersUsages = parametersUsages;
- }
-
- @Override
- public void setNonNullParamOrThrow(BitSet facts) {
- this.nonNullParamOrThrow = facts;
- }
-
- @Override
- public void setNonNullParamOnNormalExits(BitSet facts) {
- this.nonNullParamOnNormalExits = facts;
- }
-
- @Override
- public void setReachabilitySensitive(boolean reachabilitySensitive) {
- this.reachabilitySensitive = reachabilitySensitive;
- }
-
- @Override
- public void setClassInlinerEligibility(ClassInlinerEligibility eligibility) {
- this.classInlinerEligibility = eligibility;
- }
-
- @Override
- public void setTrivialInitializer(TrivialInitializer info) {
- this.trivialInitializerInfo = info;
- }
-
- @Override
- public void setInitializerEnablingJavaAssertions() {
- this.initializerEnablingJavaAssertions = true;
- }
-
- @Override
- public void markInitializesClassesOnNormalExit(Set<DexType> initializedClassesOnNormalExit) {
- this.initializedClassesOnNormalExit = initializedClassesOnNormalExit;
- }
-
- @Override
- public void markReturnsArgument(int argument) {
- assert argument >= 0;
- assert returnedArgument == -1 || returnedArgument == argument;
- returnedArgument = argument;
- }
-
- @Override
- public void markMayNotHaveSideEffects() {
- mayHaveSideEffects = false;
- }
-
- @Override
- public void markReturnValueOnlyDependsOnArguments() {
- returnValueOnlyDependsOnArguments = true;
- }
-
- @Override
- public void markNeverReturnsNull() {
- neverReturnsNull = true;
- }
-
- @Override
- public void markNeverReturnsNormally() {
- neverReturnsNormally = true;
- }
-
- @Override
- public void markReturnsConstantNumber(long value) {
- assert !returnsConstantString;
- assert !returnsConstantNumber || returnedConstantNumber == value
- : "return constant number changed from " + returnedConstantNumber + " to " + value;
- returnsConstantNumber = true;
- returnedConstantNumber = value;
- }
-
- @Override
- public void markReturnsConstantString(DexString value) {
- assert !returnsConstantNumber;
- assert !returnsConstantString || returnedConstantString == value
- : "return constant string changed from " + returnedConstantString + " to " + value;
- returnsConstantString = true;
- returnedConstantString = value;
- }
-
- @Override
- public void markReturnsObjectOfType(AppView<?> appView, TypeLatticeElement type) {
- assert type != null;
- // We may get more precise type information if the method is reprocessed (e.g., due to
- // optimization info collected from all call sites), and hence the `returnsObjectOfType` is
- // allowed to become more precise.
- assert returnsObjectOfType == UNKNOWN_TYPE
- || type.lessThanOrEqual(returnsObjectOfType, appView)
- : "return type changed from " + returnsObjectOfType + " to " + type;
- returnsObjectOfType = type;
- }
-
- @Override
- public void markForceInline() {
- // For concurrent scenarios we should allow the flag to be already set
- assert inlining == InlinePreference.Default || inlining == InlinePreference.ForceInline;
- inlining = InlinePreference.ForceInline;
- }
-
- @Override
- public void unsetForceInline() {
- // For concurrent scenarios we should allow the flag to be already unset
- assert inlining == InlinePreference.Default || inlining == InlinePreference.ForceInline;
- inlining = InlinePreference.Default;
- }
-
- @Override
- public void markNeverInline() {
- // For concurrent scenarios we should allow the flag to be already set
- assert inlining == InlinePreference.Default || inlining == InlinePreference.NeverInline;
- inlining = InlinePreference.NeverInline;
- }
-
- @Override
- public void markUseIdentifierNameString() {
- useIdentifierNameString = true;
- }
-
- @Override
- public void markCheckNullReceiverBeforeAnySideEffect(boolean mark) {
- checksNullReceiverBeforeAnySideEffect = mark;
- }
-
- @Override
- public void markTriggerClassInitBeforeAnySideEffect(boolean mark) {
- triggersClassInitBeforeAnySideEffect = mark;
- }
-
- @Override
- public void markAsPropagated() {
- returnValueHasBeenPropagated = true;
- }
-
- @Override
- public boolean returnValueHasBeenPropagated() {
- return returnValueHasBeenPropagated;
- }
-
- @Override
- public UpdatableMethodOptimizationInfo mutableCopy() {
- assert this != DefaultMethodOptimizationInfoImpl.DEFAULT_INSTANCE;
- return new MethodOptimizationInfoImpl(this);
- }
- }
-
public MethodOptimizationInfo getOptimizationInfo() {
checkIfObsolete();
return optimizationInfo;
@@ -1702,7 +1121,7 @@
public synchronized UpdatableMethodOptimizationInfo getMutableOptimizationInfo() {
checkIfObsolete();
- if (optimizationInfo == DefaultMethodOptimizationInfoImpl.DEFAULT_INSTANCE) {
+ if (optimizationInfo == DefaultMethodOptimizationInfo.DEFAULT_INSTANCE) {
optimizationInfo = optimizationInfo.mutableCopy();
}
return (UpdatableMethodOptimizationInfo) optimizationInfo;
@@ -1820,7 +1239,7 @@
}
public Builder unsetOptimizationInfo() {
- optimizationInfo = DefaultMethodOptimizationInfoImpl.DEFAULT_INSTANCE;
+ optimizationInfo = DefaultMethodOptimizationInfo.DEFAULT_INSTANCE;
return this;
}
diff --git a/src/main/java/com/android/tools/r8/graph/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/graph/UpdatableMethodOptimizationInfo.java
deleted file mode 100644
index 601bc7b..0000000
--- a/src/main/java/com/android/tools/r8/graph/UpdatableMethodOptimizationInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.graph;
-
-import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
-import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
-import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
-import java.util.BitSet;
-import java.util.Set;
-
-public interface UpdatableMethodOptimizationInfo extends MethodOptimizationInfo {
-
- void markCannotBeKept();
-
- void markInitializesClassesOnNormalExit(Set<DexType> initializedClasses);
-
- void markInlinedIntoSingleCallSite();
-
- void markReturnsArgument(int argument);
-
- void markReturnsConstantNumber(long value);
-
- void markReturnsConstantString(DexString value);
-
- void markReturnsObjectOfType(AppView<?> appView, TypeLatticeElement type);
-
- void markAsPropagated();
-
- void markMayNotHaveSideEffects();
-
- void markReturnValueOnlyDependsOnArguments();
-
- void markNeverReturnsNull();
-
- void markNeverReturnsNormally();
-
- void markCheckNullReceiverBeforeAnySideEffect(boolean mark);
-
- void markTriggerClassInitBeforeAnySideEffect(boolean mark);
-
- void setClassInlinerEligibility(ClassInlinerEligibility eligibility);
-
- void setTrivialInitializer(TrivialInitializer info);
-
- void setInitializerEnablingJavaAssertions();
-
- void setParameterUsages(ParameterUsagesInfo parameterUsagesInfo);
-
- void setNonNullParamOrThrow(BitSet facts);
-
- void setNonNullParamOnNormalExits(BitSet facts);
-
- void setReachabilitySensitive(boolean reachabilitySensitive);
-
- void markUseIdentifierNameString();
-
- void markForceInline();
-
- void unsetForceInline();
-
- void markNeverInline();
-
- void markClassInitializerMayBePostponed();
-}
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
index f6defb2..bed6235 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/ClassInitializerAssertionEnablingAnalysis.java
@@ -14,7 +14,7 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.objectweb.asm.Opcodes;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index a03832a..614c521 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -19,8 +19,8 @@
import com.android.tools.r8.graph.FieldAccessInfoCollection;
import com.android.tools.r8.ir.conversion.CallSiteInformation;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedbackIgnore;
import com.android.tools.r8.ir.optimize.Outliner;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.DescriptorUtils;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
index c3cd006..62a9bb5 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -30,8 +30,8 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.CallSiteInformation;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedbackIgnore;
import com.android.tools.r8.ir.optimize.Outliner;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.List;
import java.util.function.Consumer;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 1ba87f9..cdb5d82 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -69,6 +69,10 @@
import com.android.tools.r8.ir.optimize.ServiceLoaderRewriter;
import com.android.tools.r8.ir.optimize.UninstantiatedTypeOptimization;
import com.android.tools.r8.ir.optimize.classinliner.ClassInliner;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.ir.optimize.lambda.LambdaMerger;
import com.android.tools.r8.ir.optimize.staticizer.ClassStaticizer;
import com.android.tools.r8.ir.optimize.string.StringBuilderOptimizer;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 5ba5363..48e880c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -28,9 +28,6 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.ParameterUsagesInfo;
-import com.android.tools.r8.graph.ParameterUsagesInfo.ParameterUsage;
-import com.android.tools.r8.graph.ParameterUsagesInfo.ParameterUsageBuilder;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption;
import com.android.tools.r8.ir.analysis.equivalence.BasicBlockBehavioralSubsumption;
import com.android.tools.r8.ir.analysis.type.Nullability;
@@ -88,8 +85,11 @@
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.code.Xor;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.SwitchUtils.EnumSwitchInfo;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo.ParameterUsage;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo.ParameterUsageBuilder;
import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
import com.android.tools.r8.kotlin.Kotlin;
import com.android.tools.r8.shaking.AppInfoWithLiveness.EnumValueInfo;
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 2ca0f00..a80f7ab 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
@@ -19,10 +19,10 @@
import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.CallSiteInformation;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
import com.android.tools.r8.ir.optimize.Inliner.InlineeWithReason;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.MainDexDirectReferenceTracer;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java
index ace7a3b..1a1aacb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DynamicTypeOptimization.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.MethodOptimizationInfo;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.code.Assume;
import com.android.tools.r8.ir.code.Assume.DynamicTypeAssumption;
@@ -19,6 +18,7 @@
import com.android.tools.r8.ir.code.JumpInstruction;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.google.common.base.Predicates;
import java.util.ArrayList;
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 a5cfdb5..4aaa3bc 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
@@ -15,10 +15,10 @@
import com.android.tools.r8.ir.code.InvokeMethodWithReceiver;
import com.android.tools.r8.ir.code.InvokePolymorphic;
import com.android.tools.r8.ir.code.InvokeStatic;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
import com.android.tools.r8.ir.optimize.Inliner.InlineeWithReason;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import java.util.ListIterator;
import java.util.Map;
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 773a7e0..c35cd11 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
@@ -33,9 +33,9 @@
import com.android.tools.r8.ir.conversion.CallSiteInformation;
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.conversion.LensCodeRewriter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
-import com.android.tools.r8.ir.conversion.OptimizationFeedbackIgnore;
import com.android.tools.r8.ir.desugar.TwrCloseResourceRewriter;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.MainDexClasses;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningStrategy.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningStrategy.java
index 678cbc3..f9bf9c6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningStrategy.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningStrategy.java
@@ -10,8 +10,8 @@
import com.android.tools.r8.ir.code.BasicBlock;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.InvokeMethod;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.Inliner.InlineeWithReason;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import java.util.ListIterator;
interface InliningStrategy {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
index 8b57c10..d6e16e8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/NonNullTracker.java
@@ -23,7 +23,7 @@
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.Phi;
import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.google.common.base.Predicates;
import com.google.common.collect.Sets;
import it.unimi.dsi.fastutil.ints.IntArrayList;
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 bfcaba0..be28c03 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
@@ -15,8 +15,6 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.MethodOptimizationInfo;
-import com.android.tools.r8.graph.ParameterUsagesInfo.ParameterUsage;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
@@ -38,6 +36,8 @@
import com.android.tools.r8.ir.optimize.Inliner.InliningInfo;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.ir.optimize.InliningOracle;
+import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo.ParameterUsage;
import com.android.tools.r8.kotlin.KotlinInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Pair;
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
similarity index 94%
rename from src/main/java/com/android/tools/r8/graph/DefaultFieldOptimizationInfo.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
index 3fd09c0..0eaac27 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.ir.optimize.info;
public class DefaultFieldOptimizationInfo extends FieldOptimizationInfo {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
new file mode 100644
index 0000000..e96cdb0
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
@@ -0,0 +1,196 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.optimize.info;
+
+import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
+import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo.ParameterUsage;
+import com.google.common.collect.ImmutableSet;
+import java.util.BitSet;
+import java.util.Set;
+
+public class DefaultMethodOptimizationInfo implements MethodOptimizationInfo {
+
+ public static final MethodOptimizationInfo DEFAULT_INSTANCE = new DefaultMethodOptimizationInfo();
+
+ static Set<DexType> UNKNOWN_INITIALIZED_CLASSES_ON_NORMAL_EXIT = ImmutableSet.of();
+ static int UNKNOWN_RETURNED_ARGUMENT = -1;
+ static boolean UNKNOWN_NEVER_RETURNS_NULL = false;
+ static boolean UNKNOWN_NEVER_RETURNS_NORMALLY = false;
+ static boolean UNKNOWN_RETURNS_CONSTANT = false;
+ static long UNKNOWN_RETURNED_CONSTANT_NUMBER = 0;
+ static DexString UNKNOWN_RETURNED_CONSTANT_STRING = null;
+ static TypeLatticeElement UNKNOWN_TYPE = null;
+ static boolean DOES_NOT_USE_IDNETIFIER_NAME_STRING = false;
+ static boolean UNKNOWN_CHECKS_NULL_RECEIVER_BEFORE_ANY_SIDE_EFFECT = false;
+ static boolean UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT = false;
+ static ClassInlinerEligibility UNKNOWN_CLASS_INLINER_ELIGIBILITY = null;
+ static TrivialInitializer UNKNOWN_TRIVIAL_INITIALIZER = null;
+ static boolean UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS = false;
+ static ParameterUsagesInfo UNKNOWN_PARAMETER_USAGE_INFO = null;
+ static boolean UNKNOWN_MAY_HAVE_SIDE_EFFECTS = true;
+ static boolean UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS = false;
+ private static BitSet NO_NULL_PARAMETER_OR_THROW_FACTS = null;
+ private static BitSet NO_NULL_PARAMETER_ON_NORMAL_EXITS_FACTS = null;
+
+ private DefaultMethodOptimizationInfo() {}
+
+ @Override
+ public boolean cannotBeKept() {
+ return false;
+ }
+
+ @Override
+ public boolean classInitializerMayBePostponed() {
+ return false;
+ }
+
+ @Override
+ public TypeLatticeElement getDynamicReturnType() {
+ return UNKNOWN_TYPE;
+ }
+
+ @Override
+ public Set<DexType> getInitializedClassesOnNormalExit() {
+ return UNKNOWN_INITIALIZED_CLASSES_ON_NORMAL_EXIT;
+ }
+
+ @Override
+ public TrivialInitializer getTrivialInitializerInfo() {
+ return UNKNOWN_TRIVIAL_INITIALIZER;
+ }
+
+ @Override
+ public ParameterUsage getParameterUsages(int parameter) {
+ assert UNKNOWN_PARAMETER_USAGE_INFO == null;
+ return null;
+ }
+
+ @Override
+ public BitSet getNonNullParamOrThrow() {
+ return NO_NULL_PARAMETER_OR_THROW_FACTS;
+ }
+
+ @Override
+ public BitSet getNonNullParamOnNormalExits() {
+ return NO_NULL_PARAMETER_ON_NORMAL_EXITS_FACTS;
+ }
+
+ @Override
+ public boolean hasBeenInlinedIntoSingleCallSite() {
+ return false;
+ }
+
+ @Override
+ public boolean isReachabilitySensitive() {
+ return false;
+ }
+
+ @Override
+ public boolean returnsArgument() {
+ return false;
+ }
+
+ @Override
+ public int getReturnedArgument() {
+ assert returnsArgument();
+ return UNKNOWN_RETURNED_ARGUMENT;
+ }
+
+ @Override
+ public boolean neverReturnsNull() {
+ return UNKNOWN_NEVER_RETURNS_NULL;
+ }
+
+ @Override
+ public boolean neverReturnsNormally() {
+ return UNKNOWN_NEVER_RETURNS_NORMALLY;
+ }
+
+ @Override
+ public boolean returnsConstant() {
+ return UNKNOWN_RETURNS_CONSTANT;
+ }
+
+ @Override
+ public boolean returnsConstantNumber() {
+ return UNKNOWN_RETURNS_CONSTANT;
+ }
+
+ @Override
+ public boolean returnsConstantString() {
+ return UNKNOWN_RETURNS_CONSTANT;
+ }
+
+ @Override
+ public ClassInlinerEligibility getClassInlinerEligibility() {
+ return UNKNOWN_CLASS_INLINER_ELIGIBILITY;
+ }
+
+ @Override
+ public long getReturnedConstantNumber() {
+ assert returnsConstantNumber();
+ return UNKNOWN_RETURNED_CONSTANT_NUMBER;
+ }
+
+ @Override
+ public DexString getReturnedConstantString() {
+ assert returnsConstantString();
+ return UNKNOWN_RETURNED_CONSTANT_STRING;
+ }
+
+ @Override
+ public boolean isInitializerEnablingJavaAssertions() {
+ return UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS;
+ }
+
+ @Override
+ public boolean useIdentifierNameString() {
+ return DOES_NOT_USE_IDNETIFIER_NAME_STRING;
+ }
+
+ @Override
+ public boolean forceInline() {
+ return false;
+ }
+
+ @Override
+ public boolean neverInline() {
+ return false;
+ }
+
+ @Override
+ public boolean checksNullReceiverBeforeAnySideEffect() {
+ return UNKNOWN_CHECKS_NULL_RECEIVER_BEFORE_ANY_SIDE_EFFECT;
+ }
+
+ @Override
+ public boolean triggersClassInitBeforeAnySideEffect() {
+ return UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT;
+ }
+
+ @Override
+ public boolean mayHaveSideEffects() {
+ return UNKNOWN_MAY_HAVE_SIDE_EFFECTS;
+ }
+
+ @Override
+ public boolean returnValueOnlyDependsOnArguments() {
+ return UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS;
+ }
+
+ @Override
+ public boolean returnValueHasBeenPropagated() {
+ return false;
+ }
+
+ @Override
+ public UpdatableMethodOptimizationInfo mutableCopy() {
+ return new UpdatableMethodOptimizationInfo();
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/FieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
similarity index 93%
rename from src/main/java/com/android/tools/r8/graph/FieldOptimizationInfo.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
index be4df18..e47073e 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.ir.optimize.info;
public abstract class FieldOptimizationInfo {
diff --git a/src/main/java/com/android/tools/r8/graph/MethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/graph/MethodOptimizationInfo.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
index 1c76877..4e369e6 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
@@ -1,13 +1,15 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.ir.optimize.info;
import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
-import com.android.tools.r8.graph.ParameterUsagesInfo.ParameterUsage;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo.ParameterUsage;
import java.util.BitSet;
import java.util.Set;
diff --git a/src/main/java/com/android/tools/r8/graph/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
similarity index 96%
rename from src/main/java/com/android/tools/r8/graph/MutableFieldOptimizationInfo.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index 24d2ea3..4c6e023 100644
--- a/src/main/java/com/android/tools/r8/graph/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.ir.optimize.info;
/**
* Optimization info for fields.
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
similarity index 93%
rename from src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
index c5bff88..e4a878a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedback.java
@@ -1,8 +1,8 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.conversion;
+package com.android.tools.r8.ir.optimize.info;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -10,7 +10,6 @@
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.ParameterUsagesInfo;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
similarity index 96%
rename from src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDelayed.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index 5b900d2..a3e8559 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -1,8 +1,8 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.conversion;
+package com.android.tools.r8.ir.optimize.info;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -10,8 +10,6 @@
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.ParameterUsagesInfo;
-import com.android.tools.r8.graph.UpdatableMethodOptimizationInfo;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.utils.IteratorUtils;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
similarity index 94%
rename from src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
index a2d7387..3f5967a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
@@ -1,8 +1,8 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.conversion;
+package com.android.tools.r8.ir.optimize.info;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -10,7 +10,6 @@
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.ParameterUsagesInfo;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
similarity index 95%
rename from src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
index 024c815..91698b9 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
@@ -1,8 +1,8 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.conversion;
+package com.android.tools.r8.ir.optimize.info;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -10,7 +10,6 @@
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.ParameterUsagesInfo;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
diff --git a/src/main/java/com/android/tools/r8/graph/ParameterUsagesInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/graph/ParameterUsagesInfo.java
rename to src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
index aac25ba..0495bba 100644
--- a/src/main/java/com/android/tools/r8/graph/ParameterUsagesInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
@@ -1,9 +1,10 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.graph;
+package com.android.tools.r8.ir.optimize.info;
+import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.ir.code.If;
import com.android.tools.r8.ir.code.If.Type;
import com.android.tools.r8.ir.code.InstanceGet;
@@ -24,6 +25,7 @@
import java.util.stream.Collectors;
public final class ParameterUsagesInfo {
+
private ImmutableList<ParameterUsage> parametersUsages;
public ParameterUsagesInfo(List<ParameterUsage> usages) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
new file mode 100644
index 0000000..44ed8c0
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -0,0 +1,382 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.optimize.info;
+
+import static com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationInfo.UNKNOWN_TYPE;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
+import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
+import com.android.tools.r8.ir.optimize.info.ParameterUsagesInfo.ParameterUsage;
+import java.util.BitSet;
+import java.util.Set;
+
+public class UpdatableMethodOptimizationInfo implements MethodOptimizationInfo {
+
+ private boolean cannotBeKept = false;
+ private boolean classInitializerMayBePostponed = false;
+ private boolean hasBeenInlinedIntoSingleCallSite = false;
+ private Set<DexType> initializedClassesOnNormalExit =
+ DefaultMethodOptimizationInfo.UNKNOWN_INITIALIZED_CLASSES_ON_NORMAL_EXIT;
+ private int returnedArgument = DefaultMethodOptimizationInfo.UNKNOWN_RETURNED_ARGUMENT;
+ private boolean mayHaveSideEffects = DefaultMethodOptimizationInfo.UNKNOWN_MAY_HAVE_SIDE_EFFECTS;
+ private boolean returnValueOnlyDependsOnArguments =
+ DefaultMethodOptimizationInfo.UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS;
+ private boolean neverReturnsNull = DefaultMethodOptimizationInfo.UNKNOWN_NEVER_RETURNS_NULL;
+ private boolean neverReturnsNormally =
+ DefaultMethodOptimizationInfo.UNKNOWN_NEVER_RETURNS_NORMALLY;
+ private boolean returnsConstantNumber = DefaultMethodOptimizationInfo.UNKNOWN_RETURNS_CONSTANT;
+ private long returnedConstantNumber =
+ DefaultMethodOptimizationInfo.UNKNOWN_RETURNED_CONSTANT_NUMBER;
+ private boolean returnsConstantString = DefaultMethodOptimizationInfo.UNKNOWN_RETURNS_CONSTANT;
+ private DexString returnedConstantString =
+ DefaultMethodOptimizationInfo.UNKNOWN_RETURNED_CONSTANT_STRING;
+ private TypeLatticeElement returnsObjectOfType = UNKNOWN_TYPE;
+ private InlinePreference inlining = InlinePreference.Default;
+ private boolean useIdentifierNameString =
+ DefaultMethodOptimizationInfo.DOES_NOT_USE_IDNETIFIER_NAME_STRING;
+ private boolean checksNullReceiverBeforeAnySideEffect =
+ DefaultMethodOptimizationInfo.UNKNOWN_CHECKS_NULL_RECEIVER_BEFORE_ANY_SIDE_EFFECT;
+ private boolean triggersClassInitBeforeAnySideEffect =
+ DefaultMethodOptimizationInfo.UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT;
+ // Stores information about instance methods and constructors for
+ // class inliner, null value indicates that the method is not eligible.
+ private ClassInlinerEligibility classInlinerEligibility =
+ DefaultMethodOptimizationInfo.UNKNOWN_CLASS_INLINER_ELIGIBILITY;
+ private TrivialInitializer trivialInitializerInfo =
+ DefaultMethodOptimizationInfo.UNKNOWN_TRIVIAL_INITIALIZER;
+ private boolean initializerEnablingJavaAssertions =
+ DefaultMethodOptimizationInfo.UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS;
+ private ParameterUsagesInfo parametersUsages =
+ DefaultMethodOptimizationInfo.UNKNOWN_PARAMETER_USAGE_INFO;
+ // Stores information about nullability hint per parameter. If set, that means, the method
+ // somehow (e.g., null check, such as arg != null, or using checkParameterIsNotNull) ensures
+ // the corresponding parameter is not null, or throws NPE before any other side effects.
+ // This info is used by {@link UninstantiatedTypeOptimization#rewriteInvoke} that replaces an
+ // invocation with null throwing code if an always-null argument is passed. Also used by Inliner
+ // to give a credit to null-safe code, e.g., Kotlin's null safe argument.
+ // Note that this bit set takes into account the receiver for instance methods.
+ private BitSet nonNullParamOrThrow = null;
+ // Stores information about nullability facts per parameter. If set, that means, the method
+ // somehow (e.g., null check, such as arg != null, or NPE-throwing instructions such as array
+ // access or another invocation) ensures the corresponding parameter is not null, and that is
+ // guaranteed until the normal exits. That is, if the invocation of this method is finished
+ // normally, the recorded parameter is definitely not null. These facts are used to propagate
+ // non-null information through {@link NonNullTracker}.
+ // Note that this bit set takes into account the receiver for instance methods.
+ private BitSet nonNullParamOnNormalExits = null;
+ private boolean reachabilitySensitive = false;
+ private boolean returnValueHasBeenPropagated = false;
+
+ UpdatableMethodOptimizationInfo() {
+ // Intentionally left empty, just use the default values.
+ }
+
+ private UpdatableMethodOptimizationInfo(UpdatableMethodOptimizationInfo template) {
+ cannotBeKept = template.cannotBeKept;
+ returnedArgument = template.returnedArgument;
+ neverReturnsNull = template.neverReturnsNull;
+ neverReturnsNormally = template.neverReturnsNormally;
+ returnsConstantNumber = template.returnsConstantNumber;
+ returnedConstantNumber = template.returnedConstantNumber;
+ returnsConstantString = template.returnsConstantString;
+ returnedConstantString = template.returnedConstantString;
+ inlining = template.inlining;
+ useIdentifierNameString = template.useIdentifierNameString;
+ checksNullReceiverBeforeAnySideEffect = template.checksNullReceiverBeforeAnySideEffect;
+ triggersClassInitBeforeAnySideEffect = template.triggersClassInitBeforeAnySideEffect;
+ classInlinerEligibility = template.classInlinerEligibility;
+ trivialInitializerInfo = template.trivialInitializerInfo;
+ initializerEnablingJavaAssertions = template.initializerEnablingJavaAssertions;
+ parametersUsages = template.parametersUsages;
+ nonNullParamOrThrow = template.nonNullParamOrThrow;
+ nonNullParamOnNormalExits = template.nonNullParamOnNormalExits;
+ reachabilitySensitive = template.reachabilitySensitive;
+ }
+
+ @Override
+ public boolean cannotBeKept() {
+ return cannotBeKept;
+ }
+
+ public void markCannotBeKept() {
+ cannotBeKept = true;
+ }
+
+ @Override
+ public boolean classInitializerMayBePostponed() {
+ return classInitializerMayBePostponed;
+ }
+
+ public void markClassInitializerMayBePostponed() {
+ classInitializerMayBePostponed = true;
+ }
+
+ @Override
+ public TypeLatticeElement getDynamicReturnType() {
+ return returnsObjectOfType;
+ }
+
+ @Override
+ public Set<DexType> getInitializedClassesOnNormalExit() {
+ return initializedClassesOnNormalExit;
+ }
+
+ @Override
+ public TrivialInitializer getTrivialInitializerInfo() {
+ return trivialInitializerInfo;
+ }
+
+ @Override
+ public ParameterUsage getParameterUsages(int parameter) {
+ return parametersUsages == null ? null : parametersUsages.getParameterUsage(parameter);
+ }
+
+ @Override
+ public BitSet getNonNullParamOrThrow() {
+ return nonNullParamOrThrow;
+ }
+
+ @Override
+ public BitSet getNonNullParamOnNormalExits() {
+ return nonNullParamOnNormalExits;
+ }
+
+ @Override
+ public boolean hasBeenInlinedIntoSingleCallSite() {
+ return hasBeenInlinedIntoSingleCallSite;
+ }
+
+ public void markInlinedIntoSingleCallSite() {
+ hasBeenInlinedIntoSingleCallSite = true;
+ }
+
+ @Override
+ public boolean isReachabilitySensitive() {
+ return reachabilitySensitive;
+ }
+
+ @Override
+ public boolean returnsArgument() {
+ return returnedArgument != -1;
+ }
+
+ @Override
+ public int getReturnedArgument() {
+ assert returnsArgument();
+ return returnedArgument;
+ }
+
+ @Override
+ public boolean neverReturnsNull() {
+ return neverReturnsNull;
+ }
+
+ @Override
+ public boolean neverReturnsNormally() {
+ return neverReturnsNormally;
+ }
+
+ @Override
+ public boolean returnsConstant() {
+ assert !(returnsConstantNumber && returnsConstantString);
+ return returnsConstantNumber || returnsConstantString;
+ }
+
+ @Override
+ public boolean returnsConstantNumber() {
+ return returnsConstantNumber;
+ }
+
+ @Override
+ public boolean returnsConstantString() {
+ return returnsConstantString;
+ }
+
+ @Override
+ public ClassInlinerEligibility getClassInlinerEligibility() {
+ return classInlinerEligibility;
+ }
+
+ @Override
+ public long getReturnedConstantNumber() {
+ assert returnsConstant();
+ return returnedConstantNumber;
+ }
+
+ @Override
+ public DexString getReturnedConstantString() {
+ assert returnsConstant();
+ return returnedConstantString;
+ }
+
+ @Override
+ public boolean isInitializerEnablingJavaAssertions() {
+ return initializerEnablingJavaAssertions;
+ }
+
+ @Override
+ public boolean useIdentifierNameString() {
+ return useIdentifierNameString;
+ }
+
+ @Override
+ public boolean forceInline() {
+ return inlining == InlinePreference.ForceInline;
+ }
+
+ @Override
+ public boolean neverInline() {
+ return inlining == InlinePreference.NeverInline;
+ }
+
+ @Override
+ public boolean checksNullReceiverBeforeAnySideEffect() {
+ return checksNullReceiverBeforeAnySideEffect;
+ }
+
+ @Override
+ public boolean triggersClassInitBeforeAnySideEffect() {
+ return triggersClassInitBeforeAnySideEffect;
+ }
+
+ @Override
+ public boolean mayHaveSideEffects() {
+ return mayHaveSideEffects;
+ }
+
+ @Override
+ public boolean returnValueOnlyDependsOnArguments() {
+ return returnValueOnlyDependsOnArguments;
+ }
+
+ public void setParameterUsages(ParameterUsagesInfo parametersUsages) {
+ this.parametersUsages = parametersUsages;
+ }
+
+ public void setNonNullParamOrThrow(BitSet facts) {
+ this.nonNullParamOrThrow = facts;
+ }
+
+ public void setNonNullParamOnNormalExits(BitSet facts) {
+ this.nonNullParamOnNormalExits = facts;
+ }
+
+ public void setReachabilitySensitive(boolean reachabilitySensitive) {
+ this.reachabilitySensitive = reachabilitySensitive;
+ }
+
+ public void setClassInlinerEligibility(ClassInlinerEligibility eligibility) {
+ this.classInlinerEligibility = eligibility;
+ }
+
+ public void setTrivialInitializer(TrivialInitializer info) {
+ this.trivialInitializerInfo = info;
+ }
+
+ public void setInitializerEnablingJavaAssertions() {
+ this.initializerEnablingJavaAssertions = true;
+ }
+
+ public void markInitializesClassesOnNormalExit(Set<DexType> initializedClassesOnNormalExit) {
+ this.initializedClassesOnNormalExit = initializedClassesOnNormalExit;
+ }
+
+ public void markReturnsArgument(int argument) {
+ assert argument >= 0;
+ assert returnedArgument == -1 || returnedArgument == argument;
+ returnedArgument = argument;
+ }
+
+ public void markMayNotHaveSideEffects() {
+ mayHaveSideEffects = false;
+ }
+
+ public void markReturnValueOnlyDependsOnArguments() {
+ returnValueOnlyDependsOnArguments = true;
+ }
+
+ public void markNeverReturnsNull() {
+ neverReturnsNull = true;
+ }
+
+ public void markNeverReturnsNormally() {
+ neverReturnsNormally = true;
+ }
+
+ public void markReturnsConstantNumber(long value) {
+ assert !returnsConstantString;
+ assert !returnsConstantNumber || returnedConstantNumber == value
+ : "return constant number changed from " + returnedConstantNumber + " to " + value;
+ returnsConstantNumber = true;
+ returnedConstantNumber = value;
+ }
+
+ public void markReturnsConstantString(DexString value) {
+ assert !returnsConstantNumber;
+ assert !returnsConstantString || returnedConstantString == value
+ : "return constant string changed from " + returnedConstantString + " to " + value;
+ returnsConstantString = true;
+ returnedConstantString = value;
+ }
+
+ public void markReturnsObjectOfType(AppView<?> appView, TypeLatticeElement type) {
+ assert type != null;
+ // We may get more precise type information if the method is reprocessed (e.g., due to
+ // optimization info collected from all call sites), and hence the `returnsObjectOfType` is
+ // allowed to become more precise.
+ assert returnsObjectOfType == UNKNOWN_TYPE || type.lessThanOrEqual(returnsObjectOfType, appView)
+ : "return type changed from " + returnsObjectOfType + " to " + type;
+ returnsObjectOfType = type;
+ }
+
+ public void markForceInline() {
+ // For concurrent scenarios we should allow the flag to be already set
+ assert inlining == InlinePreference.Default || inlining == InlinePreference.ForceInline;
+ inlining = InlinePreference.ForceInline;
+ }
+
+ public void unsetForceInline() {
+ // For concurrent scenarios we should allow the flag to be already unset
+ assert inlining == InlinePreference.Default || inlining == InlinePreference.ForceInline;
+ inlining = InlinePreference.Default;
+ }
+
+ public void markNeverInline() {
+ // For concurrent scenarios we should allow the flag to be already set
+ assert inlining == InlinePreference.Default || inlining == InlinePreference.NeverInline;
+ inlining = InlinePreference.NeverInline;
+ }
+
+ public void markUseIdentifierNameString() {
+ useIdentifierNameString = true;
+ }
+
+ public void markCheckNullReceiverBeforeAnySideEffect(boolean mark) {
+ checksNullReceiverBeforeAnySideEffect = mark;
+ }
+
+ public void markTriggerClassInitBeforeAnySideEffect(boolean mark) {
+ triggersClassInitBeforeAnySideEffect = mark;
+ }
+
+ public void markAsPropagated() {
+ returnValueHasBeenPropagated = true;
+ }
+
+ @Override
+ public boolean returnValueHasBeenPropagated() {
+ return returnValueHasBeenPropagated;
+ }
+
+ @Override
+ public UpdatableMethodOptimizationInfo mutableCopy() {
+ assert this != DefaultMethodOptimizationInfo.DEFAULT_INSTANCE;
+ return new UpdatableMethodOptimizationInfo(this);
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
index 724acb2..87fc257 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
@@ -25,9 +25,9 @@
import com.android.tools.r8.ir.code.StaticPut;
import com.android.tools.r8.ir.conversion.CallSiteInformation;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.Outliner;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.lambda.CodeProcessor.Strategy;
import com.android.tools.r8.ir.optimize.lambda.LambdaGroup.LambdaStructureError;
import com.android.tools.r8.ir.optimize.lambda.kotlin.KotlinLambdaGroupIdFactory;
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 3a006fd..88a20da 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
@@ -26,7 +26,7 @@
import com.android.tools.r8.ir.code.StaticPut;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index 4815c1f..1ab806d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -28,8 +28,8 @@
import com.android.tools.r8.ir.code.StaticPut;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.CallSiteInformation;
-import com.android.tools.r8.ir.conversion.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.Outliner;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.staticizer.ClassStaticizer.CandidateInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.SetUtils;