Change interpretation of bottom cf state to unreachable

Change-Id: Iac6835adc35f92dcbaafe112c8176b96c58e37e8
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 99c43b7..79bef88 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -1050,7 +1050,7 @@
       DexMethod previousMethodSignature,
       boolean previousMethodSignatureIsInstance) {
     DexItemFactory dexItemFactory = appView.dexItemFactory();
-    CfFrameState state = ConcreteCfFrameState.bottom();
+    CfFrameState state = new ConcreteCfFrameState();
     int localIndex = 0;
     if (previousMethodSignatureIsInstance) {
       state =
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java
index b381e18..6ffdfef 100644
--- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java
+++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java
@@ -31,17 +31,17 @@
 
   @Override
   public CfFrameState check(AppView<?> appView, CfFrame frame) {
-    return new ConcreteCfFrameState().check(appView, frame);
+    return this;
   }
 
   @Override
   public CfFrameState checkLocals(AppView<?> appView, CfFrame frame) {
-    return new ConcreteCfFrameState().checkLocals(appView, frame);
+    return this;
   }
 
   @Override
   public CfFrameState checkStack(AppView<?> appView, CfFrame frame) {
-    return new ConcreteCfFrameState().checkStack(appView, frame);
+    return this;
   }
 
   @Override
@@ -52,66 +52,65 @@
   @Override
   public CfFrameState markInitialized(
       UninitializedFrameType uninitializedType, DexType initializedType) {
-    // Initializing an uninitialized type is a no-op when the frame is empty.
     return this;
   }
 
   @Override
-  public ErroneousCfFrameState pop() {
-    return error("Unexpected pop from empty stack");
+  public CfFrameState pop() {
+    return this;
   }
 
   @Override
-  public ErroneousCfFrameState pop(BiFunction<CfFrameState, PreciseFrameType, CfFrameState> fn) {
-    return pop();
+  public CfFrameState pop(BiFunction<CfFrameState, PreciseFrameType, CfFrameState> fn) {
+    return this;
   }
 
   @Override
-  public ErroneousCfFrameState popAndInitialize(
+  public CfFrameState popAndInitialize(
       AppView<?> appView, DexMethod constructor, CfAnalysisConfig config) {
-    return pop();
+    return this;
   }
 
   @Override
-  public ErroneousCfFrameState popArray(AppView<?> appView) {
-    return pop();
+  public CfFrameState popArray(AppView<?> appView) {
+    return this;
   }
 
   @Override
-  public ErroneousCfFrameState popInitialized(
+  public CfFrameState popInitialized(
       AppView<?> appView,
       DexType expectedType,
       BiFunction<CfFrameState, PreciseFrameType, CfFrameState> fn) {
-    return pop();
+    return this;
   }
 
   @Override
   public CfFrameState popInitialized(AppView<?> appView, DexType... expectedTypes) {
-    return expectedTypes.length == 0 ? this : pop();
+    return this;
   }
 
   @Override
   public CfFrameState push(CfAnalysisConfig config, DexType type) {
-    return new ConcreteCfFrameState().push(config, type);
+    return this;
   }
 
   @Override
   public CfFrameState push(CfAnalysisConfig config, PreciseFrameType frameType) {
-    return new ConcreteCfFrameState().push(config, frameType);
+    return this;
   }
 
   @Override
-  public ErroneousCfFrameState readLocal(
+  public CfFrameState readLocal(
       AppView<?> appView,
       int localIndex,
       ValueType expectedType,
       BiFunction<CfFrameState, FrameType, CfFrameState> fn) {
-    return error("Unexpected local read from empty frame");
+    return this;
   }
 
   @Override
   public CfFrameState storeLocal(int localIndex, FrameType frameType, CfAnalysisConfig config) {
-    return new ConcreteCfFrameState().storeLocal(localIndex, frameType, config);
+    return this;
   }
 
   @Override
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 e72ad60..b5df6e6 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
@@ -43,7 +43,7 @@
   private final ArrayDeque<PreciseFrameType> stack;
   private int stackHeight;
 
-  ConcreteCfFrameState() {
+  public ConcreteCfFrameState() {
     this(new Int2ObjectAVLTreeMap<>(), new ArrayDeque<>(), 0);
   }
 
@@ -143,8 +143,7 @@
   @Override
   public CfFrameState pop(BiFunction<CfFrameState, PreciseFrameType, CfFrameState> fn) {
     if (stack.isEmpty()) {
-      // Return the same error as when popping from the bottom state.
-      return bottom().pop();
+      return error("Unexpected pop from empty stack");
     }
     PreciseFrameType frameType = stack.removeLast();
     stackHeight -= frameType.getWidth();