| // Copyright (c) 2023, 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.library; |
| |
| import com.android.tools.r8.graph.AppView; |
| import com.android.tools.r8.graph.DexClassAndMethod; |
| import com.android.tools.r8.graph.DexItemFactory; |
| import com.android.tools.r8.graph.DexType; |
| import com.android.tools.r8.graph.ProgramMethod; |
| import com.android.tools.r8.ir.analysis.value.AbstractValue; |
| import com.android.tools.r8.ir.code.AbstractValueSupplier; |
| import com.android.tools.r8.ir.code.InvokeMethod; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedBooleanMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedByteMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedCharacterMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedDoubleMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedFloatMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedIntegerMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedLongMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedMethodOptimizationInfoCollection; |
| import com.android.tools.r8.ir.optimize.library.info.ComputedShortMethodOptimizationInfoCollection; |
| |
| public class LibraryOptimizationInfoCollection { |
| |
| public static AbstractValue getAbstractReturnValueOrDefault( |
| AppView<?> appView, |
| InvokeMethod invoke, |
| DexClassAndMethod singleTarget, |
| ProgramMethod context, |
| AbstractValueSupplier abstractValueSupplier, |
| AbstractValue defaultValue) { |
| ComputedMethodOptimizationInfoCollection computedMethodOptimizationInfoCollection = |
| getComputedMethodOptimizationInfoCollection(appView, singleTarget.getHolderType()); |
| if (computedMethodOptimizationInfoCollection != null) { |
| AbstractValue abstractValue = |
| computedMethodOptimizationInfoCollection.getAbstractReturnValueOrDefault( |
| invoke, singleTarget, context, abstractValueSupplier); |
| if (!abstractValue.isUnknown()) { |
| return abstractValue; |
| } |
| } |
| return defaultValue; |
| } |
| |
| private static ComputedMethodOptimizationInfoCollection |
| getComputedMethodOptimizationInfoCollection(AppView<?> appView, DexType type) { |
| DexItemFactory dexItemFactory = appView.dexItemFactory(); |
| switch (type.getDescriptor().length()) { |
| case 16: |
| // java.lang.Byte |
| // java.lang.Long |
| if (type.isIdenticalTo(dexItemFactory.boxedByteType)) { |
| return new ComputedByteMethodOptimizationInfoCollection(appView); |
| } else if (type.isIdenticalTo(dexItemFactory.boxedLongType)) { |
| return new ComputedLongMethodOptimizationInfoCollection(appView); |
| } |
| break; |
| case 17: |
| // java.lang.Float |
| // java.lang.Short |
| if (type.isIdenticalTo(dexItemFactory.boxedFloatType)) { |
| return new ComputedFloatMethodOptimizationInfoCollection(appView); |
| } else if (type.isIdenticalTo(dexItemFactory.boxedShortType)) { |
| return new ComputedShortMethodOptimizationInfoCollection(appView); |
| } |
| break; |
| case 18: |
| // java.lang.Double |
| if (type.isIdenticalTo(dexItemFactory.boxedDoubleType)) { |
| return new ComputedDoubleMethodOptimizationInfoCollection(appView); |
| } |
| break; |
| case 19: |
| // java.lang.Boolean |
| // java.lang.Integer |
| if (type.isIdenticalTo(dexItemFactory.boxedBooleanType)) { |
| return new ComputedBooleanMethodOptimizationInfoCollection(appView); |
| } else if (type.isIdenticalTo(dexItemFactory.boxedIntType)) { |
| return new ComputedIntegerMethodOptimizationInfoCollection(appView); |
| } |
| break; |
| case 21: |
| // java.lang.Character |
| if (type.isIdenticalTo(dexItemFactory.boxedCharType)) { |
| return new ComputedCharacterMethodOptimizationInfoCollection(appView); |
| } |
| break; |
| default: |
| // Intentionally empty. |
| break; |
| } |
| return null; |
| } |
| } |