Merge "Guard check-cast elimination when in-value is null constant"
diff --git a/src/test/java/com/android/tools/r8/deadcode/RemoveDeadArray.java b/src/test/java/com/android/tools/r8/deadcode/RemoveDeadArray.java
index 5de7de0..b522155 100644
--- a/src/test/java/com/android/tools/r8/deadcode/RemoveDeadArray.java
+++ b/src/test/java/com/android/tools/r8/deadcode/RemoveDeadArray.java
@@ -66,10 +66,9 @@
.compile();
CodeInspector inspector = result.inspector();
assertFalse(inspector.clazz(TestClass.class).clinit().isPresent());
-
MethodSubject main = inspector.clazz(TestClass.class).mainMethod();
- main.streamInstructions().noneMatch(instructionSubject -> instructionSubject.isNewArray());
- assertFalse(main.getMethod().getCode().asDexCode().toString().contains("NewArray"));
+ assertTrue(
+ main.streamInstructions().noneMatch(instructionSubject -> instructionSubject.isNewArray()));
runOnArt(result.app, TestClass.class.getName());
}
@@ -83,10 +82,8 @@
CodeInspector inspector = result.inspector();
MethodSubject clinit = inspector.clazz(TestClassWithCatch.class).clinit();
assertTrue(clinit.isPresent());
- // Ensure that our optimization does not hit, we should still have 4 Aput instructions.
- long aPutCount = Arrays.stream(clinit.getMethod().getCode().asDexCode().instructions)
- .filter(instruction -> instruction instanceof Aput)
- .count();
- assertEquals(4, aPutCount);
+ // Ensure that our optimization does not hit, we should still have 4 ArrayPut instructions.
+ long count = clinit.streamInstructions().filter(a -> a.isArrayPut()).count();
+ assertEquals(4, count);
}
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
index 375f0b5..93a1c37 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.cf.code.CfArithmeticBinop;
+import com.android.tools.r8.cf.code.CfArrayStore;
import com.android.tools.r8.cf.code.CfCheckCast;
import com.android.tools.r8.cf.code.CfConstClass;
import com.android.tools.r8.cf.code.CfConstNull;
@@ -286,6 +287,11 @@
}
@Override
+ public boolean isArrayPut() {
+ return instruction instanceof CfArrayStore;
+ }
+
+ @Override
public int size() {
// TODO(b/122302789): CfInstruction#getSize()
throw new UnsupportedOperationException("CfInstruction doesn't have size yet.");
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
index e2e801e..c9b7ee5 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.utils.codeinspector;
+import com.android.tools.r8.code.Aput;
import com.android.tools.r8.code.CheckCast;
import com.android.tools.r8.code.Const;
import com.android.tools.r8.code.Const16;
@@ -366,6 +367,11 @@
}
@Override
+ public boolean isArrayPut() {
+ return instruction instanceof Aput;
+ }
+
+ @Override
public boolean isMonitorEnter() {
return instruction instanceof MonitorEnter;
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
index dd5af7c..0528185 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
@@ -84,6 +84,8 @@
boolean isNewArray();
+ boolean isArrayPut();
+
boolean isMonitorEnter();
boolean isMonitorExit();