[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();
+  }
+}