[LIR] Add const class instruction.
This also moves the fp example test which uses the const class
instruction.
Bug: b/167145686
Bug: b/225838009
Change-Id: Ia761c0fe52ddbf287a8d9b8deb526a594c7ea5e5
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index 2dfbc18..a42e312 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -25,6 +25,7 @@
import com.android.tools.r8.ir.conversion.DexBuilder;
import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
+import com.android.tools.r8.lightir.LirBuilder;
public class ConstClass extends ConstInstruction {
@@ -220,6 +221,11 @@
registry.registerConstClass(clazz, null, ignoreCompatRules);
}
+ @Override
+ public void buildLir(LirBuilder<Value, ?> builder) {
+ builder.addConstClass(getType());
+ }
+
public static class Builder extends BuilderBase<Builder, ConstClass> {
private DexType type;
diff --git a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
index 6d6d497..707e91c 100644
--- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
+++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -24,6 +24,7 @@
import com.android.tools.r8.ir.code.CheckCast;
import com.android.tools.r8.ir.code.Cmp;
import com.android.tools.r8.ir.code.Cmp.Bias;
+import com.android.tools.r8.ir.code.ConstClass;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
import com.android.tools.r8.ir.code.DebugLocalWrite;
@@ -421,6 +422,14 @@
}
@Override
+ public void onConstClass(DexType type) {
+ Value dest =
+ getOutValueForNextInstruction(
+ type.toTypeElement(appView, Nullability.definitelyNotNull()));
+ addInstruction(new ConstClass(dest, type));
+ }
+
+ @Override
public void onNumberConversion(NumericType from, NumericType to, EV value) {
Value dest =
getOutValueForNextInstruction(
diff --git a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
index 8f41773..da03a02 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirBuilder.java
@@ -331,6 +331,10 @@
return addOneItemInstruction(LirOpcodes.LDC, string);
}
+ public LirBuilder<V, EV> addConstClass(DexType type) {
+ return addOneItemInstruction(LirOpcodes.LDC, type);
+ }
+
public LirBuilder<V, EV> addDiv(NumericType type, V leftValue, V rightValue) {
int opcode;
switch (type) {
diff --git a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
index 1fca6a6..23b20dd 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirParsedInstructionCallback.java
@@ -85,6 +85,10 @@
onInstruction();
}
+ public void onConstClass(DexType type) {
+ onInstruction();
+ }
+
private void onArrayGetInternal(MemberType type, LirInstructionView view) {
if (type.isObject()) {
DexType destType = (DexType) getConstantItem(view.getNextConstantOperand());
@@ -392,6 +396,10 @@
onConstString((DexString) item);
return;
}
+ if (item instanceof DexType) {
+ onConstClass((DexType) item);
+ return;
+ }
throw new Unimplemented();
}
case LirOpcodes.ICONST_M1:
diff --git a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
index 132fc61..2a49d6c 100644
--- a/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
+++ b/src/main/java/com/android/tools/r8/lightir/LirPrinter.java
@@ -150,6 +150,11 @@
}
@Override
+ public void onConstClass(DexType type) {
+ appendOutValue().append("class(").append(type).append(")");
+ }
+
+ @Override
public void onAdd(NumericType type, EV leftValueIndex, EV rightValueIndex) {
appendOutValue();
appendValueArguments(leftValueIndex, rightValueIndex);
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index e2b1b04..d57b60d 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -26,7 +26,6 @@
public static Collection<String[]> data() {
String[] tests = {
"arithmetic.Arithmetic",
- "floating_point_annotations.FloatingPointValuedAnnotationTest",
"filledarray.FilledArray",
"hello.Hello",
"ifstatements.IfStatements",
diff --git a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
index 3e716f0..9c33abc 100644
--- a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
@@ -60,11 +60,6 @@
}
@Test
- public void testFloatingPointValuedAnnotation() throws Exception {
- testDebugging("floating_point_annotations", "FloatingPointValuedAnnotationTest");
- }
-
- @Test
public void testFilledArray() throws Exception {
testDebugging("filledarray", "FilledArray");
}
diff --git a/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java b/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java
index cd9e112..1850623 100644
--- a/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java
+++ b/src/test/java/com/android/tools/r8/examples/ExamplesTestBase.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.examples;
import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime.CfRuntime;
import com.android.tools.r8.ToolHelper;
@@ -16,8 +17,8 @@
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
+import java.util.function.Consumer;
import org.junit.Assume;
-import org.junit.Test;
public abstract class ExamplesTestBase extends DebugTestBase {
@@ -43,12 +44,17 @@
}
public void runTestR8() throws Exception {
+ runTestR8(unused -> {});
+ }
+
+ public void runTestR8(Consumer<R8FullTestBuilder> modifier) throws Exception {
parameters.assumeR8TestParameters();
testForR8(parameters.getBackend())
.addOptionsModification(o -> o.testing.roundtripThroughLir = true)
.setMinApi(parameters)
.addProgramClasses(getTestClasses())
.addKeepMainRule(getMainClass())
+ .apply(modifier::accept)
.run(parameters.getRuntime(), getMainClass())
.assertSuccessWithOutput(getExpected());
}
diff --git a/src/test/examples/floating_point_annotations/FloatingPointValuedAnnotation.java b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotation.java
similarity index 87%
rename from src/test/examples/floating_point_annotations/FloatingPointValuedAnnotation.java
rename to src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotation.java
index 5d7fd8c..83b9d69 100644
--- a/src/test/examples/floating_point_annotations/FloatingPointValuedAnnotation.java
+++ b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotation.java
@@ -1,7 +1,7 @@
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package floating_point_annotations;
+package com.android.tools.r8.examples.floating_point_annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/src/test/examples/floating_point_annotations/FloatingPointValuedAnnotationTest.java b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTest.java
similarity index 92%
rename from src/test/examples/floating_point_annotations/FloatingPointValuedAnnotationTest.java
rename to src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTest.java
index 1772f23..d787b76 100644
--- a/src/test/examples/floating_point_annotations/FloatingPointValuedAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTest.java
@@ -1,7 +1,7 @@
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package floating_point_annotations;
+package com.android.tools.r8.examples.floating_point_annotations;
public class FloatingPointValuedAnnotationTest {
diff --git a/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java
new file mode 100644
index 0000000..acba8f35
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/examples/floating_point_annotations/FloatingPointValuedAnnotationTestRunner.java
@@ -0,0 +1,72 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.examples.floating_point_annotations;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.examples.ExamplesTestBase;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class FloatingPointValuedAnnotationTestRunner extends ExamplesTestBase {
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().enableApiLevelsForCf().build();
+ }
+
+ public FloatingPointValuedAnnotationTestRunner(TestParameters parameters) {
+ super(parameters);
+ }
+
+ @Override
+ public Class<?> getMainClass() {
+ return FloatingPointValuedAnnotationTest.class;
+ }
+
+ @Override
+ public List<Class<?>> getTestClasses() {
+ return ImmutableList.of(
+ FloatingPointValuedAnnotation.class,
+ FloatingPointValuedAnnotationTest.class,
+ FloatingPointValuedAnnotationTest.A.class,
+ FloatingPointValuedAnnotationTest.B.class,
+ FloatingPointValuedAnnotationTest.C.class,
+ FloatingPointValuedAnnotationTest.D.class);
+ }
+
+ @Override
+ public String getExpected() {
+ return StringUtils.lines("false", "false");
+ }
+
+ @Test
+ public void testDesugaring() throws Exception {
+ runTestDesugaring();
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ runTestR8(
+ builder ->
+ builder
+ .addKeepRuntimeVisibleAnnotations()
+ .addKeepClassAndMembersRules(
+ FloatingPointValuedAnnotation.class,
+ FloatingPointValuedAnnotationTest.A.class,
+ FloatingPointValuedAnnotationTest.B.class,
+ FloatingPointValuedAnnotationTest.C.class,
+ FloatingPointValuedAnnotationTest.D.class));
+ }
+
+ @Test
+ public void testDebug() throws Exception {
+ runTestDebugComparator();
+ }
+}