Allow sources for moves to be more precise than the static type

Bug: 144302929
Change-Id: If00e2534d81eb5bb16eb36305650672933d22300
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
index 4e1e00a..453a564 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
@@ -75,4 +75,11 @@
   public boolean isAllowedAfterThrowingInstruction() {
     return true;
   }
+
+  @Override
+  public boolean verifyTypes(AppView<?> appView) {
+    super.verifyTypes(appView);
+    assert src().getTypeLattice().lessThanOrEqual(outValue().getTypeLattice(), appView);
+    return true;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Move.java b/src/main/java/com/android/tools/r8/ir/code/Move.java
index 9054d07..3478645 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Move.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Move.java
@@ -126,7 +126,10 @@
   @Override
   public boolean verifyTypes(AppView<?> appView) {
     super.verifyTypes(appView);
-    assert src().getTypeLattice().equals(outValue().getTypeLattice());
+    // DebugLocalWrite defines it's own verification of types but should be allowed to call super.
+    if (!this.isDebugLocalWrite()) {
+      assert src().getTypeLattice().equals(outValue().getTypeLattice());
+    }
     return true;
   }
 }