Assert no vertically merged classes in IR after lensrewriting
Change-Id: I736b8edbe5aacaaafa9e1680e0e57df93dd146c0
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 964ce8a..cc54a60 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -4,13 +4,17 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.TypeChecker;
+import com.android.tools.r8.ir.analysis.type.ClassTypeLatticeElement;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.shaking.VerticalClassMerger.VerticallyMergedClasses;
import com.android.tools.r8.utils.CfgPrinter;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
@@ -474,6 +478,24 @@
return true;
}
+ public boolean hasNoVerticallyMergedClasses(AppView<? extends AppInfoWithSubtyping> appView) {
+ VerticallyMergedClasses verticallyMergedClasses = appView.verticallyMergedClasses();
+ if (verticallyMergedClasses == null) {
+ return true;
+ }
+ for (Instruction instruction : instructions()) {
+ if (instruction.outValue != null && instruction.outValue.getTypeLattice().isClassType()) {
+ ClassTypeLatticeElement classTypeLattice =
+ instruction.outValue.getTypeLattice().asClassTypeLatticeElement();
+ assert !verticallyMergedClasses.hasBeenMergedIntoSubtype(classTypeLattice.getClassType());
+ for (DexType itf : classTypeLattice.getInterfaces()) {
+ assert !verticallyMergedClasses.hasBeenMergedIntoSubtype(itf);
+ }
+ }
+ }
+ return true;
+ }
+
public boolean isConsistentGraph() {
assert noColorsInUse();
assert consistentBlockNumbering();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 959e9b7..772c70c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -410,6 +410,7 @@
new TypeAnalysis(appView, method).widening(newSSAValues);
}
assert code.isConsistentSSA();
+ assert code.hasNoVerticallyMergedClasses(appView);
}
// If the given invoke is on the form "invoke-direct A.<init>, v0, ..." and the definition of