| // 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.DexType; |
| import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint; |
| import com.android.tools.r8.ir.analysis.type.DynamicType; |
| import com.android.tools.r8.ir.analysis.value.AbstractValue; |
| import com.android.tools.r8.ir.code.InvokeDirect; |
| import com.android.tools.r8.ir.code.InvokeMethod; |
| import com.android.tools.r8.ir.optimize.classinliner.constraint.ClassInlinerMethodConstraint; |
| import com.android.tools.r8.ir.optimize.enums.classification.EnumUnboxerMethodClassification; |
| import com.android.tools.r8.ir.optimize.info.bridge.BridgeInfo; |
| import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo; |
| import com.android.tools.r8.utils.InternalOptions; |
| import java.util.BitSet; |
| import java.util.Set; |
| |
| public abstract class MethodOptimizationInfo |
| implements MemberOptimizationInfo<MutableMethodOptimizationInfo> { |
| |
| enum InlinePreference { |
| MultiCallerInline, |
| ForceInline, |
| Default |
| } |
| |
| public abstract boolean cannotBeKept(); |
| |
| public abstract boolean classInitializerMayBePostponed(); |
| |
| public abstract CallSiteOptimizationInfo getArgumentInfos(); |
| |
| public abstract ClassInlinerMethodConstraint getClassInlinerMethodConstraint(); |
| |
| public abstract EnumUnboxerMethodClassification getEnumUnboxerMethodClassification(); |
| |
| public abstract DynamicType getDynamicType(); |
| |
| public final boolean hasNonNullParamOrThrow() { |
| return getNonNullParamOrThrow() != null; |
| } |
| |
| public abstract BitSet getNonNullParamOrThrow(); |
| |
| public final boolean hasNonNullParamOnNormalExits() { |
| return getNonNullParamOnNormalExits() != null; |
| } |
| |
| public abstract BitSet getNonNullParamOnNormalExits(); |
| |
| public abstract boolean hasBeenInlinedIntoSingleCallSite(); |
| |
| public abstract boolean isReachabilitySensitive(); |
| |
| public abstract boolean returnsArgument(); |
| |
| public abstract int getReturnedArgument(); |
| |
| public abstract boolean neverReturnsNormally(); |
| |
| public abstract BridgeInfo getBridgeInfo(); |
| |
| public abstract Set<DexType> getInitializedClassesOnNormalExit(); |
| |
| public abstract InstanceInitializerInfo getContextInsensitiveInstanceInitializerInfo(); |
| |
| public abstract InstanceInitializerInfo getInstanceInitializerInfo(InvokeDirect invoke); |
| |
| public abstract boolean isInitializerEnablingJavaVmAssertions(); |
| |
| public abstract AbstractValue getAbstractReturnValue(); |
| |
| public abstract SimpleInliningConstraint getNopInliningConstraint(InternalOptions options); |
| |
| public abstract SimpleInliningConstraint getSimpleInliningConstraint(); |
| |
| public final boolean hasUnusedArguments() { |
| assert getUnusedArguments() == null || !getUnusedArguments().isEmpty(); |
| return getUnusedArguments() != null; |
| } |
| |
| public abstract BitSet getUnusedArguments(); |
| |
| public abstract boolean isMultiCallerMethod(); |
| |
| public abstract boolean forceInline(); |
| |
| public abstract boolean checksNullReceiverBeforeAnySideEffect(); |
| |
| public abstract boolean triggersClassInitBeforeAnySideEffect(); |
| |
| public abstract boolean mayHaveSideEffects(); |
| |
| /** Context sensitive version of {@link #mayHaveSideEffects()}. */ |
| public abstract boolean mayHaveSideEffects(InvokeMethod invoke, InternalOptions options); |
| |
| public abstract boolean returnValueOnlyDependsOnArguments(); |
| |
| public abstract boolean returnValueHasBeenPropagated(); |
| |
| @Override |
| public boolean isMethodOptimizationInfo() { |
| return true; |
| } |
| |
| @Override |
| public MethodOptimizationInfo asMethodOptimizationInfo() { |
| return this; |
| } |
| } |