blob: 4e129aa262a77a22dfd657ca8bd4dd00ebb2211f [file] [log] [blame]
// Copyright (c) 2019, 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.code;
import com.android.tools.r8.graph.AppView;
import java.util.function.Consumer;
public abstract class Switch extends JumpInstruction {
private final int[] targetBlockIndices;
private int fallthroughBlockIndex;
public Switch(Value in, int[] targetBlockIndices, int fallthroughBlockIndex) {
super(in);
this.targetBlockIndices = targetBlockIndices;
this.fallthroughBlockIndex = fallthroughBlockIndex;
}
public abstract Instruction materializeFirstKey(AppView<?> appView, IRCode code);
public Value value() {
return inValues.get(0);
}
public boolean valid() {
for (int i = 0; i < numberOfKeys(); i++) {
assert getTargetBlockIndex(i) != getFallthroughBlockIndex();
}
return true;
}
public BasicBlock targetBlock(int index) {
return getBlock().getSuccessors().get(targetBlockIndices()[index]);
}
public int getTargetBlockIndex(int index) {
return targetBlockIndices[index];
}
public int[] targetBlockIndices() {
return targetBlockIndices;
}
public void forEachTarget(Consumer<BasicBlock> fn) {
for (int i = 0; i < targetBlockIndices.length; i++) {
fn.accept(targetBlock(i));
}
}
@Override
public BasicBlock fallthroughBlock() {
return getBlock().getSuccessors().get(fallthroughBlockIndex);
}
public int getFallthroughBlockIndex() {
return fallthroughBlockIndex;
}
public void setFallthroughBlockIndex(int i) {
fallthroughBlockIndex = i;
}
@Override
public void setFallthroughBlock(BasicBlock block) {
getBlock().getMutableSuccessors().set(fallthroughBlockIndex, block);
}
public int numberOfKeys() {
return targetBlockIndices.length;
}
@Override
public boolean isSwitch() {
return true;
}
@Override
public Switch asSwitch() {
return this;
}
}