| // 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(); |
| } |
| } |
| } |