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