blob: efb1342dfa8ffb9658ab88e205ba43c889be062b [file] [log] [blame]
// Copyright (c) 2021, 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.fieldaccess.state;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.analysis.value.AbstractValueFactory;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.ConcreteParameterState;
import com.android.tools.r8.optimize.argumentpropagation.codescanner.NonEmptyParameterState;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Action;
/** Used to represent the state for fields that have never been assigned in the program. */
public class BottomFieldState extends FieldState {
private static final BottomFieldState INSTANCE = new BottomFieldState();
private BottomFieldState() {}
public static BottomFieldState getInstance() {
return INSTANCE;
}
@Override
public AbstractValue getAbstractValue(
AbstractValueFactory abstractValueFactory, ProgramField field) {
return abstractValueFactory.createDefaultValue(field.getType());
}
@Override
public boolean isBottom() {
return true;
}
@Override
public FieldState mutableCopy() {
return this;
}
@Override
public FieldState mutableJoin(
AppView<AppInfoWithLiveness> appView,
ProgramField field,
NonEmptyFieldState fieldState,
Action onChangedAction) {
return fieldState.mutableCopy();
}
@Override
public FieldState mutableJoin(
AppView<AppInfoWithLiveness> appView,
ProgramField field,
NonEmptyParameterState parameterState,
Action onChangedAction) {
if (parameterState.isUnknown()) {
return unknown();
}
ConcreteParameterState concreteParameterState = parameterState.asConcrete();
if (field.getType().isArrayType()) {
return ConcreteArrayTypeFieldState.create(
concreteParameterState.getAbstractValue(appView), concreteParameterState.copyInFlow());
} else if (field.getType().isReferenceType()) {
return ConcreteClassTypeFieldState.create(
concreteParameterState.getAbstractValue(appView),
concreteParameterState.asReferenceParameter().getDynamicType(),
concreteParameterState.copyInFlow());
} else {
assert field.getType().isPrimitiveType();
return ConcretePrimitiveTypeFieldState.create(
concreteParameterState.getAbstractValue(appView), concreteParameterState.copyInFlow());
}
}
}