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()) {