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