blob: 9a31e29a1f8279230602c718140f86bf3d83d50e [file] [log] [blame]
// 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;
}
}