blob: 99603e830bc37b2df77e438635f6c35b4f685a04 [file] [log] [blame]
// Copyright (c) 2020, 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.analysis.inlining;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
public class SimpleInliningConstraintFactory {
// Immutable argument constraints for low argument indices to avoid overhead of ConcurrentHashMap.
private final BooleanFalseSimpleInliningConstraint[] lowBooleanFalseConstraints =
new BooleanFalseSimpleInliningConstraint[5];
private final BooleanTrueSimpleInliningConstraint[] lowBooleanTrueConstraints =
new BooleanTrueSimpleInliningConstraint[5];
private final NotNullSimpleInliningConstraint[] lowNotNullConstraints =
new NotNullSimpleInliningConstraint[5];
private final NullSimpleInliningConstraint[] lowNullConstraints =
new NullSimpleInliningConstraint[5];
// Argument constraints for high argument indices.
private final Map<Integer, BooleanFalseSimpleInliningConstraint> highBooleanFalseConstraints =
new ConcurrentHashMap<>();
private final Map<Integer, BooleanTrueSimpleInliningConstraint> highBooleanTrueConstraints =
new ConcurrentHashMap<>();
private final Map<Integer, NotNullSimpleInliningConstraint> highNotNullConstraints =
new ConcurrentHashMap<>();
private final Map<Integer, NullSimpleInliningConstraint> highNullConstraints =
new ConcurrentHashMap<>();
public SimpleInliningConstraintFactory() {
for (int i = 0; i < lowBooleanFalseConstraints.length; i++) {
lowBooleanFalseConstraints[i] = BooleanFalseSimpleInliningConstraint.create(i, this);
}
for (int i = 0; i < lowBooleanTrueConstraints.length; i++) {
lowBooleanTrueConstraints[i] = BooleanTrueSimpleInliningConstraint.create(i, this);
}
for (int i = 0; i < lowNotNullConstraints.length; i++) {
lowNotNullConstraints[i] = NotNullSimpleInliningConstraint.create(i, this);
}
for (int i = 0; i < lowNullConstraints.length; i++) {
lowNullConstraints[i] = NullSimpleInliningConstraint.create(i, this);
}
}
public BooleanFalseSimpleInliningConstraint createBooleanFalseConstraint(int argumentIndex) {
return createArgumentConstraint(
argumentIndex,
lowBooleanFalseConstraints,
highBooleanFalseConstraints,
() -> BooleanFalseSimpleInliningConstraint.create(argumentIndex, this));
}
public BooleanTrueSimpleInliningConstraint createBooleanTrueConstraint(int argumentIndex) {
return createArgumentConstraint(
argumentIndex,
lowBooleanTrueConstraints,
highBooleanTrueConstraints,
() -> BooleanTrueSimpleInliningConstraint.create(argumentIndex, this));
}
public NotNullSimpleInliningConstraint createNotNullConstraint(int argumentIndex) {
return createArgumentConstraint(
argumentIndex,
lowNotNullConstraints,
highNotNullConstraints,
() -> NotNullSimpleInliningConstraint.create(argumentIndex, this));
}
public NullSimpleInliningConstraint createNullConstraint(int argumentIndex) {
return createArgumentConstraint(
argumentIndex,
lowNullConstraints,
highNullConstraints,
() -> NullSimpleInliningConstraint.create(argumentIndex, this));
}
private <T extends SimpleInliningArgumentConstraint> T createArgumentConstraint(
int argumentIndex, T[] lowConstraints, Map<Integer, T> highConstraints, Supplier<T> fn) {
return argumentIndex < lowConstraints.length
? lowConstraints[argumentIndex]
: highConstraints.computeIfAbsent(argumentIndex, key -> fn.get());
}
}