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