blob: db23102d1767e429a305d7dbde8c5a1f9d202609 [file] [log] [blame]
// Copyright (c) 2024, 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.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.utils.ThreadUtils;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
/**
* Clears any optimization info on fields and methods that need lens code rewriting. This avoids the
* need to lens code rewrite such optimization info in repackaging and other optimizations where the
* optimization info is mostly unused, since no more optimizations passes will be run.
*/
public class OptimizationInfoRemover {
public static void run(
AppView<? extends AppInfoWithClassHierarchy> appView, ExecutorService executorService)
throws ExecutionException {
ThreadUtils.processItems(
appView.appInfo().classes(),
OptimizationInfoRemover::processClass,
appView.options().getThreadingModule(),
executorService);
}
private static void processClass(DexProgramClass clazz) {
for (DexEncodedField field : clazz.fields()) {
processField(field);
}
for (DexEncodedMethod method : clazz.methods()) {
processMethod(method);
}
}
private static void processField(DexEncodedField field) {
MutableFieldOptimizationInfo optimizationInfo =
field.getOptimizationInfo().asMutableFieldOptimizationInfo();
if (optimizationInfo == null) {
return;
}
optimizationInfo.unsetAbstractValue();
optimizationInfo.unsetDynamicType();
}
private static void processMethod(DexEncodedMethod method) {
MutableMethodOptimizationInfo optimizationInfo =
method.getOptimizationInfo().asMutableMethodOptimizationInfo();
if (optimizationInfo == null) {
return;
}
optimizationInfo.unsetAbstractReturnValue();
optimizationInfo.unsetArgumentInfos();
optimizationInfo.unsetDynamicType();
optimizationInfo.unsetInitializedClassesOnNormalExit();
optimizationInfo.unsetInstanceInitializerInfoCollection();
optimizationInfo.unsetNopInliningConstraint();
optimizationInfo.unsetSimpleInliningConstraint();
if (optimizationInfo.isEffectivelyDefault()) {
method.unsetOptimizationInfo();
}
}
}