| // 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.lightir; | |
| /** | |
| * Abstraction for how to encode SSA values. | |
| * | |
| * <p>At high level the unencoded SSA value index is the absolute index to the instruction defining | |
| * the SSA out value. This strategy provides a way to opaquely encode any references of an SSA value | |
| * as the relative offset from the referencing instruction. | |
| */ | |
| public abstract class LirSsaValueStrategy<EV> { | |
| private static final LirSsaValueStrategy<Integer> INSTANCE = new RelativeStrategy(); | |
| public static LirSsaValueStrategy<Integer> get() { | |
| return INSTANCE; | |
| } | |
| public abstract int encodeValueIndex(EV value, int currentValueIndex); | |
| public abstract EV decodeValueIndex(int encodedValueIndex, int currentValueIndex); | |
| private static class RelativeStrategy extends LirSsaValueStrategy<Integer> { | |
| @Override | |
| public int encodeValueIndex(Integer absoluteValueIndex, int currentValueIndex) { | |
| assert absoluteValueIndex != null; | |
| return currentValueIndex - absoluteValueIndex; | |
| } | |
| @Override | |
| public Integer decodeValueIndex(int encodedValueIndex, int currentValueIndex) { | |
| return currentValueIndex - encodedValueIndex; | |
| } | |
| } | |
| } |