Add a few consistency checks related to exceptional edges in IR.
R=ager
Change-Id: I87e288ac144df356754d5b5bd5d7a78556bce7d9
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index ee85d7e..a451d14 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -53,6 +53,13 @@
assert instruction.getBlock() == this;
assert !instruction.isArgument() || argumentsAllowed;
assert !instruction.isDebugLocalRead() || !instruction.getDebugValues().isEmpty();
+ if (instruction.isMoveException()) {
+ assert instruction == entry();
+ for (BasicBlock pred : getPredecessors()) {
+ assert pred.hasCatchSuccessor(this)
+ || (pred.isTrivialGoto() && pred.endOfGotoChain() == this);
+ }
+ }
if (!instruction.isArgument()) {
argumentsAllowed = false;
}
@@ -230,6 +237,7 @@
successors.set(index2, tmp);
}
+ // TODO(b/116174212): Remove the predecessor pointer from the old successor block.
public void replaceSuccessor(BasicBlock block, BasicBlock newBlock) {
assert successors.contains(block) : "attempt to replace non-existent successor";
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index cc3cb78..19bf655 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -572,6 +572,10 @@
private boolean validThrowingInstructions() {
for (BasicBlock block : blocks) {
if (block.hasCatchHandlers()) {
+ for (BasicBlock handler : block.getCatchHandlers().getUniqueTargets()) {
+ // Ensure that catch handlers are always split edges for a well-formed SSA graph.
+ assert handler.getPredecessors().size() == 1;
+ }
boolean seenThrowing = false;
for (Instruction instruction : block.getInstructions()) {
if (instruction.instructionTypeCanThrow()) {