blob: 34d896753dd520c5e7816343ff57c4d39182fe88 [file] [log] [blame]
// Copyright (c) 2022, 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.optimize.argumentpropagation.utils;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.KeepMethodInfo;
import com.android.tools.r8.utils.InternalOptions;
public class ParameterRemovalUtils {
public static boolean canRemoveUnusedParametersFrom(
AppView<AppInfoWithLiveness> appView, ProgramMethod method) {
KeepMethodInfo keepInfo = appView.getKeepInfo(method);
InternalOptions options = appView.options();
if (!keepInfo.isParameterRemovalAllowed(options)) {
return false;
}
if (!appView.getKeepInfo(method).isUnusedArgumentOptimizationAllowed(options)) {
return false;
}
return method.getDefinition().isLibraryMethodOverride().isFalse()
&& !appView.appInfoWithLiveness().isMethodTargetedByInvokeDynamic(method);
}
public static boolean canRemoveUnusedParameter(
AppView<AppInfoWithLiveness> appView, ProgramMethod method, int argumentIndex) {
assert canRemoveUnusedParametersFrom(appView, method);
if (argumentIndex == 0) {
if (method.getDefinition().isInstanceInitializer()) {
return false;
}
if (method.getDefinition().isInstance()) {
if (method.getAccessFlags().isSynchronized()) {
return false;
}
KeepMethodInfo keepInfo = appView.getKeepInfo(method);
InternalOptions options = appView.options();
if (!keepInfo.isMethodStaticizingAllowed(options)) {
return false;
}
}
}
return true;
}
}