|  | // 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; | 
|  |  | 
|  | import com.android.tools.r8.graph.DebugLocalInfo; | 
|  | import com.android.tools.r8.ir.analysis.type.TypeElement; | 
|  | import com.android.tools.r8.ir.code.BasicBlock; | 
|  | import com.android.tools.r8.ir.code.NumberGenerator; | 
|  | import com.android.tools.r8.ir.code.Phi; | 
|  | import java.util.function.Function; | 
|  | import java.util.function.IntFunction; | 
|  |  | 
|  | /** Abstraction for how to decode SSA values (and basic blocks) when reading LIR. */ | 
|  | public abstract class LirDecodingStrategy<V, EV> { | 
|  |  | 
|  | private final boolean useValueIndex; | 
|  | private final NumberGenerator valueNumberGenerator; | 
|  |  | 
|  | public LirDecodingStrategy(NumberGenerator valueNumberGenerator) { | 
|  | assert valueNumberGenerator != null; | 
|  | this.useValueIndex = valueNumberGenerator.peek() == 0; | 
|  | this.valueNumberGenerator = valueNumberGenerator; | 
|  | } | 
|  |  | 
|  | void reserveValueIndexes(int valuesCount) { | 
|  | if (useValueIndex) { | 
|  | for (int i = 0; i < valuesCount; i++) { | 
|  | valueNumberGenerator.next(); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | public NumberGenerator getValueNumberGenerator() { | 
|  | return valueNumberGenerator; | 
|  | } | 
|  |  | 
|  | public final int getValueNumber(int encodedValueIndex) { | 
|  | if (useValueIndex) { | 
|  | assert encodedValueIndex < valueNumberGenerator.peek(); | 
|  | return encodedValueIndex; | 
|  | } | 
|  | return valueNumberGenerator.next(); | 
|  | } | 
|  |  | 
|  | public final V getFreshUnusedValue(TypeElement type) { | 
|  | return internalGetFreshUnusedValue(valueNumberGenerator.next(), type); | 
|  | } | 
|  |  | 
|  | abstract V internalGetFreshUnusedValue(int valueNumber, TypeElement type); | 
|  |  | 
|  | public abstract V getValue(EV encodedValue, LirStrategyInfo<EV> strategyInfo); | 
|  |  | 
|  | public abstract V getValueDefinitionForInstructionIndex( | 
|  | int instructionIndex, TypeElement type, Function<EV, DebugLocalInfo> getLocalInfo); | 
|  |  | 
|  | public abstract Phi getPhiDefinitionForInstructionIndex( | 
|  | int valueIndex, | 
|  | IntFunction<BasicBlock> getBlock, | 
|  | TypeElement type, | 
|  | Function<EV, DebugLocalInfo> getLocalInfo, | 
|  | LirStrategyInfo<EV> strategyInfo); | 
|  | } |