Verify InitClass values have no users

This reverts commit 8eadbf877b3c077ff9515b4c1d9577d3180544f3.

Bug: 192293683
Change-Id: Id150b56756c636b7b75dd44b01d347208162865e
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 7dbc0ad..5c89899 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
@@ -62,12 +62,14 @@
 
   private Int2ReferenceMap<DebugLocalInfo> localsAtEntry;
 
-  public boolean consistentBlockInstructions(boolean argumentsAllowed, boolean debug) {
+  public boolean consistentBlockInstructions(boolean argumentsAllowed, boolean debug, boolean ssa) {
     for (Instruction instruction : getInstructions()) {
       assert instruction.verifyValidPositionInfo(debug);
       assert instruction.getBlock() == this;
       assert !instruction.isArgument() || argumentsAllowed;
       assert !instruction.isDebugLocalRead() || !instruction.getDebugValues().isEmpty();
+      assert !instruction.isInitClass()
+          || consistentInitClassInstruction(instruction.asInitClass(), ssa);
       if (instruction.isMoveException()) {
         assert instruction == entry();
         for (BasicBlock pred : getPredecessors()) {
@@ -82,6 +84,17 @@
     return true;
   }
 
+  public boolean consistentInitClassInstruction(InitClass initClass, boolean ssa) {
+    if (!ssa) {
+      return true;
+    }
+    assert initClass.hasOutValue();
+    assert !initClass.outValue().hasDebugUsers();
+    assert !initClass.outValue().hasPhiUsers();
+    assert initClass.outValue().uniqueUsers().stream().allMatch(Instruction::isPop);
+    return true;
+  }
+
   public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
     assert instructions.stream()
         .allMatch(instruction -> instruction.verifyTypes(appView, verifyTypesHelper));
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 202df23..6fa8653 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
@@ -577,7 +577,8 @@
   }
 
   public boolean isConsistentSSABeforeTypesAreCorrect() {
-    assert isConsistentGraph();
+    assert isConsistentGraph(true);
+    assert consistentBlockInstructions(true);
     assert consistentDefUseChains();
     assert validThrowingInstructions();
     assert noCriticalEdges();
@@ -608,11 +609,15 @@
   }
 
   public boolean isConsistentGraph() {
+    return isConsistentGraph(false);
+  }
+
+  public boolean isConsistentGraph(boolean ssa) {
     assert noColorsInUse();
     assert consistentBlockNumbering();
     assert consistentPredecessorSuccessors();
     assert consistentCatchHandlers();
-    assert consistentBlockInstructions();
+    assert consistentBlockInstructions(ssa);
     assert consistentMetadata();
     assert !allThrowingInstructionsHavePositions || computeAllThrowingInstructionsHavePositions();
     return true;
@@ -804,12 +809,13 @@
     return true;
   }
 
-  private boolean consistentBlockInstructions() {
+  private boolean consistentBlockInstructions(boolean ssa) {
     boolean argumentsAllowed = true;
     for (BasicBlock block : blocks) {
       assert block.consistentBlockInstructions(
           argumentsAllowed,
-          options.debug || method().getOptimizationInfo().isReachabilitySensitive());
+          options.debug || method().getOptimizationInfo().isReachabilitySensitive(),
+          ssa);
       argumentsAllowed = false;
     }
     return true;