blob: 8974bbf285d431e171d8177425dc5948119950ba [file] [log] [blame]
// 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.framework.intraprocedural;
import com.android.tools.r8.ir.code.BasicBlock;
import java.util.Map;
/**
* The result returned by {@link IntraproceduralDataflowAnalysis#run(BasicBlock)}.
*
* <p>The result can be either a {@link SuccessfulDataflowAnalysisResult}, which represents the fact
* that the dataflow analysis ran to completion and that the (least) fixpoint was computed, or a
* {@link FailedDataflowAnalysisResult}, in which case the dataflow analysis was aborted before a
* fixpoint was reached.
*
* <p>The result currently does not hold any data about the result of the analysis, but this would
* be natural to add once needed.
*/
public abstract class DataflowAnalysisResult {
public boolean isSuccessfulAnalysisResult() {
return false;
}
public <Block, StateType extends AbstractState<StateType>>
SuccessfulDataflowAnalysisResult<Block, StateType> asSuccessfulAnalysisResult() {
return null;
}
public boolean isFailedAnalysisResult() {
return false;
}
public static class SuccessfulDataflowAnalysisResult<
Block, StateType extends AbstractState<StateType>>
extends DataflowAnalysisResult {
private final Map<Block, StateType> blockExitStates;
public SuccessfulDataflowAnalysisResult(Map<Block, StateType> blockExitStates) {
this.blockExitStates = blockExitStates;
}
public StateType join() {
StateType result = null;
for (StateType blockExitState : blockExitStates.values()) {
result = result != null ? result.join(blockExitState) : blockExitState;
}
return result;
}
@Override
public boolean isSuccessfulAnalysisResult() {
return true;
}
@SuppressWarnings("unchecked")
@Override
public SuccessfulDataflowAnalysisResult<Block, StateType> asSuccessfulAnalysisResult() {
return this;
}
}
public static class FailedDataflowAnalysisResult extends DataflowAnalysisResult {
@Override
public boolean isFailedAnalysisResult() {
return true;
}
}
}