Disallow unknown-wide types in locals

Change-Id: Ia3430c8fac9fc0791500acb8a09a503a2abaa8e2
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
index 8d00469..95644d9 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
@@ -395,6 +395,7 @@
     }
 
     private Builder internalStore(int localIndex, FrameType frameType) {
+      assert !frameType.isTwoWord();
       ensureMutableLocals();
       locals.put(localIndex, frameType);
       if (frameType.isWide()) {
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
index f05ab67..f995cbc 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
@@ -46,6 +46,7 @@
 
   public ConcreteCfFrameState(
       Int2ObjectAVLTreeMap<FrameType> locals, ArrayDeque<PreciseFrameType> stack, int stackHeight) {
+    assert locals.values().stream().noneMatch(FrameType::isTwoWord);
     this.locals = locals;
     this.stack = stack;
     this.stackHeight = stackHeight;
@@ -431,7 +432,13 @@
       WideFrameType frameType,
       WideFrameType otherFrameType,
       CfFrame.Builder builder) {
-    builder.store(localIndex, frameType.join(otherFrameType));
+    WideFrameType join = frameType.join(otherFrameType);
+    if (join.isPrecise()) {
+      builder.store(localIndex, join);
+    } else {
+      assert join.isTwoWord();
+      setWideLocalToTop(localIndex, builder);
+    }
   }
 
   // TODO(b/231521474): By splitting each wide type into single left/right types, the join of each