blob: 6e1f5a7b6d57e2e318d99de21791cc019d38f24c [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.numberunboxer;
import com.android.tools.r8.utils.ArrayUtils;
public class MethodBoxingStatus {
public static final MethodBoxingStatus NONE_UNBOXABLE = new MethodBoxingStatus(null, null);
public static final MethodBoxingStatus UNPROCESSED_CANDIDATE = new MethodBoxingStatus(null, null);
private final ValueBoxingStatus returnStatus;
private final ValueBoxingStatus[] argStatuses;
public static MethodBoxingStatus create(
ValueBoxingStatus returnStatus, ValueBoxingStatus[] argStatuses) {
assert !ArrayUtils.contains(argStatuses, null);
if (returnStatus.isNotUnboxable()
&& ArrayUtils.all(argStatuses, ValueBoxingStatus.NOT_UNBOXABLE)) {
return NONE_UNBOXABLE;
}
return new MethodBoxingStatus(returnStatus, argStatuses);
}
private MethodBoxingStatus(ValueBoxingStatus returnStatus, ValueBoxingStatus[] argStatuses) {
this.returnStatus = returnStatus;
this.argStatuses = argStatuses;
}
public MethodBoxingStatus merge(MethodBoxingStatus other) {
if (isNoneUnboxable() || other.isNoneUnboxable()) {
return NONE_UNBOXABLE;
}
if (isUnprocessedCandidate()) {
return other;
}
if (other.isUnprocessedCandidate()) {
return this;
}
assert argStatuses.length == other.argStatuses.length;
ValueBoxingStatus[] newArgStatuses = new ValueBoxingStatus[argStatuses.length];
for (int i = 0; i < other.argStatuses.length; i++) {
newArgStatuses[i] = other.argStatuses[i].merge(argStatuses[i]);
}
return create(returnStatus.merge(other.returnStatus), newArgStatuses);
}
public boolean isNoneUnboxable() {
return this == NONE_UNBOXABLE;
}
public boolean isUnprocessedCandidate() {
return this == UNPROCESSED_CANDIDATE;
}
public ValueBoxingStatus getReturnStatus() {
assert !isNoneUnboxable();
return returnStatus;
}
public ValueBoxingStatus getArgStatus(int i) {
assert !isNoneUnboxable();
assert argStatuses[i] != null;
return argStatuses[i];
}
public ValueBoxingStatus[] getArgStatuses() {
assert !isNoneUnboxable();
return argStatuses;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MethodBoxingStatus[");
if (isUnprocessedCandidate()) {
sb.append("UNPROCESSED_CANDIDATE");
} else if (isNoneUnboxable()) {
sb.append("NONE_UNBOXABLE");
} else {
for (int i = 0; i < argStatuses.length; i++) {
if (argStatuses[i].mayBeUnboxable()) {
sb.append(i).append(":").append(argStatuses[i]).append(";");
}
}
if (returnStatus.mayBeUnboxable()) {
sb.append("ret").append(":").append(returnStatus).append(";");
}
}
sb.append("]");
return sb.toString();
}
}