blob: 3ecca10acd7a77a3034d4d5a7ef01e8b2607b2f4 [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.info;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Collection of optimization info for virtual methods with dynamic dispatch.
*
* <p>When a call to a virtual method does not have a single target, we cannot use the optimization
* info we compute for each method. Given the resolved method, this collection returns a piece of
* optimization info that is true for all possible dispatch targets (i.e., the join of the
* optimization of all possible dispatch targets).
*/
public class MethodResolutionOptimizationInfoCollection {
private static final MethodResolutionOptimizationInfoCollection EMPTY =
new MethodResolutionOptimizationInfoCollection(Collections.emptyMap());
private final Map<DexMethod, MethodOptimizationInfo> backing;
MethodResolutionOptimizationInfoCollection(Map<DexMethod, MethodOptimizationInfo> backing) {
this.backing = backing;
}
public static Builder builder() {
return new Builder();
}
public static MethodResolutionOptimizationInfoCollection empty() {
return EMPTY;
}
public MethodOptimizationInfo get(DexEncodedMethod method, DexClass holder) {
MethodOptimizationInfo defaultValue = DefaultMethodOptimizationInfo.getInstance();
if (!holder.isProgramClass()) {
return defaultValue;
}
return backing.getOrDefault(method.getReference(), defaultValue);
}
public boolean isEmpty() {
return backing.isEmpty();
}
public static class Builder {
private final Map<DexMethod, MethodOptimizationInfo> backing = new ConcurrentHashMap<>();
void add(DexMethod method, MethodOptimizationInfo optimizationInfo) {
assert !backing.containsKey(method);
if (!optimizationInfo.isDefault()) {
backing.put(method, optimizationInfo);
}
}
MethodResolutionOptimizationInfoCollection build() {
return new MethodResolutionOptimizationInfoCollection(new IdentityHashMap<>(backing));
}
}
}